【问题标题】:reading information from a text file into 3 different arrays from a text file (c++)将文本文件中的信息读取到文本文件中的 3 个不同数组中(c++)
【发布时间】:2011-04-25 16:31:28
【问题描述】:

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

拉特·伊斯梅拉 66
布朗汤姆 88
Dyrt Phil 94
Dent Stu 100

排序后:

棕色汤姆 88
Dent Stu 100
Dyrt Phil 94
拉特·伊斯梅拉 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 声明中使用的变量是都错了,最后我应该只使用一维数组。

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    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 的插入运算符:&gt;&gt;。此运算符从其输入流中读取一个以空格分隔的单词,对其进行适当的解释,并将该值分配给命名变量。例如,要读入单个 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] &lt; data[j]),那么您的交换行将类似于std::swap(data[i], data[j])

    但是,您的数据结构并不典型。您有三个并行数组,它们必须作为一个集合排序,而不是三个不同的集合。在您的情况下,您的“做一些比较”行可能是 if (LastNames[i] &lt; LastNames[j]),但您的交换行必须在所有三个数组中进行相同的交换:

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

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

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

    【讨论】:

      【解决方案2】:

      类似:

      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() 成员函数 - 提示:它不会预测下一次读取是否会导致文件结束。

      【讨论】:

      • 我认为如果 OP 使用单个数组而不是 3 个数组,实现起来可能会更容易。
      • @P.R.阅读问题标题。
      • 嗯,是的,不幸的是它确实需要 3 个并行数组:/
      【解决方案3】:

      我不会为此 (HW que) 编写代码,但仍然可以让您大致了解用 c++ 编写代码。

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

      结构螺柱{ std::string 最后; std::string 优先; 整数 };

      2.标记你得到的空格或按照unappersson的建议做。

      您的容器将是 :: vector &lt stud * &gt students; [不要忘记删除指针]

      3.访问姓氏为 :: students[iterator] -> last 并对字符串进行选择排序。

      矢量 &lt 螺柱 * &gt ::iterator it; for(it = students.begin() ; it != students.end() ; it++){ // 这是遍历学生容器的方法 }

      【讨论】:

        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        相关资源
        最近更新 更多