C語言編寫學生信息管理系統


學完C語言,自己想着編寫一個學生信息管理系統,既可以鞏固C語言知識,也能體驗怎么合理地設計和實現一個項目。

設計比較簡陋,希望各位大佬多多批評,多多指教!

這個系統最重要的便是主要功能框架,在主函數中用switch()多分支選擇結構實現。

我是鏈表實現,代碼如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<malloc.h>
 5 #include<stdbool.h>
 6 
 7 #define len sizeof(Student)
 8 
 9 struct Student{  10     char ID[11];  11     char name[10];  12     int age;  13     char sex[2];  14     int Grade;  15     Student *Next;  16 };  17 
 18 Student *Head = NULL;//全局變量,是整個鏈表的開頭 
 19 
 20 void Createlist();  21 bool Whetherlistempty();  22 Student *Createlist(int n);  23 Student *AddNode(int n);  24 bool Whetherlistempty();  25 Student * Insertnode(Student *Head, Student *newnode);  26 Student *Deleteinformation();  27 Student *DeleteNode(Student * Head, char id[]);  28 void Display();  29 Student *ReviseNode(Student* Head, char id[]);  30 Student *ReviseNode(Student* Head, char id[]);  31 Student *Findinformation();  32 Student *FindNode(Student *Head, char id[]);  33 Student *Sortinformaition();  34 Student *SortbyID(Student *Head);  35 Student *SortbyName(Student* Head);  36 
 37 void login(){//主菜單 
 38     printf(" 學生信息管理系統 1.0\n\n");  39     printf("請選擇操作:\n");  40     printf("0.退出出系統\n1.增加學生信息\n2.刪除學生信息\n3.修改學生信息\n4.查詢學生信息\n5.按信息排序\n6.展示信息\n");  41 }  42 
 43 Student *Createinformation(){//創建學生信息 
 44     printf("請輸入錄如學生信息學生個數:\n");  45     int n;  46     scanf("%d", &n);  47     if(n <= 0) return (Student *)NULL;  48     if(Whetherlistempty()) Head = Createlist(n);//如果鏈表為空,直接創建新鏈表 
 49     else Head = AddNode(n);//反之直接在鏈表中加入新節點即可 
 50     return Head;  51 }  52 
 53 bool Whetherlistempty(){//判斷鏈表是否為空 
 54     if(Head == NULL) return true;  55     else return false;  56 }  57 
 58 Student *Createlist(int n){//創建鏈表 
 59     printf("請按照以下順序輸入學生信息\n");  60     printf("學號 姓名 年齡 性別 年級 \n");  61     Student *p1, *p2;  62     for(int i = 0; i < n; i++){  63         p1 = (Student *)malloc(len);  64         scanf("%s %s %d %s %d", p1->ID, p1->name, &p1->age, p1->sex, &p1->Grade);  65         if(Head == NULL) Head = p1;  66         else p2->Next = p1;  67         p2 = p1;  68  }  69     p2->Next = NULL;  70     printf("創建完成!\n");  71     system("pause");  72     system("cls");  73     return Head;//創建完成返回鏈表頭 
 74 }  75 
 76 Student *AddNode(int n){//增加學生信息 
 77     Student *newnode;  78     for(int i = 0; i < n; i++){  79         newnode = (Student *)malloc(len);  80         printf("請按照以下順序輸入學生信息\n");  81         printf("學號 姓名 年齡 性別 年級 \n");  82         scanf("%s %s %d %s %d", newnode->ID, newnode->name, &newnode->age, newnode->sex, &newnode->Grade);  83         Head = Insertnode(Head, newnode);  84  }  85     printf("創建完成!\n");  86     system("pause");  87     system("cls");  88     return Head;  89 }  90 
 91 Student * Insertnode(Student *Head, Student *newnode){//在鏈表結尾加上一個節點 
 92     Student *p1, *p2, *p;  93     p1 = p2 = Head;  94     p = newnode;  95     if(Head == NULL) {  96         Head = p;  97         p->Next = NULL;  98  }  99     else{ 100         while(p1->Next != NULL){ 101             p1 = p1->Next; 102  } 103         p1->Next = p; 104         p->Next = NULL; 105  } 106     return Head; 107 } 108 
109 Student *Deleteinformation(){ //刪除學生信息 
110     printf("請輸入要刪除信息學生的個數:\n"); 111     int n; 112     scanf("%d", &n); 113     for(int i = 0; i < n; i++){ 114         printf("請輸入要刪除信息學生的學號:"); 115         char id[11]; 116         scanf("%s", id); 117         Head = DeleteNode(Head, id); 118  } 119     system("pause"); 120     system("cls"); 121     return Head; 122 } 123 
124 Student *DeleteNode(Student * Head, char id[]){//按學號刪除掉鏈表中相應的節點 
125     Student *head, *p1, *p2; 126     head = p1 = p2 = Head; 127     if(head == NULL){ 128         printf("系統學生信息為空!\n"); 129         return (Student *)NULL; 130  } 131     else{ 132         while(strcmp(p1->ID, id) != 0 && p1->Next != NULL){ 133             p2 = p1; 134             p1 = p1->Next; 135  } 136         if(strcmp(p1->ID, id) == 0){ 137             if(p1  == head){ 138                 head = p1->Next;//刪除操作 
139                 printf("刪除成功!\n"); 140  } 141             else{ 142                 p2->Next = p1->Next;//刪除操作 
143                 printf("刪除成功!\n"); 144  } 145  } 146         else printf("沒有這個學生!\n"); 147  } 148     return head; 149 } 150 
151 void Display(Student *Head){//打印出學生信息 
152     Student *p1; 153     p1 = Head; 154     printf(" 學號 姓名 年齡 性別 年級 \n"); 155     while(p1 != NULL){ 156         printf("%12s %10s %4d %6s %6d\n", p1->ID, p1->name, p1->age, p1->sex, p1->Grade); 157         p1 = p1->Next; 158  } 159     system("pause"); 160     system("cls"); 161 } 162 
163 Student *Reviseinformation(){//查詢學生信息 
164     printf("請輸入要修改學生信息的個數\n"); 165     int n; 166     scanf("%d", &n); 167     for(int i = 0; i < n; i++){ 168         printf("請輸入要修改信息的學生的學號\n"); 169         char id[11]; 170         scanf("%s", id); 171         Head = ReviseNode(Head, id); 172  } 173     return Head; 174 } 175 
176 Student *ReviseNode(Student* Head, char id[]){//在鏈表中按照學號找到相應的節點 
177     Student *p1; 178     p1 = Head; 179     while(p1 != NULL ){ 180         if( strcmp(p1->ID, id) == 0) break; 181         p1 = p1->Next; 182  } 183     if(p1 == NULL){//未找到該生信息 
184         printf("此系統不存在該生信息!\n"); 185         system("pause"); 186         system("cls"); 187  } 188     else{//找到后直接重新輸入 
189         printf("請重新按照以下順序輸入該生信息:\n"); 190         printf("學號 姓名 年齡 性別 年級 \n"); 191         scanf("%s %s %d %s %d", p1->ID, p1->name, &p1->age, p1->sex, &p1->Grade); 192         printf("修改成功!\n"); 193         system("pause"); 194         system("cls"); 195  } 196     return Head; 197 } 198 
199 Student *Findinformation(){//查找學生信息並且輸出 
200     printf("請輸入要查詢學生信息的個數:\n"); 201     int n; 202     scanf("%d", &n); 203     for(int i = 0; i < n; i++){ 204         printf("請輸入要查詢學生的學號:\n"); 205         char id[11]; 206         scanf("%s", id); 207         Student *p1; 208         p1 = FindNode(Head, id); 209         if(i == 0){ 210             printf(" 學號 姓名 年齡 性別 年級 \n"); 211  } 212         if(p1 == NULL){ 213             printf("沒有該生信息!\n"); 214             continue; 215  } 216         printf("%12s %10s %4d %6s %6d\n", p1->ID, p1->name, p1->age, p1->sex, p1->Grade); 217  } 218     system("pause"); 219     system("cls"); 220     return Head; 221 } 222 
223 Student *FindNode(Student *Head, char id[]){//在鏈表中按照學號尋找相應的節點 
224     Student *p1; 225     p1 = Head; 226     while(p1 != NULL ){ 227         if( strcmp(p1->ID, id) == 0) break; 228         p1 = p1->Next; 229  } 230     return p1; 231 } 232 
233 Student *Sortinformaition(){//排序的次級菜單 
234     while(1){ 235         printf("請選擇操作:\n"); 236         printf("1.按學號排序\n2.按姓名排序\n0.返回主菜單\n"); 237         int choice; 238         scanf("%d", &choice); 239         switch(choice){ 240             case 0: system("cls"); return Head; 241             case 1: Head = SortbyID(Head); break; 242             case 2: Head = SortbyName(Head); break; 243  } 244         system("cls"); 245  } 246 } 247 
248 Student *SortbyID(Student *Head){//按照學號排序,冒泡排序法 
249     Student *p1, *p2; 250     char tID[11], tname[10], tsex[2]; 251     int tGrade, tage; 252     for(p1 = Head; p1 != NULL; p1 = p1->Next){ 253         for(p2 = p1->Next; p2 != NULL; p2 = p2->Next){ 254             if(strcmp(p1->ID, p2->ID) > 0){ 255                 strcpy(tID, p1->ID); 256                 strcpy(p1->ID, p2->ID); 257                 strcpy(p2->ID, tID); 258                 strcpy(tname, p1->name); 259                 strcpy(p1->name, p2->name); 260                 strcpy(p2->name, tname); 261                 tage = p1->age; 262                 p1->age = p2->age; 263                 p2->age = tage; 264                 strcpy(tsex, p1->sex); 265                 strcpy(p1->sex, p2->sex); 266                 strcpy(p2->sex, tsex); 267                 tGrade = p1->Grade; 268                 p1->Grade = p2->Grade; 269                 p2->Grade = tGrade; 270  } 271  } 272  } 273     printf("按照學號排序完成!\n"); 274     system("pause"); 275     system("cls"); 276     return Head; 277 } 278 
279 Student *SortbyName(Student* Head){//按照姓名排序,冒泡排序法 
280         Student *p1, *p2; 281     char tID[11], tname[10], tsex[2]; 282     int tGrade, tage; 283     for(p1 = Head; p1 != NULL; p1 = p1->Next){ 284         for(p2 = p1->Next; p2 != NULL; p2 = p2->Next){ 285             if(strcmp(p1->name, p2->name) > 0){ 286                 strcpy(tID, p1->ID); 287                 strcpy(p1->ID, p2->ID); 288                 strcpy(p2->ID, tID); 289                 strcpy(tname, p1->name); 290                 strcpy(p1->name, p2->name); 291                 strcpy(p2->name, tname); 292                 tage = p1->age; 293                 p1->age = p2->age; 294                 p2->age = tage; 295                 strcpy(tsex, p1->sex); 296                 strcpy(p1->sex, p2->sex); 297                 strcpy(p2->sex, tsex); 298                 tGrade = p1->Grade; 299                 p1->Grade = p2->Grade; 300                 p2->Grade = tGrade; 301  } 302  } 303  } 304     printf("按照姓名排序完成!\n"); 305     system("pause"); 306     system("cls"); 307     return Head; 308 } 309 
310 int main(){ 311     while(1){ 312  login(); 313         int funtion; 314         scanf("%d", &funtion); 315         system("cls"); 316         switch(funtion){ 317             case 0: return 0; 318             case 1:Head = Createinformation();break; 319             case 2:Head = Deleteinformation();break; 320             case 3:Head = Reviseinformation();break; 321             case 4:Head = Findinformation();break; 322             case 5:Head = Sortinformaition();break; 323             case 6:Display(Head);break; 324  } 325  } 326     return 0; 327 }
View Code

不足的地方有很多,我目前認為主要有以下兩點:

1.沒有任何文件操作,數據不能保存下來

2.沒有創建用戶名和密碼,缺失安全性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM