数据结构课程设计最好用.docx
- 文档编号:14875901
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:79
- 大小:223.79KB
数据结构课程设计最好用.docx
《数据结构课程设计最好用.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计最好用.docx(79页珍藏版)》请在冰点文库上搜索。
数据结构课程设计最好用
《数据结构》课程设计报告
1、成绩分析问题
2、全国交通咨询模拟
学院(系):
计算机科学与工程学院
班级:
XXXXXXXXX
学生姓名:
XXX学号111030601XX
指导教师:
XXX
2012年12月17日到2013年1月4日
一、课程设计概述:
本次数据结构课程设计共完成两个题:
成绩分析问题和全国交通咨询模拟。
使用语言:
C++
编译环境:
TC3.0/VC6.0
二、课程设计题目一
[实验内容]
成绩分析文档资料
[问题描述]
录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。
[需求分析]
1.通过键盘输入各学生的多门课程的成绩,建立相应的文件sc.txt
2.对文件sc.txt中的数据进行处理,要求具有如下功能:
a.按各门课程的成绩排序,并生成相应的文件输出
b.计算每人的平均成绩,按平均成绩排序,并生成文件
c.求出各门课程的平均成绩、不及格人数、60-69分人数、
70-79分人数、80-89分人数、90分以上人数
d.根据姓名或学号查询某人的各门课成绩,重名也要能处理
3.界面美观
[概要设计]
-=ADT=-
{
save(intn)//保存函数
intload()//加载记录或可以计算记录个数的函数
voidprintf_face()//显示一个记录的函数
browse()//浏览(全部)模块函数
voidprintf_back()//一个任务结束时的选择浏览还是返回的函数
average(inti)//求平均值函数
no_input(inti,intn)//学号输入函数
score_input(inti)//分数输入函数
input(inti)//输入一个记录函数
modify_data(inti,intn)//修改记录函数
enter()//输入模块函数
add()//追加模块函数
modify()//修改模块函数
del()//删除模块函数
inth(chark)//查找模块函数
insert()//插入模块函数
voidsift(RecNoder[],intt,intw)//排序模块(按平均成绩)函数
voidfenduantongji()//统计模块函数
teacher()//教师界面函数
st()//学生界面函数
distin()//密码函数
menu()//主界面函数
}
[存储结构]
structstudent//学生信息结构体
{charnum[11];//学号
charname[20];//姓名
intscore[8];//成绩(英语数学C语言管理学信检体育近代史线数)
doubleave;//平均分
}stu[N];
typedefstructnode
{unsignedlongintkey;
structnode*link;
}HNode;
typedefstruct
{intkey;/*排序码*/
floatdata;/*其他数据项*/
}RecNode;
[流程图]
(1)程序设计组成框图
(2)模块功能说明
1输入新数据:
完成全部学生记录的输入。
2添加数据:
添加新学生所有信息。
3增加功能:
增加新学生的部分信息。
4删除功能:
删除学生信息。
5浏览全部学生数据:
输出所有学生信息。
6学号查询:
按学号查询学生信息。
7插入学生信息:
插入新学生信息。
8按平均分排序:
按平均分高低显示学生记录。
9分段统计:
查询各等次学生信息。
10退出系统。
11.返回主界面。
(3)程序流程图
[详细设计]——源程序清单(重要程序段和其重要变量的说明)
#include
#include
#include
#include
#include
/*控制学生记录的容量*/
#defineN40
#definePRprintf("\n\r%s%s%s%s%s%s%s%s%s%s%s",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].score[5],stu[i].score[6],stu[i].score[7],stu[i].score[8],stu[i].ave)
structstudent
{charnum[11];
charname[20];
intscore[8];
floatave;
}stu[N];
typedefstructnode{unsignedlongintkey;
structnode*link;}HNode;
typedefstruct{intkey;/*排序码*/
floatdata;/*其他数据项*/}RecNode;
/*全新保存函数*/
save(intn)/*保存函数,保存n个记录*/
{FILE*fp;
inti;
if((fp=fopen("sc.txt","wb"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/
{printf("\n不能打开文件\n");
getch();returnNULL;
}
for(i=0;i if(stu[i].ave! =0)/*stu[i].ave=0表此记录已删除*/ if(fwrite(&stu[i],sizeof(structstudent),1,fp)! =1) printf("文件输入错误\n"); fclose(fp); return0; } /*加载记录或可以计算记录个数的函数*/ intload()/*加载记录或可以计算记录个数的函数*/ {FILE*fp; inti; if((fp=fopen("sc.txt","rb"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/ {printf("\n不能打开文件\n"); getch();returnNULL; } for(i=0;! feof(fp);i++) fread(&stu[i],sizeof(structstudent),1,fp); fclose(fp); return(i-1);/*返回记录个数*/ } voidputs___()/*显出---函数*/ {puts("\n--------------------------------------------------------------------"); } /*显示数据结构项目函数*/ voidprintf_face()/*显示数据结构项目*/ {printf("\n学号姓名英语数学C语言管理学信检体育近代史线数平均分\n"); } /*显示一个记录的函数*/ printf_one(inti)/*显示一个记录的函数*/ {intj; printf("%12s%-9s",stu[i].num,stu[i].name); for(j=0;j<8;j++) printf("%-6d",stu[i].score[j]); printf("%-7.2f\n",stu[i].ave); return0; } teacher(); /****************浏览(全部)模块****************/ browse()/*浏览(全部)模块*/ {inti,n; n=load();/*加载记录*/ system("cls"); puts___(); printf_face();/*调用显示数据结构项目函数*/ for(i=0;i {if((i! =0)&&(i%10==0))/*目的是分屏显示*/ {printf("\n\nPassanykeytocontiune..."); getch(); puts("\n\n"); } printf_one(i);/*调用显示一个记录的函数*/ } puts___(); printf("\tThereare%drecord.\n",n); printf("\nPassanykeytoback..."); getch();/*按任意健*/ teacher(); return0; } /*一个任务结束时的选择浏览还是返回的函数*/ voidprintf_back()/*一个任务结束时的选择浏览还是返回*/ {intw; printf("\n\n\t^-^★成功★^-^\n\n"); printf("请选择: \n\n\t1).现在浏览全部\t2).返回: []\b\b"); scanf("%d",&w);system("cls"); if(w==1)browse(); elseteacher(); } average(inti)/*对第i个记录的分数求平均值*/ {intj; intsum; for(sum=0,j=0;j<8;j++) sum+=stu[i].score[j]; stu[i].ave=sum/8.0; return0; } /*学号输入函数*/ no_input(inti,intn)/*i表示第i个的学生信息,n表示比较到第n个学生*/ {intj,k,w1; do {w1=0; printf("学号: "); scanf("%s",stu[i].num); for(j=0;stu[i].num[j]! ='\0';j++)/*学号输入函数,作了严格规定*/ if(stu[i].num[j]<'0'||stu[i].num[j]>'9')/*判断学号是否为数字*/ {puts("Inputerror! Onlybemadeupof(0-9).Pleasereinput! \n"); w1=1;break; } if(w1! =1) for(k=0;k /*排除第i个学生记录即你要修改的*/ if(k! =i&&strcmp(stu[k].num,stu[i].num)==0)/*判断学号是否有雷同*/ {puts("该记录已存在.请重新输入! \n"); w1=1;break; } } while(w1==1); return0; } /*对分数输入*/ score_input(inti) {intj;printf("1.英语2.数学3.C语言4.管理学5.信检6.体育7.近代史8.线性代数\n"); for(j=0;j<8;j++) {printf("score%d: ",j+1); scanf("%d",&stu[i].score[j]); } return0; } /*输入一个记录函数*/ input(inti)/*输入一个记录函数*/ { no_input(i,i);/*调用学号输入函数*/ printf("姓名: "); scanf("%s",stu[i].name); score_input(i);/*调用分数输入函数*/ average(i);/*调用求平均值函数*/ return0; } /*修改记录函数*/ modify_data(inti,intn)/*修改数据函数,修改第i个记录*/ {intc,w1; do/*输入选择作个判断*/ {puts("\nmodifyby=>\n\n1).学号2.姓名3).英语4).数学\n5).C语言6).管理学7).信检8).体育9).近代史\n10).线性代数11).allscore12).alldata13).cancelandback"); printf("请选择: []\b\b"); scanf("%d",&c);system("cls"); if(c>13||c<1) {puts("\n选择错误! 重新选择! ");/*判断选择是否错误,若是则重新选择性*/ getchar();/*当输入是字符时可以防止死循环*/ } } while(c>13||c<1); do {switch(c)/*选择要修改的项目*/ {case1: no_input(i,n);break;/*调用学号输入函数*/ case2: printf("姓名: ");scanf("%s",stu[i].name);break; case3: printf("英语: ");scanf("%d",&stu[i].score[0]);break; case4: printf("数学: ");scanf("%d",&stu[i].score[1]);break; case5: printf("C语言: ");scanf("%d",&stu[i].score[2]);break; case6: printf("管理学: ");scanf("%d",&stu[i].score[3]);break; case7: printf(": 信检");scanf("%d",&stu[i].score[4]);break; case8: printf("体育: ");scanf("%d",&stu[i].score[5]);break; case9: printf("近代史: ");scanf("%d",&stu[i].score[6]);break; case10: printf("线性代数: ");scanf("%d",&stu[i].score[7]);break; case11: score_input(i);break;/*调用分数输入函数*/ case12: input(i);break;/*调用输入整条学生记录*/ case13: teacher();/*直接返回教师介面*/ } if(c>2&&c<10) average(i);/*调用求平均值函数*/ puts("\nNow: \n"); printf_face();/*调用显示数据结构项目函数*/ printf_one(i);/*修改后的记录让用户确认*/ printf("\n是否确定? \n\n\t1).确定2).重新修改3).不保存返回[]\b\b");/*是否确定*/ scanf("%d",&w1);/*选择2则表示这次修改错误要重新修改*/ } while(w1==2); return(w1);/*返回控制值*/ } /****************输入模块****************/ enter()/*输入模块*/ {inti,n; printf("输入学生总数(0-%d)? : ",N); scanf("%d",&n);/*要输入的记录个数*/ printf("\n现在输入数据\n\n"); for(i=0;i {printf("\nInput%dthstudentrecord.\n",i+1); input(i);/*调用输入函数*/ } if(i! =0)save(n);/*调用保存函数*/ printf_back(); return0;/*一个任务结束时让用户选择是浏览还是返回*/ } /****************追加模块****************/ add()/*追加模块*/ {inti,n,m,k; FILE*fp; n=load(); printf("增加的学生总数(0-%d)? : ",N-n); scanf("%d",&m);system("cls");/*输入要追加的记录个数*/ k=m+n; for(i=n;i {printf("\nInput%dthstudentrecord.\n",i-n+1); input(i);/*调用输入函数*/ } if((fp=fopen("sc.txt","ab"))==NULL)/*以ab方式打开文件,追加保存*/ {printf("不能打开文件\n"); return0; } for(i=n;i if(fwrite(&stu[i],sizeof(structstudent),1,fp)! =1) printf("文件输入错误\n"); fclose(fp); printf_back(); return0;/*一个任务结束时的选择浏览还是返回*/ } /****************修改模块****************/ modify()/*修改模块*/ {structstudents; inti,n,k,w0=1,w1,w2=0; n=load(); do {system("cls"); k=-1; /*给用户看全部记录以便确认要修改的记录*/ puts___();/*显示-----*/ printf_face();/*调用显示数据结构项目函数*/ for(i=0;i {if((i! =0)&&(i%10==0))/*目的是分屏显示*/ {printf("\n\nRememberNO.whichneededmodify.passanykeytocontiune..."); getch(); puts("\n\n"); } printf_one(i);/*调用显示一个记录的函数*/ } puts___(); do {printf("\n\n输入修改学号! NO.: "); scanf("%s",s.num);system("cls");/*输入要修改的数据的学号*/ for(i=0;i if(strcmp(s.num,stu[i].num)==0) {k=i;/*找到要修改的记录*/ s=stu[i];/*把stu[i](即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/ } if(k==-1)printf("\n\n不存在! 重新输入"); } while(k==-1);/*当K=-1表示没有找到*/ printf_face();/*调用显示数据结构项目函数*/ printf_one(k);/*调用显示一个记录的函数*/ w1=modify_data(k,n);/*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/ if(w1==1)/*W1等于1时则表示用户确定这次修改*/ {printf("\n^-^★成功★^-^.\n\n是否修改其他? \n\n\t1).是2).保存返回\t[]\b\b"); scanf("%d",&w0); w2=1;/*来控制保存,使w2=1是标记已有过修改*/ } else {w0=0; if(w2==1) stu[k]=s; }//走到这里是由于用户没有确认这次修改(在调用修改函数w1=modify_data(k,n);时没有确认).使W0=0,为了让终止循环, //stu[k]=s//,则把备份的s恢复给stu[k](即当次修改的),这样的好处是确保在此之前修改过的成功保存,而本次(用户没有确认的)不修改*/ if(w0! =1&&w2==1)/*W0不等于1则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认修改的并返回*/ save(n);/*w2不等于1表示在此次之前没有修改过(即: 第一次),而又反悔这次修改,则不保存返回*/ } while(w0==1); teacher(); return0; } /****************删除模块****************/ del()/*删除模块*/ {structstudents; inti,n,k,c,w0=1; n=load(); do {system("cls"); k=-1; /*给用户看全部记录以便确认要删除的记录*/ puts___(); printf_face();/*调用显示数据结构项目函数*/ for(i=0;i if(stu[i].ave! =0) {if((i! =0)&&(i%10==0))/*目的是分屏显示,每10个一屏*/ {printf("\n\nRememberNO.whichneededdel.passanykeytocontiune..."); getch(); puts("\n\n"); } printf_one(i);/*调用显示一个记录的函数*/ } puts___(); do {printf("\n\n输入删除学号! NO.: "); scanf("%s",s.num);system("cls");/*输入要修改的数据的学号*/ for(i=0;i if(strcmp(s.num,stu[i].num)==0) {k=i;/*找到要修改的记录的下标赋给K*/ s=stu[i]; } if(k==-1)printf("\n\n不存在! 重新输入");/*K=-1,表示没有找到相同之的*/ } while(k==-1); puts("\n"); printf_face();/*调用显示数据结构项目函数*/ printf_one(k);/*调用显示一个记录的函数*/ printf("\n是否确定? \n\t1).是2).否且删除其他3).保存全部返回[]\b\b"); scanf("%d",&c);system("cls"); if(c==1) {stu[k].ave=0;/*stu[k].ave=0用来标识这个记录是要删除的.保存时则不保存stu[k].ave=0的数据*/ printf("\n\n^-^★成功★^-^.\n\n是否重输? \n\t1).是2).返回菜单\t[]\b\b");/*问是否继续*/ scanf("%d",&w0); } if(c==3)w0=0;/*w0=0不删除直接返回*/ if(w0! =1&&c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 最好