我以前编过的一个作业和你的差不多,给你参考一下。我是按成绩的升序显示并保存于一个结构数组中的学生记录,但不得改变结构数组中学生记录的原有的排列顺序。 学生记录的结构如下: struct Student{ //学生结构记录 char num[8]; //学号 char name[10]; //姓名 short grade; //成绩 }; 程序如下: #include <string.h> #include<iomanip.h> struct Student{ //学生结构记录 char num[8]; //学号 char name[10]; //姓名 short grade; //成绩 }; Student a[5]={{"ch231","小敏",69},{"ec115"," 小文",82},{"dt327","小明",72},{"cs102","小平",78},{"bx214","小远",65}}; //显示Student型的全局结构数组a中的n个记录 void output(int n) { cout<<"显示具有Student结构的"<<n<<"个记录:"<<endl; cout.setf(ios::left); //使输入数据左对齐显示,默认对齐方式为右对齐 for(int i=0;i<n;i++){ cout<<stew(8)<<a[i].num<<stew(12)<<a[i].name; cout<<stew(5)<<a[i].grade<<endl; } cout<<endl; } //以数组b中元素为下标,显示a中的对应记录 void output1(int *b,int n) { cout.setf(ios::left); for(int i=0;i<n;i++){ cout<<stew(8)<<a[i].num<<stew(12)<<a[i].name; cout<<stew(5)<<a[i].grade<<endl; } cout<<endl; } //对数组的n个学生记录按grade的升序显示,但不允许改变a中记录的原有位置 void rangel(int n) { int i,*b=new int[n]; for(i=0;i<n;i++) b[i]=i; //一开始b[i]的值为a[i]的下标i for(i=1;i<n;i++){ //顺序处理无序表中的元素 int d=b[i]; //取出无序表中的第一个下标,让出空位 int j; //从后向前检查有序表中下标所对应的记录,寻找插入位置 for(j=i;j>0&&a[b[j-1]].grade>a[d].grade;j--) b[j]=b[j-1]; //不能插入当前空位,表中下标后移,空位前移 b[j]=d; //找到插入位置,下标插入空位 } output(b,n); //利用位置数组b输出数组a中的记录 delete[] b; } void main() { int n=5; cout<<"输出数组a中的记录"<<endl; output(n); } 程序的输出结果是: 输出具有Student结构的5个记录: ch231 小敏 69 ec115 小文 82 dt327 小明 72 cs102 小平 78 bx214 小远 65 按记录中grade值域的升序输出数组a中的记录: bx214 小远 65 ch231 小敏 69 dt327 小明 72 cs102 小平 78 ec115 小文 82 再一次输出数组a中的记录: 输出具有Student结构的5个记录: ch231 小敏 69 ec115 小文 82 dt327 小明 72 cs102 小平 78 bx214 小远 65 [此贴子已经被作者于2004-1-1 16:14:00编辑过]
|