//genscore.c -- @CopyLeft by tsaiwn@csie.nctu.edu.tw // 注意, 萬一你的 rand( ) 最大只有 32767, // .. 那這產生的資料檔將只有前面三萬多筆是學號亂的! // ... 後面五萬多筆資料變成照學號由小而大 ! #define FILE_NAME "studat.txt" #define ID_BASE 9917001 #include #include #include #include char nameLast[ ][3]={"趙", "錢", "孫", "李", "陳", "林", "陳", "林", "吳", "魏", "王", "蔡", "章", "張","簡", "馬","蘇" }; //陳林 2 倍機會 const int N_LAST = (sizeof nameLast / sizeof(nameLast[0]) ); #define NSTU_MIN 81357 #define NSTU_VAR 200 #define NSTU_MAX (NSTU_MIN + NSTU_VAR) int myRand( ) { int ans = rand( ) % 100; // 不好, 因 uniform distribution// 0..99 if(ans < 50) ans += 66; // 太低就加 66 分 return ans % 100; // ensure 0..99, 若還變成很低就不管囉! } void genName(char*p) { char mm, m2, m3; char tmps[8]={0}; *p = 0; // 清除字串; 其實是讓字串一開始就結束 strcat(p, nameLast[rand( )% N_LAST]); mm = 'A' + rand( )%26; m2 = 'A' + rand( )%26; m3 = 'a' + rand( )%26; sprintf(tmps, "%c%c%c", mm, m2, m3); strcat(p, tmps); // 把 tmps 串接到字串 p 尾巴 ! } extern int nStudent; // 先宣告 , 因為 genID( ) 要用到 long genID( ) { static char idFlag[NSTU_MAX + 1]; int k = rand( ) % nStudent; // 一開始用亂數決定 int nTry = 0; while(idFlag[k] !=0) { k = rand( ) % nStudent; if(++nTry > 10) break; // 試10次就放棄.. } //.. 然後改用由開始往後慢慢找沒有用過的 if(idFlag[k]!=0) { // k 已經用過 k=0; // 只好從頭開始找, 找第一個未用過的 .. while(idFlag[k] !=0) ++k; // 逐一慢慢找沒有用過的 } idFlag[k] = 1; // 找到了, 就用 k, 並標示為用過了 return ID_BASE + k; // 加上基本號 ID_BASE } //genID( /// int nStudent; // 定義, 注意前面有宣告所以在這之前可以用到! long sid; char name[9]; int hwk, mid, quiz, fin; // homework, midterm, quiz, final exam void getNextStuData( ) { // generate one student's data sid = genID( ); genName(name); hwk = myRand( ); mid = myRand( ); quiz = myRand( ); fin = myRand( ); } int main( ) { FILE* fp; // file pointer for Open a data file int i; printf(" wait..."); srand( time(0) ); // randomize so that looks like TRUE Random ! int n = NSTU_MIN + rand( ) % NSTU_VAR; // 每次 run 人數不同 nStudent = n; fp = fopen(FILE_NAME, "wt"); // Open, for write, text if(fp==0){fprintf(stderr,"?open %s error...\n",FILE_NAME); return 1; } for(i = 1; i<= n; ++i) { getNextStuData( ); // 資料在 global, 省得傳來傳去 :) fprintf(fp, "%7d %9s %3d %3d %3d %3d\n", sid, name, hwk, mid, quiz, fin); }fclose(fp); fprintf(stderr, "File %s generated successfully.\n", FILE_NAME); fprintf(stderr, "Total %d student records.\n" "Hit ENTER key ...", n); getchar( ); return 0; } // main(