yz95
荣誉会员
荣誉会员
  • 铜币29枚
  • 威望1点
  • 贡献值0点
  • 社区居民
阅读:994回复:0

数据结构课设,学生档案登记卡(C语言版)

楼主#
更多 发布于:2001-09-10 17:12
#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include<string.h>
int CARDNUM;//定义全局变量,保存存储数据的个数

 struct node
{

int num;//存储记录的条数.由系统自动生成
char stunum[10];//学号
char name[15];//姓名
char sex[5];//性别
int year,month,day;//出生年月日
int foreign;//外语成绩
int math;//数学成绩
struct node *next;//下一节点指针
} ;
struct node *STU,*TEMP;//定义全局,保存线性链表头指针
int init()// 初始化程序,将数据读入内存
{
FILE *fp;int i;
struct node *t;
fp=fopen("db.txt","r");
fscanf(fp,"%d",&CARDNUM);
TEMP=(struct node*)malloc(sizeof(struct node));
STU=TEMP;
fscanf(fp,"%d %s %s %s %d-%d-%d %d %d",//读入最初数据
&TEMP->num,TEMP->stunum,TEMP->name,TEMP->sex,&TEMP->year, &TEMP->month,&TEMP->day,&TEMP->foreign,&TEMP->math);
TEMP->next=NULL;
//while(!feof(fp))
for(i=1;i<=CARDNUM;i++)
{
t=(struct node*)malloc(sizeof(struct node));
fscanf(fp,"%d %s %s %s %d-%d-%d %d %d",//如果已经存入数据,则继续读入
&t->num,t->stunum,t->name,t->sex,&t->year, &t->month,&t->day,&t->foreign,&t->math);
TEMP->next=t;
TEMP=TEMP->next;
TEMP->next=NULL;
}
//TEMP->next=NULL;
fclose(fp);
return(0);

}
void inputstu(int a)//输入数据
{
struct node *p;
int i;
TEMP=STU;//TEMP和STU指向第一节点
while(1)//使TEMP指向链表STU的节点(节点的指针为空)
{
if (TEMP->next!=NULL)
TEMP=TEMP->next ;
else
break;
}
printf("请分别按“学号 姓名 性别 出生(年-月-日) 外语成绩 数学成绩”输入:\n");
for(i=0;i<a;i++)//循环读入输入的数据,但NUM由系统自动生成
{
p=(struct node*)malloc(sizeof(struct node));
scanf("%s %s %s %d-%d-%d %d %d",
p->stunum,p->name,p->sex,&p->year, &p->month,&p->day,&p->foreign,&p->math);
TEMP->next=p;
TEMP->next->num=++CARDNUM;
TEMP=TEMP->next;
}
TEMP->next=NULL;

}
void viewbystunum(char a[])//按学号查询
{
// struct node *TEMP;
TEMP=STU;
while(TEMP!=NULL&&(strcmp(a,TEMP->stunum)))
{
TEMP=TEMP->next;
}
if (TEMP!=NULL)
{
printf("\n您要找的记录:\n");
printf("%d %s %s %s %d-%d-%d %d %d\n\n",
TEMP->num, TEMP->stunum,TEMP->name,TEMP->sex,TEMP->year,TEMP->month,TEMP->day,TEMP->foreign,TEMP->math);
}
else
printf("\n找不到这个记录。\n\n");
}
void viewbyname(char a[])//按姓名查询
{
// struct node *TEMP;
int n;
TEMP=STU;
while(TEMP->next!=NULL)
{
TEMP=TEMP->next;
if (!(TEMP!=NULL&&(strcmp(a,TEMP->name))))
{
printf("%d %s %s %s %d-%d-%d %d %d\n\n",
TEMP->num,TEMP->stunum, TEMP->name,TEMP->sex,TEMP->year,TEMP->month,TEMP->day,TEMP->foreign,TEMP->math);
printf("\n1 查找下一个:\n0 返回:\n\n");
scanf("%d",&n);
if (n!=0)
continue;
else
break;
}

}
if (TEMP->next==NULL)
printf("\n无此记录。\n\n");

}

void viewbyscore(int a)//按成绩查询
{
// struct node *TEMP;
int i,n=1;
TEMP=STU;
while(TEMP->next!=NULL)
{
TEMP=TEMP->next;
if (!(TEMP!=NULL&&(i=(TEMP->foreign+TEMP->math))!=a))
{
printf("%d %s %s %s %d-%d-%d %d %d\n",
TEMP->num,TEMP->stunum, TEMP->name,TEMP->sex,TEMP->year,TEMP->month,TEMP->day,TEMP->foreign,TEMP->math);
n=0;
}
else
continue;
}
printf("\n");
if (n)//(TEMP->next==NULL)
printf("\n找不到这个记录。\n\n");

}
void delstu(int a)//按序号删除
{
struct node *del;//存储要删除的节点
int i=1;//i为0,删除;否则,没有删除
TEMP=STU;
while(TEMP->next!=NULL)//向下搜索,直到找到符合节点
{
if (TEMP->next->num==a)//(!strcmp(TEMP->next->stunum,a))
{
printf("\n此记录是:");
printf("%d %s %s %s %d-%d-%d %d %d\n\n",
TEMP->next->num,TEMP->next->stunum, TEMP->next->name,TEMP->next->sex,TEMP->next->year,TEMP->next->month,TEMP->next->day,TEMP->next->foreign,TEMP->next->math);
printf("\n1 确认删除:\n2 取消:\n\n");
scanf("%d",&i);
if (i==1)
{
del=TEMP->next;
TEMP->next=TEMP->next->next;
TEMP=TEMP->next;
free(del);
i=0;
break;
}
}
else
{
TEMP=TEMP->next;
}
}
if (i)
printf("没有这个记录.\n\n");
else
printf("记录已删除。\n\n");
while(TEMP!=NULL)
{
TEMP->num--;
TEMP=TEMP->next;
}
CARDNUM--;
}
void save()//保存数据
{
//struct node *TEMP;
FILE *fp;
int i;
fp=fopen("db.txt","w");
TEMP=STU;
fprintf(fp,"%d\n",CARDNUM);
for(i=0;i<=CARDNUM;i++)
{
fprintf(fp,"%d %s %s %s %d-%d-%d %d %d\n",
TEMP->num,TEMP->stunum, TEMP->name,TEMP->sex,TEMP->year,TEMP->month,TEMP->day,TEMP->foreign,TEMP->math);
TEMP=TEMP->next;
}
fclose(fp);
}
void viewall()
{
//struct node *TEMP;
TEMP=STU;
while(TEMP!=NULL)
{
printf("%d %s %s %s %d-%d-%d %d %d\n",
TEMP->num,TEMP->stunum, TEMP->name,TEMP->sex,TEMP->year,TEMP->month,TEMP->day,TEMP->foreign,TEMP->math);
TEMP=TEMP->next;
}
printf("\n");
}
void modify(int a)
{
int i;
int m;//存放系统自动生成的序号num
struct node *p,*t;//p,t临时存放节点
TEMP=STU;
for (i=1;i<a;i++)//循环查找,直到找到要修改记录的前一条记录
{
TEMP=TEMP->next;
}
p=(struct node*)malloc(sizeof(struct node));
t=TEMP->next->next;//存放要修改记录后面的链表
printf("\n这是要修改的记录。\n");
printf("%d %s %s %s %d-%d-%d %d %d\n",
TEMP->next->num,TEMP->next->stunum, TEMP->next->name,TEMP->next->sex,TEMP->next->year,TEMP->next->month,TEMP->next->day,TEMP->next->foreign,TEMP->next->math);
m=TEMP->next->num;
printf("\n请输入修改后的记录。\n");
scanf("%s %s %s %d-%d-%d %d %d",
p->stunum,p->name,p->sex,&p->year, &p->month,&p->day,&p->foreign,&p->math);
p->num=m;
TEMP->next=p;
p->next=t;
printf("\n记录修改完成。\n\n");
}

void main()
{
//struct node *TEMP,*t;//
int n,i;
char a[15];

if (init())
{
printf("不能打开文件");
exit(1);
}
while(1)
{
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("9 修改记录:\n");
printf("请输入您的选择:   ");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
printf("请输入数据的个数:\n");
scanf("%d",&i);
inputstu(i);
break;
case 2:
printf("请输入要删除的学生的序号:\n");
scanf("%d",&i);
while(i<=0||i>CARDNUM)
{
printf("输入超出范围,请重新输入:\n\n");
scanf("%d",&i);
}

delstu(i);
break;
case 3:
printf("请输入要查询的学生的学号:\n");
scanf("%s",a);
viewbystunum(a);
break;
case 4:
printf("请输入要查询的学生的姓名:\n");
scanf("%s",a);
viewbyname(a);
break;
case 5:
printf("请输入要查询的学生的成绩和:  ");
scanf("%d",&i);
printf("\n");
viewbyscore(i);
break;
case 6:
viewall();
break;
case 7:
save();
exit(0);
case 8:
exit(0);
case 9:
printf("\n请输入需要修改记录的序号:");
scanf("%d",&i);
while(i<=0||i>CARDNUM)
{
printf("您输入的序号超出了范围,请重新输入。");
scanf("%d",&i);
}
modify(i);
break;
default:
printf("\n您的输入有误,请从新输入\n\n");

}
}
}
db.txt如下:31
0 0 FF FF 0-0-0 0 0
1 99402310 chenyong woman 1980-5-6 55 44
2 99402315 ffffF M 1984-5-6 55 22
3 99402311 ggg man 1981-5-5 77 88
4 99999 yyy hhh 999-9-9 99 99
5 88888 ggg hhh 888-8-8 88 88
6 222 ffff ff 11-11-11 11 11
7 222 ggg gg 22-22-22 22 22
8 333 eee ww 33-33-33 1 21
9 1 fff jj 9-9-9 99 99
10 2 222 22 2-2-2 22 22
11 3 333 33 3-3-3 33 33
12 4 444 44 4-4-4 44 44
13 5 555 55 5-5-5 55 55
14 6 666 66 6-6-6 66 66
15 7 777 77 7-7-7 77 77
16 8 888 88 5-5-5 88 88
17 9 999 99 9-9-9 99 99
18 11 11 11 11-11-11 11 11
19 22 22 22 22-22-22 22 22
20 33 33 33 33-33-33 33 33
21 44 44 44 44-44-44 44 44
22 99 99 99 99-99-99 99 99
23 77 77 777 77-77-77 77 77
24 88 88 88 88-88-88 88 88
25 333 444 555 8-8-8 77 44
26 11 111 111 111-111-111 11 11
27 99402312 小名 男 1984-5-6 88 99
28 88 88 88 88-88-88 888 88
29 99402231 铁板 男 1980-1-1 11 22
30 56666rr tfrghg dd 99-999-99 88 77
31 00231 ddd ff 88-99-44 55 66
如果各位有自己的更优解法,请指教

[ 2001-9-10 17:18:20 yz95 修改 ]
嘿嘿,YZ95!
游客

返回顶部