C语言课程设计实验报告.docx
- 文档编号:3730240
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:56
- 大小:774.98KB
C语言课程设计实验报告.docx
《C语言课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计实验报告.docx(56页珍藏版)》请在冰豆网上搜索。
C语言课程设计实验报告
C语言课程设计
班级学号
08071207080712130807123008071231
学生姓名
田如雪刘哲强 赵丹平 胡意
提交日期
2010-11-29
成绩
教师签名:
数学与信息科学学院
一、实践的目的和要求
加深对C语言课程所学知识的理解,进一步巩固C语言算法规则.学会编制结构清晰.风格良好.数据结构适当的C程序,从而具备解决综合性问题的能力.
二、内容
在熟练掌握C语言的基础知识:
数据类型(整型.实型.字符型.指针.数组.结构等);运算类型(算术运算.逻辑运算.自增自减运算.赋值运算等);程序结构(顺序结构.判断选择结构.循环结构);大程序的功能分解方法(即函数的使用)等.进一步掌握各种函数的应用以及文件的读写操作等.
三、实验任务:
学生成绩管理系统
设计要求:
实现菜单设计,使用数据文件保存和修改,应用结构体和指针
功能要求:
实现学生信息的输入,查询,插入,删除,排序,打印等操作。
四、设计思路
1.(需求分析或算法分析)学生的主要信息包括:
学号、姓名、C语言成绩、数学成绩、英语成绩、总分、平均分、名次.
2.(数据分析:
包括所涉及的函数,数据结构等)用结构体数组来存储信息,用Add()函数来实现信息的录入,用Disp()函数来显示打印信息,用Qur()函数来查找信息,
用Sort()函数来排序用Insert()函数来插入信息,用Modify()函数来修改信息,用Del()函数来删除信息,用Save()函数来保存信息,用Exit函数来退出通讯录.
3.对小组进行分工,每个人分配至少两个函数的代码实现,其余的再按情况进行分配.
5、程序代码
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"|--------------------------------学生成绩表------------------------------|\n\n"
#defineHEADER2"|学号|姓名|C语言|数学|英语|总分|平均分|名次|\n"
#defineHEADER3"|---------------|---------------|-----|----|-----|---------|-------|-----|"
#defineFORMAT"|%-10s|%-9s|%5d|%4d|%5d|%4d|%5.2f|%4d|\n"
#defineDATAp->data.num,p->data.name,p->data.cgrade,p->data.mgrade,p->data.egrade,p->data.total,p->data.ave,p->data.mingci
#defineEND"------------------------------------------------------------------------\n"
intsaveflag=0;/*是否需要存盘的标志变量*/
/*定义与学生有关的数据结构*/
typedefstructstudent/*标记为student*/
{
charnum[10];/*学号*/
charname[15];/*姓名*/
intcgrade;/*C语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
intmingci;/*名次*/
};
/*定义每条记录或结点的数据结构,标记为:
node*/
typedefstructnode
{
structstudentdata;/*数据域*/
structnode*next;/*指针域*/
}Node,*Link;/*Node为node类型的结构变量,*Link为node类型的指针变量*/
voidmenu()/*主菜单*/
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
printf("\n\n学生成绩管理系统\n");
printf("*************************菜单*********************************\n");
printf("*1输入数据6修改数据*\n");
printf("*2打印数据7插入数据*\n");
printf("*3排序数据8删除数据*\n");
printf("*4统计数据9保存数据*\n");
printf("*5查找数据0退出系统*\n");
printf("**************************************************************\n");
}
/*------------------printheader函数,格式化表头-------------------------*/
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
/*-----------------------printdata函数,格式化输出数据-----------------*/
voidprintdata(Node*pp)/*格式化输出表中数据*/
{
Node*p;
p=pp;
printf(FORMAT,DATA);
}
/*------------------------------Wrong函数,输出按键错误信息---------------------*/
voidWrong()/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********错误!
:
输入发生错误!
请按任意键继续**********\n");
getch();
}
/*---------------------------NOfind函数,用于输出未查找此学生的信息-----------------------*/
voidNofind()/*输出未查找此学生的信息*/
{
printf("\n=====>没有找到此学生!
\n");
}
/*----------------------------------------Disp函数---------------------------------*/
voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
{
Node*p;
p=l->next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
if(!
p)/*p==NULL,NUll在stdlib中定义为*/
{
printf("\n=====>没有学生数据!
\n");
getch();
return;
}
printf("\n");
printheader();/*输出表格头部*/
while(p)/*逐条输出链表中存储的学生信息*/
{printdata(p);
p=p->next;/*移动直下一个结点*/
printf(HEADER3);
}
getch();
}
/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;
在单链表l中查找;
**************************************************************/
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的学号*/
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)/*若找到findmess值的学生姓名*/
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
/*输入字符串,并进行长度验证(长度 voidstringinput(char*t,intlens,char*notice) { charn[255]; do{ printf(notice);/*显示提示信息*/ scanf("%s",n);/*输入字符串*/ if(strlen(n)>lens)printf("\n超出要求长度! \n");/*进行长度校验,超过lens值重新输入*/ }while(strlen(n)>lens); strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/ } /*--------------------------------输入分数,0<=分数<=100)--------------------------*/ intnumberinput(char*notice) { intt=0; do{ printf(notice);/*显示提示信息*/ scanf("%d",&t);/*输入分数*/ if(t>100||t<0)printf("\n分数必须在[0,100]中! \n");/*进行分数校验*/ }while(t>100||t<0); returnt; } /*---------------------------------增加学生记录-----------------------------------*/ voidAdd(Linkl) { Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/ charch,flag=0,num[10]; r=l; s=l->next; system("cls"); Disp(l);/*先打印出已有的学生信息*/ while(r->next! =NULL) r=r->next;/*将指针移至于链表最末尾,准备添加记录*/ while (1)/*一次可输入多条记录,直至输入学号为的记录结点添加操作*/ { while (1)/*输入学号,保证该学号没有被使用,若输入学号为,则退出添加记录操作*/ { stringinput(num,10,"\n输入学号(输入返回菜单): ");/*格式化输入学号并检验*/ flag=0; if(strcmp(num,"0")==0)/*输入为,则退出添加操作,返回主界面*/ {return;} s=l->next; while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/ { if(strcmp(s->data.num,num)==0) { flag=1; break; } s=s->next; } if(flag==1)/*提示用户是否重新输入*/ {getch(); printf("=====>学号%s不存在,再试一次? (是(y)/否(n)): ",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return; } else {break;} } p=(Node*)malloc(sizeof(Node));/*申请内存空间*/ if(! p) { printf("\nallocatememoryfailure");/*如没有申请到,打印提示信息*/ return;/*返回主界面*/ } strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/ stringinput(p->data.name,15,"姓名: "); p->data.cgrade=numberinput("C语言成绩[0-100]: ");/*输入并检验分数,分数必须在-之间*/ p->data.mgrade=numberinput("数学成绩[0-100]: ");/*输入并检验分数,分数必须在-之间*/ p->data.egrade=numberinput("英语成绩[0-100]: ");/*输入并检验分数,分数必须在-之间*/ p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;/*计算总分*/ p->data.ave=(float)(p->data.total/3);/*计算平均分*/ p->data.mingci=0; p->next=NULL;/*表明这是链表的尾部结点*/ r->next=p;/*将新建的结点加入链表尾部中*/ r=p; saveflag=1; } return; } /*---------------------------------查询学生记录-----------------------------------*/ voidQur(Linkl)/*按学号或姓名,查询学生记录*/ { intselect;/*1: 按学号查,: 按姓名查,其他: 返回主界面(菜单)*/ charsearchinput[20];/*保存用户输入的查询内容*/ Node*p; if(! l->next)/*若链表为空*/ { system("cls"); printf("\n=====>没有学生数据! \n"); getch(); return; } system("cls"); printf("\n=====>1通过学号查找=====>2通过姓名查找\n"); printf("请选择[1,2]: "); scanf("%d",&select); if(select==1)/*按学号查询*/ { stringinput(searchinput,10,"请输入已存在的学生的学号: "); p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/ if(p)/*若p! =NULL*/ { printheader(); printdata(p); printf(END); printf("按任意键返回"); getch(); } else Nofind(); getch(); } elseif(select==2)/*按姓名查询*/ { stringinput(searchinput,15,"请输入已存在学生的姓名: "); p=Locate(l,searchinput,"name"); if(p) { printheader(); printdata(p); printf(END); printf("请按任意键返回"); getch(); } else Nofind(); getch(); } else Wrong(); getch(); } /*------------删除学生记录: 先找到保存该学生记录的节点,然后删除该节点---------------*/ voidDel(Linkl) { intsel; Node*p,*r; charfindmess[20]; if(! l->next) {system("cls"); printf("\n=====>没有学生记录! \n"); getch(); return; } system("cls"); Disp(l); printf("\n=====>1通过学号删除=====>2通过姓名删除\n"); printf("请输入你的选择[1,2]: "); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"请输入已存在学生的学号: "); p=Locate(l,findmess,"num"); if(p)/*p! =NULL*/ { r=l; while(r->next! =p) r=r->next; r->next=p->next;/*将p所指节点从链表中去除*/ free(p);/*释放内存空间*/ printf("\n=====>删除成功! \n"); saveflag=1; } else Nofind(); getch(); } elseif(sel==2)/*先按姓名查询到该记录所在的节点*/ { stringinput(findmess,15,"请输入已存在学生的姓名: "); p=Locate(l,findmess,"name"); if(p) { r=l; while(r->next! =p) r=r->next; r->next=p->next; free(p); printf("\n=====>删除成功! \n"); getch(); saveflag=1; } else Nofind(); getch(); } else Wrong(); getch(); } /*--修改学生记录。 先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改-----*/ voidModify(Linkl) { Node*p; charfindmess[20]; if(! l->next) {system("cls"); printf("\n=====>没有学生记录! \n"); getch(); return; } system("cls"); printf("修改学生记录"); Disp(l); stringinput(findmess,10,"\n请输入已存在学生的学号: ");/*输入并检验该学号*/ p=Locate(l,findmess,"num");/*查询到该节点*/ if(p)/*若p! =NULL,表明已经找到该节点*/ {printf("学号: %s,\n",p->data.num); printf("姓名: %s,",p->data.name); stringinput(p->data.name,15,"请输入新姓名: "); printf("C语言成绩: %d,",p->data.cgrade); p->data.cgrade=numberinput("C语言成绩[0-100]: "); printf("数学成绩: %d,",p->data.mgrade); p->data.mgrade=numberinput("数学成绩[0-100]: "); printf("英语成绩: %d,",p->data.egrade); p->data.egrade=numberinput("英语成绩[0-100]: "); p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade; p->data.ave=(float)(p->data.total/3); p->data.mingci=0; printf("\n=====>修改成功! \n"); Disp(l); saveflag=1; } else Nofind(); getch(); } /*---插入记录: 按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。 ---*/ voidInsert(Linkl) { Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/ charch,num[10],s[10];/*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/ intflag=0; v=l->next; system("cls"); Disp(l); while (1) {stringinput(s,10,"\n请输入你将新的学生插在哪个学号之后? : "); flag=0;v=l->next; while(v)/*查询该学号是否存在,flag=1表示该学号存在*/ { if(strcmp(v->data.num,s)==0){flag=1;break;} v=v->next; } if(flag==1) break;/*若学号存在,则进行插入之前的新记录的输入操作*/ else {getch(); printf("\n=====>学号: %s不存在,再输一次? (y/n): ",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') {continue;} else {return;} } } /*以下新记录的输入操作与Add()相同*/ stringinput(num,10,"输入新的学生的学号: "); v=l->next; while(v) {if(strcmp(v->data.num,num)==0) { printf("=====>抱歉,学号: '%s'已经存在! \n",num); printheader(); printdata(v); printf("\n"); getch(); return; } v=v->next; } newinfo=(Node*)malloc(sizeof(Node)); if(! newinfo) { printf("\nallocatememoryfailure");/*如没有申请到,打印提示信息*/ return;/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 实验 报告