|
第七步,定义m a i n ( )函数,列出完整的程序清单。 #include #include struct stu { char name[20]; long number; float score[4]; } ; m a i n ( ) { void input(); / *函数声明* / void aver(); void order(); void output(); void out_row(); struct stu stud[4]; / * 定义结构体数组* / float row[3]; i n p u t ( s t u d , 4 ) ; / *依此调用自定义函数* / a v e r ( s t u d , 4 ) ; o r d e r ( s t u d , 4 ) ; o u t p u t ( s t u d , 4 ) ; o u t _ r o w ( s t u d , 4 ) ; } / * * * * * * * * * * * * * * * * * * * * * * * * * * * * / void input(arr,n) struct stu arr[]; int n; { int i,j; char temp[30]; for (i=0;i<N;I++) { printf("\nInput Name,Number,English,Mathema,Physic\n"); g e t s ( a r r [ i ] . n a m e ) ; g e t s ( t e m p ) ; a r r [ i ] . n u m b e r = a t o l ( t e m p ) ; f o r ( j = 0 ; j < 4 ; j + + ) p r i n t f ( " % 7 . 2 f | " , a r r [ i ] . s c o r e [ j ] ) ; p r i n t f ( " \ n " ) ; p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n " ) ; } } / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / void out_row(arr,n) int n; struct stu arr[]; { float row[4]={0,0,0,0}; int i,j; f o r ( i = 0 ; i < 4 ; i + + ) { f o r ( j = 0 ; j < n ; j + + ) r o w [ i ] = r o w [ i ] + a r r [ j ] . s c o r e [ i ] ; r o w [ i ] = r o w [ i ] / n ; } printf("|%19c|",' '); for (i=0;i<4;i++) p r i n t f ( " % 7 . 2 f | " , r o w [ i ] ) ; p r i n t f ( " \ n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n " ) ; }
程序中要谨慎处理以数组名作函数的参数。由于数组名作为数组的首地址,在形参和实参结合时,传递给子程序的就是数组的首地址。形参数组的大小最好不定义,以表示与调用函数的数组保持一致。在定义的结构体内,成员score[3]用于表示计算的平均成绩,也是我们 用于排序的依据。我们无法用数组元素进行相互比较,而只能用数组元素的成员score[3]进行比较。在需要交换的时候,用数组元素的整体包括姓名、学号、三科成绩及平均成绩进行交换。在程序order()函数中,比较采用:arr[j].score[3]>arr[j+1].score[3],而交换则采用: arr[j]arr[j+1] |