我的C/C++之路-010课(结构体使用的简单实例(学生成绩管理))
2012-05-03 14:02
393 查看
最近比较忙,几天没写了。今天做的是结构体的应用(学生的成绩管理),相信很多朋友都做过,我这里献丑下,C比较难控制,所以在里面有很多不是很好的功能,大家可以自己完善下。
#include<stdio.h> #include<stdlib.h> #include<string.h> /** 结构体使用的简单实例: 1.创建学生成绩结构体(包含学号,姓名,语文,数学,英语成绩) 使用链表指向下一个学生(由于输入学生个数未知,使用数组方式不怎么好) 2.提供学生成绩插入,查询,更改,删除 */ typedef struct Student { char no[4];//3位数的学号,输入多的会出错 char name[10]; int chinese; int math; int english; struct Student *next;//指向下一个学生 }StudentList; void init(StudentList *&); void select(StudentList *); //查询成绩 void insert(StudentList *&); //录入成绩 void update(StudentList *&); //更新成绩 void deleteData(StudentList *);//删除数据 void studentScoreManege() { StudentList *stuList = NULL; int oprate; init(stuList);//初始化 do{ system("cls"); fflush(stdin); puts("************* Student Data Oprate *******************"); puts("* 1. select student score *"); puts("* 2. insert student score *"); puts("* 3. update student score *"); puts("* 4. delete student data *");//删除全部数据,虽然实际不能这样做,这里为了简便设计 puts("* 0. exit *"); puts("*****************************************************"); printf("please select a number: "); scanf("%d",&oprate); switch(oprate)//根据不同选择执行不同操作 { case 1: select(stuList); break; case 2: insert(stuList); break; case 3: update(stuList); break; case 4: deleteData(stuList); break; case 0: default: break; } }while(oprate!=0); } //初始化表头 void init(StudentList *&stuList) { stuList = (StudentList *)malloc(sizeof(StudentList)); stuList->next = NULL; } //查询成绩 void select(StudentList *stuList) { StudentList *p = stuList->next; if(p==NULL) { puts("there is no data,please insert!!"); puts("press any key to return!!!"); getchar(); } puts("************** student score insert *********************"); puts("No\tName\tChinese\tMath\tEnglish"); while(p!=NULL) { printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english); p = p->next; } fflush(stdin); puts("press any key to return!!!"); getchar(); } //录入成绩 void insert(StudentList *&stuList) { StudentList *p ,*s; p = stuList; while(p->next != NULL) { p = p->next; } do{ s = (StudentList *)malloc(sizeof(StudentList)); puts("please insert student data(NO,Name,Chinese,Math,English):"); scanf("%3s%10s",&s->no,&s->name); scanf("%d%d%d",&s->chinese,&s->math,&s->english); //判断数据合法性,关于学号的重复性大家自己写校验 if(s->chinese<0||s->chinese>100||s->math<0||s->math>100||s->english<0||s->english>100) { puts("input data error !!!"); return; } s->next = NULL; p->next = s; p = p->next;//为下一次循环录入准备 fflush(stdin);//清除缓冲区的 '\n' 不然下面的getchar()不起作用 puts("Continue?ENTER to yes or input no to exit");//是否继续录入 }while(getchar()=='\n'); } //更新 void update(StudentList *&stuList) { StudentList *p = stuList->next; char no[4];//3位学号,如用户输入4~位学号,这里关于越界的问题,大家自己处理 fflush(stdin);//还是先清空缓冲区 puts("please input student No: "); gets(no); //显示当前学号的学生数据 if(p==NULL) { puts("there is no record,please insert!!"); puts("press any key to return!!!"); getchar(); return; } else { while(p!=NULL) { if(!strcmp(p->no,no)){//如果查找到,则进行显示 puts("NO\tNAME\tChinese\tMath\tEnglish"); printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english); break; } else{ p = p->next; } } if(p==NULL)//未找到 { puts("can't find this student's record!!!"); puts("press any key to return!!!"); getchar(); return; } } //只能这样简单的更新了,喜欢的自己改进 puts("please update student data(Name,Chinese,Math,English):"); scanf("%10s",&p->name); scanf("%d%d%d",&p->chinese,&p->math,&p->english); fflush(stdin); puts("update successful,press any key to return!!!"); getchar(); } //删除数据 void deleteData(StudentList *stuList) { /* 前面这个部分和更新差不多,只是指针有变化,因为需要删除, 比如 a->b->c,要删除b,则需要a->c后,才free(b), 操作就是a->next=b->next */ StudentList *p = stuList,*q; char no[4];//3位学号,如用户输入4~位学号,这里关于越界的问题,大家自己处理 fflush(stdin);//还是先清空缓冲区 puts("please input student No: "); gets(no); //显示当前学号的学生数据 if(p->next==NULL) { puts("there is no record !!!"); puts("press any key to return!!!"); getchar(); return; } else { while(p->next!=NULL) { if(!strcmp(p->next->no,no)){//如果查找到,则进行显示 puts("NO\tNAME\tChinese\tMath\tEnglish"); printf("%s\t%s\t%d\t%d\t%d\n",p->next->no,p->next->name,p->next->chinese,p->next->math,p->next->english); break; } else{ p = p->next; } } if(p->next==NULL)//未找到 { puts("can't find this student's record!!!"); puts("press any key to return!!!"); getchar(); return; } } puts("Are you sure delete this record? press ENTER to confirm or other key to cancel!!!"); if(getchar()=='\n')//删除操作,如果这步不懂,大家可以去GOOGLE OR BAIDU链表的删除操作 { q = p->next; p->next = q->next; free(q);//释放内存 } puts("delete successful,press any key to return!!!"); getchar(); }
相关文章推荐
- 用C++写的学生成绩管理系统(比较简单的没有使用链表,只是用到了类和对象)
- C_综合使用数组实现简单的学生成绩管理系统
- c结构体的初使用(学生成绩简单统计)
- 使用Java模拟一个简单的Dos学生成绩管理系统:
- 汇编语言学生成绩管理系统(一)结构体的使用
- C语言编写的简单的学生成绩管理系统
- 简单的学生成绩管理系统
- 使用结构体实现学生信息管理系统
- 用C写的简单学生成绩管理系统
- C语言结构体的简单使用实例
- 超简单学生成绩管理系统
- 初次使用结构体解决学生成绩排列问题
- linux下c/c++实例之十五简单的学生信息管理系统
- 一个简单的学生成绩管理软件(ODBC开发)
- 【C语言经典实例】-数组-使用数组统计学生成绩
- 一个简单的学生成绩管理程序(二叉树实现)
- 链表《5》使用链表实现学生成绩管理系统
- 使用python实现一个简单的学生信息管理系统
- 简单的学生成绩管理系统
- C语言编写的简单的学生成绩管理系统