gpt4 book ai didi

c++ - 我如何将一个 while 循环与一个 for 循环结合起来?

转载 作者:行者123 更新时间:2023-11-27 22:40:37 26 4
gpt4 key购买 nike

我正尝试按照我的说明将这两个循环组合在一起,但我无法弄清楚我应该如何做这样的事情。因为我在 for 循环中的计数器 i 不能进入 while 循环条件。我的老师希望程序只执行一个循环。提前致谢。代码基本上贯穿一个 txt 文件,应该首先将值分配给一个数组,然后在 for 循环中我将它分配给一个指针。

这部分我有问题:

void fillArr(vector <student> &arr, vector <student *> &ptrels){
student temp;

ifstream inFile ("index.txt");
while (!inFile.eof()) {
inFile >> temp.fName >> temp.Lname >> temp.gpa >> temp.id >> temp.email;
arr.push_back(temp);
}
for (unsigned i = 0; i < arr.size(); i++ ){
ptrels.push_back(&arr[i]);
}

// combine the two above loops
}

完整代码如下:

> #include <string>
> #include <cstdio>
> #include <iostream>
> #include <vector>
> #include <fstream>
> #include <sstream> using namespace std;
>
> struct student {
> string fName, Lname, email, id;
> double gpa; } ;
>
> void input(); void fillArr(vector <student> &arr, vector <student *>
> &ptrels); void printFile(vector <student *> pointarray); void
> sortFile(vector <student> &arr, vector <student *> &pointarray);
>
> int main() {
> vector <student> elements;
> vector <student *> ptrels;
>
> ifstream inFile;
> inFile.open("index.txt");
>
> int answer;
> fillArr(elements, ptrels);
> cout << "Please select:" << endl
> << "1 = Select All" << endl
> << "2 = Order A-Z by Name"<<endl
> << "3 = To exit"<< endl;
> cin >> answer ;
> if (answer == 1){
> printFile(ptrels);
> main();
> }
> if (answer ==2){
> sortFile(elements, ptrels);
> printFile(ptrels);
> main();
> }
> if (answer ==3){
> inFile.close();
> exit(0);
> }
> else {
> cout << "Invalid Try Again:"<< endl;
> main();
> }
> return 0; }
>
> void fillArr(vector <student> &arr, vector <student *> &ptrels){
> student temp;
>
> ifstream inFile ("index.txt");
> while (!inFile.eof()) {
> inFile >> temp.fName >> temp.Lname >> temp.gpa >> temp.id >> temp.email;
> arr.push_back(temp);
> }
> for (unsigned i = 0; i < arr.size(); i++ ){
> ptrels.push_back(&arr[i]);
> }
>
> // combine the two above loops }
>
>
>
> void printFile(vector <student *> pointarray){
> for (unsigned j = 0; j < pointarray.size(); j++){
> cout << pointarray[j] -> fName << " ";
> cout << pointarray[j] -> Lname<< " ";
> cout << pointarray[j] -> gpa << " ";
> cout << pointarray[j] -> id << " ";
> cout << pointarray[j] -> email << " ";
> cout << endl;
> } }
>
> //swap the elements by pointer. you are swaping the record not the
> pointers. // only sorting by firstname, sort by all 5 void
> sortFile(vector <student> &arr, vector <student *> &pointarray){
> for(unsigned i = 0; i < arr.size(); ++i){
> for(unsigned j = i + 1; j < arr.size(); ++j) {
> if(arr[i].fName > pointarray[j] -> fName) {
> swap(arr[i].fName,pointarray[j] ->fName);
> swap(arr[i].Lname,pointarray[j] ->Lname);
> swap(arr[i].gpa,pointarray[j] ->gpa);
> swap(arr[i].id,pointarray[j] ->id);
> swap(arr[i].email,pointarray[j] ->email);
> }
> }
> } }

此外,我知道我应该在另一个问题中问这个问题,但她还希望我进行排序,这是最后一个函数 sortFile,用于按所有值排序,而不仅仅是 firstName。另外,不知何故,她讨厌交换功能,正在寻找替代品。任何提示将不胜感激。

最佳答案

天真的解决方案可能会将两个循环折叠成以下内容:

void fillArr(vector <student> &arr, vector <student *> &ptrels){
student temp;

ifstream inFile ("index.txt");
while (!inFile.eof()) {
inFile >> temp.fName >> temp.Lname >> temp.gpa >> temp.id >> temp.email;
arr.push_back(temp);
ptrels.push_back(&arr.back());
}
// combine the two above loops
}

假设 arr.empty() 是这个函数的先决条件(如果不是,语义无论如何都会被破坏),这几乎做同样的事情。

差不多。

问题是,每个 arr.push_back(temp) 都可能导致 arr 的扩展,使您放入 ptrels< 的所有指针都无效 到目前为止。最初的解决方案使用了第二个循环,这样您就可以知道 arr 已经完成并在您开始摆弄指针之前进行了清理。

我们仍然可以使用单循环解决方案,只要我们通过保留 vector 中的空间来防止重新分配。为此,您需要提前知道需要多少元素。为此,您需要使用 “index.txt” 两次,然后返回到两个循环。

所以,基本上,不,你不能这样做。

真正的解决方案是拒绝需求。希望这就是您的老师希望您报告的内容。无论如何,在像这样的简单案例中,我想不出“索引” vector 在现实世界中的任何用例。

此外,watch your I/O methodology .

关于c++ - 我如何将一个 while 循环与一个 for 循环结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49325092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com