1 #include<stdio.h> 2 #include<string.h> 3 #include <stdlib.h> 4 #define N 3 5 struct Student{ 6 int num; 7 char name[25]; 8 char major[10]; 9 int classNo; 10 int score[4]; 11 }; 12 typedef struct Student STU; 13 void Input(STU *p); 14 void Output(STU *p); 15 void Save(STU *p); 16 int Fetch(STU *st,int n,char *filename); 17 void Max(STU stu[],int m); 18 double average_person(STU *p); 19 void sort_select(STU *p); 20 void Sort_Buble(STU *p); 21 void Sort_insert(STU *p); 22 void Search(STU *p); 23 void Ask(); 24 25 26 void main() 27 { 28 int choose; 29 int i,j,m,n; 30 char filename[10]; 31 STU stu[N]; 32 STU *p; 33 p=stu; 34 35 while(1) 36 { 37 printf("\n——————————————————————————————————————————\n"); 38 printf("|/ # 已經進入 大連海事大學--學生信息管理系統 # //\n"); 39 printf("———————————————————————————————————————————\n\n\n"); 40 printf("|///#No.1 ---- 輸入學生我的信息 ---- \n"); 41 printf("|///#No.2 ---- 輸出學生我的信息 ---- \n"); 42 printf("|///#No.3 ---- 保存學生信息 ---- \n"); 43 printf("|///#No.4 ---- 讀取學生信息 ---- \n"); 44 printf("|///#No.5 ---- 輸出某門課程的最高分和分數最高的學生的姓名 ----\n"); 45 printf("|///#No.6 ---- 對某專業的學生按總平均成績進行簡單選擇排序 ---- \n");/*MOU 專業*/ 46 printf("|///#No.7 ---- 按平均成績對某班學生進行冒泡排序 ---- \n"); 47 printf("|///#No.8 ---- 對某班學生按某門課程成績進行直接插入排序 ---- \n");/*班級*/ 48 printf("|///#No.9 ---- 按照班級和成績的查找某位學生信息 ---- \n"); 49 printf("\n **注意:如果輸入其餘數字直接退出系統//**\n\n\n"); 50 printf("———————————————————————————————————————————\n\n\n"); 51 printf("請輸入選擇的功能編號:"); 52 53 scanf("%d",&choose); 54 switch(choose) 55 { 56 case 1: 57 { 58 59 for(i=0;i<N;i++) 60 { 61 Input(stu+i); 62 } 63 Ask(); 64 break; 65 66 } 67 case 2:{ 68 printf("請輸入想要輸出第幾個學生的信息:\n"); 69 scanf("%d",&n); 70 71 if (n>=0 && n<N) 72 Output(stu+n-1); 73 else 74 printf("沒有這名學生!請從新輸入!"); 75 76 Ask(); 77 break; 78 79 } 80 case 3:{ 81 getchar(); 82 Save(stu); 83 printf("文件保存成功!\n"); 84 Ask(); 85 break; 86 } 87 case 4: 88 { 89 printf("請輸入讀入的文件名:"); 90 scanf("%s",filename); 91 printf("請輸入要提取信息的位置號:"); 92 scanf(" %d",&j); 93 if (j>=0 && j<=N) 94 { 95 if ( Fetch(stu,j,filename)==0) 96 printf("提取失敗!\n"); 97 } 98 99 Ask(); 100 break; 101 102 } 103 case 5: 104 { 105 printf("請輸入想求最高分的科目代號(1,2,3),總成績代號:4:\n"); 106 scanf("%d",&m); 107 Max(p,m); 108 Ask(); 109 break; 110 } 111 112 case 6:/*6*/ 113 { 114 getchar(); 115 printf("對某專業的學生,按總平均成績由低到高排序結果爲:\n"); 116 sort_select(stu); 117 Ask(); 118 break; 119 120 } 121 122 case 7: 123 { 124 Sort_Buble(stu); 125 Ask(); 126 break; 127 128 } 129 case 8: 130 { 131 Sort_insert(stu); 132 Ask(); 133 break; 134 135 } 136 case 9: 137 { 138 getchar(); 139 Search(stu); 140 Ask(); 141 break; 142 } 143 default: 144 { 145 break; 146 147 } 148 } 149 if((choose<1)||(choose>10)) 150 break; 151 } 152 } 153 154 void Input(STU *p) 155 { 156 int j; 157 printf("請輸入學生的學號:\n"); 158 scanf("%d",&p->num); 159 getchar(); 160 printf("請輸入學生的姓名 \n"); 161 gets(p->name); 162 printf("請輸入學生的專業 軟件工程:soft/網絡工程:net/計算機科學與技術:computer \n"); 163 gets(p->major); 164 printf("請輸入學生的班級 1班/2班,:\n"); 165 scanf("%d",&p->classNo); 166 getchar(); 167 printf("請分別按順序輸入學生的三門成績:高數/英語/物理 \n"); 168 for(j=0;j<3;j++) 169 { 170 printf("請輸入第%d門成績 :\n",j+1); 171 scanf("%d",&p->score[j]); 172 getchar(); 173 } 174 p->score[3]=p->score[0]+p->score[1]+p->score[2]; 175 } 176 177 void Output(STU *p) 178 { 179 180 printf("學號:%d\t| 姓名%s\t| 專業:%s\t| 班級:%d\t| 高數成績:%d\t| 英語成績:%d\t| 物理成績:%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]); 181 182 183 184 } 185 double average_person(STU *p){//此函數將會被求平均成績的函數調用 186 187 return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0); 188 189 } 190 191 void Save(STU *p) 192 { 193 FILE *fp; 194 char filename[20]; 195 int i; 196 printf("請輸入要保存的文件名稱:\n"); 197 gets(filename); 198 if((fp=fopen(filename,"wb"))==NULL) 199 { 200 printf("新建文件失敗 請重試請從新輸入\n"); 201 return; 202 } 203 for(i=0;i<N;i++) 204 { 205 if(fwrite(p++,sizeof(STU),1,fp)!=1) 206 printf("文件寫入失敗 請從新輸入\n"); 207 } 208 fclose(fp); 209 } 210 211 212 int Fetch(STU *p,int n,char *filename) 213 { 214 FILE *fp; 215 if((fp=fopen(filename,"rb"))==NULL) 216 { 217 fclose(fp); 218 return 0; 219 } 220 fseek(fp,(long)sizeof(STU)*n,0);//將位置指針從文件的開始日後移n個STU結構體的長度,n是提取的位置。 221 if ( (fread(p,sizeof(STU),1,fp)) != 1) 222 { 223 printf("文件錄入失敗 請從新輸入:"); 224 fclose(fp); 225 return 0; 226 } 227 Output(p); 228 fclose(fp); 229 return 1; 230 } 231 232 233 234 void Max(STU stu[],int m) 235 { 236 237 int i,index; 238 int y[N]; 239 STU *p; 240 p=stu; 241 for(i=1;i<=N;i++)//定義一個長度爲N的數組,做爲下標。 242 y[i-1]=i-1; 243 244 switch(m) 245 { 246 247 case 1: 248 { 249 for(i=1;i<N;i++) 250 if((p+y[0])->score[0]<(p+y[i])->score[0])//讓最高分的同窗放到第一名的位置上來。 251 { 252 index=y[0]; 253 y[0]=y[i]; 254 y[i]=index; 255 } 256 p=p+y[0]; 257 printf("\t第1門最高分爲:"); 258 printf("%d\n",p->score[0]); 259 printf("\t得最高分的同窗名字是:"); 260 puts(p->name); 261 break; 262 } 263 case 2: 264 { 265 for(i=1;i<N;i++) 266 if((p+y[0])->score[1]<(p+y[i])->score[1]) 267 { 268 index=y[0]; 269 y[0]=y[i]; 270 y[i]=index; 271 } 272 p=p+y[0]; 273 printf("\t第2門最高分爲:"); 274 printf("%d\n",p->score[1]); 275 printf("\t得最高分的同窗名字是:"); 276 puts(p->name); 277 break; 278 } 279 case 3: 280 { 281 for(i=1;i<N;i++) 282 if((p+y[0])->score[2]<(p+y[i])->score[2]) 283 { 284 index=y[0]; 285 y[0]=y[i]; 286 y[i]=index; 287 } 288 p=p+y[0]; 289 printf("\t第3門最高分爲:"); 290 printf("%d\n",p->score[2]); 291 printf("\t得最高分的同窗名字是:"); 292 puts(p->name); 293 break; 294 } 295 case 4: 296 { 297 for(i=1;i<N;i++) 298 if((p+y[0])->score[3]<(p+y[i])->score[3]) 299 { 300 index=y[0]; 301 y[0]=y[i]; 302 y[i]=index; 303 } 304 p=p+y[0]; 305 printf("\t總成績最高分爲:"); 306 printf("%d\n",p->score[3]); 307 printf("\t得最高分的同窗名字是:"); 308 puts(p->name); 309 break; 310 } 311 default: 312 break; 313 } 314 315 } 316 317 //對某專業學生,按總平均成績由低到高進行簡單選擇排序。 318 void sort_select(STU *p)/*6*/ //STU是學生結構體,stu是學生結構體數組 319 { 320 int i,j,k; 321 char b[15]; 322 double t,aver[N]; 323 STU a; 324 printf("請選擇一個專業(請輸入已經錄入的專業名稱):\n"); 325 gets(b); 326 for(i=0;i<N;i++) 327 { 328 aver[i]=average_person(p+i); 329 //((*(p+i)).score[0]+(p+i)->score[1]+(p+i)->score[2])/3.0; 330 } 331 for(i=0;i<N-1;i++) 332 { 333 k=i; //肯定要比較的數,先選擇第一個數進行比較。 334 for(j=i+1;j<N;j++) 335 if(aver[k]>aver[j]) 336 k=j; //記下位置,繼續讓大的數和下一位進行比較。 337 t=aver[i]; 338 aver[i]=aver[k]; 339 aver[k]=t;//交換,把大的數向後移一位;若是if爲假,k=i,至關於不進行交換。 340 341 a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;//利用結構體指針變量交換結構體 342 } 343 for(i=0;i<N;i++){ 344 if(strcmp((p+i)->major,b)==0){ 345 printf("專業:%s\t班級:%d\t姓名:%s\t平均成績:%5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]); 346 } 347 } 348 } 349 350 351 //對某個班級的學生,按總平均成績由高到低進行起泡排序。 352 void Sort_Buble(STU *p)/*7*/ 353 { 354 int i,j,b; 355 double t,aver[N]; 356 STU a; 357 printf("選擇一個班級(請輸入已經建立的班級):\n"); 358 scanf("%d",&b); 359 for(i=0;i<N;i++) 360 { 361 aver[i]=average_person(p+i); 362 } 363 364 for(i=0;i<N;i++) 365 for(j=0;j<N-1-i;j++) 366 if(aver[j]<aver[j+1])//前面的數比後面的數小的話就交換,直到把最小的數放到最後。 367 { 368 t=aver[j]; 369 aver[j]=aver[j+1]; 370 aver[j+1]=t; 371 a=*(p+j); 372 *(p+j)=*(p+j+1); 373 *(p+j+1)=a; 374 } 375 for(i=0;i<N;i++) 376 if((p+i)->classNo==b){ 377 printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]); 378 } 379 } 380 381 //對某個班級的學生,按某門課程成績由低到高進行直接插入排序 382 void Sort_insert(STU *p)/*8*/ 383 { 384 int i,j,id,q,tem; 385 int score[N]; 386 char b[10]; 387 int k=0; //用於計算學生數 388 STU pai[N]; 389 STU *m; 390 STU stude[N]; 391 getchar(); //吃掉回車鍵,避免給b賦值 392 printf ("請輸入須要查當作績的班級(請輸入已經錄入的專業):"); 393 gets(b); 394 printf ("請輸入須要查當作績的班級(請輸入已經錄入的班級):"); 395 scanf ("%d",&q); 396 printf ("請輸入須要查看分數的課程(1,2,3)\n"); 397 scanf ("%d",&id); 398 getchar(); 399 for(i=0;i<N;i++,p++){ 400 if(strcmp(p->major,b)==0&&p->classNo==q){//找到某個班級的全部同窗,並把它們提取出來 401 stude[k]=*p; 402 k++; 403 } 404 } 405 pai[0]=stude[0]; 406 for(i=1;i<k;i++){ 407 for(j=i;j>=0&&stude[i].score[id-1]>pai[j].score[id-1];j--) 408 pai[j+1]=pai[j]; 409 pai[j+1]=stude[i]; 410 411 } 412 for(i=0;i<k;i++,m++){ 413 Output(m); 414 printf("\n"); 415 } 416 417 /* for (i=0; i<N; i++,p++) 418 { 419 if(strcmp(p->major,b)==0&&p->classNo==q) 420 { 421 score[k]=p->score[id-1]; 422 k++; //計算所選出的學生數 423 424 } 425 } 426 427 for (i=1; i<k; i++) 428 if (score[i-1]>score[i]) 429 { 430 struct Student tmp; 431 tem=score[i];//等於小的那個數字 432 j=i-1;//記錄大的數的位置 433 do 434 { 435 score[j+1]=score[j];//把大的數賦值給小的數,至關於把大的數字向後推了一位,可是原位置的數字不動 436 j--; 437 } 438 while (j>=0&&tem<score[j]); //把tem和較大的數的前一位比較,若是比它小,就讓大的數在日後推一個 439 score[j+1]=tem; //把tem插入到j和j+1之間的位置。 440 } 441 442 printf ("對該班級的學生,按第%d科成績由低到高進行直接插入排序爲:\n",id); 443 for (i=0; i<k; i++) 444 { 445 p=m; 446 for (j=0; j<N; j++,p++) 447 { 448 449 if (strcmp(p->major,b)==0 && (p->score[id]==score[i]) && (p->classNo==q))//而且該學生成績的這門成績等於成績數組的第i個數字 450 { 451 Output(p); 452 printf("\n"); 453 } 454 } 455 } 456 } 457 */ 458 } 459 460 //班級和成績的綜合查找 461 void Search(STU *head) 462 { 463 STU *p; 464 int b,k,sum_scores; 465 int limit_score; 466 k=0 ; // 若是輸入班級或總成績有誤,k的值不變。與後面的if相關聯。 467 printf ("請輸入該學生的班級號 \n"); 468 scanf ("%d",&b); 469 getchar(); 470 printf ("請輸入總成績>=**的學生(**爲分數)\n"); 471 scanf ("%d",&limit_score); 472 printf (" \t\t\t\t%d班總成績>=%d的學生信息爲:\t\t\t\t \n",b,limit_score); 473 for (p=head;p<head+N;p++) 474 { 475 sum_scores=(p->score[0])+(p->score[1])+(p->score[2]); 476 if((p->classNo)==b) 477 { 478 if (sum_scores >= limit_score) //知足班級號和成績界限的才能夠輸出,否則k=0; 479 { 480 printf ("該學生信息爲:\n"); 481 Output(p); 482 printf("\n"); 483 k++; 484 } 485 } 486 } 487 if (k==0) //此條件是該班級沒有符合條件的同窗 488 printf ("查找的學生信息不存在:\n"); 489 } 490 491 492 void Ask() 493 { 494 int c; 495 printf("\n已實現所選功能 輸出編號進行下一步操做:\n\n 1: 繼續選擇其餘功能 2: 再也不選擇直接退出系統\n"); 496 scanf("%d",&c); 497 if (c==2) 498 exit(0); 499 }