admin 管理员组文章数量: 1086019
2024年4月25日发(作者:德州html5培训)
课程设计说明
课程设计目的:
通过此课程,更系统和全面地掌握程序设计的相关知识,巩固和加深《C程序设
计》理论知识,把理论与实践相结合,掌握基本编程技巧,学习调试程序,锻炼
独立思考能力,培养创新思维,提高编程能力。
本程序运用了数组、指针、结构体、函数、循环语句、文件保存和读取等知识,
由于上学期时间紧张,部分知识并没有学透彻。通过这次机会,可以获得更深的
理解和应用,为以后学习打下坚实的基础。
软件的总体结构图以及主要功能模块
学生信息管理系统
一
输
入
和
添
加
信
息
二
查
找
信
息
三
修
改
信
息
四
成
绩
排
序
五
文
件
处
理
六
浏
览
记
录
一、 输入和添加信息模块
使用此模块时,系统会提示你想要输入的学生数目,然后通过for的循环语句实
现逐个输入学生学号、姓名、年龄、成绩等,并进行总分计算和排名。如果想再
输入新信息,系统会开辟新空间,并提示你是否覆盖以前信息,从而实现新信息
1
按
学
号
按
姓
名
打
开
文
件
显
示
信
息
保
存
文
件
退出系统
的输入。
未进行此操作前,先进行其它操作,系统都会提示你现在没有信息。
二、 查找信息模块
输入信息后进行此操作,系统会提示你是按学号查找,还是按姓名查找,然后通
过字符串的比较查找信息,并在屏幕显示是否找到信息。若没找到,系统会提示
没有要找的信息;若找到信息,就会在屏幕上把信息内容显示出来。
三、 修改信息
进行此操作时,系统会提示你是按学号还是按姓名查找,然后把要修改人的信息
全部显示出来,再次确认是否真的要修改。若要修改,就输入新信息,把要修改
的信息覆盖,并重新排名,把修改后的信息全部显示出来。
四、 成绩排序
此模块包括四个被调函数,应用了字符串和指针知识。同样,系统会提示你是按
学号还是按姓名(abc)排序,选择后,系统会提示是按升序还是降序排列,最
终把排序后的信息全部显示出来。
五、 文件处理
文件处理包含文件的打开和文件的保存。应用文件打开和关闭函数,以读写方式
将文件保存到一个二进制文件中。若未保存前,先打开文件,如果无信息,系统
会提示没有文件;如果有信息,系统会提示你先保存文件。打开文件后,可以在
屏幕上显示全部信息。
六、 浏览信息
随时浏览最新信息。学生学号、姓名、各科成绩、总成绩、排名等一目了然。
源程序:
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/
#define course 3 /*学科数目*/
typedef struct message_student /*结构体定义*/
{
char number[6];
char name[20];
int age;
float subject[course];
float score;
int index;
}student;
extern int numstus; /*学生数目*/
extern student *pointer; /*指向结构体数组*/
extern int lens;
2
int openfile(student stu[]);
int findrecord(student stud[]);
int writetotext(student stud[]);
void welcome();
void display1();
void showtable();
void sort(student stu[]);
void addrecord(student stud[]);
void display(student stud[],int n1,int n2);
void amendrecord(student stud[]);
void count(student stud[]);
void sortnum(student stud[]);
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void display(student stud[],int n1,int n2) /*浏览信息*/
{
int i;
showtable(); /*显示表头*/
for(i=n1;i<=n2;i++)
printf("t%st%st%dt%.2ft%.2ft%.2ft%.2ft%dtn",stud[i].number,stud[i].name,st
ud[i].age,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].score,stud[i].ind
ex);
/*通过循环输出数据*/
}
int findrecord(student stud[]) /*查找信息*/
{
char str[2];
char i;
if(numstus==0)
{
printf("No records to searchn");
}
else
{
printf("search by?");
scanf("%s",str);
3
if(str[0]=='1') /*按学号查找*/
{
printf("Enter num:");
scanf("%s",&str);
for(i=0;i if(strcmp(str,stud[i].number)==0) { display(stud,i,i); break; } else continue; } else if(str[0]=='2') /*按姓名查找*/ { printf("Enter name:"); scanf("%s",str); for(i=0;i if(strcmp(str,stud[i].name)==0) { display(stud,i,i); break; } else continue; } if(i>numstus) { printf("No records to searchn"); return -1; } return i; } } int openfile(student *stu) /*打开文件*/ { int i=0; student *p; FILE *fp; p=stu; char filename[20],str[2]; if(numstus!=0) { 4 printf("Record existed,save?(y/n)"); scanf("%s",str); if(str[0]=='y'||str[0]=='Y') writetotext(stu); } printf("Enter file name:"); scanf("%s",&filename); numstus=0; free(p); if((fp=fopen(filename,"rb"))==NULL) { printf("Cannot open filen"); return(-1); } for(i=0;i { if(fread(&stu[i],sizeof(student),1,fp)!=1) i++; numstus++; {if(!feof(fp)) return(-1); printf("file read errorn"); } } fclose(fp); printf("Read sucessfullyn"); printf("Reveal record?(y/n)"); scanf("%s",&str); if(str[0]=='y'||str[0]=='Y') display(stu,0,numstus-1); return(0); } void sort(student stud[]) /*排序*/ { int j=0; int k; char str; student *p; p=stud; if(numstus==0) { printf("No records to search!"); } while(1) 5 { aa: printf(" numbern"); printf(" namen"); scanf("%d",&k); if(k==1) { printf("Order by:n"); bb: printf("1.按升序t"); printf("2.按降序n"); scanf("%d",&k); if(k==1) sortnum2(p); else if(k==2) sortnum(p); else goto bb; display(stud,0,numstus-1); } else if(k==2) { printf("Order by:n"); cc: printf("1.按升序t"); printf("2.按降序n"); scanf("%d",&k); if(k==1) sortname2(p); else if(k==2) sortname(p); else goto cc; display(stud,0,numstus-1); } else goto aa; printf("Exit order?(y/n)"); scanf("%s",&str); if(str=='n'||str=='N') goto aa; else return; } } void sortnum(student stud[]) { int i,j; student temp; student *p; 6 p=stud; for(i=0;i for(j=0;j { if(strcmp(stud[j+1].number,stud[j].number)>0) { temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } } void sortnum2(student stud[]) { int i,j; student temp; student *p; p=stud; for(i=0;i for(j=0;j { if(strcmp(stud[j].number,stud[j+1].number)>0) { temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } } void sortname(student stud[]) { int i,j; student temp; student *p; p=stud; for(i=0;i for(j=0;j { if(strcmp(stud[j+1].name,stud[j].name)>0) { temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } 7 } } void sortname2(student stud[]) { int i,j; student temp; student *p; p=stud; for(i=0;i for(j=0;j { if(strcmp(stud[j].name,stud[j+1].name)>0) { temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } } } int writetotext(student stud[]) /*将所有记录写入文件*/ { int i=0; student *p; FILE *fp; char filename[20]; printf("Enter file name:"); scanf("%s",&filename); fp=fopen(filename,"wb"); while(i { p=&stud[i]; if(fwrite(p,sizeof(student),1,fp)==1) i++; } fclose(fp); printf("Save successfully!n"); display(stud,0,numstus-1); numstus=0; return 0; } void welcome() { 8 printf("t************************************************************* n"); printf("tt ☆★☆★欢迎使用学生成绩管理系统★☆★☆nttttn"); printf("t************************************************************* n"); } void showtable() { printf("------------------------------------------------------------------------------n"); printf("t学号t姓名t年龄t计算机t英语t数学t总分t名次n"); printf("------------------------------------------------------------------------------n"); } void amendrecord(student stud[]) /*修改信息*/ { char str[5]; int j,i=-1; if(numstus==0) /*没有记录返回*/ printf("No records to modify!"); while(i<0) { i=findrecord(stud); if(i>=0) { printf("Modify the record or no?(y/n)"); scanf("%s",&str); if(str[0]=='y'||str[0]=='Y') { printf("Renew recordn"); printf("Enter number:"); scanf("%s",stud[i].number); printf("Enter name:"); scanf("%s",stud[i].name); printf("Enter age:"); scanf("%d",&stud[i].age); stud[i].score=0; printf("Enter scores by order(用空格隔开):"); for(j=0;j { 9 scanf("%f",&stud[i].subject[j]); stud[i].score+=stud[i].subject[j]; } } count(stud); } display(stud,0,numstus-1); } } void count(student stud[]) /*排名*/ { int i,j; for(i=0;i { stud[i].index=1; for(j=0;j if(stud[j].score>stud[i].score) stud[i].index++; } } void addrecord(student stud[]) /*输入和添加信息*/ { int i=0,j,num; char str[5]; if(numstus!=0) { printf("Cover the existed record or no?(y/n)n"); scanf("%s",str); if(str[0]=='Y'||str[0]=='y') i=0; else i=numstus; } printf("How many students to insert:"); scanf("%d",&num); if(i==0) numstus=num; else numstus+=num; if(numstus>lens) { lens+=50; 10 pointer=(student *)realloc(pointer,lens*LEN); } for(;i { getchar(); printf("Enter number:"); gets(pointer[i].number); printf("Enter name:"); gets(pointer[i].name); printf("Enter age:"); scanf("%d",&pointer[i].age); printf("Enter 3 scores(用空格隔开):"); stud[i].score=0; for(j=0;j { scanf("%f",&stud[i].subject[j]); /*计算总分*/ stud[i].score+=stud[i].subject[j]; } } count(stud); /*附名次*/ display(stud,0,numstus-1); getchar(); } int numstus; int lens; student *pointer; void main() { int i=1; lens=100; pointer=(student *)malloc(lens*LEN); /*分配内存*/ numstus=0; welcome(); /*欢迎界面*/ printf("nn"); abc: printf(" t◇**** 1. 输入和添加记录 printf(" t◆**** 3. 修改记录 printf(" t◇**** 5. 打开文件 printf(" t◆**** 7. 浏览记录 printf("nn"); printf("请选择功能编号(0-7):"); scanf("%d",&i); switch(i) 11 2. 查找记录 ****◇n"); 4. 成绩排序 ****◆n"); 6. 保存文件 ****◇n"); 0. 退出系统 ****◆n"); { case 1:addrecord(pointer);break; /*增加学生信息*/ case 2:findrecord(pointer);break; /*查询学生信息*/ case 3:amendrecord(pointer);break; /*修改学生信息*/ case 4:sort(pointer);break; /*学生信息排序*/ case 5:openfile(pointer);break; /*打开文件*/ case 6:writetotext(pointer);break; /*保存文件*/ case 7:display(pointer,0,numstus-1);break; /*显示记录*/ case 0: {printf("nntt★☆谢谢您的使用!☆★nn");goto end;} /*退出系统*/ default:printf("Enter number 0~7:n"); /*输入错误*/ } goto abc; end: ; getchar(); getchar(); } 运行结果: 12 13 14 总结: 本程序主要功能是查询学生信息,包括计算总分和排名次等。在运行各功能模块 时,都会有相关信息提示,以防出错,并综合应用了指针、结构体、数组、字符 串、循环语句、文件等方面的知识。 15 其中排序功能模块最为严密,运用了字符串和指针的相关知识,还运用了goto 语句,防止因输错而无法进行此项操作。部分代码如下: printf("Order by:n"); bb: printf("1.按升序t"); printf("2.按降序n"); scanf("%d",&k); if(k==1) sortnum2(p); else if(k==2) sortnum(p); else goto bb; 如果输入的不是1或2,则重新选择,然后显示结果。如果你进行了按学号降序 排列,还想尝试一下其它排列,比如,按姓名,或者按升序,则以下部分代码可 以实现你的愿望,而不必再返回主菜单进行选择。 printf("Exit order?(y/n)"); scanf("%s",&str); if(str=='n'||str=='N') goto aa; else return; 因时间紧迫,此程序还有很多不足之处,否则可以更严密,功能也可更加完善, 比如,可以再添加一个求平均分的模块,还可以为程序加一个密码。 通过此课程,我学到了很多。我不仅系统的学到了编程的很多知识,更领悟了生 活态度。 通过自学,我学会了使用typedef,并在此程序中成功运用。我还学会了调试程序 的新方法,利用特殊键定位调试。 因为心急,我当时在文件相关的程序还没有调试出来的情况下就答辩了,结果当 然不理想。于是答辩后,我自己又来到图书馆查找资料,最终将程序调试正确, 并成功运行。这时,我心里有说不出的喜悦。我深深地体会到学习要有耐心,更 要细心,只要坚持,就一定会成功!学习中是这样,生活中更是这样,我坚信“坚 持就是胜利” ! 16
版权声明:本文标题:C语言设计-学生成绩管理系统 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1714054364a663479.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论