第1个回答 2012-05-03
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bool int
#define true 1
#define false 0
#define LEN sizeof(struct System)
struct System /*存放学生信息*/
{
char name[20]; /*姓名*/
char num[10]; /*学号*/
char c[5]; /*c语言成绩*/
char match[5]; /*数学成绩*/
char english[5]; /*英语成绩*/
struct System *next; /*下个结点*/
};
typedef struct System sys;
sys *head = NULL;
void ShowMenu(); /*菜单*/
void Find(); /*输出单个信息*/
void Display(); /*输出全部信息*/
void Addition(); /*增加学生信息*/
void Modify(); /*修改学生信息*/
void Delete(); /*删除学生信息*/
void Aver();
void Save(); /*输出信息到文件*/
void Open(); /*文件信息输出到链0表*/
sys *FindMessage(); /*查找信息*/
int main()
{
char x;
bool quit = false; /*创建并设置退出循环的条件为假*/
Open();
while(!quit)
{
ShowMenu(); /*显示菜单*/
scanf("%s", &x);
switch(x)
{
case'0':
quit = true;
Save();
break;
case'1':
Addition();
break;
case'2':
Modify();
break;
case'3':
Delete();
break;
case'4':
Find();
break;
case'5':
Display();
break;
default:
break;
}
}
return 0;
}
/*菜单显示*/
void ShowMenu()
{
printf("\n********************************************* \n");
printf("1.增加学生 ");
printf("2.修改学生 ");
printf("3.删除学生 ");
printf("4.查找学生 ");
printf("5.显示全部学生 ");
printf("0.退出\n");
printf("********************************************* \n");
printf("请选择 ");
}
/*增加信息*/
void Addition()
{
sys *p1 = NULL, *p2 = NULL;
p1 = (sys * )malloc(sizeof(sys));
printf("输入姓名:");
scanf(" %s ",p1->name);
printf("输入学号:");
scanf(" %s ",p1->num);
printf("输入c语言成绩:");
scanf(" %s ",p1->c);
printf("输入数学成绩:");
scanf(" %s ",p1->match);
printf("输入英语成绩:");
scanf(" %s ",p1->english);
p1->next = NULL;
if(NULL == head)
{
head = (sys * )malloc(sizeof(sys));
head->next=p1;
}else
{
for(p2 = head;p2->next!=NULL;p2=p2->next);
p2->next=p1;
}
}
/*查找用户*/
void Find()
{
sys *p = FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
printf("找到该学生:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);
}
/*查找用户函数*/
sys *FindMessage()
{
char name[20];
sys *p = NULL;
printf("请输入姓名!\n");
scanf(" %s ",name);
if(head == NULL)
{
printf("学生管理系统没有记录,请输入记录后,再使用功能!\n");
return NULL;
}
for(p = head; p->next!= NULL; p = p->next)
if(!strcmp(p->next->name,name))
return p;
return NULL;
}
/*显示所有信息*/
void Display()
{
sys * p = NULL;
if(head==NULL)
{
printf("学生管理系统没有记录,请输入记录后,再使用功能!\n");
return;
}
for(p = head->next;p!=NULL;p=p->next)
printf("姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->name, p->num, p->c, p->match, p->english);
}
/*修改信息*/
void Modify()
{
sys *p=FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
{
printf("要修改学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);
printf("请输入新的姓名:\n");
scanf("%s",p->next->name);
printf("请输入新的学号:\n");
scanf("%s",p->next->num);
printf("请输入新的c语言成绩:\n");
scanf("%s",p->next->c);
printf("请输入新的数学成绩:\n");
scanf("%s",p->next->match);
printf("请输入新的英语成绩:\n");
scanf("%s",p->next->english);
p->next->next=NULL;
}
}
/*删除信息*/
void Delete()
{
sys *temp = NULL;
sys *p=FindMessage();
if(NULL==p)
printf("对不起,没有找到该学生!\n");
else
{
printf("要删除学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english);
temp=p->next;
p->next=p->next->next;
free(temp);
}
}
/*输出信息到文件,并释放链表空间*/
void Save()
{
sys *p=NULL;
FILE *fp;
char *filename="book.txt";
if(head==NULL)
{
printf("\n记录为空!\n");
return;
}
else
p=head->next;
if((fp=fopen(filename,"w"))==NULL) /*出错检测*/
{
printf("\n打不开文件!\n");
return;
}
while(p!=NULL)
{
fprintf(fp, "%s\t %s\t %s\t %s\t %s\t\n",p->name, p->num, p->c, p->match, p->english);
p=p->next;
}
printf("保存完毕!\n");
fclose(fp);
for(;head->next!=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
/*读取文件信息输出到链表*/
void Open()
{
FILE *fp;
sys *p1=NULL, *p2=NULL, *temp=NULL;
if((fp=fopen("book.txt","r"))==NULL)
{
printf("\n**************这是一个新的学生管理系统***************");
return;
}
head=(sys *)malloc(sizeof(sys));
head->next=NULL;
temp=p2=head;
while(!feof(fp)) /*读取文件信息*/
{
p1=(sys *)malloc(LEN);
temp=p2;
p2->next=p1;
p2=p1;
fscanf(fp,"%s %s %s %s %s", p1->name, p1->num, p1->c, p1->match, p1->english);
}
temp->next=NULL;
fclose(fp);
}