C语言课程设计报告+源码.docx
- 文档编号:27866510
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:15
- 大小:45.75KB
C语言课程设计报告+源码.docx
《C语言课程设计报告+源码.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告+源码.docx(15页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告+源码
C语言课程设计报告
一.程序主要功能
用单向链表结构实现简单的学生成绩管理功能,具有链表建立、链表输出、结点有序插入、结点删除、数据查询等功能。
用户在主菜单界面输入选项,即按照功能列表0-9输入任意数字,回车后执行该功能。
(1)CreateList(建立有序单向链表)
从键盘上一次输入一个学生的姓名及成绩,以姓名为序建立有序链表。
插入一条记录后,显示提示信息:
确认是否输入下一条记录,如确认,继续输入,否则退出输入功能。
(2)DisplayAllRecord(显示所有结点记录)
按顺序显示链表中所有记录,每屏显示10条记录。
每显示10条,按
(3)InsertaRecord(插入一条结点记录)
在以姓名为序排列的链表中插入一条记录,插入后,链表仍有序。
输出插入成功的信息。
(4)DeleteaRecord(按姓名查找,删除一条结点记录)
输入待删除记录的姓名,显示提示信息,用户再次确认是否要删除。
确认后,将该姓名的记录删除。
(5)Query(查找并显示一个结点记录)
输入姓名,查找该记录,并显示该同学的成绩。
(6)AddRecordsfromaTextFile(从正文文件中添加数据到链表中)
从纯文本文件添加数据到链表。
(7)WritetoaTextFile
将链表中数据写入文件(纯文本文档),键入文件名后建立该文件。
(0)Quit(退出学生成绩管理系统)
释放链表存储空间。
#include
#include
#include
#include
structstud/*定义结构体*/
{
charName[80];
intScore;
structstud*next;
};
typedefstructstudStudent;/*声明新的类型名Student*/
intmenu_select();/*声明全体函数*/
Student*Create();
voidDisplay(Student*head);
Student*Insert(Student*head,Student*s);
Student*Insert_a_record(Student*head);
Student*Delete(Student*head,char*name);
Student*Delete_a_record(Student*head);
Student*Query(Student*head,char*name);
voidQuery_a_record(Student*head);
Student*AddfromText(Student*head,char*filename);
voidWritetoText(Student*head,char*filename);
voidQuit(Student*head);
main()/*主函数*/
{
Student*head=NULL;/*定义头指针为全局变量*/
for(;;)
{
switch(menu_select())/*调用menu_select()函数*/
{
case1:
/*在主函数中进行各个功能函数的调用*/
head=Create(head);
printf("ExecutionofCreateList\n");
system("pause");
break;
case2:
Display(head);
printf("ExecutionofDisplayAllRecord\n");
system("pause");
break;
case3:
head=Insert_a_record(head);
printf("ExecutionofInsertaRecord\n");
system("pause");
break;
case4:
head=Delete_a_record(head);
printf("ExecutionofDeleteaRecord\n");
system("pause");
break;
case5:
Query_a_record(head);
printf("ExecutionofQurey\n");
system("pause");
break;
case6:
head=Add_Records_from_a_Text_File(head);
printf("ExecutionofAddRecordsfromaTextFile\n");
system("pause");
break;
case7:
Write_to_text(head);
printf("ExecutionofWritetoatextfile\n");
system("pause");
break;
case0:
printf("Goodbye!
\n");
system("pause");
exit(0);
}
}
}intmenu_select()/*菜单选择函数*/
{
charc;
do{
system("cls");
printf("1.CreatList\n");
printf("2.DisplayAllrecords\n");
printf("3.InsertaRecord\n");
printf("4.DeleteaRecord\n");
printf("5.Query\n");
printf("6.AddRecordsFromaTextFile\n");
printf("7.WritetoaTextFile\n);
printf("0.Quit\n");
printf("Giveyourchoice(0-7):
");
c=getchar();
getchar();
}
while(c<'0'||c>'7');
return(c-'0');/*返回选择值*/
}
Student*Create(Student*head)/*创建链表*/
{
Student*p;charx='y';/*p为新开辟的空间的首地址*/
printf("createanincreasinglist..............");
printf("pleaseinputnameandscore:
");
while(x=='y')
{
p=(Student*)malloc(sizeof(Student));/*给p分配动态存储空间*/
scanf("%s%d",p->Name,&p->Score);
head=insert(head,p);/*调用Insert函数创建有序链表*/
printf("continue?
?
(yorn?
)");
getchar();
x=getchar();
if(x=='n'){printf("gameover...\n");break;}
else
printf("pleaseinputthenameandscore:
");
}
returnhead;/*返回头指针变量*/
}
voidDisplay(Student*head)/*显示链表数据*/
{
Student*p=head;/*通过变量P的改变对应链表中所有的数据*/
inti=1;
printf("StudentNameScore\n");
for(;p!
=NULL;i++)
{
printf("%-15s%d\n",p->Name,p->Score);
p=p->next;
if(i%10==0)
{
system("pause");/*输出10个暂停一次*/
system("cls");
printf("FUNCTIONLIST\n");
printf("1.CreatList\n");
printf("2.DisplayAllRecord\n");
printf("3.InsertaRecord\n");
printf("4.DeleteaRecord\n");
printf("5.Query\n");
printf("6.AddRecordsFromaTextFile\n");
printf("7.WritetoaTextFile\n");
printf("0.Quit\n");
printf("StudentNameScore\n");
}
}
}
Student*Insert(Student*head,Student*p)/*有序插入指针p所对应的结点到链表*/
{
Student*p1,*p2;
if(head==NULL)/*如果链表为空*/
{
head=p;
p->next=NULL;
returnhead;/*返回头指针变量*/
}
p2=p1=head;
while(strcmp(s->Name,p1->Name)>0&&(p1->next!
=NULL))/*查找功能,head指针非空的情况,当p指向的Name的首字母大于head指针指向的Name*/
{
p2=p1;
p1=p1->next;/*p1后移,再进行循环,直到s指向的Name的首字母小于等于p1指针指向的Name或p1指向了空指针*/
}
if(strcmp(p->Name,p1->Name)<=0)
{
p->next=p1;/*把p大的p1放在链表后面*/
if(head==p1)head=p;/*判断p1是否为head*/
elsep2->next=s;
}
else
{
p1->next=p;
p->next=NULL;
}/*p指向的Name的首字母大于head指针指向的Name*/
returnhead;/*返回头指针变量*/
}
Student*Insert_a_record(Student*head)/*插入结点记录*/
{
Student*p/*p为新开辟的空间的首地址*/;
p=(Student*)malloc(sizeof(Student));/*给p分配动态存储空间*/
scanf("%s%d",s->Name,&s->Score);
head=Insert(head,p);/*调用Insert函数插入*/
printf("Insertsuccessfully\n");
returnhead;/*返回头指针变量*/
}
Student*Delete(Student*head,char*name)/*删除链表中的一条数据,数组name存放删除数据姓名*/
{
Student*p1,*p2;
p1=head;
while(strcmp(p1->Name,name)!
=0&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->Name,name)==0)/*找到了姓名相同的记录*/
{
if(p1==head)
head=p1->next;/*当p1==head,p1->next为NULL,赋值给head,起到了删除的作用*/
elsep2->next=p1->next;/*p1->next为NULL,赋值给p2->next即p1,起到了删除的作用*/
}
returnhead;/*返回头指针变量*/
}
Student*Delete_a_record(Student*head)/*删除结点记录*/
{
charch,name[20];
Student*p;
scanf("%s",name);
getchar();
p=Query(head,name);
if(p==NULL)printf("CannotFind%s\n",name);
else{
printf("Delete%s,Y/N?
\n",name);
ch=getchar();
if(ch=='y'||ch=='Y')
while(p!
=NULL)
{
head=Delete(head,name);/*调用Delete函数*/
p=Query(head,name);/*调用Query函数进行查找*/
}
printf("Delete%sissuccessfully.\n",name);
}
returnhead;/*返回头指针变量*/
}
Student*Query(Student*head,char*name)/*查找一条记录,name存放待查数据姓名*/
{
Student*p;/*通过p访问所有结点*/
p=head;
while(strcmp(name,p->Name)!
=0&&p->next!
=NULL)/*查找功能,寻找需要与查找相同的记录*/
p=p->next;
if(strcmp(name,p->Name)==0)
returnp;/*p此时为文件的头指针*/
else
returnNULL;/*返回空指针*/
}
voidQuery_a_record(Student*head)/*查询一条记录*/
{
charname[20];/*定义数组存放要查找的名字*/
Student*p;/*如果有要查找的结点,P为该结点的地址*/
scanf("%s",name);
p=Query(head,name);/*调用Query函数进行查找*/
if(p!
=NULL)
{
printf("Find%ssuccessfully\n%s%d\n",p->Name,p->Name,p->Score);
}
else
printf("can'tfindtherecordsof%s\n",name);
}
Student*AddfromText(Student*head,char*filename)/*从文件添加数据*/
{
FILE*fp;/*定义指向FILE的文件指针*/
Student*p;
intn,i;
if((fp=fopen(filename,"r"))==NULL)/*用只读方式打开文件*/
{
printf("Cannotfindfile:
%s\n",filename);
returnhead;
}
fscanf(fp,"%d",&n);
for(i=0;i { p=(Student*)malloc(sizeof(Student));/*给p分配动态存储空间*/ fgetc(fp); fscanf(fp,"%s%d",p->Name,&p->Score); head=Insert(head,p);/*调用Insert函数插入*/ } printf("Addfrom%ssuccessfully\n",filename); fclose(fp);/*关闭fp1指向的文件*/ returnhead;/*返回头指针*/ } voidWritetoText(Student*head,char*filename)/*将数据写入文件*/ { FILE*fp; Student*p;/*通过指针变量p访问所有链表结点*/ intnum=0; if(head==NULL) { printf("NoRecord! \n");returnhead; } fp=fopen(filename,"w");/*打开输入了文件名的文件*/ p=head; for(;p! =NULL;num++)p=p->next; fprintf(fp,"%d\n",num); p=head; while(p! =NULL) { fprintf(fp,"%s%d\n",p->Name,p->Score);/*循环输出,在文件中循环输出数据*/ p=p->next; } printf("Writeto%ssuccessfully\n",filename); fclose(fp);/*关闭文件*/ } voidQuit(Student*head)/*释放内存空间*/ { Student*p;/*通过指针变量p访问所有链表结点*/ while(head! =NULL) { p=head; head=head->next; free(p);/*退出函数*/ } } 四.函数调用关图 五.测试流程及典型测试数据 name score aa 90 cc 86 bb 79 dd 93 ee 67 ff 76 gg 75 hh 80 ii 75 jj 89 kk 86 ll 84 mm 91 mm 87 1.执行功能1,输入上表中数据,输入‘n’返回主菜单。 2.执行功能2在第一个屏幕中只显示前十个同学的数据,按任意键后,在第二个屏幕中看到后四个同学的数据。 3.执行功能3,插入qq87,按任意键返回,执行功能2时,可以看到数据被成功插入。 4.执行功能4,输入qq87,出现“deleteqq,y/n? ”若要删除则按y以及回车,然后就会出现Deleteqqissuccessfully! 。 再执行功能2时,可以看到数据已被删除。 5.执行功能5,输入aa,输出“Findaasuccessfully! aa90” 6.先建立一个正文文件a.txt,并在里面保存数据“1pp96”,执行功能6,输入“a.txt”,回车显示“Addfroma.txtsuccessfully! ”,按任意键返回菜单。 执行功能2,会显示出加入的数据。 7.据执行功能7,输入b.txt.然后回车,显示“Writetob.txtsuccessfully! ”按任意键返回。 退出程序。 打开b.txt会显示输入的全部数据。 8.执行功能0,输入‘y’,然后回车,显示“Goodbye! ”,退出程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告 源码
![提示](https://static.bdocx.com/images/bang_tan.gif)