已经按你的要求改写并调试通过了。调试环境win-tc和Dev-c++.
这是我在以前帮别人写的学生成绩管理系统的基础上改写的,学生信息用文件保存,从文件读入。同时为了简化起见,没有使用链表,容易理解。程序还具有很强的判断验错功能。对本题算法很简单,就是一个函数strcmp().其中student.dat内容如下,你可以自己用记事本修改并保存文件名为student.dat即可:
100001 周云发 19 男 1985.10 香港秀水街 19944569659 123@163.com
100009 程龙 18 男 1986.11 香港秀水街 19744569659 133@126.com
100003 章自已 18 女 1986.12 香港古装城 19844569659 143@163.com
100004 周讯 17 女 1987.06 香港秀水街 19644569659 153@126.com
100008 李丽珍 19 女 1985.08 香港古装城 19544569659 163@163.com
100007 蔡灼燕 17 女 1987.10 香港靓仔街 19444569659 173@126.com
100012 刘得花 20 男 1984.06 香港古装城 19344569659 183@126.com
100010 李嘉欣 20 女 1984.03 香港秀水街 19244569659 193@163.com
100011 周星星 19 男 1985.07 香港靓仔街 19144569659 223@163.com
100002 梁超伟 20 男 1984.01 香港秀水街 19044569659 233@163.com
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
/* 简易学生信息管理系统 win-tc和Dev-c++下运行良好,注意不是vc++下*/
#include
#include
#include
#define BUFLEN 80 /* 缓冲区最大字符数 */
#define LEN 20 /* 学号和姓名最大字符数,实际请更改 */
#define N 200 /* 最大学生人数,实际请更改*/
struct record
{
char code[LEN+1]; /* 学号 */
char name[LEN+1]; /* 姓名 */
int age; /* 年龄 */
char sex[3]; /* 性别 */
char time[LEN+1]; /* 出生年月 */
char add[30]; /* 家庭地址 */
char tel[LEN+1]; /* 电话号码 */
char mail[30]; /* 电子邮件地址 */
}stu[N];
int k=1,n,m; /* 定义全局变量 */
void readfile();/* 函数声明 */
void seek();
void modify();
void insert();
void del();
void display();
void save();
void menu();
int main()
{ while(k)
menu();
system("pause");
return 0;
}
void readfile()/* 建立信息 */
{
char buf[BUFLEN],*p="student.dat";
FILE *fp;
int i=0;
if ((fp=fopen("student.dat","r"))==NULL)
{ printf("Open file %s error! Strike any key to exit!",p);
system("pause");
exit(0);
}
while(fscanf(fp,"%s %s%d%s %s %s %s %s",stu[i].code,stu[i].name,&stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail)==8)
{ i++;
i=i;
}
fclose(fp);
n=i;
printf("录入完毕!\n");
}
void seek()
{int i,j,item,flag;
char s1[21]; /* 以姓名和学号最长长度+1为准 */
printf("------------------\n");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
printf("3.退出本菜单\n");
printf("------------------\n");
while(1)
{ printf("请选择子菜单编号:");
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的学生的学号:\n");
scanf("%s",s1);
for(i=0;i
{ flag=1;
printf("该学生学号,姓名,年龄,性别,出生年月,地址,电话,E-mail 分别为:\n");
printf("%s %s %d %s %s %s %s %s\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
if(flag==0)
printf("该学号不存在!\n"); break;
case 2:
printf("请输入要查询的学生的姓名:\n");
scanf("%s",s1);
for(i=0;i
{ flag=1;
printf("该学生学号,姓名,年龄,性别,出生年月,地址,电话,E-mail 分别为:\n");
printf("%s %s %d %s %s %s %s %s\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
if(flag==0)
printf("该姓名不存在!\n"); break;
case 3:return;
default:printf("请在1-3之间选择\n");
}
}
}
void modify() /*修改信息*/
{int i,j,item,num;
char sex1[3],s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准 */
printf("请输入要要修改的学生的学号:\n");
scanf("%s",s1);
for(i=0;i
num=i;
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改出生年月\n");
printf("5.修改地址\n");
printf("6.修改电话号码\n");
printf("7.修改E-mail地址\n");
printf("8.退出本菜单\n");
printf("------------------\n");
while(1)
{ printf("请选择子菜单编号:");
scanf("%d",&item);
switch(item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",s2);
strcpy(stu[num].name,s2); break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d",&stu[num].age);break;
case 3:
printf("请输入新的性别:\n");
scanf("%s",sex1);
strcpy(stu[num].sex,sex1); break;
case 4:
printf("请输入新的出生年月:\n");
scanf("%s",s2);
strcpy(stu[num].time,s2); break;
case 5:
printf("请输入新的地址:\n");
scanf("%s",s2);
strcpy(stu[num].add,s2); break;
case 6:
printf("请输入新的电话号码:\n");
scanf("%s",s2);
strcpy(stu[num].tel,s2); break;
case 7:
printf("请输入新的E-mail地址:\n");
scanf("%s",s2);
strcpy(stu[num].mail,s2); break;
case 8:return;
default:printf("请在1-8之间选择\n");
}
}
}
void insert()
{ int i=n,j,flag;
printf("请输入待增加的学生数:\n");
scanf("%d",&m);
do
{ flag=1;
while(flag)
{ flag=0;
printf("请输入第 %d 个学生的学号:\n",i+1);
scanf("%s",stu[i].code);
for(j=0;jif(strcmp(stu[i].code,stu[j].code)==0)
{ printf("已有该学号,请检查后重新录入!\n");
flag=1;
break; /*如有重复立即退出该层循环,提高判断速度*/
}
}
printf("请输入第 %d 个学生的姓名:\n",i+1);
scanf("%s",stu[i].name);
printf("请输入第 %d 个学生的年龄:\n",i+1);
scanf("%d",&stu[i].age);
printf("请输入第 %d 个学生的性别:\n",i+1);
scanf("%s",stu[i].sex);
printf("请输入第 %d 个学生的出生年月:(格式:年.月)\n",i+1);
scanf("%s",stu[i].time);
printf("请输入第 %d 个学生的地址:\n",i+1);
scanf("%s",stu[i].add);
printf("请输入第 %d 个学生的电话:\n",i+1);
scanf("%s",stu[i].tel);
printf("请输入第 %d 个学生的E-mail:\n",i+1);
scanf("%s",stu[i].mail);
if(flag==0)
{ i=i;
i++;
}
}while(i
printf("录入完毕!\n\n");
}
void del()
{ int i,j,flag=0;
char s1[LEN+1];
printf("请输入要删除学生的学号:\n");
scanf("%s",s1);
for(i=0;i
{ flag=1;
for(j=i;j
}
if(flag==0)
printf("该学号不存在!\n");
if(flag==1)
{ printf("删除成功,显示结果请选择菜单6\n");
n--;
}
}
void display()
{ int i,j;
printf("所有学生的信息为:\n");
for(i=0;i
printf("%s %s %d %s %s %s %s %s\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
}
void save()
{ int i,j,k,flag=0;
FILE *fp;
fp=fopen("student.dat","w");
for(i=0;i
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
fclose(fp);
}
void menu()/* 界面 */
{ int num;
printf(" \n\n简易学生信息管理系统\n\n");
printf("*****系统功能菜单*****\n");
printf("----------------------\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");
printf("请选择菜单编号:");
scanf("%d",&num);
switch(num)
{
case 1:readfile();break;
case 2:seek();break;
case 3:modify();break;
case 4:insert();break;
case 5:del();break;
case 6:display();break;
case 7:save();break;
case 8:k=0;break;
default:printf("请在1-8之间选择\n");
}
}
这个是我以前编的,有些小错误,你参考一下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"string.h"
typedef struct stud
{
long int number;
char name[20];
int grade;
char other[30];
char sex[10];
struct stud *next;
}T;
T *creat()
{
T *p,*q,*head;
long int number;
int grade;
char name[20],other[30],sex[10];
head=(T *)malloc(sizeof(T));
q=head;
printf("Please input the data:(num,name,sex,grade,other,0:end)\n");
scanf("%ld",&number);fflush(stdin);
if(number)
{
gets(name);
gets(sex);
scanf("%d",&grade);fflush(stdin);
gets(other);
}
while(number)
{
p=(T *)malloc(sizeof(T));
q->number=number;
strcpy(q->name,name);
strcpy(q->sex,sex);
q->grade=grade;
strcpy(q->other,other);
q->next=p;
q=p;
scanf("%ld",&number);fflush(stdin);
if(number)
{
gets(name);
gets(sex);
scanf("%d",&grade);fflush(stdin);
gets(other);
}
}
q->next=NULL;
fflush(stdin);
return head;
}
void print(T *head)
{
T *p;
p=head;
if(p)
printf("Number name \tsex grade other\n");
while(p->next)
{
printf("%08ld %-15s%-6s %-8d %s\n",p->number,p->name,p->sex,p->grade,p->other);
p=p->next;
}
printf("\nEND!\n");
}
void fprint(T *head,FILE *fp)
{
T *p;
p=head;
if(p)
fprintf(fp,"Number name \tsex grade other\n");
while(p->next)
{
fprintf(fp,"%08ld %-15s%-6s %-8d %s\n",p->number,p->name,p->sex,p->grade,p->other);
p=p->next;
}
fprintf(fp,"\nEND!\n");
}
T *range(T *head)
{
T *p,*q,*s;
int key;
printf("Please input the key you want to range:\n1.number,2.name,3.sex,4.grade,5.other.\nYour choice:[ ]\b\b");
scanf("%d",&key);fflush(stdin);
s=q=head;
p=q->next;
switch(key)
{
case 1:
while(p)
{
if(s->number>p->number) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
break;
case 2:
while(p)
{
if(strcmp(s->name,p->name)>0) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
break;
case 3:
while(p)
{
if(strcmp(s->sex,p->sex)>0) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
break;
case 4:
while(p)
{
if(s->grade>p->grade) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
break;
case 5:
while(p)
{
if(strcmp(s->other,p->other)>0) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
break;
}
return head;
}
T *range_1(T *head)
{
T *p,*q,*s;
s=q=head;
p=q->next;
while(p)
{
if(s->number>p->number) s=p;
p=p->next;
}
if(s!=head)
{
s->next=head;
head=s;
}
for(s=q=head->next;s;s=q=s->next)
{
for(p=q->next;p;p=p->next)
if(s->grade>p->grade) s=p;
if(s!=q)
{
s->next=q;
q=s;
}
}
return head;
}
T *insert(T *head)
{
T *p,*q,*s;
s=(T *)malloc(sizeof(T));
printf("Please input the insert data:(num,name,sex,grade,other)\n");
scanf("%ld",&s->number);fflush(stdin);
if(s->number==0)
{
printf("ERROR!\nPlease input number again.\n");
scanf("%ld",&s->number);fflush(stdin);
}
gets(s->name);
gets(s->sex);
scanf("%d",&s->grade);fflush(stdin);
gets(s->other);
q=head;
p=q->next;
if(q->number>s->number)
{
s->next=head;
head=s;
}
while(q->number
{
q=p;
p=q->next;
}
/*if(!q)
{
q->next=s;
s->next=NULL;
}
else
{
s->next=p;
q->next=s;
}*/
s->next=p;
q->next=s;
return head;
}
T *del(T *head)
{
T *p,*q;
long int x;
int key=2;
print(head);
printf("Please input the data you want to delete:(num)\n");
scanf("%ld",&x);fflush(stdin);
for(;key==2;)
{
printf("Are you sure?\n1.OK.\n2.Input new.\n3.Exit delete.\nYour choice:[ ]\b\b");
scanf("%d",&key);fflush(stdin);
if(key==3) return head;
if(key==2) scanf("%ld",&x);
}
q=head;
p=q->next;
if(q->number==x)
{head=p;return(head);}
while(q&&p->number!=x)
{
q=p;
p=q->next;
}
if(q)
{
q->next=p->next;
free(p);
}
else printf("NOT Found!!!\n");
return head;
}
void prt()
{
printf(" welcome to use!!! \t\t========================\n");
printf(" \t\t* Linklist Student *\n");
printf(" \t\t* by czj *\n");
printf(" \t\t* 2008 10 4 *\n");
printf(" \t\t========================\n");
}
void fprt(FILE *p)
{
fprintf(p," welcome to use!!! \t\t========================\n");
fprintf(p," \t\t* Linklist Student *\n");
fprintf(p," \t\t* by czj *\n");
fprintf(p," \t\t* 2008 10 4 *\n");
fprintf(p," \t\t========================\n");
}
void main()
{
T *head=NULL;
int key=1;
FILE *p;
prt();
head=creat();
print(head);
printf("1.INSERT.\n2.DLETE.\n3.CORRECT.\n4.RANGE.\n0.EXIT.\nYour choice[ ]\b\b");
scanf("%d",&key);fflush(stdin);
for(;key;)
{
system("cls");
prt();
if(key==1) insert(head);
if(key==2||key==3) del(head);
if(key==3) insert(head);
if(key==4) range(head);
print(head);
printf("1.INSERT.\n2.DELETE.\n3.CORRECT.\n4.RANGE.\n0.EXIT.\nYour choice[ ]\b\b");
scanf("%d",&key);fflush(stdin);
}
if((p=fopen("d:\\linklist1.dat","w"))==NULL)
{
printf("Can't open the file.\n");
exit(0);
}
fprt(p);
fprint(head,p);
fclose(p);
}
/*
最后一个节点不用。
fflush(stdin);清除缓存。
insert中输入有问题,range。
*/
呵呵,不难做,只是没有那么多时间。
这个用链表很容易实现。
网上也有很多相关的代码可以直接下载。
建议你还是对照着书看看。自己做一下。
这个程序做下来能学到不少东西呢~