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 }

 

posted @ 2020-09-30 15:04  天使不设防  阅读(142)  评论(0编辑  收藏  举报