2015-12-29 36 views
0

我刚开始学习C++,并且一直在研究一些问题来磨练我的技能。目前,我遇到了一个问题,即交换我的记录数组的某些值。输入验证工作正常,但后来当我尝试交换程序周围的值停止响应和崩溃。下面是我创造它: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

是否有原因,您为什么将'DriverData * grand'定义为全局以及局部变量? – MikeMB

+0

另外你的代码不能编译,因为'input','sorting'和'showtable'不返回值。这是你的真实代码吗? – MikeMB

+0

您不必按字段进行交换。 'std :: swap(grand [b],grand [b + 1]);'会对你的结构做正确的事情。 – Blastfurnace

回答

0

你访问你的数组越界。你的阵列具有grandprixnum的长度,所以你可以从0如果之三是没有在你不需要返回类型的函数返回访问elments到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中分配它。

for(int b=0; b<=grandprixnum; b++) 

因此,这将是这样的:

DriverData * grand = NULL; 

int input() 
{ 
    ... 
    grand = new DriverData[grandprixnum]; 
+0

感谢您的回复。修复了问题,程序现在工作正常。我相信我意外地在输入函数中声明了数组。再次感谢您如此迅速地回复并解决问题。 –

0

从该行删除等号

for(int b=0; b<grandprixnum; b++) 

而替换该行

DriverData * grand = new DriverData[grandprixnum]; 

grand = new DriverData[grandprixnum]; // will store in global variable 
+0

感谢您的回复。答案的第一部分有帮助,但下半场抛出了范围错误。但是,下面的答复解决了这个问题。 –