计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。
//程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生人数。
//重难点:结构体的定义。结构体的使用。文件指针的定义。对文件的操作。输出格式‘%4d’。两种方法获取最小值。
1 #include <stdio.h> 2 #define N 16 3 typedef struct//定义一个新结构体类型 4 { char num[10]; 5 int s; 6 } STREC;//新类型名称 7 int fun( STREC *a, STREC *b )//形参这里可以有三种定义方式,指针,数组,数组加下标 8 { 9 //第一种方法:先把第一个数定义为最小的,然后遍历,如果遇见更小的就重新赋值。 10 int i, j; 11 j = 0; 12 int min = a[0].s; 13 for (i = 1; i < N; i++) 14 { 15 if (min > a[i].s) 16 { 17 min = a[i].s; 18 } 19 } 20 for (i = 0; i < N; i++) 21 { 22 if (a[i].s == min) 23 { 24 b[j]= a[i]; 25 j++; 26 } 27 } 28 return j;//这里不是j+1,因为上面多了一次j++。 29 /* //第二种方法:先把a数组进行由小到大的排序,然后再遍历一遍,和第一个相等的,都输出出来。 30 int i, j, t; 31 STREC m; 32 t = 1; 33 for (i = 0; i < N; i++) 34 { 35 for (j = i; j < N; j++) 36 { 37 if (a[i].s > a[j].s) 38 { 39 m = a[i]; 40 a[i] = a[j]; 41 a[j]= m; 42 } 43 } 44 } 45 b[0]= a[0];//灵活变通,如果分开不能赋值的话,就把整体直接交换定义。 46 for (i = 1; i < N; i++) 47 { 48 if (b[0].s == a[i].s) 49 { 50 b[i]= a[i]; 51 t = t + 1; 52 } 53 } 54 return t;*/ 55 } 56 main() 57 { 58 //定义结构体数组。 59 STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85}, 60 {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}, 61 {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91}, 62 {"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}}; 63 STREC h[N]; 64 int i,n;FILE *out ; 65 n=fun( s,h );//以地址方式传递 66 printf("The %d lowest score :\n",n); 67 for(i=0;i<n; i++) 68 printf("%s %4d\n",h[i].num,h[i].s);//注意这里是4d,所以如果是两位数,会出现两个空格。 69 printf("\n"); 70 out = fopen("out.dat","w") ; 71 fprintf(out, "%d\n",n); 72 for(i=0;i<n; i++) 73 fprintf(out, "%4d\n",h[i].s);//可以修改out文件,考试的时候 74 fclose(out); 75 }