我在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声明中使用的变量是一切都错了,最后我应该只使用一维数组。
答案 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 }