结构数组第一个元素在排序后变为零

时间:2014-09-02 06:19:01

标签: c++

我编写代码以从文本文件中读取学生姓名及其CGPA,并将它们保存在类型结构数组中,然后根据CGPA按升序对它们进行排序。排序后数组的第一个元素是空白的,为什么?

学生类型的结构

struct student{
      char name[20];
      float cgpa;
};

读取文件的代码

while(!inFile.eof()){    
   inFile>>students[i].name >> students[i].cgpa;  
   cout << i << "\t" << students[i].name << "\t\t" << students[i].cgpa << endl;
   i++;  
} 

交换函数,用于根据CGPA按升序排序数组内容。

void swap(student studentsRcrd[]){
 student tempValue;
  for(int i=0; i<10; i++){      
      for(int j=0; j<10; j++){
         if(studentsRcrd[j].cgpa > studentsRcrd[j+1].cgpa){
                tempValue = studentsRcrd[j];
                studentsRcrd[j] = studentsRcrd[j+1] ;
                studentsRcrd[j+1] = tempValue;
         }
      }
  }
}

命令提示符下的最终输出

No      Name            CGPA
0       ▄               0
1       Maria           2.4
2       Humza           2.6
3       Saira           2.6
4       Anila           3
5       Junaid          3
6       Usman           3.4
7       Aasim           3.5
8       Talaal          3.8
9       Haris           3.9
10      Ahmer           4

2 个答案:

答案 0 :(得分:1)

交换功能必须如下所示

void swap(student studentsRcrd[]){
 student tempValue;
  for(int i=0; i<9; i++){      
      for(int j=0; j<9; j++){
         if(studentsRcrd[j].cgpa > studentsRcrd[j+1].cgpa){  
                tempValue = studentsRcrd[j];
                studentsRcrd[j] = studentsRcrd[j+1] ;
                studentsRcrd[j+1] = tempValue;
         }
      }
  }
}

因为当j == 10,那么studentsRcrd [j + 1]将是studentsRcrd [11]并且在这个位置确实没有放任何东西所以它有零,所以虽然排序函数把这个零放在顶部因为它最较小的值,然后按升序打印。 所以将循环条件更改为

i < 9

j < 9

答案 1 :(得分:0)

您有10名成员的数据!那是0到9.但是当你使用 -

for(int i=0; i<10; i++){ 
   for(int j=0; j<10; j++){

j == 9它将数据与下一个内存位置(j = 10)交换时,这不在你的范围内! 试试这个 -

for(int i=0; i<9; i++){  // Make i<9 and j<9
      for(int j=0; j<9; j++){ // when j == 9, it will swap the data with next memory location
         if(studentsRcrd[j].cgpa > studentsRcrd[j+1].cgpa){
                tempValue = studentsRcrd[j];
                studentsRcrd[j] = studentsRcrd[j+1] ;
                studentsRcrd[j+1] = tempValue;
      }
}