|
阅读:994回复:0
数据结构课设,学生档案登记卡(C语言版)
#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 修改 ] |
|
|