.
C语言上机实践报告
专业:冶金工程
班级:冶金1102
姓名:
学号:
任课教师:丽华
时间:2012年8月
一、题目
学生信息管理系统设计
●学生信息包括:学号,姓名,年龄,性别,出生年月,地址,,E-mail等。
●试设计一学生信息管理系统,使之能提供以下功能:
a)系统以菜单方式工作
b)学生信息录入功能(学生信息用文件保存)---输入
c)学生信息浏览功能---输出
d)查询、排序功能---算法
(1) 按学号查询
(2) 按姓名查询
e)学生信息的删除与修改(可选项)
一、系统功能模块结构图
二、数据结构设计及用法说明#include"stdio.h"
#include"stdlib.h"
#include"string.h"
/*定义结构体用作创建链表*/
typedef struct z1
{
char no[11]; //学生学号
char name[15]; //学生姓名
int age; //学生年龄
char sex; //学生性别
char birthday[8]; //学生出生年月char address[20]; //学生住址
char tel[12]; //学生联系
char e_mail[20]; //学生e-mail
struct z1 *next; //指向下一链表}STUDENT;
/*声明用户自定义函数*/
STUDENT *init();
STUDENT *create();
STUDENT *del(STUDENT *h);
STUDENT *insert(STUDENT *h);
STUDENT *revise(STUDENT *h);
void print(STUDENT *h);
void search1(STUDENT *h);
void search2(STUDENT *h);
void save(STUDENT *h);
int menu_select();
void inputs(char *prompt,char *s,int count);
/*主函数,用于选择功能*/
void main()
{
STUDENT *head;
head=init(); //初始化链表表头
for(;;)
{
switch(menu_select())
{
case 0:head=init();break; //初始化
case 1:head=create();break; //创建列表
case 2:head=insert(head);break; //插入节点
case 3:save(head);break; //以文件形式保存
case 4:print(head);break; //显示
case 5:search1(head);break; //搜索学号
case 6:search2(head);break; //搜索姓名
case 7:head=del(head);break; //删除
case 8:head=revise(head);break; //修改
case 9:exit(0); //退出程序
}
}
}
/*目录选择函数,返回用户输入的数字*/
int menu_select()
{
char *menu[]={"************菜单************",
"0. 初始化链表",
"1. 输入学生信息",
"2. 插入学生信息",
"3. 保存学生信息",
"4. 显示学生信息",
"5. 按学号查找学生信息",
"6. 按姓名查找学生信息",
"7. 删除指定学号的学生信息",
"8. 修改指定学号的学生信息",
"9. 退出系统"};
int c,i;
for(i=0;i<=11;i++)
printf(" %s\n",menu[i]);
do
{
printf("\n请选择0~9中的某一个选项:\n");
scanf("%d",&c);
}while(c<0||c>10);
return c;
}
/*初始化函数,作用是返回空指针初始化链表*/ STUDENT *init()
{
return NULL;
}
/*创建函数,输入学生信息*/
STUDENT *create()
{
STUDENT *h=NULL,*info;
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT));
if(!info)
{
printf("\n存不足");
return NULL;
}
inputs("输入学号:",info->no,11);
if(info->no[0]=='@')break;
inputs("输入姓名:",info->name,15);
printf("输入年龄:");
scanf("%d",&info->age);
printf("输入性别编号(0.男1.女):");
scanf("%s",&info->sex);
printf("输入出生年月(XXXX/XX):");
scanf("%s",info->birthday);
inputs("输入地址:",info->address,20);
inputs("输入:",info->tel,12);
inputs("输入E-mail:",info->e_mail,20);
info->next=h;
h=info;
}
return h;
}
/*输入函数,用于判断输入的字符是否超出程序定义避免数据溢出*/ void inputs(char *prompt,char *s,int count)
{
char p[255];
do
{
printf(prompt);
scanf("%s",p);
if(strlen(p)>count)
printf("\n太长了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
/*插入函数,插入学生成绩*/
STUDENT *insert(STUDENT *h)
{
STUDENT *p,*q,*info;
char s[11];
printf("请输入插入点的学生学号\n");
scanf("%s",s);
printf("\n请输入新的学生信息\n");
info=(STUDENT *)malloc(sizeof(STUDENT));
inputs("输入学号:",info->no,11);
inputs("输入姓名:",info->name,15);
printf("输入年龄:");
scanf("%d",&info->age);
printf("输入性别编号(0.男1.女):");
scanf("%s",&info->sex);
printf("输入出生年月(XXXX/XX):");
scanf("%s",info->birthday);
inputs("输入地址:",info->address,20);
inputs("输入:",info->tel,12);
inputs("输入E-mail:",info->e_mail,20);
info->next=NULL;
p=h;
q=h;
while(strcmp(p->no,s)&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==NULL)
if(p==h)
h=info;
else
q->next=info;
else if(p==h)
{
info->next=p;
h=info;
}
else
{
info->next=p;
q->next=info;
}
printf("\n已经插入了%s这个学生\n",info->name); return(h);
}
/*保存函数,以文件的形式保存学生信息*/
void save(STUDENT *h)
{
FILE *fp;
STUDENT *p;
char outfile[50];
printf("请输入保存文件的文件名,例如c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{
printf("不能打开文件\n");
exit(1);
}
printf("\n正在保存......\n");
p=h;
while(p!=NULL)
{
fwrite(p,sizeof(STUDENT),1,fp);
p=p->next;
}
fclose(fp);
printf("------保存成功!!!------\n");
}
/*显示函数,显示学生信息*/
void print(STUDENT *h)
{
int i=0;
STUDENT *p;
p=h;
printf("\n\n\n********************************学生*************************************\n");
printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");
printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );
while(p!=NULL)
{
i++;
printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);
p=p->next;
}
printf("***************************************end************************************ *\n");
}
/*搜索函数,按学号搜索学生信息并显示*/
void search1(STUDENT *h)
{
STUDENT *p;
char s[11];
printf("请输入你要查找的同学的学号\n");
scanf("%s",s);
p=h;
while(strcmp(p->no,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("'n没有学号为%s的学生\n",s);
else
{
printf("\n\n\n****************************找到了
***************************************\n");
printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");
printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );
printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);
printf("***********************************end**************************************** *\n");
}
}
/*搜索函数,按姓名搜索学生信息并显示*/
void search2(STUDENT *h)
{
STUDENT *p;
char s[15];
printf("请输入你要查找的同学的姓名\n");
scanf("%s",s);
p=h;
while(strcmp(p->name,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("'n没有姓名为%s的学生\n",s);
else
{
printf("\n\n\n*******************************找到了************************************\n");
printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");
printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );
printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);
printf("**************************************end************************************* *\n");
}
}
/*删除函数,删除指定学号的学生信息*/
STUDENT *del(STUDENT *h)
{
STUDENT *p,*q;
char s[11];
printf("请输入要删除的学生的学号\n");
scanf("%s",s);
q=p=h;
while(strcmp(p->no,s)&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==NULL)
printf("\n链表中没有学号为%s的学生\n",s);
else
{
printf("\n\n\n********************************找到了***********************************\n");
printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");
printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );
printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);
printf("***************************************end************************************ *\n");
printf("请按任意键删除\n");
getchar();
if(p==h)
h=p->next;
else
q->next=p->next;
free(p);
printf("\n已经删除学号为%s的学生\n",s);
}
return h;
}
/*修改函数,修改指定学号的学生信息*/
STUDENT *revise(STUDENT *h)
{
STUDENT *p,*q;
char s[11];
printf("请输入您希望修改的学生学号\n");
scanf("%s",s);
printf("\n 请输入新的学生信息\n");
p=h;
q=h;
while(strcmp(p->no,s)&&p!=NULL)
{
q=p;
p=p->next;
}
inputs("输入学号:",p->no,11);
inputs("输入姓名:",p->name,15);
printf("输入年龄:");
scanf("%d",&p->age);
printf("输入性别编号(0.男1.女):");
scanf("%s",&p->sex);
printf("输入出生年月(XXXX/XX):");
scanf("%s",p->birthday);
inputs("输入地址:",p->address,20);
inputs("输入:",p->tel,12);
inputs("输入E-mail:",p->e_mail,20);
return (h);
}
三、程序结构