资源描述
*********大学
课 程 设 计 报 告
课程名称 高级语言程序设计
设计题目 学生信息管理系统
专 业 计算机科学及技术
班 级
学 号
姓 名
完成日期
课 程 设 计 任 务 书
设计题目: 学生信息管理系统设计
设计内容及要求:
内容:
对学生信息进行管理,学生信息包括学号、姓名、性别、年龄、学历、学号、住址、电话等(学号不重复)。
要求:
(1) 系统以菜单方式工作
(2) 学生信息录入功能(学生信息用文件保存) 。
(3) 输出学生信息、浏览学生信息功能。
(4) 查询和排序功能:(至少一种查询方式) ,如按学号查询、按学历查询等。
(5) 学生信息删除、修改功能(任选项)。
指导教师:_______________
年 月 日
课 程 设 计 评 语
成绩:
指导教师:_______________
年 月 日
28 / 32
【问题描述】
学生信息管理软件设计。对学生信息进行管理,学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一个学生信息管理软件。
【基本要求】
一、输入形式和输入值范围
形式:用scanf输入学生学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。输入一个学生信息一个回车。用输入学号p1->num来控制输入,当输入学号为0时,用break跳出循环。即if(p1->num==0)break。
输入值范围:
学号、年龄为整型 long num; int age;
姓名为字符串型15个字节char name[15];
性别为字符串型,10个字节char sex[10];
出生为字符串型,20个字节char chushen[20];
地址为字符串型,30个字节char dizhi[30];
邮箱为字符串型,输入11位数字char email[11]。
二、输出形式
输出是以表格形式输出,即表格每一行都能显示第一个学生信息,第二行是显示第二个学生信息。
三、程序所能达到功能
对学生信息进行管理,学生信息包括职学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。
(1)系统以菜单方式工作
(2)学生信息录入功能。
(3)输出学生信息、浏览学生信息功能。
(4)查询和排序功能:(至少一种查询方式),如按学号查询、按姓名查询等。
(5)学生信息删除、修改功能(任选项)。
(6)添加学生信息。
【测试数据】
输入:设输入四个学生信息,以最后一个学生学号为0来结束输入,学号是整型。
预期输出结果:预期输出结果请参见程序后运行结果。
【数据结构】
排序记录数据元素表采用一维数组存储结构,每个元素包含8个关键字段,其类型描述为:
#include<stdio.h>
#include<malloc.h> //分配size字节存储区
#include<string.h> //包含字符串处理函数头文件,可以直接调用现有字符串处理一系列函数
#define len sizeof(struct student) //宏定义求字节运算符
#include<stdlib.h> //清屏功能
struct student //声明一个结构体类型struct student
{
long num; //定义学号为long型数据
char name[15]; //定义姓名
int age; //定义年龄
char sex[3]; //定义性别
char chushen[10]; //定义出生
char dizhi[20]; //定义出生地址
char phone[11]; //定义电话
char email[20]; //定义邮箱
struct student *next; //next是指针变量,指向结构体变量
【算法思想】
利用一维结构体存放所有学生信息,输入后,在输出时要对学生按学号高低排序,然后可以执行按学号查询学生信息,输入学号,删除学生信息,输入学号可以找出该学生信息,然后选择修改学生信息,如果来了新学生,还可以添加学生信息。
【总体设计】
输入一个学生学号,来删除该学生信息
输入学号,修改的学生信息
显示主菜单
输入函数
学生排序
输出学生信息
删除学生信息
修改学生信息
添加学生信息
用键盘输入学生信息
按学生学号高低排序
在原有的学生上添加学生信息
以表格的形式输出学生信息
主菜单包括:输入函数、学号排序、浏览函数、删除函数、修改函数、添加函数。
图1-1学生管理总体设计
【模块划分】
一、主函数:main()
显示系统工作菜单,显示该系统所有功能。告诉使用者所有将会调用被
调函数,再运用选择函数switch即可根据使用者所输入学号进入对应功能程序。并且对菜单做了一个循环,进行完一个选择后,按回车键可进行清屏功能,把屏幕上除了主菜单以外都清空,然后可以继续选择那些可以使用功能,这样可以方便使用者使用,并且每一步都很清晰。以8退出系统。
二、输入函数:struct student *creat()
在该程序前面已经定义了一个结构体struct student用来储存学生所有信息,(学号、年龄、姓名、性别、出生日期、地址、电话、邮箱)。定义p1和p2,struct student *p1,*p2;p1,p2是指向struct student类型数据指针变量。定义一个n=0,n是输入个数,主要作用是:如果输入一个学生信息,首地址指向p1,head=p1;否则p2下一个地址指向p1,p2指向p1. p2->next=p1;p2=p1;学号控制循环。
三、排序函数:void paixu(struct student *head)
用一个for语句做循环,不是NULL话,指针指向下一个,按学生学号高低排序。整形直接交换,字符型用strcpy交换,类型相当于两个数据之间交换。
四、输出函数:void printlist(struct student *head)
在主函数里边用while控制循环,输出学生信息,然后指针指向下一个。
五、 查询函数:void findList_num(struct student *head) 和
void findList_num(struct student *head)
输入一个学号或姓名,做一个for循环,即指针pt指向第一个地址,再定义一个指针p1,让它等于pt,他是紧跟着pt后面一个指针,让p1->next不等于NULL,pt指向下一个地址。这样就能修改最后一个学生信息了。如果要查询学生学号在学生里,就输出该学生信息,否则,就输出查询学生信息不存在。
六、删除函数:int shanchu(struct student *head)
输入一个学号,先找到这个学生信息。如果输入学号在学生信息中,就进行以下循环:如果输入是第一个学生话,就head等于第二个学生信息;如果输入学生信息是最后一个,就让倒数第二个等于NULL;否则话,就让下一个学生信息覆盖前一个。如果输入学号不在学生信息中,输出“此学生信息不存在”。
七、修改函数:struct student *delList(struct student *head,long del_num)
输入要修改学号,找到该学生并且输出该学生信息。然后屏幕上会出现学生信息所有项目,用switch进行选择修改项目。选择后输入新学生信息,用它来覆盖原来学生信息。
八、添加函数:void insert(struct student *head)
用一个while语句while(p2->next!=NULL)控制循环,p2指针指向下一个地址,即p2=p2->next;这是找到最后一个地址,然后开辟动态存储区,p1=(struct student *)malloc(len);输入要添加学号,用学号为0来终止循环,如果不为0,就继续输入学生信息。
【源程序】
#include<stdio.h>
#include<malloc.h> //分配size字节存储区
#include<string.h> //包含字符串处理函数头文件,可以直接调用现有字符串处理一系列函数
#define len sizeof(struct student) //求字节运算符
#include<stdlib.h> //清屏功能
FILE *fp;
struct student //声明一个结构体类型struct student
{int num; //学号为整型
char name[20]; //姓名为字符串
char genter[10]; //性别为字符串
int age; //年龄为整型
char xueli[20]; //学历为字符串
int gongzi; //学号为整型
char address[30]; //地址为字符串
char phone[11]; //电话为字符串
struct student *next; //next是指针变量,指向结构体变量
};
void menu()
{
printf("===========学生信息管理系统==========\n\n");
printf(" 1、录入学生信息\n");
printf(" 2、浏览学生信息\n");
printf(" 3、查询学生信息\n");
printf(" 4、删除学生信息\n");
printf(" 5、插入学生信息\n");
printf(" 6、修改学生信息\n");
printf(" 7、排序学生信息\n");
printf(" 8、退出管理系统\n");
printf("=====================================\n");
}
struct student *creat() //录入学生信息
{
int n;
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *) malloc(len);
scanf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s",&p1->num,&p1->age,p1->name,p1->sex,p1->chushen,p1->dizhi,p1->phone,p1->email);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(len);
scanf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s",&p1->num,&p1->age,p1->name,p1->sex,p1->chushen,p1->dizhi,p1->phone,p1->email);
}
p2->next=NULL;
return(head);
}
void insert(struct student *head) //插入学生信息
{
int search_num;
struct student *p,*q,*s;
p=head;
printf("在哪个学生前插入 请输入学号:\n");
scanf("%d",&search_num);
while((p!=NULL)&&(p->num!=search_num))
{
q=p;
p=p->next;
}
s=(struct student *)malloc(len);
q->next=s;
system("cls");
printf("请输入学生信息:\n");
printf("学号\t年龄\t姓名\t性别\t出生\t地址\t电话\te-mail\n");
scanf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s",&s->num,&s->age,s->name,s->sex,s->chushen,s->dizhi,s->phone,s->email);
s->next=p;
}
void printList(struct student *head) //浏览全部学生信息
{
struct student *p;
p=head;
if(head==NULL)
printf("没有学生信息!!\n");
else
{
do
{
fread(p,len,1,fp);
printf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->age,p->name,p->sex,p->chushen,p->dizhi,p->phone,p->email);
p=p->next;
}while(p!=NULL);
}
}
void findList_num(struct student *head,long search_num) //按学号查找
{
struct student *p;
p=head;
while((p!=NULL)&&(p->num!=search_num))
p=p->next;
if(p!=NULL)
printf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->age,p->name,p->sex,p->chushen,p->dizhi,p->phone,p->email);
else
printf("没有该学生信息!!\n");
}
void findList_name(struct student *head,char *search_name) //按姓名查找
{
struct student *p;
int cmp1=0,cmp=0;
p=head;
while(p!=NULL)
if(strcmp(p->name,search_name)!=0)
{
p=p->next;
cmp++;
}
else
{
printf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->age,p->name,p->sex,p->chushen,p->dizhi,p->phone,p->email);
p=p->next;
cmp1=1;
}
if(cmp!=0&&cmp1==0)
printf("没有该学生信息!!\n");
}
void xiugai(struct student *p1,long xiu_num) //修改学生信息
{
struct student *p2;
p2=p1;
while((p2!=NULL)&&(p2->num!=xiu_num))
p2=p2->next;
if(p2!=NULL)
{
scanf("%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s",&p2->num,&p2->age,p2->name,p2->sex,p2->chushen,p2->dizhi,p2->phone,p2->email);
}
else
printf("没有该学生信息!!\n");
}
struct student *delList(struct student *head,long del_num) // 删除学生信息
{
struct student *p,*q;
p=head;
q=head;
while(p &&(p->num != del_num))
{
q=p;
p=p->next;
}
if(p==NULL)
printf("无此学号!\n");
else{
if(p == head)
{
head = p->next;
free(p);
}
else{
q->next = p->next;
free(p);
}
}
return head;
}
void paixu(struct student *head) //按学号排序
{
struct student *p,*f,*t;
char ch[100];
int i;
t=f=p=head;
for(p=head;p->next!=NULL;p=p->next)
{
for(t=head,f=t->next;t->next!=NULL;t=t->next,f=f->next)
{
if(t->num>f->num>0)
{
i=t->num;
t->num=f->num;
f->num=i;
i=t->age;
t->age=f->age;
f->age=i;
strcpy(ch,t->name);
strcpy(t->name,f->name);
strcpy(f->name,ch);
strcpy(ch,t->sex);
strcpy(t->sex,f->sex);
strcpy(f->sex,ch);
strcpy(ch,t->chushen);
strcpy(t->chushen,f->chushen);
strcpy(f->chushen,ch);
strcpy(ch,t->dizhi);
strcpy(t->dizhi,f->dizhi);
strcpy(f->dizhi,ch);
strcpy(ch,t->phone);
strcpy(t->phone,f->phone);
strcpy(f->phone,ch);
strcpy(ch,t->email);
strcpy(t->email,f->email);
strcpy(f->email,ch);
}
}
}
// return head;
}
void save(struct student *head) //保存为磁盘文件
{
struct student *p;
if((fp=fopen("keshe","w"))==NULL) //打开一个文件
{
printf("cannot open this file\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fprintf(fp,"%d\n",p->num);
fprintf(fp,"%d\n",p->age);
fprintf(fp,"%s\n",p->name);
fprintf(fp,"%s\n",p->sex);
fprintf(fp,"%s\n",p->chushen);
fprintf(fp,"%s\n",p->dizhi);
fprintf(fp,"%s\n",p->phone);
fprintf(fp,"%s\n",p->email);
p=p->next;
}
fclose(fp);
}
struct student *read() //从磁盘读取文件
{
struct student *head=NULL;
struct student *p=NULL;
struct student *t=NULL;
int a;
// fp=fopen("keshe","r");
if((fp=fopen("keshe","r"))==NULL) //打开一个文件
{
printf("cannot open this file\n");
exit(0);
}
while(1)
{
t=(struct student *)malloc(len);
a=fscanf(fp,"%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s",&t->num,&t->age,t->name,t->sex,t->chushen,t->dizhi,t->phone,t->email);
if(a==0||a==-1)
return head;
t->next=NULL;
if(p==NULL)
{
p=t;
head=t;
}
else
{
p->next=t;
p=p->next;
p->next=NULL;
}
}
fclose(fp);
}
void main() //主函数
{
int code=0;
struct student *pt = NULL;
for(code=1;;code++) //控制循环
{
menu(); //调用菜单函数
printf("请输入序号:\n"); //提示输入序号
scanf("%d",&code);
system("cls"); //清屏(下边也是这样功能)
switch(code) //选择序号进行功能选择
{
case 1:
{
system("cls");
printf("===========================输入学生信息 ==============================\n");
printf("---------------------------------------------------------------------\n");
printf("学号\t年龄\t姓名\t性别\t出生\t地址\t电话\te-mail\n");
pt=creat(); //调用输入函数
save(pt); //将数据存储到磁盘中
system("cls");
printf("===========================输入学生信息 ==============================\n");
printf("---------------------------------------------------------------------\n");
printf("************成功输入学生信息***********!!\n\n");
printf("按回车键返回主菜单\n");
getchar();
getchar(); //按回车键返回
system("cls");
};break;
case 2:
{
system("cls");
printf("===========================学生信息表 ================================\n");
printf("---------------------------------------------------------------------\n");
printf("学号\t年龄\t姓名\t性别\t出生\t地址\t电话\te-mail\n");
printList(read()); //调用输出函数(是从磁盘中读出)
printf("=============================
========================================\n");
printf("---------------------------------------------------------------------\n");
printf("\n按回车键返回主菜单\n");
getchar();
getchar();
system("cls");
};break;
case 3:
{
int search=0;
system("cls");
printf("===========================查询学生信息==============================\n");
printf("---------------------------------------------------------------------\n");
while(search!=3) //进入查询功能函数
{
printf("1、按学号查询\n2、按姓名查询\n3、退出查询\n");
scanf("%d",&search); //插入查找方式
switch(search)
{
case 1: //选择学号查询
{
long search_num;
system("cls");
printf("请输入学生学号\n");
scanf("%d",&search_num);
system("cls");
printf("===========================查询结果==================================\n"); printf("---------------------------------------------------------------------\n");
printf("学号\t年龄\t姓名\t性别\t出生\t地址\t电话\te-mail\n");
findList_num(read(),search_num); //调用查找函数,将数据从磁盘中读出
printf("===========================
==========================================\n"); printf("---------------------------------------------------------------------\n");
printf("\n按回车键返回查询菜单\n");
getchar();
getchar();
system("cls");
};break;
case 2: //按姓名查找
{
char search_name[15];
system("cls");
printf("请输入学生姓名\n");
scanf("%s",search_name); //输入要查找学生姓名
system("cls");
printf("===========================查询结果==============
====================\n");
printf("---------------------------------------------------------------------\n");
printf("学号\t年龄\t姓名\t性别\t出生\t地址\t电话\te-mail\n");
findList_name(read(),search_name); //调用姓名查找函数 printf("=====================================================================\n");
printf("---------------------------------------------------------------------\n");
printf("\n按回车键返回查询菜单\n");
getchar();
getchar();
system("cls");
};
}
}
system("cls");
};break;
case 4: //删除学生信息
{
long del_num;
system("cls");
printf("===========================删除学生信息 ==============================\n");
printf("---------------------------------------------------------------------\n");
printf("请输入要删除学生信息学号:\n");
scanf("%d",&del_num); //输入要删除学号
system("cls");
pt=delList(read(),del_num); //调用删除函数
save(pt);
printf("=========================删除结果================================\n");
printf("--
展开阅读全文