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 }