2011-04-25 18 views
1

我在C++類中遇到了這個問題: 老師創建了一個名字,名字和測試成績的平行數組。數組被排列成每個數組的第n個元素包含相關信息。編寫一個程序,用學生姓氏排序(使用選擇排序)數組,以便每個數組的第n項仍包含與正確人員相關的數據。 例如原始陣列數據如下:從文本文件讀取信息到文本文件中的3個不同的數組(012)c + +

Ratte Ismella 66
布朗湯姆88
Dyrt菲爾94
登特斯圖100

排序後:

Brown Tom 88
Dent Stu 100
Dyrt菲爾·94
Ratte Ismella 66

程序必須連續工作達30名學生。數據必須從數據文件中讀取。數據文件的每一行都將包含姓氏,空格,名字,空格和整數分數。程序必須在排序前後顯示數據。

我知道我應該包括一個選擇排序和交換功能,但我不知道該怎麼做。這裏是我迄今爲止它不是很好

#include "stdafx.h" 
#include <iomanip> 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

void selsort(int a[], int size) 
void swap(string, &s1,string &s2) 
void swap (int &i1, int &i2) 

int main() 
{ 
    int counter=0; 
    ifstream inputFile; 
    string inputFileName; 
    cout<<"Enter the path and filename."; 
    getline(cin, inputFileName); 
    inputFile.open (inputFileName.c_str()); 
    string LINE; 
    while (!inputFile.eof()) 
    { 
     getline (inputFile, LINE) 
     cout<<LINE<<endl; 
    } 

我知道我應該讀取文件作爲字行不,我不知道如何把它們變成陣列基於姓氏名字,和得分,我的selsort和swap聲明中使用的變量都是錯誤的,最後我應該只使用1維數組。

回答

0

喜歡的東西:

vector <string> firstname, lastname; 
vector <int> score; 
string fn, ln; 
int n; 

while(inputfile >> fn >> ln >> n) { 
    firstname.push_back(fn); 
    lastname.push_back(ln); 
    score.push_back(n); 
} 

在任何情況下使用EOF()成員函數,直到你明白它實際上 - 提示:不預測,如果下一個讀會引起文件的末尾。

+0

我認爲如果OP使用單個數組而不是3,則實現起來可能更容易。 – Pepe 2011-04-25 16:44:50

+0

@ P.R。閱讀問題標題。 – 2011-04-25 16:45:34

+0

嗯,是的,不幸的是它確實要求3個並行陣列:/ – Pepe 2011-04-25 16:47:56

0

我不會爲這個(HW que)編寫代碼,但仍然給你一個在C++中完成的概念。

1)每個學生的數據結構。

 
struct stud{ 
std::string last; 
std::string first; 
int number 
}; 

2.記號化,你得到的空間還是作爲unappersson曾建議就行了。

你的容器將會是:: vector&lt; stud&gt; students; [DO NOT忘記刪除指針]

3。訪問姓氏::學生[迭代] - >最後,做字符串選擇排序。

 
vector < stud * > ::iterator it; 
for(it = students.begin() ; it != students.end() ; it++){ 
// This is the way to iterate through your students container 
} 

2

您似乎對您的家庭作業有多個問題。

問題1:如何存儲我的數據?

首先,您需要聲明數組。在C++中,數組是一個固定大小的基本數據結構,代表一組同類數據。數組的特點是其類型和大小。如果T代表某種任意類型,並且N代表某個任意常量表達式,那麼可以聲明一個名爲myArray的數組,如:T myArray[N]。具體來說,你可以聲明這三個陣列

std::string LastNames[30]; 
std::string FirstNames[30]; 
int Scores[30]; 

當訪問這些數組的元素,我們使用下標操作符[]例如,

LastName[7] = "Johnson"; 
std::cout << Scores[23]; 

Q2:如何做我在數據讀取?

要填充這些數組,我們使用std::istream的插入運算符:>>。該運算符從其輸入流中讀取一個以空格分隔的單詞,並對其進行適當解釋,並將該值賦予指定的變量。例如,在單個int閱讀,我們可以這樣寫:

int i; 
std::cin >> i; 

閱讀價值值後,直到到達文件的結尾,是一種常見的C++成語。在對一種類型的數據的重複讀取的情況下,我們用這樣一種形式:

std::string name; 
while(std::cin >> name) { 
    // do something with "name" 
} 

在這種特殊情況下,我們使用了一個名爲「運營商鏈接」功能來讀取每個循環迭代三個值:

std::string lastName; 
std::string firstName; 
int score; 
while(std::cin >> lastName >> firstName >> score) { 
} 

該循環運行幾次,直到文件結束。循環的每次迭代都將下一組值賦給這些命名變量。請注意,這個循環很愚蠢,因爲我們對這些值沒有做任何事情。我們立即用下一次迭代覆蓋它們。

結合陣列概念與讀取輸入成語,我們有:

std::string LastNames[30]; 
std::string FirstNames[30]; 
int Scores[30]; 
std::string lastName; 
std::string firstName; 
int score; 
int i = 0; 
while(std::cin >> lastName >> firstName >> score) { 
    LastNames[i] = lastName; 
    FirstNames[i] = firstName; 
    Scores[i] = score; 
    ++i; 
} 
int NumberOfStudents = i; 

Q3:如何將我的數據進行排序?

我不會寫你的selsort算法你,但你可能會碰到這樣的:

for(int i = 0; i < NumberOfStudents; i++) { 
    for(j = i; j < NumberOfStudents; j++) { 
     // do some compares 
     // swap some data 
    } 
} 

在一個典型的排序中,「做一些進行比較」和「交換一些數據」行會在相同的數據結構上運行。所以,如果你的比較行類似if (data[i] < data[j]),那麼你的交換行看起來像std::swap(data[i], data[j])

但是,您的數據結構並不典型。你有三個並行數組,它們必須被排序爲一個集合,而不是三個不同的集合。在你的情況,你的「做一些比較」行可能是if (LastNames[i] < LastNames[j]),但你的互換額度將不得不做相同的掉期交易在所有三個數組:

std::swap(LastNames[i], LastNames[j]) 
std::swap(FirstNames[i], FirstNames[j]) 
std::swap(Scores[i], Scores[j])  

順便說一句,這種額外的複雜性是一個很好的理由,爲什麼你不應該使用並行陣列 - 它們會讓你重複自己,增加出錯的機會。

我希望這個答案可以讓你自己完成作業,而不會顯示你太多如何做。不要忘記注意每個你認爲有用的答案,並接受解決問題的答案(如果有的話)。