/* written by 1jjk mail:lingjiujianke@gmail.com
使用的是结构数组实现!其实可以用链表,而且可能会更方便些。
听说是科技大学的作业,不知道是不是真的。
综合程序设计
【实验目的】
本实验是综合性的,目的是通过这些程序对所学内容和算法进行复习,进一步提高程序设计的能力。
【实验内容】 学生成绩管理
编写一个C程序,对一个班(不多于35人)的学生成绩进行管理,其中:每个学生的数据包括学号、姓名、三门课的成绩(英语、数学、计算机)、平均成绩和总成绩。
程序执行时,主界面如下:
主菜单
===========================================================
1、数据输入 2、数据输出
3、数据排序(按平均分) 4、数据查找(按学号)
6、数据删除
7、数据统计(按平均分) 0、退出
============================================================
请输入您的选择(0—7):
其中各个选项的功能如下:
1、 数据输入:按一定格式输入若干名学生的数据。(要求对输入格式有所提示)
2、 数据输出:用比较美观的格式输出所有学生的数据。如果没有记录,输出提示信息。
如:
学号 姓名 英语 数学 计算机 平均成绩
=================================================================
…… …… …… …… …… ……
=================================================================
3、 数据排序:对输入的数据按平均分进行由低→高的排序(可采用冒泡法或选择法)。
4、 数据查找:查找指定学号的学生数据,并按照一定的格式输出查找结果。(要求用折半查找算法,并可实现连续查找。)
6、 数据删除:删除指定学号的学生数据。(要求能够进行连续删除,如果没有找到该学生,输出提示信息。)
7、 数据统计:按平均分统计各个分数段的学生人数,用比较美观的格式输出统计结果。如:
按平均分统计各分数段学生人数
=========================================================================
分数段 0—59 60—69 70—79 80—89 90—100
人 数 ..... ...... ...... ...... ......
==========================================================================
3 退出:退出整个程序的运行。(注:1—7功能运行后,程序仍返回主界面,可接着选择其他功能继续运行,只有选择选项0才真正退出程序的运行。)
[ 注:]原题目5已删除。
要求:
1. 数据的存储可采用结构数组、链表或文件中的任意一种。
2. 若采用结构数组,则预先定义数组的大小应足够容纳所有的数据(建议用符号常量来存放数组的大小,便于修改),同时应有一个全局变量存放输入的实际数据个数,当进行数据输入、数据插入、数据删除时,该全局变量的值应根据情况进行更新。
3. 各个子功能的实现可通过编写相应的函数来解决,函数之间的数据传递可采用参数传递的方法或采用全局变量的方法来实现。
4.界面设计要以用户为中心, 要求数据输入应有提示,操作方便,输出结果格式应美观。
5. 呈交完整的实验报告,实验报告包括:
1) 系统分析
2) 模块设计(包括各函数模块的设计思路、流程图)
3) 重点和难点分析(设计中的重点和难点问题及其处理办法)
4) 程序源代码
5) 总结和体会
比我以前写的那个记录,多了一个排序和删除
*/
/* written by 1jjk mail:lingjiujianke@gmail.com */
#include<stdio.h> typedef struct{ unsigned int number; char name[20]; unsigned int english; unsigned int math; unsigned int computer; unsigned int ave; }stuinfo; stuinfo stu[600]; int counter=0; char filename[50]="/root/11.txt"; FILE *fp;
int output(); int insert(); int search(); int stat(); int taxis(); int delete();
/*显示目录*/ int menu(void) { printf("\n===============================================\n"); printf("\t\t\tthe main menu\n"); printf("\t1. insert the data\t\t2. output the data\n"); printf("\t3. data taxis\t\t\t4. search the data\n"); printf("\t5. delete the data\t\t6. data stat\n"); printf("\t7. exit the menu\n"); printf("===============================================\n"); printf("please input the number you want to choose [the number form 1----7]:"); return 0; }
int main() { int num; if((fp=fopen(filename,"w"))==NULL) { printf(" error"); } fprintf(fp,"%-10s%-10s%-10s%-10s%-10s%-10s","number","name","english","math","computer","ave"); fclose(fp);
while(1) { menu(); scanf("%d",(int)&num); if(num>7||num<0) { printf("input error\n"); return 0; } switch(num) { case 1: insert(); break; case 2: output(); break; case 3: taxis(); break; case 4: search(); break; case 5: delete(); break; case 6: stat(); break; case 7: return 0; default: printf("you have input other num,please in put the num from 1 to 7.\n"); break;
} } return 0; }
/*输入成绩*/ int insert() { int aver; counter++; /*如果人数超过590就自动弹出错误并返回*/ if(counter>590) { printf("error!"); return 0; }
if((fp=fopen(filename,"a"))==NULL) { printf(" error"); } /*输入学生姓名*/ printf("\nplease in put the student name:"); /*输入学生姓名*/ scanf("%s",stu[counter].name); printf("\nplease input the student's english grade:"); /*输入学生英语成绩*/ scanf("%d",&stu[counter].english); /*如果输入的成绩不符实,则出错*/ if(stu[counter].english>100) { printf("input wrong\n"); return 0; } if(stu[counter].english<0) { printf("input wrong\n"); return 0; } /*输入数学成绩*/ printf("\nplease input the student's math grade:"); /*出入数学成绩*/ scanf("%d",&stu[counter].math); /*如果输入的成绩不符实,则出错*/ if(stu[counter].math>100) { printf("input wrong\n"); return 0; } if(stu[counter].math<0) { printf("input wrong\n"); return 0; } /*输入计算机成绩*/ printf("\nplease input the student's computer grade:"); /*输入计算机成绩*/ scanf("%d",&stu[counter].computer); /*如果输入的成绩不符实,则出错*/ if(stu[counter].computer>100) { printf("input wrong\n"); return 0; } if(stu[counter].computer<0) { printf("input wrong\n"); return 0; }
aver=(stu[counter].english+stu[counter].math+stu[counter].computer)/3; stu[counter].ave=aver; stu[counter].number=counter; /*输入文件,内容为姓名,英语成绩,数学成绩,计算机成绩。平均成绩,都是结构数组*/ fprintf(fp,"\n%-10d%-10s%-10d%-10d%-10d%-10d", stu[counter].number, stu[counter].name, stu[counter].english, stu[counter].math, stu[counter].computer, stu[counter].ave); /*在屏幕上输出结果*/ printf("%-10s%-10s%-10s%-10s%-10s%-10s","number","name","english","math","computer","ave"); printf("\n%-10d%-10s%-10d%-10d%-10d%-10d\n", stu[counter].number, stu[counter].name, stu[counter].english, stu[counter].math, stu[counter].computer, stu[counter].ave);
fclose(fp); return 0; }
/*输出文件内的所有内容*/ int output() { char ch; printf("\n"); if((fp=fopen(filename,"r"))==NULL) { printf(" error"); }
while((ch=fgetc(fp))!=EOF) { printf("%c",ch); }
fclose(fp); return 0; }
/*根绝学生的平均成绩的大小排序*/ int taxis() { stuinfo mid; unsigned int a=1, b=1; if((fp=fopen(filename,"rb"))==NULL) { printf("error!"); return 0; }
while(b<counter) { while(a<=counter) { fscanf(fp,"%d%s%d%d%d%d",&a, stu[a].name,&stu[a].english,&stu[a].math,&stu[a].computer,&stu[a].ave); a++; } a=1; while(a<counter) { if(stu[a].ave>stu[a+1].ave) { mid=stu[a]; stu[a]=stu[a+1]; stu[a+1]=mid; } a++; }
b++; } fclose(fp); if((fp=fopen(filename,"w"))==NULL) { printf("error!"); return 0; } fprintf(fp,"%-10s%-10s%-10s%-10s%-10s%-10s\n","number","name","english","math","computer","ave"); printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","number","name","english","math","computer","ave"); a=1; while(a<=counter) { fprintf(fp,"%-10d%-10s%-10d%-10d%-10d%-10d\n",a, stu[a].name,stu[a].english,stu[a].math,stu[a].computer,stu[a].ave); printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",a, stu[a].name,stu[a].english,stu[a].math,stu[a].computer,stu[a].ave); a++; }
fclose(fp); return 0; }
/*根据学号查找学生的成绩*/ int search() { unsigned int a; printf("\nplease input the number you want to find:"); scanf("%d",&a); if(a>590) { printf("the num you input is very large\n"); return 0; } if(a<0) { printf("the num you input is small then 0\n"); return 0; } if((fp=fopen(filename,"rb"))==NULL) { printf("error!"); return 0; }
fscanf(fp,"%d%s%d%d%d%d",&a, stu[a].name,&stu[a].english,&stu[a].math,&stu[a].computer,&stu[a].ave); printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",a, stu[a].name,stu[a].english,stu[a].math,stu[a].computer,stu[a].ave); fclose(fp); return 0; }
/*删除指定内容*/ int delete() {
unsigned int a,b; printf("\nplease input the number you want to delete:");
if((fp=fopen(filename,"rb"))==NULL) { printf("error!"); return 0; } a=1; while(a<=counter) { fscanf(fp,"%d",&a); a++; } fclose(fp);
if((fp=fopen(filename,"w"))==NULL) { printf("error!"); return 0; } scanf("%d",&a); printf("you want delete %d\n",a); for(b=a;b<=counter;b++) { stu[b-1]=stu[b]; } counter=counter-1; for(a=1;a<=counter;a++) { fprintf(fp,"%-10d%-10s%-10d%-10d%-10d%-10d\n",a, stu[a].name,stu[a].english,stu[a].math,stu[a].computer,stu[a].ave); printf("%-10d%-10s%-10d%-10d%-10d%-10d\n",a, stu[a].name,stu[a].english,stu[a].math,stu[a].computer,stu[a].ave); } fclose(fp); return 0; }
/*平均分人数统计*/ int stat() { unsigned int a=1,c=0,d=0,e=0,f=0,g=0; if((fp=fopen(filename,"rb"))==NULL) { printf("error!"); return 0; } while(a<=counter) { fscanf(fp,"%d",&a); a++; } a=1; while(a<(counter+1)) { if(stu[a].ave<60) { c++; } else if(stu[a].ave>=60&&stu[a].ave<70) { d++; } else if(stu[a].ave>=70&&stu[a].ave<80) { e++; } else if(stu[a].ave>=80&&stu[a].ave<90) { f++; } else if(stu[a].ave>=90&&stu[a].ave<=100) { g++; } a++; } printf("\n============================================================\n"); printf("%-10s%-10s%-10s%-10s%-10s\n","0--59","60--69","70--79","80--89","90--100"); printf("%-10d%-10d%-10d%-10d%-10d\n", c, d, e, f, g); fclose(fp); return 0; }
|