学生管理系统(初级)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 /*
  5 一个小项目,学生管理
  6 核心思想:初始化文件,读文件生成链表,插入节点,退出时将链表data域写入文件保存,用文件当做数据库。
  7 
  8 第一步:实现总目标(菜单):1>.初始化数据 2>.添加学生信息 3>.查找学生信息 4>.删除学生信息 5>.修改学生信息 6>.排序 7>.退出
  9 
 10 第二步:逐一实现单个目标
 11         1>.初始化数据。创建初始的数据,读文件生成链表。
 12         2>.添加学生信息。创建结点插入链表实现添加学生信息
 13         3>.查找学生信息。遍历链表查找学生,并且显示学生所有信息
 14         4>.删除学生信息。遍历链表找到结点,然后找到该结点前区,删除该结点
 15         5>.修改学生信息。遍历链表找到结点,然后修改结点的data域
 16         6>.排序。此处排序依据每门功课的成绩排序
 17         7>.退出程序。退出时将链表的data域写入文件保存。
 18 */
 19 typedef struct student
 20 {
 21     int num;
 22     char name[30];
 23     char sex;
 24     float math;
 25     float chinese;
 26     float english;
 27 //    float phy;
 28 //    float chem;
 29 //    float sport;
 30 }STU;
 31 typedef struct node
 32 {
 33     STU data;
 34     struct node * next;
 35 }NODE;
 36 //初始化
 37 void init()
 38 {
 39     STU stu[] = {
 40         {1001,"张三",'x',100,100,100},
 41         {1002,"李四",'x',100,100,100},
 42         {1003,"王麻子",'x',100,100,100}
 43     };
 44     
 45     FILE * fp = fopen("stu.data","wb+");
 46     //一次将初始化数据全部写入文件
 47     fwrite((void *)stu,sizeof(stu),1,fp);
 48 
 49     //查看初始化数据
 50 /*    rewind(fp);
 51 
 52     STU Stu;
 53     while(fread((void *)&Stu,sizeof(STU),1,fp) >0 )
 54     {
 55         printf("num = %d	name = %s	sex = %c	math = %0.2f	chinese =%0.2f	english =%0.2f",
 56                 Stu.num,Stu.name,Stu.sex,Stu.math,Stu.chinese,Stu.english);
 57         putchar(10);
 58     }
 59 */
 60     fclose(fp);
 61 }
 62 //读文件生成链表
 63 NODE * createList()
 64 {
 65     NODE *head = (NODE *)malloc(sizeof(NODE));
 66     head->next = NULL;
 67     
 68     FILE *fp = fopen("stu.data","rb");
 69     if(NULL == fp)
 70         return NULL;
 71     NODE *sur = (NODE *)malloc(sizeof(NODE));
 72     while(fread((void *)&sur->data,sizeof(STU),1,fp) >0 )
 73     {
 74         sur->next = head->next;
 75         head->next = sur;
 76 
 77         sur = (NODE *)malloc(sizeof(NODE));
 78     }
 79     free(sur);
 80     fclose(fp);
 81     return head;
 82 }
 83 //添加学生(插入节点)
 84 void insertNode(NODE *head)
 85 {
 86     NODE * sur = (NODE *)malloc(sizeof(NODE));
 87     printf("请输入学号:");scanf("%d",&sur->data.num);
 88     printf("请输入姓名:");scanf("%s",sur->data.name);getchar();
 89     printf("请输入性别:");scanf("%c",&sur->data.sex);
 90     printf("请输入数学:");scanf("%f",&sur->data.math);
 91     printf("请输入语文:");scanf("%f",&sur->data.chinese);
 92     printf("请输入英语:");scanf("%f",&sur->data.english);
 93 
 94     sur->next = head->next;
 95     head->next = sur;
 96 
 97 }
 98 //查看学生(遍历链表)
 99 void displaystudent(NODE *head)
100 {
101     printf("学号	姓名	性别	数学	语文	英语

");
102     head = head->next;
103     while(head)
104     {
105         printf("%d	%s	%c	%0.2f	%0.2f	%0.2f
",
106                 head->data.num,head->data.name,head->data.sex,head->data.math,head->data.chinese,head->data.english);
107         head = head->next;
108     }
109 }
110 //删除学生(删除结点)
111 void deleteStudent(NODE *head)
112 {
113     char ch[50];
114     NODE *p = head;
115     printf("请输出删除学生的姓名
");
116     scanf("%s",ch);
117     while(p)
118     {
119         p = p->next;
120         if(strcmp(p->data.name,ch) == 0)
121             break;
122     }
123     if(NULL == p)
124         printf("不存在这个学生
");
125     else
126     {
127         while(head->next != p)
128         {
129             head = head->next;
130         }
131         head->next = p->next;
132         free(p);
133     }
134 }
135 //修改学生信息(data域重新赋值)
136 void modScore(NODE *head)
137 {
138     
139     printf("输入要修改成绩学生姓名
");
140     char ch[50];
141     scanf("%s",ch);
142     NODE * p = head;
143     while(p)
144     {
145         p = p->next;
146         if(strcmp(p->data.name,ch) == 0)
147             break;
148     }
149     if(NULL == p)
150         printf("不存在这个学生
");
151     else
152     {
153         printf("选择要修改成绩的学科:1>.数学	2>.语文	3>.英语	4>.全部修改
");
154         int i;
155         scanf("%d",&i);
156         switch(i)
157         {
158         case 1: 
159             printf("数学成绩修改为:");scanf("%f",&p->data.math);
160             break;
161         case 2:
162             printf("语文成绩修改为:");scanf("%f",&p->data.chinese);
163             break;
164         case 3:
165             printf("英语成绩修改为:");scanf("%f",&p->data.english);
166             break;
167         case 4:
168             printf("数学成绩修改为:");scanf("%f",&p->data.math);
169             printf("语文成绩修改为:");scanf("%f",&p->data.chinese);
170             printf("英语成绩修改为:");scanf("%f",&p->data.english);
171             break;
172         }        
173     }
174 }
175 //求链表长度
176 int lenList(NODE *head)
177 {
178     int len = 0;
179     head = head->next;
180     while(head)
181     {
182         len++;
183         head = head->next;
184     }
185     return len;
186 }
187 //排序(只写一种排序把,按照数学成绩排序)
188 void PopList(NODE *head)
189 {
190     int len = lenList(head);
191     NODE * sur,*p,*q,*temp;
192     int i,j;
193     for(i = 0;i<len-1;i++)
194     {
195         sur = head;
196         p = sur->next;
197         q = p->next;
198         for(j = 0;j<len-1-i;j++)
199         {
200             if(p->data.math > q->data.math)
201             {
202                 sur->next = q;
203                 p->next = q->next;
204                 q->next = p;
205                 
206                 temp = p;
207                 p = q;
208                 q = temp;
209             }
210             sur = sur->next;
211             p = p->next;
212             q = q->next;
213         }
214         
215     }
216 }
217 //退出程序(保存链表中的数据,即:将链表中的数据写入文件,文件当做数据库来使用)
218 void saveStudent2File(NODE *head)
219 {
220     head = head->next;
221     FILE * fp = fopen("stu.data","wb");
222     while(head)
223     {
224         fwrite((void *)&head->data,sizeof(STU),1,fp);
225         head = head->next;
226     }
227     fclose(fp);
228 }
229 void menu()
230 {
231     //读文件生成链表
232     NODE *head = createList();
233     printf("		*****************欢迎使用ZY学生管理系统****************

");
234     int choice;
235     while(1)
236     {
237         printf("1>.添加学生信息
2>.查找学生信息
3>.删除学生信息
4>.修改学生信息
5>.排列学生成绩
6>.退出
");
238         scanf("%d",&choice);
239         switch(choice)
240         {
241         case 1:
242             //添加学生信息(插入节点)
243             insertNode(head);
244             break;
245         case 2:
246             //查看学生信息(遍历链表)
247             displaystudent(head);
248             break;
249         case 3:
250             //删除学生信息
251             deleteStudent(head);
252             break;
253         case 4:
254             //修改学生信息
255             modScore(head);
256             break;
257         case 5:
258             //排列学生成绩
259             PopList(head);
260             break;
261         case 6:
262             //退出程序(保存链表中的数据,即:将链表中的数据写入文件)
263             saveStudent2File(head);
264             return ;    
265         }
266     }    
267 }
268 int main(void)
269 {
270     //初始化数据
271 //    init();
272     menu();
273     
274     return 0;
275 }
原文地址:https://www.cnblogs.com/wangchaomahan/p/9787798.html