大一期末作業終於告一段落
學生管理系統可以用來管理班級學生,能夠對學生信息(包括姓名、性別、年齡、成績等)進行增加、刪除、更改、查詢等操作。
該軟件將學生信息保存在文件中,直接對文件中的數據進行增刪改查操作,除了能夠培養您的編程思維,還能讓你深入了解文件操作。
廢話不多說,下面貼代碼(在VS2012環境下實測可以運行 在dev環境下測試可以運行)
#define LG (sizeof(struct student)) struct student { char name[10];//保存學生姓名 char sex[5];//保存學生的性別 long int num;//學號 int xuhao;// int age; float score[3]; float averange; char DJ;//存放等級哦 struct student *next; };//定義結構體變量保存 名字 性別 年齡 成績] 結構體聲明 int n;//存放學生人數 int man;//存放統計的男生數 int time=3000;//定義全局變量暫停時間 float JY(float a)//成績校驗函數 { int n=0; while(1) { if(a>100||a<0) { printf(" 輸入成績有誤,范圍應該0-100,請重新輸入:"); scanf("%f",&a); n=n+1; } else { return a; } } } struct student *creat(void)// 鏈表創建函數 { struct student *head;//頭指針 struct student *p1,*p2,*p3;// 其他指針 int mm=0; int m=1; n=0; p1=p2=(struct student *)malloc(LG); // 開辟內存空間 if(p1==NULL) { printf("開辟內存空間失敗\n"); } //內存空間開辟后最后一定要釋放 printf("請先輸入學號(輸入0退出錄入)\n"); printf(" "); p1->xuhao=m; m++; scanf("%d",&p1->num); if(p1->num!=0) { printf(" 請輸入您的姓名\n"); printf(" "); scanf("%s",&p1->name); printf(" 你好,%s!",p1->name); printf("請輸入您的性別male or female\n"); //mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型 printf(" "); scanf("%s",&p1->sex); mm=sexJY(p1->sex); if(mm==1) { printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n"); printf(" 第一科的成績是:"); scanf("%f",&p1->score[0]); p1->score[0]=JY(p1->score[0]);//校驗第一科的成績 printf(" 第二科的成績是:"); scanf("%f",&p1->score[1]); p1->score[1]=JY(p1->score[1]);//校驗第二科的成績 printf(" 第三科的成績是:"); scanf("%f",&p1->score[2]); p1->score[2]=JY(p1->score[2]);//校驗第三科的成績 printf(" 錄入完畢\n"); _sleep(1000); printf("-----------------------------------------------------------------------------------------------------------------\n"); } } head=NULL; while(1) { n=n+1; if(n==1) { head=p1; } else { p3=(struct student *)malloc(LG); printf("請先輸入學號(輸入0退出錄入)\n"); printf(" "); p3->xuhao=m; m++; scanf("%d",&p3->num); if(p3->num!=0) { printf(" 請輸入您的姓名\n"); printf(" "); scanf("%s",&p3->name); printf(" 你好,%s!",p3->name); printf("請輸入您的性別male or female\n"); printf(" "); scanf("%s",&p3->sex); mm=sexJY(p3->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型 if(mm==1) { printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n"); printf(" 第一科的成績是:"); scanf("%f",&p3->score[0]); p3->score[0]=JY(p3->score[0]);//校驗第一科的成績 printf(" 第二科的成績是:"); scanf("%f",&p3->score[1]); p3->score[1]=JY(p3->score[1]);//校驗第二科的成績 printf(" 第三科的成績是:"); scanf("%f",&p3->score[2]); p3->score[2]=JY(p3->score[2]);//校驗第三科的成績 printf(" 錄入完畢\n"); _sleep(1000); printf("-----------------------------------------------------------------------------------------------------------------\n"); p2->next=p3; p2=p3; printf("%d",n); } } else { n--; break; } } } p2->next=NULL; return (head); }////結構體鏈表創 void body()//界面設計 { /* char stCmd[128]; sprintf("mode con cols=%d lines=%d", height, width); system(stCmd);動態設置窗體大小 */ system("mode con cols=120 lines=40"); //system("color f4"); printf("\n ----------------------------------------------- 學生成績管理系統-----------------------------------------------\n"); printf("\n"); printf("\n"); printf(" ===========================\n"); printf(" = 請先輸入數據 =\n"); printf(" ===========================\n"); printf(" 請輸入學生的信息,包含姓名、性別、年齡 、語文成績、數學成績、外語成績。\n \n \n"); printf(" ---------------------------------------------------------------------------------------------------------------\n "); printf("\n"); } void body2()//界面設計 { printf("\n ----------------------------------------- 學生成績管理系統-----------------------------------------------\n"); printf("\n"); printf("\n"); printf(" ==========================\n"); printf(" = 歡迎 =\n"); printf(" 該系統共有%d個學生\n",n); printf(" ===========================\n"); } int showdata(struct student *head)//功能界面, { struct student *p; int sexJY(char *sex);//性別校驗函數 void *dell(struct student *head);//摧毀函數 struct student *del(struct student *head); struct student *del2(struct student *head);//刪除功能2 long int search(struct student *head);//查找功能 int showdata3(struct student *head);//系統設置 void print1(struct student *head);//打印功能1 void print2(struct student *head);//打印功能2 void print3(struct student *head);//打印功能3 void out1(struct student *head);//輸出到文件功能 struct student *add(struct student *head);//添加功能 void cont(struct student *head);//計算功能1 void change1(struct student*head);//修改功能 struct student* input1();//外部導入功能 //void input1(struct student *head);//錄入功能 //void change1(struct student*head, long int i)//修改功能 struct student *add(struct student *head);//插入數據 struct student*nsert(struct student *head); // void destroy1(struct student *head);//摧毀鏈表 int TJ(struct student *head);//男生計算功能 int i;//存放學生編號 int iii;//存放選擇顯示參數 int j;//存放選擇參數 int o;//選擇顏色參數 long int ii;//存放需要修改的學生編號 long int jj;//存放需要查找的學生編號 char a; p=head; while(1) { body2(); printf("\n"); printf("\n"); printf("\n---------- 學生成績管理系統------------\n"); printf("\n"); printf(" 1 ======================\n"); printf(" = 主菜單 =\n"); printf(" ======================\n"); printf("\n"); printf(" 請根據需要選擇操作\n"); printf("\n"); printf(" 選擇查詢的方式\n"); printf(" (0) 輸入0退出該系統\n"); printf(" (1)增加一個同學信息 \n"); printf(" (2)刪除一個同學信息 \n"); printf(" (3)修改一個學生信息 \n");//完成 printf(" (4)計算學生的三科平均分並且給予等級 \n");//完成 printf(" (5)顯示所有學生的信息 \n");//完成 //printf(" (6) 設置系統背景 \n");//完成 printf(" (6) 數據存盤 \n");//完成 printf(" (7) 查找一個學生的信息\n"); printf(" (8) 統計男生的人數\n"); printf(" (9) 局部顯示學生的信息\n"); printf(" (10) 系統設置\n"); //printf(" (11) 選擇顯示時間\n"); //printf(" (12) 刪除所有學生的數據\n"); //printf(" (13) 數據存盤\n "); printf(" 請選擇1-10\n"); scanf("%d",&j);//選擇不同的功能 if(j==0) { break; } if(j>=1&&j<=10) { switch(j) { case 1: add(p); _sleep(time); system("cls");//清屏操作 break; case 2: del(p); _sleep(time); system("cls"); break; case 3: print3(p); change1(p); break; // change1(p,ii); system("cls"); break; case 4: cont(p); //rank(stu); _sleep(time); system("cls"); break; case 5: print3(p); _sleep(time); break; case 6: out1(p); _sleep(time); break; /* case 6: printf("請選擇顏色\n"); printf("(1)天藍色"); printf("(2)紅色"); printf(" (3) 白色 "); printf(" (4) 亮白色 "); printf(" (5)綠色 "); scanf("%d",&o); switch(o) { case 1: system("color 0B"); break; case 2: system("color 0C"); break; case 3: system("color 07"); break; case 4: system("color 0F"); break; case 5: system("color 0A"); break; default://其他值均為默認 system("color 07"); break; } break;*/ case 7: printf("請輸入要查找的學生學號"); search(p); _sleep(time); break; case 8: TJ(p);//計算男生人數 _sleep(time); break; case 9: showdata2(p); _sleep(time); // _sleep(5000); break; case 10://系統設置 showdata3(p); _sleep(time); break; /* case 11: printf("輸入暫停時間(s),默認3s\n"); scanf("%d",&time); time=time*1000; _sleep(time); break; */ /*case 12: printf("正在摧毀鏈表\n"); dell(p); time=time*1000; _sleep(time);*/ /*case 13: out1(p); _sleep(time); */ } } else { printf("輸入錯誤\n"); _sleep(time); system("cls"); } } } int showdata2(struct student *head) { struct student *p; int sexJY(char *sex);//性別校驗函數 struct student *del(struct student *head); struct student *del2(struct student *head);//刪除功能2 // long int search(struct student *head,long int i);//查找功能 void print1(struct student *head);//打印功能1 void print2(struct student *head);//打印功能2 void print3(struct student *head);//打印功能3 void cont(struct student *head);//計算功能1 void change1(struct student*head); struct student *add(struct student *head);//插入數據 struct student*nsert(struct student *head); int TJ(struct student *head);//男生計算功能 int iii;//存放學生的查詢參數 p=head; system("cls");//清屏 printf(" 1 ======================\n"); printf(" = 副菜單 =\n"); printf(" ======================\n"); printf(" 選擇查詢的方式\n"); printf("\n 1.顯示所有學生的成績\n"); printf("\n 2.顯示所有學生的學號性別\n"); printf("\n 3.顯示所有學生的所有信息\n"); printf(" 請選擇1-3\n"); scanf("%d",&iii); switch (iii) { case 1: print2(p); _sleep(1000); break; case 2: print1(p); _sleep(1000); break; case 3: print3(p); _sleep(1000); break; default: printf("輸入錯誤,返回主菜單\n"); break; } return 0; }//二級菜單 int showdata3(struct student *head)//系統設置選項 { struct student *p; int iii; int o; p=head; system("cls");//清屏 printf(" 1 ======================\n"); printf(" = 副菜單 =\n"); printf(" ======================\n"); printf(" 選擇查詢的方式\n"); printf("\n (1). 設置系統背景 \n"); printf("\n (2). 修改系統延時 \n"); printf("\n (3). 刪除鏈表所有數據並重新讀入\n"); printf(" 請選擇1-2\n"); scanf("%d",&iii); switch (iii) { case 1: printf("請選擇顏色\n"); printf("(1)天藍色"); printf("(2)紅色"); printf(" (3) 白色 "); printf(" (4) 亮白色 "); printf(" (5)綠色 "); scanf("%d",&o); switch(o) { case 1: system("color 0B"); break; case 2: system("color 0C"); break; case 3: system("color 07"); break; case 4: system("color 0F"); break; case 5: system("color 0A"); break; default://其他值均為默認 system("color 07"); break; } _sleep(1000); break; case 2: printf("輸入暫停時間(s),默認3s\n"); scanf("%d",&time); time=time*1000; _sleep(time); break; case 3: printf("正在摧毀鏈表\n"); dell(p); time=time*1000; _sleep(1000); break; default: printf("輸入錯誤,返回主菜單\n"); break; } return 0; } void print1(struct student *head) { struct student *p; p=head; if(head==NULL) { exit(0); } printf("------------------------------------------------------------------------------------------------------------------\n"); do { printf("\n 姓名:%s,學號%d,%s\n\n",p->name,p->num,p->sex);//姓名,學號 p=p->next; }while(p!=NULL); }//不同顯示數據的方式 第一種 void print2(struct student *head)//顯示所有學生的成績 { struct student *p; p=head; if(head==NULL) { exit(0); } printf("------------------------------------------------------------------------------------------------------------------\n"); do { printf("\n\n 姓名%s,語文:%3.1f,數學:%3.1f,外語:%3.1f\n",p->name,p->score[0],p->score[1],p->score[2]); p=p->next; }while(p!=NULL); }//不同顯示數據的方式 第二種 void print3(struct student *head) { float a; struct student *p; p=head; if(head==NULL) { exit(0); } printf("------------------------------------------------------------------------------------------------------------------------------------------"); while(p!=NULL) { printf("\n\n序號 %d 學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f",p->xuhao,p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2]);//姓名,性別 a=p->score[0]+p->score[1]+p->score[2]; printf(" 總分:%3.1f",a); printf(" 等級%c\n",p->DJ); p=p->next; } } int passwd(char *name, char *pwd) { int u = 0; if (strcmp(name, "root") == 0 && strcmp(pwd, "123456") == 0) { u =1; return u; } else if (strcmp(name, "1") == 0 && strcmp(pwd, "1") == 0) { u = 1; return u; } return 0; }//密碼校驗函數 傳遞兩個字符數組,一個賬號,一個密碼。 void change1(struct student*head) { long int i; struct student *p; p=head;//定義指針 if(head==NULL) { exit(0); } printf("輸入想要修改的學生的學號:\n"); scanf("%ld",&i); do { //printf("test1"); if(p->num==i)//當結點跳轉到該學生時修改成績 { printf("開始修改信息\n"); printf("請先輸入學號\n"); printf(" "); scanf("%ld",&p->num); if(p->num!=0) { printf(" 請輸入您的姓名\n"); printf(" "); scanf("%s",&p->name); printf(" 你好,%s!",p->name); printf("請輸入您的性別male or female\n"); printf(" "); scanf("%s",&p->sex); printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n"); printf(" 第一科的成績是:"); scanf("%f",&p->score[0]); p->score[0]=JY(p->score[0]);//校驗第一科的成績 printf(" 第二科的成績是:"); scanf("%f",&p->score[1]); p->score[1]=JY(p->score[1]);//校驗第二科的成績 printf(" 第三科的成績是:"); scanf("%f",&p->score[2]); p->score[2]=JY(p->score[2]);//校驗第三科的成績 printf(" 錄入完畢\n"); printf("-----------------------------------------------------------------------------------------------------------------\n"); break; } p=p->next;//需要把下一個結點賦值給p } } while(p->next!=NULL); } void cont(struct student *head)//計算學生等級函數 { struct student *p; int i=0; p=head; if(head==NULL) { exit(0); } printf("------------------------------------------------------------------------------------------------------------------\n"); printf("----------------------------------------計算中----------------------------------------\n"); do{ p->averange=((p->score[0])+(p->score[1])+(p->score[2]))/3.0; printf("第%d同學的成績為%3.1f",i+1,p->averange); if(p->averange>=90&&p->averange<=100) { printf(" 等級為A\n",i+1); p->DJ='A'; } if(p->averange>=60&&p->averange<=89) { printf(" 等級為B\n",i+1); p->DJ='B'; } if(p->averange>=0&&p->averange<=60) { printf(" 等級為C\n",i+1); p->DJ='C'; } if(p->averange>100||p->averange<0) { printf(" incorrect\n"); } i=i+1; p=p->next; }while(p!=NULL); } long int search(struct student *head)//通過學號來查找學生的信息 { struct student *p; long jj; scanf("%ld",&jj); p=head; if(head==NULL) { exit(0); } do{ if(jj==p->num) { printf("\n\n學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f 等級%c\n",p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->DJ); return 0; } p=p->next; }while(p->next!=NULL); //遍歷鏈表結點 printf("無該生信息\n"); return 0; } struct student *del(struct student *head)//鏈表怎么刪除結點並鏈接 刪除序號為多少的學生的成績 定義一個結構體指針 { int i,j; struct student *p1,*p2;//定義兩個結構體指針 if(head==NULL) { exit(0); } p1=head;// p2=head;//p2指針依然指向head printf("刪除第幾個節點的數據\n"); scanf("%d",&i);//獲得節點數據 for(j=1;j<i;j++) { p2=p1;//p2指向p1 p1=p1->next;//p1向后移動一個表 } //此時指向刪除數據的上一個位置 if(p1==head)//如果此時依然指向鏈表的頭 則鏈表向后移動一位 { // head=p1->next;//則通過p1向后一移動一位,鏈表向后移動了一位但是指針沒動 head = p1->next;//邏輯完全正確啊 // free(p1); printf("當前正在刪除一個結點數據\n"); //return head; } else//否則 { p2->next=p1->next;//把p1指針指向下一個數據給p2指針指向下一個位置 這句話的意思是向后移動一位指針。 //把p1指針指向下一個數據給p2指針指向下一個位置 這句話的意思是向后移動一位指針。 } while(head!=NULL) { printf("\n\n序號 %d 學號 %ld 姓名:%s 性別: %s 語文: %3.1f 數學:%3.1f 外語:%3.1f",head->xuhao,head->num,head->name,head->sex,head->score[0],head->score[1],head->score[2]);//姓名,性別 // a=p->score[0]+p->score[1]+p->score[2]; //printf(" 總分:%3.1f",a); printf(" 等級%c\n",head->DJ); head=head->next; } //刪除第二行數據,之后的鏈條直接中斷需要把鏈條接上 free(p1);//釋放 n=n-1; printf("\n**********刪除中 稍后*********\n"); return head;//返回 } struct student*nsert(struct student *head) { struct student *p1,*p,*q; int i = 1; int jj; int mm; int nn; if(head==NULL) { exit(0); } printf("要插入的位置(尾插)1-%d:",n); scanf("%d",&jj);//所要插入第幾位學生信息 if(jj>=1&&jj<=n) { p = head->next ; p1 = (struct student *)malloc(sizeof(struct student)); printf("請先輸入學號(輸入0退出錄入)\n"); printf(" "); scanf("%ld",&p1->num); if(p1->num!=0) { p1->xuhao=jj+1; printf(" 請輸入您的姓名\n"); printf(" "); scanf("%s",&p1->name); printf(" 你好,%s!",p1->name); printf("請輸入您的性別male or female\n"); printf(" "); scanf("%s",&p1->sex); mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型 if(mm==1) { printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n"); printf(" 第一科的成績是:"); scanf("%f",&p1->score[0]); p1->score[0]=JY(p1->score[0]);//校驗第一科的成績 printf(" 第二科的成績是:"); scanf("%f",&p1->score[1]); p1->score[1]=JY(p1->score[1]);//校驗第二科的成績 printf(" 第三科的成績是:"); scanf("%f",&p1->score[2]); p1->score[2]=JY(p1->score[2]);//校驗第三科的成績 printf(" 錄入完畢\n"); n=n+1;//系統學生數自增1 printf("-----------------------------------------------------------------------------------------------------------------\n"); } } if(1 == jj) { struct student*q = head->next ; head->next = p1; p1 ->next = q; } else while( p ) { if(i == (jj-1)) { struct student*q = p->next ; p->next = p1; p1->next = q; } p = p->next ; i++; } return p; } else { printf("\n---------錄入錯誤---------\n"); printf("請重試\n"); return head; } } int sexJY2(char *sex) { int u = 0; if (strcmp(sex, "male") == 0) { u =1; return u; } return 0; } int sexJY(char *sex) { int u = 0; while(1) { if (strcmp(sex, "male") == 0 || strcmp(sex, "female") == 0) { u =1; return u; } else { printf("性別錯誤請重新輸入\n"); scanf("%s",sex); } } } int TJ(struct student *head) { int sexJY2(char *sex); int mm; int nn; struct student *p; if(head==NULL) { exit(0); } p=head; do { nn=sexJY((char*)p->sex);//強制轉換 if(nn==1) { man++; } p=p->next;//一直向下指直到 }while(p!=NULL); printf("\n男生人數為:%d\n",man); return 0; }//遍歷整個鏈表 計算男生的人數 int in() { int i,j; int m; int n=0;//如果密碼輸入錯誤三次則跳出循環 char user[20]={'0'}; char pas[20]={'0'}; char aa[20]={' ','U','s','e','r',' ','N','a','m','e',':'};//輸出賬號登陸 char bb[20]={' ','P','a','s','s','w','o','r','d',':'}; system("mode con cols=45 lines=15"); while(1) { printf("\n"); for(i=0;i<12;i++) { printf("%c",aa[i]); _sleep(50); } //printf(" User Name:"); gets(user);//輸入賬號 for(i=0;i<10;i++) { printf("%c",bb[i]); _sleep(50); } gets(pas);//如何隱藏輸入的密碼 安全性getch(); printf("*"); m=passwd(user,pas); if(m==1) { return m; } else { n++; printf("incorrect please try again\n"); if(n==3) { system("color 04"); system("cls"); while(1) { printf("快滾出老子的魔仙堡!!!!\n"); _sleep(1000); } return 0; } } } } struct student *add(struct student *head) { struct student *p,*p1,*p2; int i = 1; int jj; int mm; int nn; p=head; printf("輸入要插入的位置1-%d: ",n); scanf("%d",&i); jj=i; p1=(struct student*)malloc(LG);//開辟p1內存空間 p2=(struct student*)malloc(LG);//開辟p2內存空間 printf("請先輸入學號(輸入0退出錄入)\n"); printf(" "); scanf("%ld",&p1->num); if(p1->num!=0) { p1->xuhao=jj+1; printf(" 請輸入您的姓名\n"); printf(" "); scanf("%s",&p1->name); printf(" 你好,%s!",p1->name); printf("請輸入您的性別male or female\n"); printf(" "); scanf("%s",&p1->sex); mm=sexJY((char*)p1->sex);//char **類型與char *類型不兼容 需要強制轉換為char*類型 if(mm==1) { printf(" 請輸入三科成績,(語文成績,數學成績,外語成績)\n"); printf(" 第一科的成績是:"); scanf("%f",&p1->score[0]); p1->score[0]=JY(p1->score[0]);//校驗第一科的成績 printf(" 第二科的成績是:"); scanf("%f",&p1->score[1]); p1->score[1]=JY(p1->score[1]);//校驗第二科的成績 printf(" 第三科的成績是:"); scanf("%f",&p1->score[2]); p1->score[2]=JY(p1->score[2]);//校驗第三科的成績 printf(" 錄入完畢\n"); printf("-----------------------------------------------------------------------------------------------------------------\n"); } } if(i==1)//如果插入點為頭部head 則 { p2=head->next; head->next=p1; p1->next=p2; n=n+1;//系統學生數自增1 return head; } else { p=head; if(i==n) { //如果輸入等於n while(p->next!=NULL) { p=p->next; } p->next=p1; p1->next=NULL; //插入函數寫完后一定要把指針指向空 //printf("%d",p1->xuhao); n=n+1; return head; } else { //如果不是頭也不是尾巴 //則從中間插 while(i--) { p=p->next; } // printf("已找到"); p2=p->next; p->next=p1; p1->next=p2; n=n+1; return head; } } } void *dell(struct student *head) { struct student *p=head; free(p); printf("\n\n鏈表已摧毀\n\n"); } int choose(int i) { printf("\n ----------------------------------------------- 學生成績管理系統-----------------------------------------------\n"); printf("\n"); printf("\n"); printf(" 請選擇信息錄入的方式\n"); printf(" ===========================\n"); printf(" = (1)手動輸入 =\n"); printf(" = (2)通過外部導入信息 =\n"); printf(" ===========================\n"); printf(" 請選擇:"); while(1) { scanf("%d",&i); if(i==1||i==2) { //printf("%d",n); return i; } else { printf("\n 請輸入一個有效的值:"); } } } void load() { printf("\n該功能還在完善中\n 敬請期待\n"); } //實現輸出輸入文件的功能 void out1(struct student *head) { FILE *out; struct student *p; char outfile[20]; char ch; int i; ch=getchar(); if((out=fopen("stu.txt","wb"))==NULL) { printf(" 找不到輸出文件"); exit(0); } p=head; while(p!=NULL) { if(fwrite(p,LG,1,out)!=1) { printf("\n寫入數據出錯\n"); fclose(out); return; } p=p->next; } fclose(out); } struct student *input1 () { struct student *head = NULL; struct student *p1, *p2;//s = p1;p = p2; FILE *fp; if((fp=fopen("stu.txt","rb+"))==NULL) { printf("打開文件出錯\n"); exit(0); } while(!feof(fp)) { if((p1=(struct student*)malloc(LG))==NULL){ printf("內存申請出錯\n"); fclose(fp); exit(0); } if(fread(p1,LG,1,fp)!=1){ free(p1); break; } if(head==NULL) { head=p2=p1; n=n+1; } else{ p2->next=p1; p2=p1; n=n+1; } } fclose(fp); return (head); }
登陸界面
實現文件的讀入功能
主菜單的設計 還有相關的二級菜單
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<windows.h> #include"xyf.h" int main(void) { struct student *p; int m=1;//注意要修改回來 int zz=0; //system("cls"); //m=in(); if(m==1) { system("color 07"); zz=choose(zz); switch (zz) { case 1: body(); //data(p); p=creat(); showdata(p); break; case 2: printf("\n -----------------------------------------------正在導入-----------------------------------------------\n"); p=input1(); showdata(p); break; } } _sleep(1000); return 0; } /*增加一個同學信息 刪除一個同學信息 修改一個學生信息 查找一個學生信息(按姓名、按學號) 等級計算 統計男生人數 顯示學生信息(局部或全部) 學生成績管理系統 要求: 定義學生結構體數據類型。在此類型中,應該包括三個成員變量(學號、姓名、成績)。 定義個學生數組保存學生的信息。用一個變量來記錄學生人數。 添加學生的信息。 顯示學生的信息。 刪除學生的信息。 查找學生的信息,根據姓名。 統計學生的信息。 第一步:菜單界面設計 提示: 1、程序功能的展示:輸出語句 2、提供用戶選擇功能的接口:輸入語句 3、對用戶輸入的范圍校驗:if結構 4、對用戶選擇的響應:switch結構 5、單個函數頭的定義 第二步: 1、結構體構造(函數外面的地方) 2、設計輸入函數,實現一個信息的輸入; 3、設計輸出函數,實現一個信息的輸出。 4、提示:變量的定義位置,解決數據共享問題。 方法一:定義在主函數中,通過函數參數傳遞的方式進行。 方法二:定義為全局變量,實現數據的共享(變量的作用域) 程序結構: //引入頭文件 include //函數原型聲明 void add(); //結構體定義(構造) struct A{……}; //主函數定義 int main() { } //子函數定義 void add() {……} 第三步:采用數組解決全班信息的存儲、顯示問題 1、采用宏定義的方式聲明學生人數 2、定義數組,定義數組的數組下標采用宏定義符號 struct stu s[N]; for(int i=0;i<N;i++) { //單個數據輸入代碼 } 3、對數組操作,顯示全班信息 第四步:結構體變量定義在主函數中,通過函數參數傳遞的方式進行數據共享。 1、一個數據的處理 main() { …… struct stu s; //結構體變量的定義 sr(&s); //實參傳遞 …… } //單個數據輸入函數 void sr(struct stu * x) { //對形參變量x賦值 scanf("%d",&(*x).xh); scanf("%d",&(x->xh)); } 2、多個數據的處理 main() { …… struct stu s[10]; //結構體變量的定義 for(i=0;i<10;i++) sr(&s[i]); //實參傳遞 …… } //單個數據輸入函數 void sr(struct stu * x) { //對形參變量x賦值 scanf("%d",&(*x).xh); scanf("%d",&(x->xh)); } */ /* /*1、聲明一個結構體類型student,包含姓名、性別、年齡、語文成績、數學成績、外語成績等成員。 2、編寫程序:輸入2個同學的基礎信息,分別求出2個同學的語文平均成績。 3、編寫程序:輸入10個同學的基礎信息,顯示同學的基礎信息。 4、設計多個顯示功能函數: (1)顯示學生的姓名、性別 (2)顯示學生的姓名、年齡 (3)顯示學生的姓名、總分 編寫程序:讓用戶有選擇的查看10位同學的信息。 5、給結構體類型student新增成員:等級 設計等級測試函數:根據3科平均分計算出學生等級(A:100-90; B:89-60; C:60-0) 編寫程序:讓用戶有選擇的使用系統功能。 6、學生管理系統 7.鏈表+指針 學生成績管理系統 2016級物聯網2班 1.代碼優化 3.框架 4.增加功能 5.輸出定向文件 */