从文本文件中读取信息到文本文件中的3个不同数组(c ++)

时间:2011-04-25 16:31:28

标签: c++

我在c ++课程中遇到这个程序有问题: 一位教师创建了具有姓氏,名字和考试成绩的平行学生阵列。排列数组使得每个数组的第n个元素包含相关信息。编写一个程序,按学生姓氏对数组进行排序(使用选择排序),这样每个数组的第n个项仍然包含与正确人员相关的数据。 例如,原始数组数据如下:

  

Ratte Ismella 66   
布朗汤姆88   
Dyrt Phil 94   
Dent Stu 100

排序后:

  布朗汤姆88   
Dent Stu 100   
Dyrt Phil 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声明中使用的变量是一切都错了,最后我应该只使用一维数组。

3 个答案:

答案 0 :(得分:2)

您的家庭作业似乎有多个问题。

Q1:我如何存储我的数据?

首先,您需要声明数组。在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"
}

在这种特殊情况下,我们使用一个名为“operator chaining”的功能来读取每个循环迭代中的三个值:

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;

问题3:如何对数据进行排序?

我不会为你编写你的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])      

顺便说一句,这个额外的复杂性是你永远不应该使用并行数组的一个很好的理由 - 它们让你自己重复,增加了出错的机会。

我希望这个答案可以让你自己完成作业,而不会向你展示太多如何做。不要忘记向你发现的每个答案提供帮助,并接受解决问题的答案(如果有的话)。

答案 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()成员函数,直到你理解它的实际作用为止 - 提示:它不会预测下一次读取是否会导致文件结束。

答案 2 :(得分:0)

我不会为此编写代码(HW que),但仍然会让你大致了解在c ++中这样做。

1)每个学生的数据结构。

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

2.标记你获得空格的行,或者像unappersson建议的那样。

你的容器将是:: vector&lt; stud *&gt;学生们; [不要忘记删除指针]

3。访问姓氏为:: students [iterator] - &gt; last并对字符串进行Selection排序。

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