#include<stdio.h>
#include<stdlib.h>
#include<string.h>//字符串头文件
void menu() //显示菜单
{ printf(" *********************************** \n");
printf(" 学生信息管理系统 \n");
printf(" ***********************************\n");
printf(" 系统功能菜单 \n");
printf(" *********************************** \n");
printf(" * 1、录入学生信息 * \n"); printf("\n");
printf(" * 2、打印学生信息 * \n"); printf("\n");
printf(" * 3、保存学生信息 * \n");
printf("\n");
printf(" * 4、统计学生信息 * \n");
printf("\n");
printf(" * 5、查询学生信息 * \n");
printf("\n");
printf(" * 6、修改显示信息 * \n");
printf("\n");
printf(" * 7、删除学生信息 * \n");
printf("\n");
printf(" * 8、退出系统 * \n");
printf("\n");
printf(" * 9、读取学生信息 \n");
printf(" *********************************** \n");
}
void jumpspace()
{
char ch = getchar();
}
//定义一个学生结构体
typedef struct _student
{
int num; //学号
char name[20];//姓名
char sex[10]; //性别
int age; //年龄
int score; //成绩
}student;
//节点
typedef struct _Node
{
student stu; //学生
struct _Node* pNext;//指向下一个结点
}Node;
Node* phead = NULL; //头结点
//录入学生信息
void Inputstudent()
{
//创建一个新结点
Node* pNewNode = (Node*)malloc(sizeof(Node));
printf("输入学号: \n");
scanf_s("%d", &(pNewNode->stu.num), sizeof(student::num));
jumpspace();
printf("请输入姓名: \n");
scanf_s("%s", &(pNewNode->stu.name), sizeof(student::name));
jumpspace();
printf("请输入性别: \n");
scanf_s("%s", &pNewNode->stu.sex, sizeof(student::sex));
printf("请输入年龄: \n");
scanf_s("%d", &(pNewNode->stu.age), sizeof(student::age));
printf("请输入成绩: \n");
scanf_s("%d", &(pNewNode->stu.score), sizeof(student::score));
printf("学生信息录入成功!\n");
system("pause");//暂停
system("cls");//清屏
if (phead == NULL)
{
phead = pNewNode;
phead->pNext = NULL;
}
else
{
pNewNode->pNext = phead;
phead->pNext = pNewNode;
phead->pNext->pNext = NULL;
}
}
//打印学生信息
void Printstudent()
{
printf(" *********************************** \n");
printf(" 学生信息管理系统 \n");
printf(" ***********************************\n");
printf("\t学号\t姓名\t性别\t年龄\t成绩\n");
printf(" ***********************************\n");
//遍历链表
Node* p = phead;
while (p != NULL)
{
printf("\t%d\t%s\t%s\t%d\t%d\n", p->stu.num, p->stu.name, p->stu.sex, p->stu.age, p->stu.score); p = p->pNext;
}
system("pause");//暂停
system("cls");//清屏
}
//保存学生信息
void Savestudent()
{
//打开文件
FILE* fp;
errno_t err = fopen_s(&fp, "D:\\stuinfo.txt", "w");
if (fp == NULL)
{ printf("打开文件失败!\n");
return;
}
//遍历链表
Node* p = phead;
while (p != NULL)
{
fwrite(&p->stu, 1, sizeof(student), fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功!\n");
system("pause");//暂停
system("cls");//清屏
}
//读取学生信息
void Readsttudent()
{
student stu;
//打开文件
FILE* fp;
errno_t err = fopen_s(&fp, "D:\\stuinfo.txt", "r");
if (fp == NULL)
{
printf("文件打开失败!\n");
return;
}
//读文件
while (fread(&stu, 1, sizeof(student), fp))
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
//申请一个空节点
pNewNode->pNext = NULL;
memcpy(pNewNode, &stu, sizeof(student));//copy
//头插法
if (phead == NULL)
{
phead = pNewNode;
}
else
{
pNewNode->pNext = phead;
phead = pNewNode;
//统计学生信息
int Countstudent()
{
int Count = 0;//学生总数
//遍历链表
Node* p = phead;
while (p != NULL)//尾结点的指针域->NULL {
Count++;
p = p->pNext;
}
return Count;
}
//查找学生信息
Node* Findstudent()
{
int num;
char name[20];
printf("请输入需要查找的学生的学号:\n"); scanf_s("%d", &num);
system("pause");//暂停
system("cls");//清屏
//遍历链表
Node* p = phead;
while (p != NULL)
{
//strcmp字符串函数
if(p->stu.num==num /*0==strcmp(p->stu.name,name)*/)
{
return p;
}
p = p->pNext;
}
return NULL;
}
//修改学生信息
void Modifystudent()
{
int num;
printf("请输入需要修改的学生信息的学号:\n");
scanf_s("%d", &num);
//遍历链表
Node* p = phead;
while (p != NULL)
{
if (p->stu.num == num )
{
printf("请输入要修改的学生姓名 年龄 成绩:\n");
scanf_s("%c %d %d", &p->stu.name, &p->stu.age, &p->stu.score);
printf("修改成功!\n");
break;
}
p = p->pNext;
}
if(p==NULL)
{
printf("没有找到该学生信息!\n");
}
system("pause");//暂停
system("cls");//清屏
}
//删除学生信息
void Deletestudent()
{
int stunum;
printf("请输入要删除的学生的学号:\n");
scanf_s("%d", &stunum);
//删除结点
Node* p1, * p2;
//p2是备份的,可释放
//判断是否为头结点
if (phead->stu.num ==stunum)
{
p1 = phead;
phead = phead->pNext;
free(p1);
system("pause");//暂停
system("cls");//清屏
return;
}
//不是头结点
Node* p = phead;
while (p->pNext != NULL)
{
if (p->pNext->stu.num == stunum) {
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
system("pause");//暂停
system("cls");//清屏
return;
}
p = p->pNext;
if (p->pNext == NULL)//到了尾部
{
break;
}
}
if (p->pNext == NULL)
{
printf("没有找到该学员!\n");
}
system("pause");//暂停
system("cls");//清屏
}
int main()
{
int choice;
while (1)
{
menu();
scanf_s("%d", &choice);
jumpspace();
switch (choice)
{
case 1: //录入
Inputstudent();
jumpspace();
break;
case 2: //打印
Printstudent();
break;
case 3: //保存
Savestudent();
break;
case 4: //统计
printf("学生总人数为:%d\n", Countstudent());
system("pause");//暂停
system("cls");//清屏
break;
case 5: //查找
{
Node* p = Findstudent();
if (p != NULL)
{
printf("学号:%d\t姓名:%s\t性别:%s\t年龄:%d\t成绩:%d\n", p->stu.num, p->stu.name, p->stu.sex, p->stu.age, p->stu.score); system("pause");//暂停
system("cls");//清屏
}
else
printf("没有找到该学员!\n");
break;
}
case 6: //修改
Modifystudent();
break;
case 7: //删除
Deletestudent();
break;
case 8: //退出
printf("goodbye!\n");
return 0;
case 9: //读取
Readsttudent();
break;
default:
printf("输入有误,请重新输入!\n");
system("pause");//暂停
system("cls");//清屏
break;
}
}
return 0;
}
此代码中如何限制性别(只能输入男或女)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- CSDN专家-link 2022-09-09 19:28关注
不都采纳过了么,给你写的你也不认可,你到底要什麽
第58,59行修改为:while(1) { printf("请输入性别(男或女): \n"); scanf_s("%s", &pNewNode->stu.sex, sizeof(student::sex)); if(strcmp(pNewNode->str.sex,"男") != 0 && strcmp(pNewNode->str.sex,"女") != 0) printf("性别只能输入男或女,请重新输入\n"); else break; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥30 Hyper-v虚拟机相关问题,求解答。
- ¥15 TSM320F2808PZA芯片 Bootloader
- ¥45 谷歌浏览器出现开发者工具无法显示已创建的,但您可以调试已部署的代码。 状态代码 404, net::ERR HTTP RESPONSE CODE FAILURE
- ¥15 chatgpt网页版侧边栏和模型切换点击没反应怎么办
- ¥15 如何解决蓝牙通话音频突发失真问题
- ¥15 安装opengauss数据库报错
- ¥15 【急】在线问答CNC雕刻机的电子电路与编程
- ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
- ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
- ¥15 Python pandas