C语言课程设计报告—学生选修课程系统设计
中 国 地 质 大 学
本科生课程
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
封面
课程名称 C语言课程设计 教师姓名 本科生姓名 本科生学号
本科生专业 所在院系 类别: C.本科生 日期: 2012年09月05日
1
课程设计评语 对课程论文的评语:
平时成绩: 课程论文成绩: 总 成 绩: 评阅人签名:
注:1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中标出,并计算入总成绩。
2
目 录
课程设计评语 ...................................................................................................................................... 2 目 录.................................................................................................................................................... 3 1(课程论文
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目 ................................................................................................................................ 4
2(程序设计思路 ................................................................................................................................ 5
3(功能模块图 .................................................................................................................................... 5 4(数据结构设计 ................................................................................................................................ 6
5(算法设计........................................................................................................................................ 6 6(程序代码...................................................................................................................................... 12 7(程序运行结果 .............................................................................................................................. 22
8(编程中遇到的困难及解决方法 .................................................................................................. 23
9(
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
心得及良好建议 .................................................................................................................. 24
10(致谢............................................................................................................................................ 24
3
1(课程论文题目
名称:学生选修课系统设计
【要求】
假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课时间,实验或上级时间,学分,开课学期等信息,学生可按要求(如总学分不超过60)自由选课。是设计一选修课课程系统,使只能提供以下功能:
(1) 系统一菜单方式工作
(2) 课程信息和学生选课信息录入功能(课程信息用文件保存 输入
(3) 课程信息浏览功能——输出
(4) 查询功能(至少一种查询方式)——算法
(5) 按学分查询
(6) 某门课程学生选修情况(可选项)
【提示】
数据结构可用结构体,包括授课和选课两个结构体,其中课程结构体成员包括编号,课程名称,课程性质,总学时,授课学时,实验或上机时间,学分,开课学期。学秀结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况。
4
2(程序设计思路
由于题目要求将学生的选课信息用结构体形式输入,并写入文件中,所以应提供文件的输入输出等操作:在过程中需有浏览、插入、修改、查找、删除学生选课信息等操作,顾应分别建立个功能模块;另外还应提供键盘式选择菜单实现程序运行。
根据题目要求,可以将系统分为六个模块:
1) 系统以菜单方式工作模块;
2) 课程信息与学生选课信息录入功能模块;
3) 课程信息浏览功能模块;
4) 查询模块;
5) 按学分查询模块;
6)某些课程学生选修情况模块
3(功能模块图
5
学生选修课程系统
按系统课程课程查某些
以菜信息信息询学课程
单方与学浏览模分学生
式工生选功能查选修块
作模课信询情况模块
块 息录模模块
入功块
能模
块
4(数据结构设计
该程序采用多个main()函数模块分别来实现程序的运行,通过使用数组功能来实现数据的录入,使用strcpy()函数来实现录入信息的复制,整个结构从整体来看使用了选择结构,break ..case ..的合理利用
5(算法设计
1.课程信息录入功能
void savefile(SUB *head)
{ 开始
SUB *p;
FILE *fp;
fp=fopen("subjects.txt","w"); 输出
6
写入文件并储存
输入
结束
fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p-
>stime,p->ttime,p->etime,p->score,p->term);
fclose(fp);
}
void savefileadd(SUB *head)
{
SUB *p;
FILE *fp;
fp=fopen("subjectsadd.txt","w");
fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p-
>stime,p->ttime,p->etime,p->score,p->term);
fclose(fp);
}
7
2.查询功能
开始 void search(SUB *head)
{
int a,num; 打开文件查看学生选课信息 int t=1;
char type[10];
2 char ch='a',ch1; 1 判断查询方法 SUB *ptr;
按学分查 按课程性质 输入
查
结束
while(ch!=' '){
printf("若要按课程性质查找请输入1,若要按学分查找请输入2:\n");
scanf("%d",&a);
switch(a){
case 1:printf("请输入要查找的课程的性质:\n");
scanf("%s",type);
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(type,ptr->kind)==0){
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,pt
r->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
break;
case 2:printf("输入要查找的课程的学分\n");
scanf("%d",&num);
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(ptr->score==num){
8
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,pt
r->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
}
printf("继续查找请按回车键,结束请按空格键:\n");
ch1=getchar(); //将回车键赋给CH1,否则CASE里面最后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
}
3.插入、删除信息功能
SUB *insert(SUB *head)
{
SUB *ptr,*ptr2,*subj;
int size=sizeof(SUB);
char ch='a',ch1;
while(ch!=' '){
subj=(SUB *)malloc(size);
ptr=subj;
printf("输入要插入的课程信息:\n");
scanf("%d%s%s%d%d%d%d%d",&subj->num,subj->name,subj->kind,&subj->sti
me,&subj->ttime,&subj->etime,&subj->score,&subj->term);
if(head==NULL){
head=ptr;
head->next=NULL;
}
else{
for(ptr2=head;ptr2;ptr2=ptr2->next)
9
if(ptr2->next==NULL){
ptr2->next=subj;
subj->next=NULL;
break;
}
}
printf("继续插入请按回车,结束请按空格:\n");
ch1=getchar(); //将回车键赋给CH1,否则
subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
return head;
}
SUB *del(SUB *head)
{
SUB *p1,*p2;
char ch='a',ch1;
int num;
while(ch!=' '){
printf("输入想要删除的课程编号:\n");
scanf("%d",&num);
if(head->num==num){
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2){
if(p2->num==num){
p1->next=p2->next;
free(p2);
}
else p1=p2;
p2=p1->next;
}
printf("继续删除请按回车,结束请按空格:\n");
10
ch1=getchar(); //将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
} 开始
return head;
} 输入、选课
4.选课功能
void choose(SUB *head) N
判断是否是要选的课程
选定、输出
{
SUB *p,*q; 结束
int a[5];
int num,total=0,i=0,j;
printf("输入要选修的课程的编号,编号之间以空格分开,输完后以0结束\n");
scanf("%d",&num);
while(num!=0){
for(p=head;p;p=p->next)
if(p->num==num){
total=total+p->score;
a[i]=num;
i++;
}
scanf("%d",&num);
}
if(total<60) printf("选修总学分未达到60,选修失败!\n");
else {
printf("选修成功!\n");
printf("您选修的课程为:\n");
for(j=0;j
next)
11
if(q->num==a[j])
printf("%s ",q->name);
printf("\n");
printf("***********************************\n");
printf("***********************************\n");
printf("***********************************\n");
printf("***********************************\n");
}
6(程序代码
#include
#include
#include
typedef struct subjects
{
int num;
char name[20];
char kind[10];
int stime;
int ttime;
int etime;
int score;
int term;
struct subjects *next;
}SUB;
12
SUB *create_form() {
SUB *head,*tail,*p;
int num,stime,ttime;
int etime,score,term;
char name[20],kind[10];
int size=sizeof(SUB);
head=tail=NULL;
printf("输入选修课程信息:\n");
scanf("%d %s %s %d %d %d %d %d",&num,&name,&kind,&stime,&ttime,&etime,&score,&term);
while(num!=0){
p=(SUB *)malloc(size);
p->num=num;
strcpy(p->name,name); strcpy(p->kind,kind);
p->stime=stime;
p->ttime=ttime;
p->etime=etime;
p->score=score;
p->term=term;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
scanf("%d %s %s %d %d %d %d %d",&num,&name,&kind,&stime,&ttime,&etime,&score,&term);
}
tail->next=NULL;
13
return head;
}
void savefile(SUB *head)
{
SUB *p;
FILE *fp;
fp=fopen("subjects.txt","w");
fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->tt
ime,p->etime,p->score,p->term); fclose(fp);
}
void savefileadd(SUB *head) {
SUB *p;
FILE *fp;
fp=fopen("subjectsadd.txt","w"); fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学
分 开课学期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->tt
ime,p->etime,p->score,p->term);
14
fclose(fp);
}
void savefiledel(SUB *head) {
SUB *p;
FILE *fp;
fp=fopen("subjectsdel.txt","w");
fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\n");
for(p=head;p;p=p->next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->tt
ime,p->etime,p->score,p->term); fclose(fp);
}
void prin(SUB *head)
{
SUB *ptr;
if(head==NULL){
printf("没有此门课程记录!\n");
return;
}
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分
开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
15
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,p
tr->ttime,ptr->etime,ptr->score,ptr->term); }
void search(SUB *head)
{
int a,num;
int t=1;
char type[10];
char ch='a',ch1;
SUB *ptr;
while(ch!=' '){
printf("若要按课程性质查找请输入1,若要按学分查找请输入2:\n");
scanf("%d",&a);
switch(a){
case 1:printf("请输入要查找的课程的性质:\n");
scanf("%s",type);
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(type,ptr->kind)==0){
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,p
tr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
16
break;
case 2:printf("输入要查找的课程的学分\n");
scanf("%d",&num);
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(ptr->score==num){
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,p
tr->ttime,ptr->etime,ptr->score,ptr->term);
t=0;
}
if(t) printf("未找到!\n");
t=1;
}
printf("继续查找请按回车键,结束请按空格键:\n");
ch1=getchar(); //将回车键赋给CH1,否则CASE里面最后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
}
SUB *insert(SUB *head)
{
SUB *ptr,*ptr2,*subj;
int size=sizeof(SUB);
char ch='a',ch1;
17
while(ch!=' '){
subj=(SUB *)malloc(size);
ptr=subj;
printf("输入要插入的课程信息:\n");
scanf("%d%s%s%d%d%d%d%d",&subj->num,subj->name,subj->kind,&subj->stime,&subj->tt
ime,&subj->etime,&subj->score,&subj->term);
if(head==NULL){
head=ptr;
head->next=NULL;
}
else{
for(ptr2=head;ptr2;ptr2=ptr2->next)
if(ptr2->next==NULL){
->next=subj; ptr2
subj->next=NULL;
break;
}
}
printf("继续插入请按回车,结束请按空格:\n");
ch1=getchar(); //将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
return head;
}
18
SUB *del(SUB *head) {
SUB *p1,*p2;
char ch='a',ch1;
int num;
while(ch!=' '){
printf("输入想要删除的课程编号:\n");
scanf("%d",&num);
>num==num){ if(head-
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2){
if(p2->num==num){
p1->next=p2->next;
free(p2);
}
else p1=p2;
p2=p1->next;
}
printf("继续删除请按回车,结束请按空格:\n");
19
ch1=getchar(); //将回车键赋给CH1,否则num输完后再输入的
回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
return head;
}
void choose(SUB *head) {
SUB *p,*q;
int a[5];
int num,total=0,i=0,j;
printf("输入要选修的课程的编号,编号之间以空格分开,输完后以0结束\n");
scanf("%d",&num);
while(num!=0){
for(p=head;p;p=p->next)
if(p->num==num){
total=total+p->score;
a[i]=num;
i++;
}
scanf("%d",&num); }
if(total<60) printf("选修总学分未达到60,选修失败!\n");
else {
printf("选修成功!\n");
printf("您选修的课程为:\n");
for(j=0;jnext)
if(q->num==a[j])
printf("%s ",q->name);
printf("\n");
printf("***********************************\n");
printf("**********************************\n");
printf("**********************************\n");
printf("***********************************\n");
}
}
void main()
{
SUB *head=create_form();
savefile(head);
prin(head);
search(head);
head=insert(head); //注意此处的必要性,函数insert的的返回值重新赋给head!
savefileadd(head);
printf("修改后的信息为:\n");
prin(head);
head=del(head); //注意此处的必要性,函数del的的返回值重新赋给head!
savefiledel(head);
printf("修改后的课程信息为:\n");
prin(head);
21
choose(head);
}
7.程序运行结果
22
7(编程中遇到的困难及解决方法 1.问题:程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。
解决方法:.算法上除了采用结构体数组外,考虑在程序的算法设计上引入链表结构,考察这样对数据组织存贮效率上是否具有提高作用 2.问题:程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。
23
解决方法:对每个数据输入段代码进行更深的研究与分析,明确变量的类型、可能的数值,然后进行分类判断(if或switch语句),必要时借助for循环语句来控制程序进行,保障各模块运行相对独立,稳定准确执行各自功能。典型方法是如果输入数据错误,通过printf输出问题,并用for或(do)while构成循环,输入三次以上程序自动跳出主菜单或直到用户输入正确为止。
9(总结心得及良好建议
程序的源代码为白手写起,历时,天,克服了非常多的困难,感觉到了很大的压力。程序的源代码是在边看
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。程序源代码经过数次精简,但仍然比较庞大,应是编程经验不足造成的,虽不能说本程序源代码比他人的类似代码运行效率更高,占有资源更少,但是程序执行的准确性还是能够保障的。
10(致谢
首先得感谢绍老师这8晚上的指导,在此表示衷心的感谢~其次也
24
感谢那些在我们不懂得时候给予我们帮助的同学。起初,我们刚开始实习时,对内容掌握度根本就不够,通过了8天的上机实习及课后的查阅资料、询问同学才对自己的程序有了系统的认识及完成程序的设计思路,并在大家的帮助下完成了本次课程设计的全部内容,看着自己做出来的东西心中莫名的开心,在这次过程中也历练了自己的耐心及学习方法。总之在这次实习中获益匪浅。对绍老师再次表示感谢~
25