2011-04-25 74 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])  

顺便说一句,这种额外的复杂性是一个很好的理由,为什么你不应该使用并行阵列 - 它们会让你重复自己,增加出错的机会。

我希望这个答案可以让你自己完成作业,而不会显示你太多如何做。不要忘记注意每个你认为有用的答案,并接受解决问题的答案(如果有的话)。