我刚刚开始学习C ++,并且一直在研究一些问题来磨练我的技能。目前我在交换记录数组的某些值时遇到问题。输入验证工作正常,但当我尝试交换程序周围的值停止响应和崩溃。以下是我创建它的方法:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int grandprixnum;
struct DriverData {
string driver;
int car;
string team;
int grid;
int points;
};
DriverData * grand = new DriverData[grandprixnum];
int input()
{
cout << "How many drivers where there? ";
cin >> grandprixnum;
cin.sync();
DriverData * grand = new DriverData[grandprixnum];
for (int i=0; i<grandprixnum; i++)
{
cout << "Driver numbers: "<< i+1 << " \n";
cout << "What is the drivers name? \n";
getline (cin, grand[i].driver);
cin.sync();
cout << "What is the drivers car number? \n";
cin >> grand[i].car;
while (grand[i].car > 99 || grand[i].car < 1)
{
cout << "Please enter a value between 1 and 99! \n";
cin >> grand[i].car;
}
cin.sync();
cout << "What team is the driver racing for? \n";
getline (cin, grand[i].team);
cin.sync();
cout << "What grid are they in? \n";
cin >> grand[i].grid;
cin.sync();
while (grand[i].grid < 0 || grand[i].grid > 22)
{
cout << "Please enter a grid number between 1 and 22! \n";
cin >> grand[i].grid;
}
cin.sync();
cout << "What are their total points? \n";
cin >> grand[i].points;
cin.sync();
while (grand[i].points > 25 || grand[i].points < 0)
{
cout << "Please enter the drivers points between 0 and 25! \n";
cin >> grand[i].points;
}
}
}
int sorting ()
//This part _______________________________
{
for(int a=1; a<=grandprixnum; a++)
{
for(int b=0; b<=grandprixnum; b++)
{
if(grand[b].points < grand[b+1].points)
{
swap(grand[b].driver, grand[b+1].driver);
swap(grand[b].car, grand[b+1].car);
swap(grand[b].team, grand[b+1].team);
swap(grand[b].grid, grand[b+1].grid);
swap(grand[b].points, grand[b+1].points);
}
}
}
}
//To here_________________________________
int showtable ()
{
cout << "Driver Car Team Grid Points \n";
for(int c=0; c<grandprixnum; c++)
{
cout << grand[c].driver << grand[c].car << grand[c].team << grand[c].grid << grand[c].points << "\n";
}
}
int main()
{
input ();
sorting ();
showtable ();
}
我环顾四周,找不到一个例子,或者找不到与我有同样问题的人。如果有人能告诉我它有什么问题。提前谢谢。
编辑:我之前测试了交换,它确实有效,但它似乎很难与记录数组一起使用。
答案 0 :(得分:0)
您可以访问您的阵列越界。您的数组长度为grandprixnum
,因此您可以访问0
到grandprixnum-1
for(int a=1; a < grandprixnum; a++)
// ^
{
for(int b=0; b < grandprixnum-1; b++)
// ^ ^^ -1 because of b+1
{
if(grand[b].points < grand[b+1].points)
{
...
}
}
}
如果在函数中没有返回任何内容,则不需要返回类型。使用void sorting()
,void input()
,void showtable()
您声明了数组grand
两次。在函数input
中按时全局和第二次本地。将其声明为全局并在函数input
中分配。
DriverData * grand = NULL;
int input()
{
...
grand = new DriverData[grandprixnum];
答案 1 :(得分:0)
从此行删除等号:
for(int b=0; b<=grandprixnum; b++)
所以它会是这样的:
for(int b=0; b<grandprixnum; b++)
并替换此行
DriverData * grand = new DriverData[grandprixnum];
与
grand = new DriverData[grandprixnum]; // will store in global variable