J-三门问题

文章讨论了三门问题的背景及其概率逻辑。在一次程序设计竞赛中,参赛者需要解决这个问题。初始时,有三个门,一扇门后有奖品,选手先选择一扇,然后主持人打开一扇无奖品的门。文章指出,换门比不换门获得奖品的概率更高,并提供了计算这一概率的代码示例。

J-三门问题_中国石油大学(北京)第三届“骏码杯”程序设计竞赛(同步赛) (nowcoder.com)

这道题主要的就是理解三门问题。三门问题题意是一开始有三个门,然后其中有一个门中有汽车,其他的都没有,你会首先选一个门,然后主持人会选一个没有汽车的门。问你换门概率大还是不换门大。

三门问题的关键在于前后条件改变了,比如说一开始有三个门,你选到汽车的概率是 1 / 3, 然后主持人会选择一个没有汽车的门打开,到现在,主持人其实已经帮你排除了一个错误选项了。

现在我们考虑两种情况:

1. 如果你不换门,那么你的中汽车概率就是 1 / n。

2. 如果你换门 ,这里又有两种情况:第一种就是你一开始就选的汽车,这样概率自然是 \frac{1}{n}  * 0,第二种情况是你一开始选的不是汽车,那剩下的就有 n - 1 个门,然后你选不到汽车的概率是\frac{n - 1}{n},然后再去掉主持人去掉的门,剩下的门有 n - 2 个,你选到的概率就是\frac{1}{n - 2}

  最后这两个概率相乘就是你换门可以得到汽车的概率 \frac{n - 1}{n * (n - 2)}

代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	int t; cin >> t;
	while (t --)
	{
		int n; cin >> n;
		int a = n - 1, b = (n * n - 2 * n);
		int gg = __gcd(a, b);
		a /= gg, b /= gg;
		cout << a << " " << b << "\n";
	}
	return 0;
}

#ifndef STUDENTS_MANAGE_SYSTEMS_H #define STUDENTS_MANAGE_SYSTEMS_H #include<stdio.h> #include<stdlib.h> //数据类型重定义 //管理员结构体定义 管理员账号名 密码 指针域 typedef struct Administrator_t { char number[100]; char password[100]; struct Administrator_t* next; }adm; //教师信息结构体定义 姓名 密码 工号 性别 出生日期 指针域 typedef struct Teachers_t { char name[100]; char password[100]; int number; int sex; char birthday[100]; struct Teachers_t* next; }tea; //学生信息结构体定义 姓名、密码、学号、性别、出生日期、数学、语文、英语三门功课成绩 指针域 typedef struct Students_t { char name[100]; char password[100]; int number; int sex; char birthday[100]; double chinese; double maths; double english; struct Students_t* next; }stu; //选择身份界面函数 void Choose_Identity_Interface(); //创建管理员空白单向链表 adm* Creat_Adm_Ep_Link_List(); //创建教师空白单向链表 tea* Create_Ep_Teacher_Link_List(); //创建学生空白单向链表 stu* Create_Ep_Student_Link_List(); //管理员页面 //修改管理员密码 void Modify_Adm_Password(adm* p); //添加新教师 int Add_New_teachers(tea* p); //查看所有教师信息 void View_All_Teachers(tea* p); //删除教师 int Delete_Teacher(tea* p); // 修改教师信息函数 int Modify_Teacher_Information(tea* p); //创建管理员页面 void Creat_Adm_Page(adm* padm, tea* ptea); //教师页面 //更改教师登录密码 void Modify_Teacher_Password(tea* p); //查看教师自身信息 void View_Teacher_Information(tea* p); //添加新学生 int Add_New_Student(stu* p); //删除学生 int Delete_Student(stu* p); //查阅学生信息 int View_Student_Information(stu* p); // 修改学生信息(姓名、性别、出生日期、三门功课成绩) int Modify_Student_Information(stu* p); // 按学号从低到高查看所有学生信息 void View_Student_Num_Information(stu* p); // 按总分从高到低查看所有学生信息 void View_Student_Total_Information(stu* p); //记录教师的位置 //int Search_Teacher_Position(tea* p, char name[]); // 教师登录界面 void Creat_Tea_Page(tea* p, stu* p1); // 修改学生登录密码 void Modify_Student_Password(stu* p); // 学生查看自身信息 void View_Studentself_Information(stu* p); //记录学生位置 //int Search_Student_Position(stu* p, char name[]); //学生登录界面 void Creat_Student_page(stu* p); #endif #define _CRT_SECURE_NO_WARNINGS #include "students_manage_systems.h" //选择身份界面函数 void Choose_Identity_Interface() { printf("---------欢迎登录学生管理系统---------\n"); printf("\n"); printf("---------1.管理员登录---------\n"); printf("\n"); printf("---------2.教师登录---------\n"); printf("\n"); printf("--------- 3.学生登陆---------\n"); printf("\n"); printf("--------- 4.退出登录--------- \n"); printf("\n"); } //创建管理员空白单向链表 并将初始账号密码储存到管理员数组中 //strncpy复制函数计算数组要减1 且手动删除空格 adm* Creat_Adm_Ep_Link_List() { adm* p; p = (adm*)malloc(sizeof(adm)); // 内存检查 if (p == NULL) { printf(" CreatEpLinkList error\n"); return NULL; } strncpy(p->number, "admin", sizeof(p->number) - 1); p->number[sizeof(p->number) - 1] = '\0'; strncpy(p->password, "admin123", sizeof(p->password) - 1); p->password[sizeof(p->password) - 1] = '\0'; p->next = NULL; return p; } //创建教师空白单向链表 tea* Create_Ep_Teacher_Link_List() { tea* p = (tea*)malloc(sizeof(tea)); // 内存检查 if (p == NULL) { printf("Create_Ep_Teacher_Link_List error\n"); return NULL; } // 设置空链表 p->next = NULL; // 返回指针 return p; } //创建一个空的学生头节点 stu* Create_Ep_Student_Link_List() { stu* p = (stu*)malloc(sizeof(stu)); if (p == NULL) { printf(" Create_Ep_Student_Link_List error\n"); return NULL; } p->next = NULL; return p; } //修改管理员密码 while循环清除输入缓冲区中未被处理的字符 void Modify_Adm_Password(adm* p) { printf("请输入新的登录密码:\n"); char newpassword[20]; scanf("%s", newpassword); // 防止溢出 while (getchar() != '\n'); // 清空缓冲区 strncpy(p->password, newpassword, sizeof(p->password) - 1); p->password[sizeof(p->password) - 1] = '\0'; printf("您的密码已经修改成功!\n"); } //添加新教师 int Add_New_teachers(tea* p) { //空指针检查 if (p == NULL) { printf("Add_New_teachers error\n"); return -1; } //开辟内存 tea* pnew = (tea*)malloc(sizeof(tea)); if (pnew == NULL) { printf("Add_New_teachers error\n"); return -1; } //定义变量,数组 char name[20]; char password[21]; int sex; int number; char birthday[20]; //新数据读取 printf("请新教师的姓名\n"); scanf("%s", name); while (getchar() != '\n'); printf("请新教师的密码 最多20位\n"); scanf("%s", password); while (getchar() != '\n'); printf("请输入新教师的工号\n"); scanf("%d", &number); while (getchar() != '\n'); printf("请输入新教师的性别 1代表男 0代表女\n"); scanf("%d", &sex); while (getchar() != '\n'); printf("请输入新教师的出生年月日,例如(1997-6-25)\n"); scanf("%s", birthday); while (getchar() != '\n'); strncpy(pnew->name, name, sizeof(pnew->name) - 1); pnew->name[sizeof(pnew->name) - 1] = '\0'; strncpy(pnew->password, password, sizeof(pnew->password) - 1); pnew->password[sizeof(pnew->password) - 1] = '\0'; pnew->number = number; pnew->sex = sex; strncpy(pnew->birthday, birthday, sizeof(pnew->birthday) - 1); pnew->birthday[sizeof(pnew->birthday) - 1] = '\0'; pnew->next = NULL; //插入新节点,先连接后结点,再连接前结点 pnew->next = p->next; p->next = pnew; //安全退出 return 0; } //查看所有教师信息 void View_All_Teachers(tea* p) { //移动链表 while (p->next != NULL) { p = p->next; // 打印当前节点的教师信息 printf("\n"); printf("教师姓名:%s\n", p->name); printf("教师密码:%s\n", p->password); printf("教师工号:%d\n", p->number); printf("教师性别 1代表男 0代表女:%d\n", p->sex); printf("教师的出生日期:%s\n", p->birthday); printf("\n"); } } //删除教师 int Delete_Teacher(tea* p) { printf("请输入您要删除的教师名称\n"); char a[20]; scanf("%s", a); // 清除输入缓冲区中的多余字符 while (getchar() != '\n'); // 从第一个有效节点开始查找 tea* pdel = p->next; // 遍历链表并找到合适的教师名字 while (pdel != NULL) { if (strcmp(pdel->name, a) == 0) { printf("%s教师已删除\n", pdel->name); printf("\n"); // 修改前驱节点的next指针,跳过当前节点 p->next = pdel->next; // 释放内存并制空指针 free(pdel); pdel = NULL; return 0; } else { p = p->next; pdel = pdel->next; } } printf("查无此人\n"); printf("\n"); return -1; } // 修改教师信息函数 int Modify_Teacher_Information(tea* p) { // int n = 0; char name[20]; // 存储用户输入的姓名 tea* l = NULL; // 用于遍历链表的指针 int found = 0; // 是否找到教师标志 int exit_flag = 0; // 是否退出主循环标志 // 主循环:允许用户多次输入姓名查找 while (!exit_flag) { printf("请输入您想要修改的教师姓名(输入 q 退出):\n"); scanf("%s", name); while (getchar() != '\n'); // 清空输入缓冲区 // 如果用户输入 q,退出整个函数 if (strcmp(name, "q") == 0) { printf("已退出修改功能。\n"); return 0; } // 从链表第一个有效节点开始查找 l = p->next; found = 0; // 遍历链表查找匹配的教师 while (l != NULL) { if (strcmp(l->name, name) == 0) { found = 1; printf("找到教师:%s\n", l->name); // 进入修改菜单循环 while (1) { printf("\n"); printf("请选择您要修改的信息\n"); printf("1.姓名 2.密码 3.工号 4.性别 5.出生日期 0.返回上一层\n"); scanf("%d", &n); while (getchar() != '\n'); // 清空缓冲区 switch (n) { case 1: { char new_name[20]; printf("请输入您想要修改的新名字:\n"); scanf("%s", new_name); while (getchar() != '\n'); strcpy(l->name, new_name); // 修改姓名 printf("姓名修改成功。\n"); break; } case 2: { char new_password[50]; printf("请输入您想要修改的新密码:\n"); scanf("%s", new_password); while (getchar() != '\n'); strcpy(l->password, new_password); // 修改密码 printf("密码修改成功。\n"); break; } case 3: { int new_number; printf("请输入您想要修改的新工号:\n"); scanf("%d", &new_number); l->number = new_number; // 修改工号 printf("工号修改成功。\n"); break; } case 4: { int new_sex; printf("请输入您想要修改的新性别:\n"); scanf("%d", &new_sex); while (getchar() != '\n'); l->sex= new_sex; // 修改性别 printf("性别修改成功。\n"); break; } case 5: { char new_birthday[20]; printf("请输入您想要修改的新出生日期(例如:1997-6-25):\n"); scanf("%s", new_birthday); strcpy(l->birthday, new_birthday); printf("出生日期修改成功。\n"); break; } case 0: printf("返回上一层。\n"); exit_flag = 1; // 设置退出标志 break; default: printf("错误选择,请重新选择。\n"); break; } // 跳出修改菜单循环 if (n == 0) break; } } l = l->next; } // 如果未找到匹配的教师,提示重新输入 if (!found) { printf("查无此人,请重新输入(输入 q 退出):\n"); } } return 0; // 正常退出 } //创建管理员页面 void Creat_Adm_Page(adm* p, tea* p1) { int flag = 1, count = 0; int sel = 0; char name[20]; char password[20]; while (flag) { printf("请输入您的账户\n"); scanf("%s", name); while (getchar() != '\n'); printf("请输入密码\n"); scanf("%s", password); while (getchar() != '\n'); if (strcmp(name, p->number) == 0 && strcmp(password, p->password) == 0) { int pflag = 1; printf("\n"); printf("您好\n"); while (pflag) { printf("\n"); printf("1. 修改自身登录密码\n"); printf("2. 添加新教师\n"); printf("3. 查看所有教师\n"); printf("4. 删除教师\n"); printf("5. 修改教师信息\n"); printf("0. 返回上一层\n"); printf("\n"); scanf("%d", &sel); switch (sel) { case 1:Modify_Adm_Password(p); break; case 2:Add_New_teachers(p1); break; case 3:View_All_Teachers(p1); break; case 4:Delete_Teacher(p1); break; case 5:Modify_Teacher_Information(p1); break; case 0: pflag = 0; flag = 0; break; default:printf("错误选择,请重新选择\n"); break; } } } else { printf("输入错误请重新输入!\n"); count++; if (count == 3) { flag = 0; printf("输入错误3次,自动退出!\n"); } } } } //更改教师登录密码 void Modify_Teacher_Password(tea* p) { printf("请输入新的登录密码:\n"); char newpassword[20]; scanf("%s", newpassword); while (getchar() != '\n'); strncpy(p->password, newpassword, sizeof(p->password) - 1); p->password[sizeof(p->password) - 1] = '\0'; } //查看教师自身信息 void View_Teacher_Information(tea* p) { // 检查指针是否为空,防止程序崩溃 if (p == NULL) { printf("错误:教师信息为空,无法查看!\n"); return; } // 输出教师信息 printf("姓名:%s\n", p->name); printf("密码:%s\n", p->password); printf("工号:%d\n", p->number); printf("性别:%d\n", p->sex); printf("出生日期:%s\n", p->birthday); printf("\n"); } //添加新学生 int Add_New_Student(stu* p) { // 检查传入指针是否为空,防止访问非法内存 if (p == NULL) { printf("当前节点为空,无法添加新学生!\n"); return -1; } // 动态分配内存,创建新学生节点 stu* pnew = (stu*)malloc(sizeof(stu)); if (pnew == NULL) { printf("内存分配失败\n"); return -1; } // 临时变量用于存储输入信息 char name[20]; char password[20]; int number; int sex; char birthday[100]; double chinese; double maths; double english; // 输入学生姓名 printf("请输入新学生姓名\n"); scanf("%s", name); while (getchar() != '\n'); // 清空输入缓冲区 // 输入学生密码 printf("请输入新学生密码\n"); scanf("%s", password); while (getchar() != '\n'); // 输入学生学号 printf("请输入新学生学号\n"); scanf("%d", &number); while (getchar() != '\n'); // 输入学生性别 printf("请输入新学生性别\n"); scanf("%d", &sex); while (getchar() != '\n'); // 输入学生出生日期 printf("请输入新学生生日 例如:1997-6-25\n"); scanf("%s", birthday); while (getchar() != '\n'); // 输入语文成绩 printf("请输入新学生语文成绩\n"); scanf("%lf", &chinese); while (getchar() != '\n'); // 输入数学成绩 printf("请输入新学生数学成绩\n"); scanf("%lf", &maths); while (getchar() != '\n'); // 输入英语成绩 printf("请输入新学生英语成绩\n"); scanf("%lf", &english); while (getchar() != '\n'); // 初始化新节点的数据 strcpy(pnew->name, name); strcpy(pnew->password, password); pnew->number = number; pnew->sex = sex;; strcpy(pnew->birthday, birthday); pnew->chinese = chinese; pnew->maths = maths; pnew->english = english; pnew->next = NULL; // 新节点的 next 初始化为 NULL // 将新节点插入到当前节点的后面 pnew->next = p->next; // 新节点指向当前节点的下一个节点 p->next = pnew; // 当前节点指向新节点 printf("新学生添加成功!\n"); return 0; // 成功返回 0 } //删除学生 int Delete_Student(stu* p) { printf("请输入您要删除的学生姓名\n"); char name[20]; scanf("%s", name); // 防止缓冲区溢出 while (getchar() != '\n'); // 清空缓冲区 stu* pdel = p->next; while (pdel != NULL) { if (strcmp(pdel->name, name) == 0) { printf("%s学生已删除\n", pdel->name); printf("\n"); // 删除节点 p->next = pdel->next; // 如果结构体中有动态分配字段,需先释放 // free(pstu_del->name); // free(pstu_del->passwd); free(pdel); pdel = NULL; return 0; } else { p = p->next; pdel = pdel->next; } } printf("查无此人\n"); printf("\n"); return -1; } //查阅学生信息 int View_Student_Information(stu* p) { // 判断传入的链表指针是否为 NULL if (p == NULL) { printf("链表为空,无法查找\n"); return -1; } printf("请输入您要查阅的学生姓名\n"); char name[20]; // 用于存储输入的学生姓名 scanf("%s", name); // 读取用户输入的姓名(不处理溢出) while (getchar() != '\n'); // 清空输入缓冲区中的多余字符 p = p->next; // 移动到第一个有效节点(跳过哨兵节点) // 如果此时 pstu 为 NULL,说明链表中没有有效节点 if (p == NULL) { printf("链表中无学生信息\n"); return -1; } // 遍历链表查找匹配的学生 while (p != NULL) { // 判断当前节点的 name 是否非空,并且与输入的 name 匹配 if (p->name != NULL && strcmp(p->name, name) == 0) { // 打印学生信息 printf("学生姓名:%s\n", p->name); printf("学生密码:%s\n", p->password); printf("学生学号:%d\n", p->number); printf("学生性别:%d\n", p->sex); printf("学生出生日期:%s\n", p->birthday); printf("学生语文成绩:%lf\n", p->chinese); printf("学生数学成绩:%lf\n", p->maths); printf("学生英语成绩:%lf\n", p->english); printf("\n"); return 0; // 成功找到并打印,返回 0 } else { p = p->next; // 没有找到,继续下一个节点 } } // 遍历完整个链表仍未找到目标学生 printf("查无此人\n"); return -1; // 返回 -1 表示查找失败 } // 修改学生信息(姓名、性别、出生日期、三门功课成绩) int Modify_Student_Information(stu* p) { int choice = 0; char name[20]; int running = 1; while (running) { printf("请输入您想要修改的学生姓名\n"); scanf("%s", name); // 读取要修改的学生姓名 while (getchar() != '\n'); // 清空输入缓冲区 stu* current = p->next; // 从第一个有效节点开始查找 stu* found = NULL; while (current != NULL) { if (strcmp(current->name, name) == 0) { found = current; // 找到学生 break; } current = current->next; } if (found == NULL) { printf("查无此人\n"); continue; } // 进入修改菜单 int modifying = 1; while (modifying) { printf("*******************************************************\n"); printf("请选择您要修改的信息\n"); printf("1.姓名 2.性别 3.出生日期 4.数学成绩 5.语文成绩 6.英语成绩 0.返回上一层\n"); if (scanf("%d", &choice) != 1) // 输入失败 { printf("输入错误,请输入数字\n"); while (getchar() != '\n'); // 清空无效输入 continue; } switch (choice) { case 1: { char new_name[20]; printf("请输入您想要修改的新名字\n"); scanf("%s", new_name); while (getchar() != '\n'); strcpy(found->name, new_name); printf("修改成功\n"); break; } case 2: { int new_sex; printf("请输入您想要修改的新性别\n"); scanf("%d",&new_sex); while (getchar() != '\n'); found->sex = new_sex; printf("修改成功\n"); break; } case 3: { char new_birthday[20]; printf("请输入您想要修改的新出生日期,如 1998-4-19\n"); scanf("%s", new_birthday); strcpy(found->birthday, new_birthday); while (getchar() != '\n'); printf("修改成功\n"); break; } case 4: { double new_chinese = 0; printf("请输入您想要修改的新语文成绩\n"); scanf("%lf", &new_chinese); while (getchar() != '\n'); found->chinese = new_chinese; printf("修改成功\n"); break; } case 5: { double new_maths = 0; printf("请输入您想要修改的新数学成绩\n"); scanf("%lf", &new_maths); while (getchar() != '\n'); found->maths = new_maths; printf("修改成功\n"); break; } case 6: { double new_english = 0; printf("请输入您想要修改的新英语成绩\n"); scanf("%lf", &new_english); while (getchar() != '\n'); found->english = new_english; printf("修改成功\n"); break; } case 0: modifying = 0; // 退出修改菜单 running = 0; // 退出主循环 break; default: printf("错误选择,请重新选择\n"); break; } } } return 0; } // 7. 按学号从低到高查看所有学生信息 void View_Student_Num_Information(stu* p) { // 如果链表为空或只有一个节点,直接返回 if (p == NULL || p->next == NULL) { printf("链表为空,无法排序查看信息\n"); return; } stu* i = NULL; stu* j = NULL; stu*temp = NULL; int len = 0; // 计算链表长度 temp = p->next; while (temp != NULL) { len++; temp = temp->next; } // 冒泡排序:按学号从低到高排序 for (i = p->next; i != NULL; i = i->next) { for (j = p->next; j != NULL && j->next != NULL; j = j->next) { if (j->number > j->next->number) { // 比较学号 // 交换节点 j 和 j->next 的数据域(不交换指针) // 这种方式更简单安全,适合展示排序效果 stu temp = { 0 }; temp = *j; // 保存 j 的内容 *j = *(j->next); // 将 j->next 的内容复制给 j *(j->next) = temp; // 将临时保存的内容复制给 j->next // 重置指针,因为交换后 j->next 已改变 j->next->next = temp.next; } } } // 排序完成后,遍历输出学生信息 temp = p->next; while (temp != NULL) { printf("姓名:%s ", temp->name); printf("密码:%s ", temp->password); printf("学号:%d ", temp->number); printf("性别:%d ", temp->sex); // 性别改为 int 类型 printf("出生日期:%s ", temp->birthday); // 生日改为 char[12] printf("语文成绩:%lf ", temp->chinese); // 语文成绩放在前面 printf("数学成绩:%lf ", temp->maths); // 数学成绩放在后面 printf("英语成绩:%lf \n", temp->english); printf("\n"); temp = temp->next; } } // 8. 按总分从高到低查看所有学生信息 void View_Student_Total_Information(stu* p) { // 如果链表为空或只有一个节点,直接返回 if (p == NULL || p->next == NULL) { printf("链表为空,无法排序查看信息\n"); return; } stu* i = NULL; stu* j = NULL; // 冒泡排序:按总分从高到低排序 for (i = p->next; i != NULL; i = i->next) { for (j = p->next; j != NULL && j->next != NULL; j = j->next) { int total_j = j->chinese + j->maths + j->english; int total_j_next = j->next->chinese + j->next->maths + j->next->english; if (total_j < total_j_next) { // 总分降序排序 // 交换节点 j 和 j->next 的数据域 stu temp = { 0 }; temp = *j; *j = *(j->next); *(j->next) = temp; // 保持链表指针连续性 stu* tmp_next = j->next->next; j->next->next = temp.next; j->next = tmp_next; } } } // 排序完成后,遍历输出学生信息 stu* current = p->next; while (current != NULL) { int total = current->maths + current->chinese + current->english; printf("姓名:%s ", current->name); printf("密码:%s ", current->password); printf("学号:%d ", current->number); printf("性别:%d ", current->sex); // 性别为 int printf("出生日期:%s ", current->birthday); // 生日为 char[12] printf("语文成绩:%lf ", current->chinese); // 语文成绩 printf("数学成绩:%lf ", current->maths); // 数学成绩 printf("英语成绩:%lf ", current->english); // 英语成绩 printf("总分:%d \n", total); // 输出总分 printf("\n"); current = current->next; } } //查找老师的位置 /* int Search_Teacher_Position(tea* p, char name[]) { //记录查找位置 int post = 0; while (p->next != NULL) { p = p->next; if (strcmp(p->name, name) == 0) { return post; } post++; } return -1; } */ // 教师登录界面 void Creat_Tea_Page(tea* p, stu* p1) { int flag = 1, count = 0; int sel = 0; char name[20]; char password[20]; while (flag) { printf("请输入姓名:\n"); scanf("%s", name); while (getchar() != '\n'); // 清空缓冲区 printf("请输入密码:\n"); scanf("%s", password); while (getchar() != '\n'); // 使用临时指针查找教师 tea* current_teacher = p->next; // 跳过头节点 int found = 0; while (current_teacher != NULL) { if (strcmp(current_teacher->name, name) == 0 && strcmp(current_teacher->password, password) == 0) { found = 1; break; } current_teacher = current_teacher->next; } // 判断登录是否成功 if (found && current_teacher != NULL) { int pflag = 1; printf("\n"); printf("欢迎 %s 老师登录\n", current_teacher->name); printf("\n"); while (pflag) { printf("1. 修改自身登录密码\n"); printf("2. 查阅自身信息\n"); printf("3. 添加新学生\n"); printf("4. 删除学生\n"); printf("5. 查阅指定学生信息\n"); printf("6. 修改学生信息(姓名、性别、出生日期、三门功课成绩)\n"); printf("7. 按学号从低到高查看所有学生信息\n"); printf("8. 按总分从高到低查看所有学生信息\n"); printf("0. 返回上一层\n"); printf("\n"); scanf("%d", &sel); switch (sel) { case 1: Modify_Teacher_Information(current_teacher); break; case 2: View_Teacher_Information(current_teacher); break; case 3: Add_New_Student(p1); break; case 4: Delete_Student(p1); break; case 5: View_Student_Information( p1); break; case 6: Modify_Student_Information(p1); break; case 7: View_Student_Num_Information(p1); break; case 8: View_Student_Total_Information(p1); break; case 0: pflag = 0; flag = 0; break; default: printf("错误选择,请重新选择\n"); break; } } } else { printf("登录失败,请重新输入\n"); count++; if (count == 3) { flag = 0; printf("输入错误3次,自动退出!\n"); } } } } // 修改学生登录密码 void Modify_Student_Password(stu* p) { char new_password[20]; char confirm_password[20]; printf("请输入新的登录密码:\n"); scanf("%s", new_password); while (getchar() != '\n'); printf("请再次输入以确认密码:\n"); scanf("%s", confirm_password); while (getchar() != '\n'); if (strcmp(new_password, confirm_password) == 0) { strcpy(p->password, new_password); printf("密码修改成功!\n"); } else { printf("两次输入的密码不一致,修改失败。\n"); } } // 学生查看自身信息 void View_Studentself_Information(stu* p) { if (p == NULL) { printf("当前学生信息为空,无法查看。\n"); return; } printf("\n"); printf("姓名:%s\n", p->name); printf("密码:%s\n", p->password); printf("学号:%d\n", p->number); printf("性别:%d\n", p->sex); printf("出生日期:%s\n", p->birthday); printf("语文成绩:%lf\n", p->chinese); printf("数学成绩:%lf\n", p->maths); printf("英语成绩:%lf\n", p->english); printf("\n"); } //记录学生位置 /* int Search_Student_Position(stu* p, char name[]) { //记录查找位置 int post = 0; while (p->next != NULL) { p = p->next; if (strcmp(p->name, name) == 0) { return post; } post++; } return -1; } */ //学生登录界面 void Creat_Student_page(stu* p) { int flag = 1, count = 0; int sel = 0; char name[20]; char password[20]; while (flag) { printf("请输入姓名:\n"); scanf("%s", name); while (getchar() != '\n'); // 清空缓冲区 printf("请输入密码:\n"); scanf("%s", password); while (getchar() != '\n'); // 使用临时指针查找学生 stu* current = p->next; // 假设 pstu 是头节点 int found = 0; while (current != NULL) { if (strcmp(current->name, name) == 0 && strcmp(current->password, password) == 0) { found = 1; break; } current = current->next; } if (found) { int pflag = 1; printf("\n"); printf("欢迎 %s 同学登录\n", current->name); printf("\n"); while (pflag) { printf("1. 修改自身登录密码\n"); printf("2. 查阅自身信息\n"); printf("0. 返回上一层\n"); printf("\n"); scanf("%d", &sel); switch (sel) { case 1: Modify_Student_Password(current); break; case 2: View_Student_Information(current); break; case 0: pflag = 0; flag = 0; break; default: printf("错误选择,请重新选择\n"); break; } } } else { printf("输入错误,请重新输入,您还有 %d 次机会\n", 3 - count); count++; if (count == 3) { flag = 0; printf("输入错误3次,自动退出!\n"); } } } }还有问题
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值