1. 程式人生 > >C語言編寫學生信息管理系統

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

name 全局變量 功能 管理系統 als 圖片 format \n 創建鏈表

學完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.沒有創建用戶名和密碼,缺失安全性

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