C程序设计学生信息管理系统.docx
- 文档编号:12228555
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:25
- 大小:49.14KB
C程序设计学生信息管理系统.docx
《C程序设计学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《C程序设计学生信息管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
C程序设计学生信息管理系统
课程设计说明
1、课程设计目的
通过该课程的学习,我们可以巩固和加深《C程序设计》理论知识,进一步掌握编程技巧和方法,并通过课程设计实践进一步加强我们独立分析问题和解决问题的能力、综合设计及创新能力的培养。
在这次课程设计中我们将一学年中所学到的C语言知识进行复习和综合运用,将书本的理论知识和实践操作联系,同时在进行课程设计的过程中我们可以提高自己的编程能力、调试程序的能力,学习新的调程方法,为以后的计算机语言的学习打下基础。
在此次设计中,主要运用了函数、switch语句、二级菜单、结构体、动态链表、指针及文件的保存和读取。
由于上学期时间紧张,结构体、链表、文件这部分知识没有学到位,通过这次课程设计,能够更好的学习这些知识。
学会怎样建立一个动态链表,并对链表实施查找、插入、删除的操作以及使用文件的打开(fopen)、关闭(fclose)、写入(fwrite)、读取(fread)等操作对链表进行处理。
巩固对函数、指针、switch语句的掌握和应用,学会应用二级菜单。
2、软件的总体结构图及主要模块说明
此次课程设计的总题目我选择的是数据计算及学生的信息管理,在这个大题目下,又分为两个子程序,分别进行数据的处理计算与学生信息管理系统,进入数据处理单元后可以通过菜单选择所要进行的计算,有两个模块,即解一元二次方程和计算π的值;进入学生信息管理系统后,也同样可以使用菜单在七个模块中进行选择,进行学生信息表的建立,输出,可以按学号进行查找某一学生信息,可以插入或删除一个学生的信息,另外,在作出建立、插入、删除后均可选择保存及读取文件的模块对内容进行保存。
在主函数中,运用switch语句,建立了一个对一级模块的菜单选择,进入子程序后同样使用switch语句实现对小模块的选择。
此为二级菜单。
在程序中的第二个子程序的菜单中由于有一个加密的循环,这样可以保证信息的安全性,但由于我知识有限,时间紧迫,没能编译出可以修改密码,确定输入密码次数的程序。
程序中文件的保存和读取都为单独的小模块,这样在进行了建立、插入、删除后可以将修改后的信息表分别存入一个可以自命名的文件中,也可通过选择读取模块自行读取。
但由于进行保存时只是针对首结点定义,所以查找到的信息不能进行保存,这也是一个不足之处。
此外,在插入的程序中,因为是利用了学号的大小比较,所以在建立信息表时,学号必须是由小到大的顺序输入,否则无法进行插入动作。
这是本程序的一个最大的不足。
数据的计算
◆第一个模块:
解一元二次方程,在这个模块中可以自行建立一个一元二次方程,即输入a、b、c的值,判断a的值是否为零然后进行解方程。
此程序主要运用了if….else语句的嵌套。
◆第二个模块:
计算π的值,此程序主要运用了while循环语句。
学生信息管理系统(重点)
◆在进入学生信息管理系统的子菜单前,有一个密码保护,需要操作者首先输入密码,若密码正确,则进入菜单进行选择,若不正确,则重新输入,直到所输密码正确为止,这样,可以对信息起到保护的作用。
此处,密码定位123。
◆第一个模块:
建立学生信息表,此模块中运用动态链表和结构的知识,先定义一个学生信息的结构体,开辟一个新结点,并使p1、p2指向它,读入一个学生的数据给p1所指的结点,当读入的p1->num不是零时,使n=n+1,若n=1,则把p1所指的结点作为第一个结点,否则把p1所指的结点连接到表尾,再把p2移到表尾,然后开辟一个新结点,使p1指向它,读入一个学生数据给p1所指的结点,如此循环,直到所读入数据均为零。
◆第二个模块:
输出信息表,先定义一个指针变量p1,指向第一个结点,输出p1所指的结点,使p1后移一个结点,再输出,直到链表的尾结点。
◆第三个模块:
按学号查找学生的信息,定义指针变量p,指向首结点,输入要查找的学号,如果p不是要找的结点且后面还有结点则指针后移,反之,找到该结点,输出即可。
如果找不到,则输出找不到该生的信息。
◆第四个模块:
插入学生的信息,定义者针变量p0、p1、p2,令p1指向首结点,p0指向要插入的点,输入要插入的学生信息,如果head==NULL,则原来的链表时空表,使p0指向的结点作为头结点,如果p0->num>p1->num&&p1->next!
=NULL,则使p2指向刚才p1指向的结点,p1后移。
如果p0->num<=p1->num且head==p1就将新信息插到第一个结点前,否则插到p2指向的结点后,再另p0->next指向p1,若p0->num大于p1->num则将其插到最后的结点之后。
最终,要返回head。
由于在student函数中调用插入函数后,又调用了输出函数,所以插入信息后的学生信息表也会被打印出来,显示到屏幕上
◆第五个模块:
删除学生信息,先定义两个指针变量p1和p2,使p1指向首结点,输入要删除的学号,循环判断,若p1指向的结点不是要找的且后面还有结点,就令p2=p1,p1后移一个结点,如果所输入的学号与p1->num相同则进行删除,若p1指向的是首结点,就把第二个结点赋给head,否则将下一结点地址赋给前一结点地址,输出删除信息后的信息表并打印出已删除的字样,否则输出没有该学号。
最后返回head。
◆第六个模块:
保存文件,首先定义指向文件的指针fp和移动指针p,输入文件名,打开文件,
if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,为只写方式*/
{
printf("Cannotopenthefile\n");
return;/*若打不开则返回菜单*/
}
进行保存,令p=head即移动指针从头指针开始,如p不为空,则写入一条记录,后指针p后移,使用while语句进行循环,直到全部写入,调fclose(fp)关闭文件,最后打印“Savethefilesuccessfully”的字样。
◆第七个模块:
读取文件,定义记录指针变量p1,使head=NULL,定义指向文件的指针fp,
输入文件名,if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为只读方式*/
{printf("Cannotopenthefile.\n");
return(head);
}
进行读取文件,首先令p1=(structstudent*)malloc(LEN)开辟一个新单元,head=p1(申请到空间,将其作为头指针),先打印出表头,然后开始用while语句循环读数据,程序代码如下:
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(fread(p1,LEN,1,fp)!
=1)break;/*如果没读到数据,跳出循环*/
else
{printf("\t%d\t|%10s\t|%10d\t|%10ld\t|%10s\t\n",p1->num,p1->name,p1->score,p1->phone,p1->home);
printf("---------------------------------------------------------------------------\n");
}
p1->next=(structstudent*)malloc(LEN);/*为下一个结点开辟空间*/
}
fclose(fp);/*关闭文件*/
printf("Youhavesuccesstoreaddatafromthefile!
\n");
return(head);
}
源程序为:
#include
#include
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent)
structstudent
{
intnum;
charname[10];
intscore;
longphone;
charhome[10];
structstudent*next;
};
intn;/*n为全局变量*/
structstudent*create(void)/*建立链表函数*/
{
structstudent*head,*p1,*p2;
n=0;p1=p2=(structstudent*)malloc(LEN);/*开辟一个新单元ª*/
printf("请输入学号、姓名、成绩、电话、省份:
\n");
scanf("%d%s%d%ld%s\n",&p1->num,p1->name,&p1->score,&p1->phone,p1->home);
head=NULL;
while(p1->num!
=0)/*如果学号为0则退出循环*/
{n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
scanf("%d%s%d%ld%s",&p1->num,p1->name,&p1->score,&p1->phone,p1->home);
}
p2->next=NULL;
return(head);
}
voidprint(structstudent*head)/*输出链表函数*/
{
structstudent*p1;
printf("**************************学生信息表**************************\n");
printf("----------------------------------------------------------------------------\n");
printf("\t学号\t|\t姓名\t|\t成绩\t|\t电话\t|\t籍贯\n");
printf("----------------------------------------------------------------------------\n");
p1=head;
if(head!
=NULL)
do
{printf("\t%d\t|%10s\t|%10d\t|%10ld\t|%10s\t\n",p1->num,p1->name,
p1->score,p1->phone,p1->home);
printf("---------------------------------------------------------------------------\n");
p1=p1->next;}
while(p1!
=NULL);
getchar();
getchar();
}
voidsearch(structstudent*head)/*按学号查找学生信息函数*/
{
structstudent*p;
ints;
printf("请输入要查找的学号:
");
scanf("%d",&s);
p=head;
while(p->num!
=s&&p->next!
=NULL)/*p所指向的不是要找的点,且后面还有结点*/
p=p->next;
if(p->num==s)/*找到该学号*/
{printf("\n******FOUND******\n");
printf("*****************学生信息表***************\n");
printf("----------------------------------------------------------------------------\n");
printf("\t学号\t|\t姓名\t|\t成绩\t|\t电话\t|\t籍贯\n");
printf("----------------------------------------------------------------------------\n");
printf("\t%d\t|%10s\t|%10d\t|%10ld\t|%10s\t\n",p->num,p->name,
p->score,p->phone,p->home);
printf("---------------------------------------------------------------------------\n");}
elseprintf("没有该学生\n");
getchar();
getchar();
}
structstudent*insert(structstudent*head)/*插入学生信息函数*/
{
structstudent*p0,*p1,*p2;
structstudent*xin;
printf("请输入要插入的信息:
");
xin=(structstudent*)malloc(LEN);
scanf("%d%s%d%ld%s",&xin->num,xin->name,&xin->score,&xin->phone,xin->home);
p1=head;p0=xin;
if(head==NULL)/*原来的链表是空表*/
{head=p0;p0->next=NULL;}/*p0指向的点作为头结点*/
else
{
while(p0->num>p1->num&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(p0->num<=p1->num)
{if(head==p1)head=p0;/*插到第一个结点前*/
elsep2->next=p0;/*插到p2指向的结点后*/
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;}/*插到最后的结点之后*/
}
n=n+1;
printf("已插入该信息\n");
return(head);
}
structstudent*delet(structstudent*head)/*删除学生信息函数*/
{
structstudent*p1,*p2;
ints;
printf("请输入要删除的学号\n");
scanf("%d",&s);
p1=p2=head;
while(p1->num!
=s&&p1->next!
=NULL)
{p2=p1;p1=p1->next;}
if(p1->num==s)
{printf("******FOUND******\n");
printf("----------------------------------------------------------------------------\n");
printf("\t学号\t|\t姓名\t|\t成绩\t|\t电话\t|\籍贯\n");
printf("----------------------------------------------------------------------------\n");
printf("\t%d\t|%10s\t|%10d\t|%10ld\t|%10s\t\n",p1->num,p1->name,
p1->score,p1->phone,p1->home);
printf("---------------------------------------------------------------------------\n");
if(p1==head)head=p1->next;/*若p1指向首结点,把第二个结点地址赋给head*/
else
p2->next=p1->next;/*否则将下一结点地址赋给前一结点地址*/
n=n-1;
printf("已删除该信息\n");
}
elseprintf("没有此学号\n");
return(head);
}
/*保存文件函数*/
voidsave(structstudent*head)
{FILE*fp;/*定义指向文件的指针*/
structstudent*p;/*定义移动指针*/
charoutfile[10];
printf("请输入文件名,如c:
\\score\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,为只写方式*/
{
printf("Cannotopenthefile\n");
return;/*若打不开则返回菜单*/
}
printf("\nSavingthefile......\n");
p=head;/*移动指针从头指针开始*/
while(p!
=NULL)/*如p不为空*/
{
fwrite(p,LEN,1,fp);/*写入一条记录*/
p=p->next;/*指针后移*/
}
fclose(fp);/*关闭文件*/
printf("Savethefilesuccessfully!
\n");
}
/*从文件中读数据函数*/
structstudent*load()
{structstudent*p1,*head=NULL;/*定义记录指针变量*/
FILE*fp;/*定义指向文件的指针*/
charinfile[10];
printf("请输入文件名,如c:
\\score\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为只读方式*/
{
printf("Cannotopenthefile.\n");
return(head);
}
printf("\nLoadingthefile!
\n");
p1=(structstudent*)malloc(LEN);/*开辟一个新单元*/
head=p1;/*申请到空间,将其作为头指针*/
printf("----------------------------------------------------------------------------\n");
printf("\t学号\t|\t姓名\t|\t成绩\t|\t电话\t|\t籍贯\n");
printf("----------------------------------------------------------------------------\n");
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(fread(p1,LEN,1,fp)!
=1)break;/*如果没读到数据,跳出循环*/
else
{
printf("\t%d\t|%10s\t|%10d\t|%10ld\t|%10s\t\n",p1->num,p1->name,p1->score,p1->phone,p1->home);
printf("---------------------------------------------------------------------------\n");
}
p1->next=(structstudent*)malloc(LEN);/*为下一个结点开辟空间*/
}
fclose(fp);
printf("Youhavesuccesstoreaddatafromthefile!
\n");
return(head);
}
voidstudent()
{
intkey;
printf("inputthekey:
");
scanf("%d",&key);
while(key!
=123)
{printf("inputthekey:
");
scanf("%d",&key);}
if(key==123)
{
inty;structstudent*head;
printf("2.1、***************建立学生信息表*****************\n");
printf("2.2、******************输出信息表************************\n");
printf("2.3、********************按学号查找信息*********************\n");
printf("2.4、**********************插入学生信息*************************\n");
printf("2.5、************************删除学生信息***************************\n
printf("2.6、*************************保存文件********************************\n");
printf("2.7、*************************读取文件********************************\n);
printf("2.8、*************************返回主菜单******************************\n");
a2:
getchar();
printf("请输入编号");
scanf("%d",&y);
switch(y)
{
case1:
head=create();break;
case2:
print(head);break;
case3:
search(head);break;
case4:
head=insert(head);print(head);break;
case5:
head=delet(head);break;
case6:
save(head);break;
case7:
head=load();break;
case8:
gotoend;
}
gotoa2;
end:
;
}
}
voidfangcheng()
{
floata,b,c,disc,x1,x2,m,n;
printf("Inputa,b,c:
");
scanf("%f%f%f",&a,&b,&c);
printf("Theequation");
if(a==0)
printf(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 学生 信息管理 系统