|
时 间 记 忆  |
 |
<< < 2017 - 9 > >>
日 |
一 |
二 |
三 |
四 |
五 |
六 |
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
|
|
 |
|
 |
|
|
 |
|
 |
|
|
c语言(学生管理系统) |
|
>>2017-9-3 22:08:00 |
#i nclude<stdio.h> #i nclude<stdlib.h> #i nclude<string.h> #define NAME_LEN 25
struct stu { int number; char name[NAME_LEN+1]; char sex[5]; char dept[20]; int age; struct stu *next; };
struct stu *find_students1(int number,struct stu *first); struct stu *find_students2(struct stu *first); struct stu *insert(struct stu *first);//1 struct stu * search(struct stu *first);//2 void print(struct stu *first);//3 int search_girl(struct stu *first);//4 void search_first_name(struct stu *first);//5 int search_16_year(struct stu *first);//6 struct stu * search_max_boy(struct stu *first);//7 struct stu * fix(struct stu *first);//8 void delete_students(struct stu *first,struct stu *p);//9 void save(char *name, struct stu *first,FILE *fp);//10 struct stu * readout(char *name,stu *first,FILE *fp); int read_line(char str[],int n); void quit(stu *first,char *name,FILE *fp); void print_single(struct stu *p); int search_boy(struct stu *first); int * age_statistics(struct stu *first); struct stu **boy_girl(struct stu *first);
int main() { FILE *fp; struct stu *first=NULL; struct stu *p2,*p7,*p9; int *p11; int n; char filename[100]; int type; start: for(;;) { printf("输入 1 读入文件\n输入 2 创建新文件\n"); scanf("%d",&type); if(type==1||type==2) { break; } else { printf("输入错误,请重新输入"); } } if(type == 1) { for(;;) { printf("输入要读取的文件地址\n"); fflush(stdin); gets(filename); if((fp = fopen(filename,"rb+"))==NULL) { printf("无法打开文件\n"); goto start; } else { first = readout(filename,first,fp); break; } } } if(type == 2) { for(;;) { printf("输入要创建的文件地址\n"); fflush(stdin); gets(filename); if((fp = fopen(filename, "w")) == NULL) { printf("无法创建文件"); goto start; } else { struct stu *news; news=(struct stu*)malloc(sizeof(struct stu)); news->number=805; strcpy(news->name,"刘德华"); strcpy(news->sex,"男"); strcpy(news->dept,"null"); news->age=52; news->next=NULL; first=news; news=(struct stu*)malloc(sizeof(struct stu)); news->number=804; strcpy(news->name,"金秀贤"); strcpy(news->sex,"女"); strcpy(news->dept,"MA"); news->age=24; news->next=first; first = news; news=(struct stu*)malloc(sizeof(struct stu)); news->number=803; strcpy(news->name,"那英"); strcpy(news->sex,"女"); strcpy(news->dept,"CS"); news->age=41; news->next=first; first=news; news=(struct stu*)malloc(sizeof(struct stu)); news->number=802; strcpy(news->name,"李敏槁"); strcpy(news->sex,"男"); strcpy(news->dept,"MA"); news->age=25; news->next=first; first=news; news=(struct stu*)malloc(sizeof(struct stu)); news->number=801; strcpy(news->name,"金贤重"); strcpy(news->sex,"男"); strcpy(news->dept,"CS"); news->age=23; news->next=first; first=news; break; } } } int code; for(;;) { printf("1.增加学生名单\t 2.搜索学生名单\n" "3.打印学生信息表\t 4.查询男女学生人数\n" "5.同姓人数\t 6.年龄小于16岁的学生\n" "7.查询年龄最大的男生\t 8.修改学生信息\n" "9.删除学生\t\t 0.退出程序\n10.保存\t\t\t11.各年龄统计\n" "12.和最大女生年龄相同的男生\n"); scanf("%d",&code); switch(code) { case 0: quit(first,filename,fp); return 0; break; case 1: first=insert(first); break; case 2: p2 = search(first); if(p2 == NULL) { printf("查无该生\n"); } else { print_single(p2); } break; case 3: print(first); break; case 4: printf("%d个女生\n",search_girl(first)); printf("%d个男生\n",search_boy(first)); break; case 5: search_first_name(first); break; case 6: n = search_16_year(first); printf("有%d个小于16岁的学生\n"); break; case 7: p7=search_max_boy(first); if(p7==NULL) { printf("没有男生"); } else { printf("找到该男生\n"); print_single(p7); } break; case 8: first = fix(first); break; case 9: int item; for(;;) { printf("输入 1 按学号查询\n输入 2 按姓名查询"); scanf("%d",&item); if(item == 1 || item == 2) { break; } else { printf("输入错误,请重新输入\n"); } } if(item == 1) { int number; printf("请输入学生的学号:"); scanf("%d",&number); p9 = find_students1(number,first);
}
if(item == 2) { printf("请输入学生的姓名:"); p9 = find_students2(first); }
if(p9 == NULL) { printf("查无该生\n"); } else { delete_students(first,p9); } break; case 10: save(filename,first,fp); break; case 11: int i; p11 = age_statistics(first); for( i=0; i<120; i++) { if(*p11 == 0) { p11++; } else { printf("%d岁:%d个人\n",i, *p11); p11++; } } break; case 12: struct stu **p12; p12 = boy_girl(first); if((*p12) == NULL) { printf("未找到\n"); } while(*p12 != NULL) { printf("学号:%d\t姓名:%s\n",(*p12)->number,(*p12)->name); p12 = p12++; } break;
default: printf("输入错误,请重新输入\n"); } printf("\n"); } return 0; }
/********* *find_students2* **********/
struct stu *find_students2(struct stu *first) { struct stu *p; char search_name[NAME_LEN+1]; read_line(search_name,NAME_LEN); for(p=first;p!=NULL&&strcmp(p->name,search_name)!=0;p=p->next) ; if(p!=NULL&&strcmp(p->name,search_name)==0) { return p; } return NULL; }
/********* *find_students1* **********/ struct stu *find_students1(int number,struct stu *first) { struct stu *p; for(p=first;p!=NULL&&p->number!=number;p=p->next) ; if(p!=NULL&&p->number==number) { return p; } return NULL; }
/********* * insert * **********/
struct stu *insert(struct stu *first) { struct stu *cur,*prev,*new_node; new_node=(struct stu *)malloc(sizeof(struct stu)); printf("请输入学生的学号:"); scanf("%d",&new_node->number); for(prev=NULL,cur=first; cur!=NULL&&new_node->number>cur->number;prev=cur,cur=cur->next) ; if(cur!=NULL&&cur->number==new_node->number) { printf("该学生编号已存在\n"); free(new_node); return first; } int sex; printf("请输入学生姓名:"); read_line(new_node->name,NAME_LEN); printf("请输入学生性别(1为男,2为女)"); do { scanf("%d",&sex); if(sex!=1&&sex!=2) { printf("输入错误,请重新输入"); } } while(sex!=1&&sex!=2); if(sex==1) { strcpy(new_node->sex,"男"); } if(sex==2) { strcpy(new_node->sex,"女"); } printf("输入学生系别:"); scanf(" %s",new_node->dept); printf("输入学生年龄:"); scanf("%d",&new_node->age); new_node->next=cur; if(prev==NULL) { first=new_node; } else { prev->next=new_node; } return first; }
/********* * search * **********/
struct stu * search(struct stu *first) { struct stu *p; int measure,number; printf("输入1进行学号搜索(推荐)\n输入2进行姓名搜索\n"); do { scanf("%d",&measure); if(measure!=1&&measure!=2) { printf("输入错误,请重新输入"); } } while(measure!=1&&measure!=2); if(measure==1) { printf("输入搜索学生的学号:"); scanf("%d",&number); p=find_students1(number,first); return p; } if(measure==2) { printf("输入搜索学生的姓名"); p=find_students2(first); return p; } }
/********* * print * **********/ void print(struct stu *first) { struct stu *p; printf("学号\t姓名\t性别\t系别\t年龄\n"); for(p=first;p!=NULL;p=p->next) { printf("%d\t%s\t%s\t%s\t%d\n",p->number,p->name,p->sex,p->dept,p->age); } }
/********* * search_girl * **********/
int search_girl(struct stu *first) { struct stu *p; int n=0; for(p=first;p!=NULL;p=p->next) { if(strcmp(p->sex,"女")==0) { n++; } } return n; }
/********* * search_16_year* **********/
int search_16_year(struct stu *first) { struct stu *p; int n=0; for(p=first;p!=NULL;p=p->next) { if(p->age<16) { n++; } } return n; }
/********* * search_max_boy* **********/
struct stu * search_max_boy(struct stu *first) { struct stu *p; int max=0; for(p=first;p!=NULL;p=p->next) { if(strcmp(p->sex,"男")==0&&max<p->age) { max=p->age; } } if(max==0) { return NULL; } else { for(p=first;p->age!=max;p=p->next); return p; } }
/********* * delete_students* **********/
void delete_students(struct stu *first,struct stu *p) { if(p->next != NULL) { struct stu *next_node; next_node = p->next; *p = *(p->next); free(next_node);
} else { struct stu *prev; for(prev = first;prev->next != p;prev = prev->next); prev->next = NULL; free(p);
}
}
/********* *search_first_name* **********/
void search_first_name(struct stu *first) { char fn[5]; struct stu *p; int n=0; printf("输入查找的姓氏:"); read_line(fn,5); for(p=first;p!=NULL;p=p->next) { if(p->name[0]==fn[0]&&p->name[1]==fn[1]) { n++; } } printf("共%d个相同性别的人\n\n",n); for(p=first;p!=NULL;p=p->next) { if(p->name[0]==fn[0]&&p->name[1]==fn[1]) { print_single(p); } } }
/********* * fix * **********/
struct stu * fix(struct stu *first) { int number,item; struct stu *p; printf("请输入想修改的学生的学号"); scanf("%d",&number); p=find_students1(number,first); if(p==NULL) { printf("无该学生信息\n"); } else { print_single(p); for(;;) { printf("请输入想修改项的序号(输入0退出修改):"); scanf("%d",&item); if(item==0) { break; } switch(item) { case 1: struct stu *prev,*cur,*prev2,*cur2; for(prev=NULL,cur=first; cur!=p;prev=cur,cur=cur->next)/*找到该学生和之前的学生*/ ; int new_number; printf("输入修改后的学号:"); scanf("%d",&new_number);/*存储新学号*/ for(prev2=NULL,cur2=first; cur2!=NULL&&new_number>cur2->number;prev2=cur2,cur2=cur2->next)/*找到新学号应在链表中的位置*/ ; if(cur2!=NULL&&new_number==cur2->number)/*判断学号是否存在*/ { printf("该学号以存在\n"); } else if(prev==NULL&&new_number>p->next->number)/*学生在首结点,且新学号大于后一学生*/ { first=p->next; if(cur2==NULL)/*该学生序号最大*/ { prev2->next=p; p->next=NULL; p->number=new_number; } else { prev2->next=p; p->next=cur2; p->number=new_number; } } else if(prev==NULL&&new_number<p->next->number)/*学生在首结点,且新学号小于后一学生*/ { p->number=new_number; } else if(cur->next==NULL&&prev->number>new_number)/*学生在末结点,且新学号小于前一学生*/ { if(prev2==NULL) { prev->next=NULL; p->next=cur2; first=p; p->number=new_number; } else { prev->next=NULL; prev2->next=p; p->next=cur2; p->number=new_number; } } else if(cur->next==NULL&&prev->number<new_number)/*学生在末结点,且新学号大于前一学生*/ { p->number=new_number; }/*学生在末结点,且新学号小于前一学生*/ else if(cur->next!=NULL&&prev!=NULL&&(prev->number>new_number||cur->next->number<new_number)) { prev->next=cur->next; if(cur2==NULL)/*该学生序号最大*/ { prev2->next=p; p->next=NULL; p->number=new_number; } if(prev2==NULL) { p->next=cur2; first=p; p->number=new_number; } else { prev2->next=p; p->next=cur2; p->number=new_number; } } else if(cur->next!=NULL&&prev!=NULL&&prev->number>new_number&&cur->next->number<new_number) { p->number=new_number; } break; case 2: printf("输入修改后的姓名:"); read_line(p->name,NAME_LEN); print_single(p); break; case 3: int sex; printf("输入性别:(1为男性 2为女性)"); do { scanf("%d",&sex); if(sex!=1&&sex!=2) { printf("输入错误请重新输入"); } } while(sex!=1&&sex!=2); if(sex==1) { strcpy(p->sex,"男"); } if(sex==2) { strcpy(p->sex,"女"); } print_single(p); break; case 4: printf("请输入修改后系别:"); read_line(p->dept,20); print_single(p); break; case 5: printf("请输入修改后的年龄:"); scanf("%d",&p->age); print_single(p); break; default : printf("输入错误,请重新输入"); } } } return first; }
/*********** **** save*** ************/ void save(char *name, struct stu *first,FILE *fp) { struct stu *p; p=first; if((fp = fopen( name, "wb"))==NULL) { printf("error\n"); exit(0); } for(;p!=NULL;p=p->next) { if(fwrite(p, sizeof(struct stu), 1, fp) != 1) { printf("error"); } } printf("保存成功\n"); }
/*********** **** readout*** ************/
struct stu * readout(char *name,struct stu *first,FILE *fp) { /*FILE *fp; if((fp = fopen(name, "r"))==NULL) { printf("error"); exit( 0 ); }*/ struct stu *new_node; first = (struct stu *)malloc(sizeof(struct stu)); fread(first, sizeof(struct stu), 1, fp); /*if(feof(fp)) { first->next=NULL; return first; } else {*/ first->next = (struct stu *)malloc(sizeof(struct stu)); new_node = first->next; for(;;) { int ch; fread(new_node,sizeof(struct stu), 1, fp); //fseek(fp,2L,SEEK_CUR); if((ch=fgetc(fp))==EOF) { new_node->next=NULL; break; } else { fseek(fp,-1L,SEEK_CUR); //fseek(fp,-2L,SEEK_CUR); new_node->next = (struct stu *) malloc(sizeof(struct stu)); new_node = new_node->next; } } fclose(fp); return first; }
/************ ***read_line** **************/
#i nclude<ctype.h> #i nclude<stdio.h>
int read_line(char str[],int n) { int ch,i=0; while(isspace(ch=getchar())) ; while(ch!='\n'&&ch!=EOF) { if(i<n) { str[i++]=ch; ch=getchar(); } } str[i]='\0'; return i; }
/************* ***quit****** *************/
void quit(stu *first,char *name,FILE *fp) { char c; for(;;) { printf("是否保存数据?\n"); printf("保存请输入Y\t不保存请输入N\n"); fflush(stdin); scanf("%c",&c); if(c=='Y'||c=='N'||c=='y'||c=='n') { break; } else { printf("输入错误,请重新输入"); } } if(c=='y'||c=='Y') { save(name,first,fp); return ; } else { return ; } }
/************** ***print_single** ****************/ void print_single(struct stu *p) { printf("1.学号:%d\n",p->number); printf("2.姓名:%s\n",p->name); printf("3.性别:%s\n",p->sex); printf("4.系别:%s\n",p->dept); printf("5.年龄:%d\n\n",p->age); };
/************** *search_boy*** **************/ int search_boy (struct stu *first) { struct stu *p; int n=0; for(p=first;p!=NULL;p=p->next) { if(strcmp(p->sex,"男")==0) { n++; } } return n; }
/************************ *****age_statistics******* **************************/
int * age_statistics(struct stu *first) { int *age; age = (int *)malloc(sizeof(int)*120); for(int i=0; i<120; i++) { age[i] = 0; } struct stu *p; for(p = first; p!=NULL; p = p->next) { age[p->age]++; } return age; }
/********** **boy_girl** ************/ struct stu **boy_girl(struct stu *first) { struct stu *p; struct stu **boy; struct stu *gilr; int max = 0 ; int i; boy = (struct stu **)malloc(sizeof(struct stu*)*120); for(i = 0; i<120; i++) { boy[i] = NULL ; } for(p = first; p != NULL; p = p->next) { if((strcmp(p->sex,"女") == 0)&&p->age > max) { max = p->age; } } if(max == 0) { return NULL; } else { for(p = first,i=0; p != NULL; p = p->next) { if((strcmp(p->sex,"男") == 0)&&p->age == max) { boy[i] = p; i++;
}
} } return boy; }
|
|
|
xianghai |
|
|
|
|
 |
|
 |
|
|
|