C语言小练习 微型学生管理系统
很简陋,没有做输入校验,以写出来为第一目的,中间出了不少问题,尤其是结构体内字符串赋值的时候(理解不透彻😔),字符串比较用strcmp不能直接==判定,逻辑也很重要,不然会出现莫名其妙的问题。
涉及知识:结构体 数组 字符串
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <ctype.h> 5 6 #define NAME_MAX_LEN 20 7 #define STUDENTS_MAX_NUMBER 100 8 9 typedef struct 10 { 11 int stuId; 12 char name[NAME_MAX_LEN]; 13 int score; 14 int flag; 15 int age; 16 } Student; 17 18 int add(Student stu, Student stus[]) 19 { 20 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) 21 { 22 if(stus[i].flag == 0) 23 { 24 // stus[i].name = stu.name; 刚开始这么写有问题,stus[i].name时字符串常量不能在=左边 25 strcpy(stus[i].name,stu.name); 26 stus[i].score = stu.score; 27 stus[i].age = stu.age; 28 stus[i].flag = 1; // 当前学生属性设置完毕,改变状态 29 return 0; 30 } 31 } 32 return 1; 33 } 34 35 int update(Student stu, Student stus[]) 36 { 37 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) 38 { 39 if(strcmp(stus[i].name,stu.name) == 0) // 之前直接用 == 判断,不报错,运用有bug,找了半天问题 40 { 41 stus[i].score = stu.score; 42 return 0; 43 } 44 } 45 return 1; 46 } 47 48 int search(Student stu, Student stus[]) 49 { 50 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) 51 { 52 if(strcmp(stus[i].name,stu.name) ==0 && stus[i].flag == 1) 53 { 54 fprintf(stdout,"学号:%d 姓名:%s 分数:%d 年龄:%d\n",stus[i].stuId,stu.name,stu.score,stu.age); 55 return 0; 56 } 57 } 58 fprintf(stdout,"查无此人!\n"); 59 return 1; 60 } 61 62 int delete(Student stu, Student stus[]) 63 { 64 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) 65 { 66 if(strcmp(stus[i].name,stu.name) == 0) 67 { 68 stus[i].flag = 0; 69 return 0; 70 } 71 } 72 fprintf(stdout,"该学生不存在!\n"); 73 return 1; 74 } 75 76 int showlist(Student stus[]) 77 { 78 fprintf(stdout,"**************************\n"); 79 fprintf(stdout,"学生名单\n"); 80 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) 81 { 82 if(stus[i].flag == 1) 83 { 84 fprintf(stdout,"学号:%d 姓名:%s 分数:%d 年龄:%d\n",stus[i].stuId,stus[i].name,stus[i].score,stus[i].age); 85 } 86 } 87 fprintf(stdout,"**************************\n"); 88 return 0; 89 } 90 91 int main(void) 92 { 93 int option; 94 int tag = 1; 95 Student stu; 96 Student stus[STUDENTS_MAX_NUMBER]; // 结构体数组 97 98 for(int i=0; i<STUDENTS_MAX_NUMBER; i++) //所有学生id和状态初始化 99 { 100 stus[i].stuId = i; 101 stus[i].flag = 0; 102 } 103 104 while(tag) 105 { 106 fprintf(stdout,"===========================\n"); 107 fprintf(stdout,"欢迎进入学生管理系统\n\n"); 108 fprintf(stdout,"1:添加\n\n"); 109 fprintf(stdout,"2:修改分数\n\n"); 110 fprintf(stdout,"3:学生个人信息查询\n\n"); 111 fprintf(stdout,"4:删除\n\n"); 112 fprintf(stdout,"5:显示学生名单\n\n"); 113 fprintf(stdout,"0:退出系统\n\n"); 114 fprintf(stdout,"===========================\n"); 115 fprintf(stdout,"请输入选项:"); 116 117 //option = getchar(); 118 scanf("%d",&option); 119 switch(option) 120 { 121 case 1: 122 fprintf(stdout,"请输入学生姓名:"); 123 scanf("%s",stu.name); 124 fprintf(stdout,"请输入学生分数:"); 125 scanf("%d",&stu.score); 126 fprintf(stdout,"请输入学生年龄:"); 127 scanf("%d",&stu.age); 128 add(stu,stus); 129 break; 130 case 2: 131 fprintf(stdout,"请输入学生姓名:"); 132 scanf("%s",stu.name); 133 fprintf(stdout,"请输入新的分数:"); 134 scanf("%d",&stu.score); 135 update(stu,stus); 136 break; 137 case 3: 138 fprintf(stdout,"请输入要查询学生姓名:"); 139 scanf("%s",stu.name); 140 search(stu,stus); 141 break; 142 case 4: 143 fprintf(stdout,"请输入要删除学生姓名:"); 144 scanf("%s",stu.name); 145 delete(stu,stus); // 当前学生标记状态标记为0 146 break; 147 case 5: 148 showlist(stus); 149 break; 150 case 0: 151 tag = 0; 152 break; 153 default: 154 fprintf(stdout,"输入选项有误,请重新输入!\n\n"); 155 break; 156 } 157 } 158 159 exit(0); 160 }
作者:天使不设防
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.