学生选修课程设计c语言,C语言课程设计报告—学生选修课程系统设计.doc

#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;

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;

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->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);

}

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->ttime,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)

printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->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,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){

printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->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();

}

}

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->stime,&subj->ttime,&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){

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");

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);

choose(head);

}

7.程序运行结果

7. 编程中遇到的困难及解决方法

1.问题:程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。

解决方法:.算法上除了采用结构体数组外,考虑在程序的算法设计上引入链表结构,考察这样对数据组织存贮效率上是否具有提高作用

2. 问题:程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。

解决方法:对每个数据输入段代码进行更深的研究与分析,明确变量的类型、可能的数值,然后进行分类判断(if或switch语句),必要时借助for循环语句来控制程序进行,保障各模块运行相对独立,稳定准确执行各自功能。典型方法是如果输入数据错误,通过printf输出问题,并用for或(do)while构成循环,输入三次以上程序自动跳出主菜单或直到用户输入正确为止。

9. 总结心得及良好建议

程序的源代码为白手写起,历时3天,克服了非常多的困难,感觉到了很大的压力。程序的源代码是在边看书、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。程序源代码经过数次精简,但仍然比较庞大,应是编程经验不足造成的,虽不能说本程序源代码比他人的类似代码运行效率更高,占有资源更少,但是程序执行的准确性还是能够保障的。

10. 致谢

首先得感谢绍老师这8晚上的指导,在此表示衷心的感谢!其次也感谢那些在我们不懂得时候给予我们帮助的同学。起初,我们刚开始实习时,对内容掌握度根本就不够,通过了8天的上机实习及课后的查阅资料、询问同学才对自己的程序有了系统的认识及完成程序的设计思路,并在大家的帮助下完成了本次课程设计的全部内容,看着自己做出来的东西心中莫名的开心,在这次过程中也历练了自己的耐心及学习方法。总之在这次实习中获益匪浅。对绍老师再次表示感谢!

25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值