//samp2.c -- by tsaiwn@csie.nctu.edu.tw #include #include typedef struct { long id; char name[9]; float height; double score; int rank; // 名次 } Student; Student x[999]; double nRand(double avg, double std, double min, double max); int getData( ); void printData(int n, int flag); void sort( ) { } int main( ) { int nStu; nStu = getData( ); printData(nStu, 0); printf("=== ===\n"); sort( ); printData(nStu, 1); return 0; } int getData( ){ static char cn[ ][3]={ "趙", "錢", "孫", "李", "陳", "林"}; static char first[ ][5]= { "阿三", "小弟", "三8", "4久", "小五", "阿水", "大華" }; int cnLen = (sizeof(cn) / sizeof(cn[0]) ); int firstLen =(sizeof(first) / sizeof(first[0]) ); int i, k, n; long baseID = 9817000; k = 5; // example for(i=1; i<= k; ++i) { // 第 0 個故意不用 x[i].id = baseID + i; n = rand( ) % cnLen; strcpy(x[i].name, cn[n]); n = rand( ) % firstLen; strcat(x[i].name, first[n]); x[i].height = nRand(168, 8, 135, 198); // [135, 198] } return k; } void printData(int n, int flag){ //印出 n 個人的 data, x[1] .. x[n]; 注意第 0 個故意不用 // flag == 0 表示不印名次 int i; printf("學 號 姓 名 身高"); if(flag!=0) printf(" 名次"); printf("\n"); for(i=1; i<=n; ++i) { printf("%ld ", x[i].id); printf("%-9s ", x[i].name); printf("%7.2f ", x[i].height); //身高 if(flag!=0) printf(" %3d", x[i].rank); printf("\n"); } } double nRand(double avg, double std, double min, double max){ // Normal distribution N(avg, std*std) int i; double ans; ans=0.0; for(i=1; i<=12; ++i) { ans += (rand( )%32768L)/32768.0; } ans -= 6.0; ans = avg + ans*std; // 調整到規定的 range, 即 [min, max] if(ansmax) ans = max; return ans; }