学生信息管理系统
- 壹、介绍
- 思路
- 贰、代码分布
-
- 一、头文件,定义结构链表
- 二、菜单栏
- 三、不同函数实现不同功能
-
- 1、录入信息
- 2、查看信息
- 3、保存信息
- 4、读取信息
- 5、查找成年学生
- 6、查找男or女学生
- 7、学生人数
- 8、修改学生信息
- 9、删除学生信息
- 10、主函数
- 叁、所有代码
壹、介绍
创建一个学生结构体,学生的属性的有sno,sname,ssex,sage(分别是学号,姓名,性别,年龄),创建一个指针链表,用来存放学生,中存放不少于五个学生,要求性别有区分,年龄有区分,使用函数,打印性别为不同性别的学生信息;打印年龄>18的学生信息,有学生数量,有修改,删除学生信息的功能。
要求有文件流,可以存储和读区数据
思路
首先考虑到代码的需要实现的功能有功能很多,用户对功能的使用顺序不一定固定,所以考虑在主函数中用到switch-case实现对不同函数跟据用户需求的调用,进而在程序开始运行是加入菜单选项,在逐步完善不同函数实现不同的功能,一个函数对应不同的功能,方便后期修改,与阅读。
贰、代码分布
一、头文件,定义结构链表
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _student{ //定义学生结构体
char name[6];
int sno;
int ssex;
int sage;
}student;
typedef struct _Node{
student stu1;
struct _Node* pNext;
}Node;
Node *g_head=NULL;
二、菜单栏
通过不同数字按键实现不同调用。
void menu(){
printf("------------\n");
printf("- 1录入信息-\n");
printf("- 2查看信息-\n");
printf("- 3保存信息-\n");
printf("- 4读取信息-\n");
printf("- 5查找成年学生-\n");
printf("- 6查找男or女学生-\n");
printf("- 7查看学生人数-\n");
printf("- 8修改学生信息-\n");
printf("- 9删除学生信息-\n");
printf("- 0退出-\n");
printf("退出不要直接点×,请按0退出\n 查看文件前请先读取文件\n");
}
三、不同函数实现不同功能
1、录入信息
//录入信息
void input(){
printf("请输入学生信息\t\n");
Node *pNewNode=(Node*)malloc(sizeof(Node)); //创建一个新节点
pNewNode->pNext=NULL;
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
printf("请输入姓名:");
scanf("%s",pNewNode->stu1.name);
printf("请输入学号:");
scanf("%d",&pNewNode->stu1.sno);
printf("1表示男,0表示女\n");
printf("请输入性别:"); //0表示女,1表示男
scanf("%d",&pNewNode->stu1.ssex);
printf("请输入年龄:");
scanf("%d",&pNewNode->stu1.sage);
printf("该学生信息输入完毕!\n\n");
}
2、查看信息
用指针打印所有学生信息。
//查看信息
void printdate(){
Node* p=g_head;
printf("\t姓名\t学号\t性别\t年龄\n");
while(p !=NULL){
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
p = p->pNext;
}
}
3、保存信息
//保存信息
void save(){
FILE *fp=fopen("D:\\stu.date","w"); //写入文件
if(fp==NULL){
printf("打开文件失败\n");
return;
}
Node* p=g_head;
while(p!=NULL){
fwrite(&p->stu1,1,sizeof(student),fp);
p=p->pNext;
printf("文件保存成功!\n");
}
fclose(fp);
}
4、读取信息
/读取信息
void rs(){
FILE* fp=fopen("D:\\stu.data","r");
if(fp==NULL){
printf("打开文件失败\n");
}else{
printf("文件读取成功!\n查看文件请按2\n");
}
student stu;
while(fread(&stu,1,sizeof(student),fp)){
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode,&stu,sizeof(student));
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
}
}
5、查找成年学生
void find_age(){
int flag;
Node* p=g_head;
while(p!=NULL){
if(p->stu1.sage>17){
printf("\t姓名\t学号\t性别\t年龄\n");
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
flag++;
}
p=p->pNext;
}
if(flag == 0){
printf("have no");
}
}
6、查找男or女学生
void find_sex(){
int sex;
int i;
printf("1表示男,0表示女\n请输入性别: \n");
scanf("%d",&sex);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.ssex==sex){
printf("\t姓名\t学号\t性别\t年龄\n");
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
i++;
}
p=p->pNext;
}
if(i == 0){
printf("have not");
}
}
7、学生人数
void count(){
int a=0;
FILE* fp=fopen("D:\\stu.data","r");
if(fp==NULL){
printf("文件打开失败");
return;
}
Node* p=g_head;
while(p!=NULL){
p=p->pNext;
a++;
}
printf("总人数:%d",a);
}
8、修改学生信息
输入num,通过if函数判断,结构中学号sno与num相等,再重新写入该学生的信息
void change(){
int num;
printf("请输入要修改的学生的学号: ");
scanf("%d",&num);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.sno==num){
printf("请输入姓名: \n");
scanf("%s",p->stu1.name);
printf("请输入年龄: \n");
scanf("%d",&p->stu1.sage);
printf("请输入学号: \n");
scanf("%d",&p->stu1.sno);
printf("请输入性别: \n");
scanf("%d",&p->stu1.ssex);
printf("信息更改完毕!");
}
p=p->pNext;
}
if(p==NULL){
printf("该学生不存在!\n");
}
}
9、删除学生信息
用num找到对应的结构,再将指针指向下一个学生结构
void del(){
int num;
printf("请输入要删除的学号");
scanf("%d",&num);
Node* p=g_head;
Node*p1,*p2;
if(p->stu1.sno==num){
p1=p->pNext;
free(p1);
}
if(p->pNext!=NULL){
p2=p->pNext;
p->pNext=p->pNext->pNext;
free(p2);
}
printf("学号为%d的信息删除成功!\n",num);
}
10、主函数
用switch-case函数实现不同功能的调用
int main()
{
menu();
while(1)
{
char ch=getch();
switch(ch){
case '1':input();break;
case '2':printdate();break;
case '3':save();break;
case '4':rs();break;
case '5':find_age();break;
case '6':find_sex();break;
case '7':count();break;
case '8':change();break;
case '9':del();break;
case '0':exit(0);
}
}
return 0;
}
叁、所有代码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _student{
char name[6];
int sno;
int ssex;
int sage;
}student;
typedef struct _Node{
student stu1;
struct _Node* pNext;
}Node;
Node *g_head=NULL;
void menu(){
printf("------------\n");
printf("- 1录入信息-\n");
printf("- 2查看信息-\n");
printf("- 3保存信息-\n");
printf("- 4读取信息-\n");
printf("- 5查找成年学生-\n");
printf("- 6查找男or女学生-\n");
printf("- 7查看学生人数-\n");
printf("- 8修改学生信息-\n");
printf("- 9删除学生信息-\n");
printf("- 0退出-\n");
printf("退出不要直接点×,请按0退出\n 查看文件前请先读取文件\n");
}
//录入信息
void input(){
printf("请输入学生信息\t\n");
Node *pNewNode=(Node*)malloc(sizeof(Node)); //创建一个新节点
pNewNode->pNext=NULL;
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
printf("请输入姓名:");
scanf("%s",pNewNode->stu1.name);
printf("请输入学号:");
scanf("%d",&pNewNode->stu1.sno);
printf("1表示男,0表示女\n");
printf("请输入性别:"); //0表示女,1表示男
scanf("%d",&pNewNode->stu1.ssex);
printf("请输入年龄:");
scanf("%d",&pNewNode->stu1.sage);
printf("该学生信息输入完毕!\n\n");
}
//查看信息
void printdate(){
Node* p=g_head;
printf("\t姓名\t学号\t性别\t年龄\n");
while(p !=NULL){
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
p = p->pNext;
}
}
//保存信息
void save(){
FILE *fp=fopen("D:\\stu.date","w");
if(fp==NULL){
printf("打开文件失败\n");
return;
}
Node* p=g_head;
while(p!=NULL){
fwrite(&p->stu1,1,sizeof(student),fp);
p=p->pNext;
printf("文件保存成功!\n");
}
fclose(fp);
}
//读取信息
void rs(){
FILE* fp=fopen("D:\\stu.data","r");
if(fp==NULL){
printf("打开文件失败\n");
}else{
printf("文件读取成功!\n查看文件请按2\n");
}
student stu;
while(fread(&stu,1,sizeof(student),fp)){
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode,&stu,sizeof(student));
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
}
}
void find_age(){
int flag;
Node* p=g_head;
while(p!=NULL){
if(p->stu1.sage>17){
printf("\t姓名\t学号\t性别\t年龄\n");
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
flag++;
}
p=p->pNext;
}
if(flag == 0){
printf("have no");
}
}
void find_sex(){
int sex;
int i;
printf("1表示男,0表示女\n请输入性别: \n");
scanf("%d",&sex);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.ssex==sex){
printf("\t姓名\t学号\t性别\t年龄\n");
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
i++;
}
p=p->pNext;
}
if(i == 0){
printf("have not");
}
}
void count(){
int a=0;
FILE* fp=fopen("D:\\stu.data","r");
if(fp==NULL){
printf("文件打开失败");
return;
}
Node* p=g_head;
while(p!=NULL){
p=p->pNext;
a++;
}
printf("总人数:%d",a);
}
void change(){
int num;
printf("请输入要修改的学生的学号: ");
scanf("%d",&num);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.sno==num){
printf("请输入姓名: \n");
scanf("%s",p->stu1.name);
printf("请输入年龄: \n");
scanf("%d",&p->stu1.sage);
printf("请输入学号: \n");
scanf("%d",&p->stu1.sno);
printf("请输入性别: \n");
scanf("%d",&p->stu1.ssex);
printf("信息更改完毕!");
}
p=p->pNext;
}
if(p==NULL){
printf("该学生不存在!\n");
}
}
void del(){
int num;
printf("请输入要删除的学号");
scanf("%d",&num);
Node* p=g_head;
Node*p1,*p2;
if(p->stu1.sno==num){
p1=p->pNext;
free(p1);
}
if(p->pNext!=NULL){
p2=p->pNext;
p->pNext=p->pNext->pNext;
free(p2);
}
printf("学号为%d的信息删除成功!\n",num);
}
int main()
{
menu();
while(1)
{
char ch=getch();
switch(ch){
case '1':input();break;
case '2':printdate();break;
case '3':save();break;
case '4':rs();break;
case '5':find_age();break;
case '6':find_sex();break;
case '7':count();break;
case '8':change();break;
case '9':del();break;
case '0':exit(0);
}
}
return 0;
}
版权声明:本文为博主作者:卷卷的aJun原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/m0_73223545/article/details/129263166