学生信息管理系统
1.题目与要求
1.1 问题提出
由于计算机技术的飞速发展,C语言作为一项编程的基础语言,它对计算机行业有着很大的贡献,我们组计划用C语言编写一个学生信息管理系统,主要用来对学生基本信息的管理,使教师对学生信息进一步了解,为老师提供很好的了解渠道。
1.2 本系统涉及的知识点
switch循环语句,参数的传递,字符串,数组,链表,指针,while语句,简单 输入输出语句,分支,函数定义,函数的递归调用
1.3 功能要求
(1)数据管理:
要求:学生信息数据要以文件的形式保存,此模块包括子模块有:录入学生信息、删除学生信息、修改学生信息
(2)数据查询:
要求:查询时可实现按学号查询、按姓名查询
(3)数据浏览:
要求:输出录入信息的全部学生的基本信息
2.功能设计
2.1 算法设计
本系统需要实现的功能要求:
1) 利用switch语句设计如图1所示的主菜单:
录入学生信息
学生信息浏览
学生信息查询
修改学生信息
删除学生信息
退出学生管理系统
图1 学生信息管理系统主菜单
(2) 选择2后,程序自动为你提供全部学生信息
(3) 选择3后,进入学生信息查询阶段,可以根据学号和姓名查询学生成绩,也可以打印全部学生信息。
1.按学号查询
2.按姓名查询
3.打印全部学生信息
4.返回主菜单
图2:学生信息查询
(4) 选择4后,程序会根据你提供的学号自动为你找出该学生的信息,并问你需要改学生的哪一项信息,之后可以提供该学生的新的信息。
(5) 选择5后,程序可以根据你提供的学号删除对应的学生信息。
2.2学生信息管理系统的菜单
学生信息管理系统主模块如下:
学生信息管理系统的信息查询模块如下
程序代码设计
程序代码设计中的函数:
录入信息函数:void register()
浏览信息函数:void scan()
信息查询函数:void search()
修改信息函数:void modify()
删除信息函数:void del()
退出程序函数:void quit()
学生信息函数的定义:
char sno[max]; 学号
char sname[max]; 姓名
char age[max]; 年龄
char sex[max]; 性别
char born[max]; 出生年月
char dress[max]; 地址
char phone[max]; 电话
char mail[max]; E-mail
学生信息输出函数:
void ElePrint(char str[]) 单个元素
int LinePrint(student *ptr) 输出一行
void print() 输出全部学生信息
这三个函数是间接递归型
信息查询中的两个函数:
学号查询函数:no[max]
姓名查询函数:name[max]
信息修改中对信息从新输入的函数:
主要用于对新的信息的输入
name1[max] 修改后名字的函数
se1[max] 修改后性别的函数
ag1[max] 修改后年龄的函数
bor1[max] 修改后出生年月函数
dres1[max] 修改后地址函数
phon1[max] 修改后电话函数
mail1[max] 修改后E-mail函数
3.C程序设计总结
(1)学了一年的c语言了,本来以为自己对编程序有了一些了解,但是第一次接触这个程序的时候,我的感觉就是无从下手,看着如此复杂的程序,那时清楚的感受到自己的能力问题。我们利用了一天时间选了一道编程题,并简单的对它进行分析。首先,我们找到它的主程序,再根据主程序需要设计几个分支,利用参数传递的方法,使得我们的程序结构比较清晰,层次感比较分明。我们在编写的过程中充分引用我们学到的知识点,比如:数组,链表,switch语句,并让函数之间互相引用,减少一些繁琐的步骤。
(2)在编译的时候,遇到了不少问题,好多学过的知识点都有所遗忘,我们在学习的过程中也在不断的复习。在调试的时候,也有不少出错的地方,当时感觉真麻烦啊,然后就不断的翻资料,请教老师,同学。然后一点一点的找到错误的那种感觉也是挺好的
4.结束语
短短几天的实践周带给了我们很多的收获,学到了很多知识,也提高了自己的实际动手能力和独立思考能力。在实践中我们运用所学知识,发现,提出,分析和解决实际问题,并且也从中发现了我们的不足。C语言不仅仅是一门语言,它更是我们使用电脑的一种工具,能够帮助我们更好更快的解决问题,是一门实用性极强的课程,掌握并且熟练地使用它将会是我们计算机专业的学生必须要做的。通过这次课程设计,使我们懂得了理论和实践相结合很重要,从理论中得出结论,加深对C语言的理解,提升自己的编程思想,丰富经验。
在做设计的时候,最重要的是团队的力量,小组内成员互相交流,查漏补缺,反复修改完善,运用集体的智慧,团结合作解决问题。所以,通过这些天的努力和老师的指导帮助,我们终于做出了这个学生信息管理系统。在此过程中,我们体会到了团队合作的重要性,同时我们各方面的能力也得到了提升,也许在以后的学习生活中我们会做的更好。
5.参考文献
[1]施荣华,刘卫国.C程序设计与应用.北京:中国铁道出版社,1999.
[2]向南平.实用C语言程序设计.长沙:中南工业大学出版社,1994
6.附录
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 20
typedef struct student //学生信息输入 (结构体类型名)
{
char sno[max]; // 学号
char sname[max]; //姓名
char age[max]; //年龄
char sex[max]; //性别
char born[max];//出生年月
char dress[max];//地址
char phone[max];//电话
char mail[max];//E-mail
struct student *next;
} student; //“;”不能省略 student属于结构体变量
student *head; //输出链表,用头指针作为参数
void ElePrint(char str[]) //输出单个元素 ,定义一个str[];
{
if(str==NULL) //如果str是空指针 ,判断str字符串是否存在
exit(0); //正常状态退出
printf("%s",str); //输出信息
for(unsigned int i=2;i<12-strlen(str);i++) //strlen函数可以返回字符串的函数 “i”用来控制两个信息之间的间距
printf(" ");//为了对齐输出,需插入一些空格 控制信息之间的距离
return;
}
int LinePrint(student *ptr) //输出一行 ,后边会引用
{
if(ptr==NULL) //检查传进来的指针 ,判断ptr字符串是否存在
exit(0);//使用“return 0;”也行,作用是正常状态退出
printf("\n");
ElePrint(ptr->sno); //利用参数传递,利用指向结构体的指针变量引用结构体成员
ElePrint(ptr->sname);
ElePrint(ptr->age);
ElePrint(ptr->sex);
ElePrint(ptr->born);
ElePrint(ptr->dress);
ElePrint(ptr->phone);
ElePrint(ptr->mail);
return 1;
}
void print() //输出全部学生信息 ,后边会引用
{
student *ptr=head; //*ptr表示取该地址处储存的变量的值
printf("\n学号\t姓名\t 年龄\t 性别 出生年月\t地址\t 电话\t E-mail");
while(ptr)
{
LinePrint(ptr); //参数传递
ptr=ptr->next; //表示输出下一个学生的信息
}
printf("\n");
return;
}
void regist() //1.录入学生信息
{
system("cls");//清屏
char ch; //用来判断是否继续录入
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student)); // 新建一个学生结点
printf("\n开始录入学生信息..."); //开始录入
printf("\n请输入该学生的学号:");
scanf("%s",s->sno); //把sno的值录入新的节点s中
printf("\n请输入该学生的姓名:");
scanf("%s",s->sname);
printf("\n请输入该学生的年龄:");
scanf("%s",s->age);
printf("\n请输入学生的性别:");
scanf("%s",s->sex);
printf("\n请输入学生的出生年月:");
scanf("%s",s->born);
printf("\n请输入学生的地址:");
scanf("%s",s->dress);
printf("\n请输入学生的电话:");
scanf("%s",s->phone);
printf("\n请输入学生的E-mail:");
scanf("%s",s->mail);
ptr=head;
head=s;//将新结点插入队头
s->next=ptr;
fflush(stdin); //清空输入缓存区
printf("\n请问是否继续录入?(Y/N)");
scanf("%c",&ch);
} while(ch=='Y'||ch=='y');
return;
}
void scan()//2.浏览信息
{
system("cls"); //清屏
printf("*提供全部学生信息*") ;
print(); //直接引用“void print()”函数
}
void search()//3.查询模块
{
system("cls");//清屏
int method;//查询方式
char no[max],name[max];//用来接收查询关键字
while(1)
{
printf("\n请选择查询方式");
printf("\n1.按学号查询");//用到上边定义的no[max]
printf("\n2.按姓名查询"); //用到上边定义的name[max];
printf("\n3.打印全部学生信息");
printf("\n4.返回主菜单\n");
scanf("%d",&method);
student *p=head,*temp;
switch(method)
{
case 1:
printf("\n请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->sno,no)) //“strcmp”是字符串比较函数,比较系统中的学号跟你输入的学号是否相等
break;
else
{
temp=p;
p=p->next;
}
}
printf("\n学号\t姓名\t 年龄\t 性别 出生年月\t地址\t 电话\t E-mail");
LinePrint(p);
break;
case 2:
printf("\n请输入学生的姓名:");
scanf("%s",name);
printf("\n学号\t姓名\t 年龄\t 性别 出生年月\t地址\t 电话\t E-mail");
while(p)
{
if(!strcmp(p->sname,name));//“strcmp”是字符串比较函数,比较系统中的姓名跟你输入的姓名是否相等
LinePrint(p);
p=p->next ;
}
break;
case 3:
print(); //输出所有学生的所有信息
break;
case 4:
return; //直接返回主菜单
default:
printf("很抱歉,暂无此查询方式!");
break;
}
}
}
void modify()//4.修改学生信息
{
system("cls");//清屏
char num[max]; //定义一个num数组
student *p=head;
printf("\n请输入要修改的学生的学号:");
scanf("%s",num);
while(p)
{
if(!strcmp(p->sno,num))
break; //如果sno跟num的字符串长度一样 ,使用break函数直接转至第168行
else
p=p->next; //用strcmp将num一个一个跟sno比较
}
if(p==NULL) //判断p是否存在
{
printf("\n错误:没有此学生的信息!\n");
return; //退出修改学生信息界面
}
LinePrint(p);
printf("\n请输入要修改的该学生的信息:");
printf("\n1.姓名");
printf("\n2.年龄");
printf("\n3.性别");
printf("\n4.出生年月");
printf("\n5.地址");
printf("\n6.电话");
printf("\n7.E-mail");
char name1[max],se1[max],ag1[max];
char bor1[max],dres1[max],phon1[max],mail1[max];
int select;
fflush(stdin); //清空输入缓存区
printf("\n");
printf("你选择的是:");
scanf("%d",&select);
printf("\n请输入新的信息:");
switch(select)
{
case 1:
scanf("%s",name1);
strcpy(p->sname,name1); //strcpy是复制函数,将新输入的信息“name1”复制到sname中
break;
case 2:
scanf("%s",se1);
strcpy(p->sex,se1); //同上
break;
case 3:
scanf("%s",ag1);
strcpy(p->age,ag1); //同上
break;
case 4:
scanf("%s",bor1);
strcpy(p->born,bor1); //同上
break;
case 5:
scanf("%s",dres1);
strcpy(p->dress,dres1); //同上
break;
case 6:
scanf("%s",phon1);
strcpy(p->phone,phon1); //同上
break;
case 7:
scanf("%s",mail1);
strcpy(p->mail,mail1); //同上
break;
default:
printf("\nError!");
break;
}
// LinePrint(p);
return; //返回主菜单
}
void del()// 5.删除某学生的信息
{
system("cls");//清屏
student *p=head,*temp=head,*s;
char num1[max];
printf("\n请输入要删除的学生的学号:");
scanf("%s",num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1)) //strcmp是比较函数
break; //如果能查找到该学生所在节点,转至242行,输出此学生信息
else
{
temp=p;
p=p->next;
}
}//while
if(p==NULL) //判断是否存在
{
printf("\n不存在此学生的信息.");
return;
}
LinePrint(p);//输出该学生的信息
printf("\n请问真的要删除该学生的信息吗?(Y/N)");
char ch;
fflush(stdin); //清除输入缓存区
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
{
s=p->next;
temp->next=s;
free(p); //释放p中的信息
printf("\n已经删除该学生的信息.");
}
return; //返回主菜单
}
void quit() //6.退出程序
{
system("cls");
char ch;
printf("\n真的要退出?(Y/N)");
fflush(stdin); //清空输入缓存区
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0); //正常退出
return; //返回主菜单
}
int main() //主程序
{
int option;
printf("\n\tWelcome to the student information management system!\n");
printf("\n\t\t欢迎使用学生信息管理系统!\n");
//系统界面
while(1)
{
system("color 2f");
printf("\n\t\t* * * * * * * * * * * * * *");
printf("\n\t\t* 请选择需要的服务: *");
printf("\n\t\t* *");
printf("\n\t\t* 1.录入学生信息 *");
printf("\n\t\t* 2.学生信息浏览 *");
printf("\n\t\t* 3.学生信息查询 *");
printf("\n\t\t* 4.修改学生信息 *");
printf("\n\t\t* 5.删除学生信息 *");
printf("\n\t\t* 6.退出学生管理系统 *");
printf("\n\t\t* *");
printf("\n\t\t* * * * * * * * * * * * * *");
printf("\n\t\t 你选择的是:");
scanf("%d",&option); //option是提供选择
switch(option)
{
case 1:
regist();
system("cls");
break;
case 2:
scan();
break;
case 3:
search();
system("cls");
break;
case 4:
modify();
system("cls");
break;
case 5:
del();
system("cls");
break;
case 6:
quit();
system("cls");
break;
}
}
return 0;
}