带有记录数组的C ++交换函数

时间:2015-12-29 12:30:34

标签: c++ arrays crash record swap

我刚刚开始学习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 (); 
}

我环顾四周,找不到一个例子,或者找不到与我有同样问题的人。如果有人能告诉我它有什么问题。提前谢谢。

编辑:我之前测试了交换,它确实有效,但它似乎很难与记录数组一起使用。

2 个答案:

答案 0 :(得分:0)

您可以访问您的阵列越界。您的数组长度为grandprixnum,因此您可以访问0grandprixnum-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