项目描述:嵌入式C高级开发实训项目,独立完成学生成绩档案管理系统的设计;实现学生信息的输入、查询、修改、删除、排序、输出、保存到文件、从文件读取等功能;熟练掌握C语言的基本语法、结构体、指针、链表的使用。
项目代码:
1 /* 2 *时间:2013年3月27日 3 *目的:学生信息档案管理系统 4 */ 5 6 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 11 #define MAXSIZE 20 12 13 typedef struct student_info 14 { 15 unsigned long int sno; 16 char sname[MAXSIZE]; 17 char sex[MAXSIZE]; 18 int english; 19 int math; 20 int total; 21 int rank; 22 }stu_info; 23 24 typedef struct student_node 25 { 26 struct student_info data; 27 struct student_node *next; 28 }stuNode,*stuList; 29 30 stuList student_system_init(); 31 void input_student_info(stuList head); 32 void output_student_info(stuList head); 33 void ordering_student_info(stuList head); 34 void save_student_info(stuList head); 35 stuList read_student_info_fromdisk(); 36 void search_student_info(stuList head); 37 void delete_student_info(stuList head); 38 void alter_student_info(stuList head); 39 40 int main(void) 41 { 42 int m, password,flags = 1,pass = 106016; 43 char username[MAXSIZE]; 44 stuList head; 45 head = student_system_init(); 46 while (1 == flags) 47 { 48 printf("\n\n学生成绩管理系统管理员登录界面\n"); 49 printf("请输入用户名:\n"); 50 scanf("%s",username); 51 printf("请输入密码:\n"); 52 scanf("%d",&password); 53 54 if ((0 == strcmp(username,"luciaark")) && (pass == password)) 55 flags = 0; 56 else if ((0 != strcmp(username,"luciaark")) && (pass == password)) 57 printf("用户名输入错误,请重新输入.\n"); 58 else if ((0 == strcmp(username,"luciaark")) && (pass != password)) 59 printf("密码输入错误,请重新输入.\n"); 60 else 61 printf("用户名和密码都输入错误,请重新输入.\n"); 62 } 63 64 65 while(1) 66 { 67 printf("\n\n欢迎进入\n"); 68 printf(" 学生成绩档案管理系统\n"); 69 70 printf(" 1.输入学生成绩档案信息\n"); 71 printf(" 2.输出学生成绩档案信息\n"); 72 printf(" 3.学生成绩进行排名处理\n"); 73 printf(" 4.保存学生信息到磁盘上\n"); 74 printf(" 5.从磁盘文件读取学生信息\n"); 75 printf(" 6.根据姓名查询学生信息\n"); 76 printf(" 7.根据姓名删除学生信息\n"); 77 printf(" 8.根据姓名修改学生信息\n"); 78 printf(" 0.退出系统\n"); 79 printf("\n"); 80 81 printf("请选择相应的功能序号:\n"); 82 scanf("%d",&m); 83 84 switch (m) 85 { 86 case 0: 87 exit(0); 88 case 1: 89 input_student_info(head); 90 break; 91 case 2: 92 output_student_info(head); 93 break; 94 case 3: 95 ordering_student_info(head); 96 break; 97 case 4: 98 save_student_info(head); 99 break; 100 case 5: 101 head = read_student_info_fromdisk(); 102 break; 103 case 6: 104 search_student_info(head); 105 break; 106 case 7: 107 delete_student_info(head); 108 break; 109 case 8: 110 alter_student_info(head); 111 break; 112 default: 113 printf("输入错误,请重新选择!\n"); 114 115 } 116 117 } 118 119 return 0; 120 } 121 122 stuList student_system_init() 123 { 124 stuList head; 125 head = (stuList)malloc(sizeof(stuNode)); 126 head->next = NULL; 127 return head; 128 } 129 130 131 void input_student_info(stuList head) 132 { 133 int i,m,n=1; 134 stuNode *stu,*p; 135 136 printf("你需要输入几名学生的学生信息?\n"); 137 scanf("%d",&m); 138 139 for (i = 0; i < m; i++) 140 { 141 stu = (stuNode *)malloc(sizeof(stuNode)); 142 143 printf("开始输入学生信息.\n"); 144 printf("学号为:\n"); 145 scanf("%ld",&stu->data.sno); 146 printf("姓名为:\n"); 147 scanf("%s",stu->data.sname); 148 printf("性别为:\n"); 149 scanf("%s",stu->data.sex); 150 printf("英语成绩为:\n"); 151 scanf("%d",&stu->data.english); 152 printf("数学成绩为:\n"); 153 scanf("%d",&stu->data.math); 154 stu->data.total = stu->data.english + stu->data.math; 155 stu->data.rank = 0; 156 157 if (head->next == NULL) 158 { 159 stu->next = NULL; 160 head->next = stu; 161 } 162 else 163 { 164 stu->next = head->next; 165 head->next = stu; 166 } 167 168 printf("你已经输入了%d个学生的学生信息\n你还需要输入%d个学生的学生信息\n",i+1,m-i-1); 169 170 } 171 172 printf("添加后学生信息如下:\n"); 173 for (p = head->next; p->next != NULL; p = p->next) 174 n++; 175 p = head->next; 176 for (i = 0; i < n; i++) 177 { 178 printf("学号为:%ld,姓名为:%s,性别为:%s,英语成绩为:%d,数学成绩为:%d,总分为:%d,排名为:%d\n",p->data.sno,p->data.sname,p->data.sex,p->data.english,p->data.math,p->data.total,p->data.rank); 179 p=p->next; 180 } 181 182 return; 183 184 } 185 186 void output_student_info(stuList head) 187 { 188 stuNode *stu; 189 stu = head->next; 190 if (NULL == stu) 191 { 192 printf("学生信息链表为空!\n"); 193 return; 194 } 195 196 while (NULL != stu) 197 { 198 printf("学号为:%ld,姓名为:%s,性别为:%s,英语成绩为:%d,数学成绩为:%d,总分为:%d,排名为:%d\n",stu->data.sno,stu->data.sname,stu->data.sex,stu->data.english,stu->data.math,stu->data.total,stu->data.rank); 199 stu = stu->next; 200 } 201 202 return; 203 } 204 205 void ordering_student_info(stuList head) 206 { 207 int i = 1; 208 209 stuNode *first,*stu,*p,*q,*s; 210 if (head->next == NULL) 211 { 212 printf("学生信息链表为空,无法进行排名处理\n"); 213 return; 214 } 215 first = head->next->next; 216 head->next->next = NULL; 217 while (NULL != first) 218 { 219 stu = first; 220 for (q = head->next; (q != NULL)&&(q->data.total > stu->data.total); p = q, q = q->next) 221 { 222 223 } 224 225 first = first->next; 226 if (q == head->next) 227 { 228 head->next = stu; 229 } 230 else 231 { 232 p->next = stu; 233 } 234 stu->next = q; 235 } 236 237 s = head->next; 238 while (NULL != s) 239 { 240 s->data.rank = i; 241 s = s->next; 242 i++; 243 } 244 245 return; 246 } 247 248 void save_student_info(stuList head) 249 { 250 stuNode *stu; 251 FILE *fp; 252 fp = fopen("student.txt","wb"); 253 if (NULL == fp) 254 { 255 printf("文件 student.txt 不存在.\n"); 256 exit(-1); 257 } 258 259 for (stu = head->next; stu != NULL; stu = stu->next) 260 { 261 fprintf(fp,"%ld %s %s %d %d %d %d\n",stu->data.sno,stu->data.sname,stu->data.sex,stu->data.english,stu->data.math,stu->data.total,stu->data.rank); 262 } 263 fclose(fp); 264 fp = fopen("student.txt","a"); 265 fprintf(fp,"0 0 0 0 0 0 0\n"); 266 fclose(fp); 267 printf("保存学生信息到文件成功.\n"); 268 269 return; 270 271 } 272 273 stuList read_student_info_fromdisk() 274 { 275 stuList first; 276 stuNode *p,*q; 277 FILE *fp; 278 fp = fopen("student.txt","rb"); 279 if (NULL == fp) 280 { 281 printf("文件 student.txt 不存在.\n"); 282 exit(-1); 283 } 284 285 first = (stuList)malloc(sizeof(stuNode)); 286 first->next = NULL; 287 q = first->next; 288 while (!feof(fp)) 289 { 290 p = (stuNode *)malloc(sizeof(stuNode)); 291 fscanf(fp,"%ld %s %s %d %d %d %d\n",&p->data.sno,p->data.sname,p->data.sex,&p->data.english,&p->data.math,&p->data.total,&p->data.rank); 292 if (p->data.sno == 0) 293 { 294 break; 295 } 296 first->next = p; 297 p->next = q; 298 q = p; 299 } 300 if (NULL == first->next) 301 { 302 printf("文件 student.txt 为空.\n"); 303 } 304 else 305 printf("文件读取成功.\n"); 306 307 fclose(fp); 308 return first; 309 } 310 311 void search_student_info(stuList head) 312 { 313 int i = 0; 314 char name[MAXSIZE]; 315 stuNode *p; 316 printf("请输入要查找的学生姓名:\n"); 317 scanf("%s",name); 318 for (p = head->next; p != NULL; p = p->next) 319 { 320 if (0 == strcmp(p->data.sname,name)) 321 { 322 printf("学号为:%ld,姓名为:%s,性别为:%s,英语成绩为:%d,数学成绩为:%d,总分为:%d,排名为:%d\n",p->data.sno,p->data.sname,p->data.sex,p->data.english,p->data.math,p->data.total,p->data.rank); 323 i++; 324 } 325 } 326 if (0 == i) 327 printf("该学生信息未在学生信息管理系统中.\n"); 328 329 return; 330 } 331 332 void delete_student_info(stuList head) 333 { 334 int x; 335 char name[MAXSIZE]; 336 stuNode *p,*q; 337 if (NULL == head->next) 338 { 339 printf("学生信息数据为空,无法进行删除操作.\n"); 340 return; 341 } 342 printf("请输入要删除的学生姓名:\n"); 343 scanf("%s",name); 344 p = head->next; 345 if (0 == strcmp(p->data.sname,name)) 346 { 347 x = p->data.sno; 348 head->next = p->next; 349 free(p); 350 printf("删除成功.\n"); 351 printf("此学生学号为:%d\n",x); 352 } 353 else 354 { 355 while ((0 != strcmp(p->data.sname,name))&&(p->next != NULL)) 356 { 357 q = p; 358 p = p->next; 359 } 360 if (0 == strcmp(p->data.sname,name)) 361 { 362 x = p->data.sno; 363 q->next = p->next; 364 free(p); 365 printf("删除成功.\n"); 366 printf("此学生学号为:%d\n",x); 367 } 368 else 369 { 370 printf("该学生信息未在学生信息管理系统中.\n"); 371 exit(-1); 372 } 373 } 374 375 return; 376 } 377 378 void alter_student_info(stuList head) 379 { 380 int i = 0; 381 char name[MAXSIZE]; 382 stuNode *p; 383 printf("请输入要修改的学生姓名:\n"); 384 scanf("%s",name); 385 for (p = head->next; p != NULL; p = p->next) 386 { 387 if (0 == strcmp(p->data.sname,name)) 388 { 389 printf("该学生的原信息为:\n"); 390 printf("学号为:%ld,姓名为:%s,性别为:%s,英语成绩为:%d,数学成绩为:%d,总分为:%d,排名为:%d\n",p->data.sno,p->data.sname,p->data.sex,p->data.english,p->data.math,p->data.total,p->data.rank); 391 392 printf("请重新输入该学生的信息.\n"); 393 printf("学号为:\n"); 394 scanf("%ld",&p->data.sno); 395 printf("姓名为:\n"); 396 scanf("%s",p->data.sname); 397 printf("性别为:\n"); 398 scanf("%s",p->data.sex); 399 printf("英语成绩为:\n"); 400 scanf("%d",&p->data.english); 401 printf("数学成绩为:\n"); 402 scanf("%d",&p->data.math); 403 p->data.total = p->data.english + p->data.math; 404 p->data.rank = 0; 405 406 printf("该学生信息修改成功.\n"); 407 printf("该学生信息修改后为:\n"); 408 printf("学号为:%ld,姓名为:%s,性别为:%s,英语成绩为:%d,数学成绩为:%d,总分为:%d,排名为:%d\n",p->data.sno,p->data.sname,p->data.sex,p->data.english,p->data.math,p->data.total,p->data.rank); 409 i++; 410 411 } 412 } 413 if (0 == i) 414 printf("该学生信息未在学生信息管理系统中.\n"); 415 416 return; 417 }