学生管理系统更新(账号系统)

展示

头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//输入输出函数
#include<stdlib.h>//动态分配函数和随机函数
#include<windows.h>//控制台程序,用来实现cmd指令,title指令,cls指令等等
#include<locale.h>//本地化,用于控制从标准库中对于不同地区会产生不一样行为的部分
#include<string.h>//字符串函数
//宏定义,学科排序
#define functioncreate(major) void major##compare(mana mn){\int i,j,sum=mn->sum;\for(i=0;i<sum-1;i++)\for(j=0;j<sum-i-1;j++)\if(mn->student[j].grade->major<mn->student[j+1].grade->major)\swap(&mn->student[j],&mn->student[j+1]);\
}
typedef struct a1 {	//学生成绩信息int Chinese;int Math;int English;int Physics;int Chemistry;int Organism;int All;
}*grade;
typedef struct a2 {	//学生信息   自定义结构体char name[10];char stunum[20];grade grade;int Class;
}*student;
typedef struct a3 {	//全体学生信息   自定义结构体int sum;student student;int capacity;
}*mana;
typedef struct m {int kind;char account[20];char password[20];char stunum[20];
}acco;
void setpos(short x, short y);	//设置位置
void init();	//初始化
void welcome();	//欢迎界面
void manager(mana mn);	//开始
void menu();	//菜单
void addstu(mana mn);//加入
void initmana(mana mn);// 初始化
void exportcapacity(mana mn);//扩容
void modifystu(mana mn);//修改个人
void showsin(student stu, int i);//展示单人
void showall(mana mn);
void clean(mana mn);//清空
void swap(student p1, student p2);
void compare(mana mn);
void initstu(student mn);
void stunumcompare(mana mn);
void enter();
int identify(int a);
void regist();
void read(mana all);
void save(mana all);
void clear(mana all);
void teacher(mana all);
void stu(mana all);

源文件

#include "FileName.h"
// 检查字符串是否全部为字母
bool is_alpha(const char* s) {for (int i = 0; i < strlen(s); i++) {if (!isalpha(s[i])) {return false;}}return true;
}// 检查字符串是否全部为数字
bool is_number(const char* s) {for (int i = 0; i < strlen(s); i++) {if (!isdigit(s[i])) {return false;}}return true;
}// 设置控制台光标位置
void setpos(short x, short y) {HANDLE mn = GetStdHandle(STD_OUTPUT_HANDLE);//此处运用句柄,句柄可以理解为一个可以操作其他设备的东西//COORD pos = { x,y };//COORD是windows APL中定义的一个结构体,表示一个字符在控制台屏幕缓冲区上的坐标SetConsoleCursorPosition(mn, pos);
}// 初始化控制台,隐藏光标
void init() {HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//STD_OUTPUT_HANDLE即为输出设备,可理解为窗口//影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息,检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息CursorInfo.bVisible = false;//隐藏控制台光标SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态
}// 显示欢迎界面
void welcome() {init();system("title 学生成绩管理系统");//运用title指令修改窗口指令为“学生成绩管理系统”system("mode con cols=100 lines=30");//运用cmd指令将黑窗大小设置为30行,100列的大小setpos(40, 12);//定义上面那行字出现的位置printf("欢迎来到学生成绩管理系统");setpos(40, 13);system("pause");//运用pause指令,用处是按下任意键才能指向下一操作
}// 显示主菜单
void menu() {//菜单system("cls");//cls指令:清除1setpos(30, 5);printf("请点击相应按键决定您的下一步操作");setpos(30, 10);printf("1.添加新学生-------2.清空");setpos(30, 12);printf("3.排序---------------4.班级排名");setpos(30, 14);printf("5.修改学生信息-----6.查看学生成绩");setpos(30, 16);printf("------------0.退出-----------");setpos(38, 20);
}// 初始化管理结构
void initmana(mana mn) {mn->capacity = 0;mn->student = NULL;mn->sum = 0;
}// 扩展学生数组容量
void exportcapacity(mana mn) {if (mn->capacity > mn->sum)return;int capacity = mn->capacity == 0 ? 1 : 2 * mn->capacity;student temp = (student)realloc(mn->student, sizeof(struct a2) * capacity);if (temp == NULL) {printf("Error: could not allocate memory\n");return;}mn->student = temp;mn->capacity = capacity;
}// 获取用户输入并验证
void get_input(const char* prompt, char* input, bool(*validate)(const char*)) {do {system("cls");setpos(30, 10);printf("%s", prompt);scanf("%s", input);} while (!validate(input));
}// 初始化学生信息,包括班级信息
void initstu(student mn) {student now = mn;int sum = 0;char temp[100];get_input("请输入新学生的姓名(拼音):", temp, is_alpha);strcpy(now->name, temp);char stunum[100];get_input("请输入新学生的学号:", stunum, is_number);strcpy(now->stunum, stunum);char classStr[100];get_input("请输入新学生的班级:", classStr, is_number);now->Class = atoi(classStr);int Chinese, Math, English, Physics, Chemistry, Organism;int* subjects[] = { &Chinese, &Math, &English, &Physics, &Chemistry, &Organism };const char* subject_names[] = { "语文", "数学", "英语", "物理", "化学", "生物" };for (int i = 0; i < 6; i++) {char score[100];char prompt[50];sprintf(prompt, "请输入%s成绩:", subject_names[i]);get_input(prompt, score, is_number);*subjects[i] = atoi(score);sum += *subjects[i];}now->grade->Chinese = Chinese;now->grade->Math = Math;now->grade->English = English;now->grade->Physics = Physics;now->grade->Chemistry = Chemistry;now->grade->Organism = Organism;now->grade->All = sum;system("cls");
}// 学号比较函数,用于排序
void stunumcompare(mana mn) {int i, j, sum = mn->sum;for (i = 0; i < sum - 1; i++) {for (j = 0; j < sum - i - 1; j++) {if (strcmp(mn->student[j].stunum,mn->student[j+1].stunum))swap(&mn->student[j], &mn->student[j + 1]);}}
}// 添加新学生
void addstu(mana mn) {system("cls");exportcapacity(mn);mn->student[mn->sum].grade = (grade)malloc(sizeof(struct a1));initstu(&mn->student[mn->sum]);mn->sum++;setpos(40, 10);printf("加入完成");setpos(40, 12);system("pause");system("cls");
}// 修改学生信息
void modifystu(mana mn) {system("cls");setpos(30, 10);int sum = 0;printf("请输入你要修改的学生名字(拼音):");char s[10];scanf("%s", s);int i;for (i = 0; i < mn->sum; i++) {if (strcmp(s, mn->student[i].name) == 0)break;}system("cls");if (i == mn->sum) {setpos(30, 10);printf("查无此人,");system("pause");return;}student now = &(mn->student[i]);initstu(now);
}// 显示单个学生信息,包括班级
void showsin(student stu, int i) {setpos(20, 5 + 2 * i);printf("%d", stu->Class); // 显示班级信息setpos(25, 5 + 2 * i);printf("%s", stu->name); // 显示学生姓名setpos(30, 5 + 2 * i);printf("%s", stu->stunum); // 显示学号setpos(35, 5 + 2 * i);printf("%d", stu->grade->Chinese); // 显示语文成绩setpos(40, 5 + 2 * i);printf("%d", stu->grade->Math); // 显示数学成绩setpos(45, 5 + 2 * i);printf("%d", stu->grade->English); // 显示英语成绩setpos(50, 5 + 2 * i);printf("%d", stu->grade->Physics); // 显示物理成绩setpos(55, 5 + 2 * i);printf("%d", stu->grade->Chemistry); // 显示化学成绩setpos(60, 5 + 2 * i);printf("%d", stu->grade->Organism); // 显示生物成绩setpos(65, 5 + 2 * i);printf("%d", stu->grade->All); // 显示总分
}// 显示所有学生信息,包括表头
void showall(mana mn) {int i = 0, sum = mn->sum;if (sum == 0) {setpos(45, 13);printf("暂空"); // 若无学生信息,显示暂空}system("cls");// 显示表头setpos(20, 3);printf("班级");setpos(25, 3);printf("姓名");setpos(30, 3);printf("学号");setpos(35, 3);printf("语文");setpos(40, 3);printf("数学");setpos(45, 3);printf("英语");setpos(50, 3);printf("物理");setpos(55, 3);printf("化学");setpos(60, 3);printf("生物");setpos(65, 3);printf("总分");// 显示每个学生的信息for (i = 0; i < sum; i++)showsin(&mn->student[i], i);setpos(50, 25);system("pause");system("cls");
}// 清空学生信息
void clean(mana mn) {system("cls");free(mn->student); // 释放学生数组内存mn->student = NULL;mn->capacity = mn->sum = 0; // 重置容量和学生数量setpos(40, 14);printf("清空成功");system("pause");
}// 交换两个学生的信息
void swap(student p1, student p2) {struct a2 mn = *p1;*p1 = *p2;*p2 = mn;
}// 未实现的函数占位符
functioncreate(Math)
functioncreate(Chinese)
functioncreate(English)
functioncreate(Physics)
functioncreate(Chemistry)
functioncreate(Organism)
functioncreate(All)// 选择排序方式并执行
void compare(mana mn) {system("cls");setpos(37, 10);printf("请选择您的排序方式");// 显示排序选项setpos(35, 12);printf("1.语文");setpos(45, 12);printf("2.数学");setpos(35, 14);printf("3.英语");setpos(45, 14);printf("4.物理");setpos(35, 16);printf("5.化学");setpos(45, 16);printf("6.生物");setpos(35, 18);printf("7.学号");setpos(45, 18);printf("8.总分");setpos(40, 20);int a;scanf("%d", &a);// 根据选择执行相应的排序函数switch (a) {case 1:Chinesecompare(mn); break;case 2:Mathcompare(mn); break;case 3:Englishcompare(mn); break;case 4:Physicscompare(mn); break;case 5:Chemistrycompare(mn); break;case 6:Organismcompare(mn); break;case 7:stunumcompare(mn); break;case 8:Allcompare(mn); break;}system("cls");setpos(40, 14);printf("排序完成,请自行查看");setpos(40, 15);system("pause");
}// 显示指定班级的学生信息
void showClassStudents(mana mn) {system("cls");int classNum; // 用户输入的班级号setpos(30, 10);printf("请输入要查询的班号: ");scanf("%d", &classNum);// 创建新的mana对象用于存储特定班级的学生mana classMn = (mana)malloc(sizeof(struct a3));initmana(classMn);// 遍历原始mana对象,复制符合班级号的学生到新的mana对象for (int i = 0; i < mn->sum; i++) {if (mn->student[i].Class == classNum) {exportcapacity(classMn);classMn->student[classMn->sum] = mn->student[i];classMn->sum++;}}if (classMn->sum == 0) {system("cls");setpos(30, 10);printf("该班级无学生记录");system("pause");}else {compare(classMn);showall(classMn);}// 释放新创建的mana对象内存free(classMn->student);free(classMn);setpos(50, 25);system("cls");
}// 程序入口,显示欢迎界面并处理用户选择
void manager(mana mn) {int choose;do {menu(); // 显示主菜单scanf("%d", &choose);// 根据用户选择执行相应功能switch (choose) {case 1:addstu(mn); break;case 2:clean(mn); break;case 3:compare(mn); break;case 4:showClassStudents(mn); break;case 5:modifystu(mn); break;case 6:showall(mn); break;case 0:break;}save(mn);} while (choose);
}
void save(mana all) {//人数,空间,学生信息FILE* file = fopen("allinfo.txt", "w");fprintf(file,"%d ",all->sum);fprintf(file, "%d ", all->capacity);fclose(file);file = fopen("info.txt", "w");//班级 学号 姓名 成绩student stu=all->student;int i;for (i = 0; i < all->sum; i++) {fprintf(file, "%d ", stu[i].Class);fprintf(file, "%s ", stu[i].stunum);fprintf(file, "%s ", stu[i].name);fprintf(file, "%d %d %d %d %d %d %d ", stu[i].grade->All, stu[i].grade->Chemistry, stu[i].grade->Chinese, stu[i].grade->English, stu[i].grade->Math, stu[i].grade->Organism, stu[i].grade->Physics);}fclose(file);
}
void read(mana all) {FILE* file = fopen("allinfo.txt", "r");fscanf(file,"%d",&all->sum);fscanf(file, "%d", &all->capacity);fclose(file);all->student = (student)malloc(sizeof(struct a2) * all->sum);student stu=all->student;file = fopen("info.txt", "r");int i;for (i = 0; i < all->sum; i++) {//班级 学号 姓名 成绩fscanf(file, "%d", &stu[i].Class);fscanf(file, "%s", stu[i].stunum);fscanf(file, "%s", stu[i].name);stu[i].grade = (grade)malloc(sizeof(struct a1));fscanf(file, "%d%d%d%d%d%d%d", &stu[i].grade->All, &stu[i].grade->Chemistry, &stu[i].grade->Chinese, &stu[i].grade->English, &stu[i].grade->Math, &stu[i].grade->Organism, &stu[i].grade->Physics);}
}
void regist() {system("cls");FILE* file = fopen("account number.txt", "a");acco m;setpos(40, 12);printf("请输入您的账号:");scanf("%s", m.account);system("cls");setpos(40, 12);printf("请输入您的密码:");scanf("%s", m.password);system("cls");setpos(35, 12);printf("请选择您的用户类型:1.管理员 2.老师 3.学生");setpos(50, 13);scanf("%d", &m.kind);system("cls");setpos(50, 14);printf("请输入您的学号/工号:");scanf("%s", &m.stunum);system("cls");setpos(40, 12);printf("恭喜您创建成功!");setpos(40, 13);fprintf(file, "%s %s %d %s\n",m.account,m.password,m.kind,m.stunum);fclose(file);system("pause");
}
int identify(int a) {system("cls");setpos(40, 12);printf("请输入您的账号:");char ac[20],nu[20];scanf("%s", ac);setpos(40, 13);printf("请输入您的密码:");scanf("%s", nu);system("cls");FILE* file = fopen("account number.txt","r");char ab[20], bc[20],num[20];int kind,flag=0;while (fscanf(file, "%s%s%d%s", ab, bc, &kind,num) != EOF) {if (strcmp(ac, ab) || strcmp(nu, bc))continue;flag = 1;break;}system("cls");if (flag) {setpos(40, 12);printf("欢迎使用本系统!");setpos(40, 13);system("pause");return 1;}setpos(40, 12);printf("账号密码错误,请重新输入");setpos(40, 13);system("pause");return 0;
}
void enter() {welcome();int a;mana mn = (mana)malloc(sizeof(struct a3));initmana(mn); // 初始化管理结构read(mn);while (1) {system("cls");setpos(40, 12);printf("请选择登陆方式:");setpos(29, 13);printf("1.管理员  2.老师  3.学生  4.退出  5.注册账号");setpos(40, 15);scanf("%d", &a);if (a == 4)break;if (a == 5) {regist();continue;}if (a != 1 && a != 2 && a != 3) {system("cls");setpos(40, 12);printf("选择错误");setpos(38, 13);system("pause");continue;}if (!identify(a))continue;switch (a) {case 1:manager(mn); break;case 2:teacher(mn); break;case 3:stu(mn); break;default:break;}}save(mn);clear(mn);
}
void clear(mana all) {int i;for (i = 0; i < all->sum; i++)free(all->student[i].grade);free(all->student);free(all);
}
void teacher(mana all) {system("cls");while (1) {setpos(40, 12);printf("是否查看班级信息:1.是  0.否");setpos(45, 13);int a;scanf("%d", &a);if (a)showClassStudents(all);elsebreak;}
}
void stu(mana all) {FILE* file = fopen("account number.txt", "r");int i;char stunum[20];flag:system("cls");setpos(40, 12);printf("请输入您的学号(输入0则退出):");scanf("%s", stunum);system("cls");if (!strcmp("0", stunum))return;for (i = 0; i < all->sum; i++) {if (strcmp(stunum, all->student[i].stunum))continue;break;}if (i == all->sum) {system("cls");setpos(40, 12);printf("学号不存在");setpos(40, 13);system("pause");goto flag;}setpos(20, 3);printf("班级");setpos(25, 3);printf("姓名");setpos(30, 3);printf("学号");setpos(35, 3);printf("语文");setpos(40, 3);printf("数学");setpos(45, 3);printf("英语");setpos(50, 3);printf("物理");setpos(55, 3);printf("化学");setpos(60, 3);printf("生物");setpos(65, 3);printf("总分");showsin(&all->student[i], 0);setpos(40, 12);system("pause");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollama深度探索:AI大模型本地部署的全面教程

目录 引言一、Ollama概述1、定义与定位2、核心功能3、技术优势4、应用场景 二、安装与配置1、系统要求2、安装方法3、配置指南4、启动Ollama服务 四、快速开始1、启动Ollama2、部署运行模型3、REEST API 五、自定义模型1、定制化的必要性2、使用Modelfile定制模型3、参数调整4、…

IPSEC VPN

IPSEC VPN IPSEC是为IP网络提供安全性的协议和服务的集合,是一种协议簇&#xff0c;一个基于网络层&#xff0c;应用密码学的安全信息协议组。一开始TCP/IP 没有考虑到信息的安全传输。IPSEC协议簇诞生的意义就是保证TCP/IP的安全传输。 伪头部校验&#xff1a;TCP再校验的时…

升级到tomcat10和Java 21后,idea控制台system.out.println输出中文乱码问题

最近一次性从tomcat 9升级到tomcat 10&#xff0c;同时Java sdk也从1.8升级到21。 升级过程中&#xff0c;当然会遇到很多问题&#xff0c;但是控制台输出中文乱码问题&#xff0c;着实折腾了很久。 1、尝试各种方法 网上说的很多通用方法都试过了&#xff0c;就是不生效。包…

前端:Element UI 与 Vuetify 的选择

vuetify优势 1、多端适配&#xff0c;Vuetify完全按照Material设计规范进行开发&#xff0c;每一个组件都经过精心设计&#xff0c;具有模块化、响应式和优秀的性能。 使用独特和动态的 布局 自定义您的应用程序&#xff0c;并使用 SASS 变量 自定义您的组件的样式。只需要做下…

【CT】LeetCode手撕—236. 二叉树的最近公共祖先

目录 题目1- 思路2- 实现⭐236. 二叉树的最近公共祖先——题解思路 3- ACM实现 题目 原题连接&#xff1a;236. 二叉树的最近公共祖先 1- 思路 模式识别 模式1&#xff1a;二叉树最近公共祖先 ——> 递归 判断 递归思路&#xff0c;分情况判断&#xff1a; 1.参数及返…

香港“试水”医疗多模态大模型

更好地引入及发掘行业数据有望为垂直领域内的多模态大模型开发提供新可能。中国香港特区传统科研优势要嫁接产业风口&#xff0c;国际化渠道如何与内地资源携手&#xff1f; 产业多模态大模型“风头”正盛&#xff0c;在积极寻找经济新动能的中国香港特区&#xff0c;相关产业…

SQL新手蜕变:掌握这20条常用SQL语句,让你也能成为高手!

序言 在现代软件开发中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;作为与数据库交互的标准编程语言&#xff0c;是每个开发者必学的基础技能。掌握SQL并在数据库管理与数据分析中应用自如&#xff0c;能显著提升开发效率和数…

如何修复“AI的原罪”

如何修复“AI的原罪” 上个月&#xff0c;《纽约时报》声称&#xff0c;科技巨头OpenAI和谷歌不顾服务条款和版权法的禁止&#xff0c;将大量YouTube视频转录成文本&#xff0c;并将其用作人工智能模型的额外训练数据&#xff0c;从而进入了版权灰色地带。《纽约时报》还援引Me…

掌握JavaScript ES6精髓:探索函数和对象的高级扩展与实用技巧

序言 JavaScript&#xff0c;作为前端开发中不可或缺的语言&#xff0c;已经发展到了ECMAScript 2015&#xff08;简称ES6&#xff09;以及后续的版本。ES6带来了诸多语法上的改进和创新&#xff0c;使得代码更加简洁、优雅&#xff0c;同时也提供了更多的编程模式和实用技巧。…

【ONE·基础算法 || 记忆化搜索】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解记忆化搜索类题型&#xff08;对比递归、动态规划理解运用&#xff09;。             文章目录 总言1、记忆化搜索1.1、基本介绍1.2、细节理解&#xff08;记忆搜索化、递归、动态规划……&#xff09; 2、斐…

idea插件开发之一起来开发个打印方法入参和返回值的插件吧!

写在前面 源码 。 在开发过程中为了调试代码我们就可能就需要知道某个方法入参的值是什么&#xff0c;或者是返回值是什么。此时&#xff0c;我们的解决办法一般都是debug&#xff0c;但是debug的效率说实话其实是不高的&#xff0c;特别是不断的调试&#xff0c;不断的debug。…

KT148A-SOP8语音芯片接收到一线串口指令到播放声音大概多长时间

一、问题简介 请问KT148A-SOP8语音芯片接收到一线串口指令&#xff0c;到播放出来声音&#xff0c;大概需要多长时间 我的需求是做按键提示音&#xff0c;初测了一下感觉有延时&#xff0c;这个要如何处理 详细说明 KT148A从接收到指令&#xff0c;到执行&#xff0c;到播放…

JavaScript基于时间的动画算法

前段时间无聊或有聊地做了几个移动端的HTML5游戏。放在不同的移动端平台上进行测试后有了诡异的发现&#xff0c;有些手机的动画会“快”一点&#xff0c;有些手机的动画会“慢”一点&#xff0c;有些慢得还不是一两点。 通过查找资料发现&#xff0c;基于帧的算法&#xff08…

多模态大模型时代下的文档图像智能分析与处理

0. 前言 随着人工智能技术的不断发展&#xff0c;尤其是深度学习技术的广泛应用&#xff0c;多模态数据处理和大模型训练已成为当下研究的热点之一&#xff0c;这些技术也为文档图像智能处理和分析领域带来了新的发展机遇。 多模态大模型时代下的文档图像智能分析与处理的研究…

Linux:用户账号和权限管理的命令

目录 一、Linux用户的分类和组的分类 1.1、用户账号和组账号 1.2、用户的分类 1.3、组账号 1.4、用户账号文件/etc/passwd 二、用户管理相关命令 2.1、chage命令&#xff1a;用来修改帐号和密码的有效期限&#xff0c;针对目前系统已经存在的用户 2.2、useradd&#xf…

【Numpy】一文向您详细介绍 np.abs()

【Numpy】一文向您详细介绍 np.abs() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;曾…

数据结构-图的基本概念

图的定义 图时由非空的顶点集合和一个描述顶点之间关系的集合组成。可以定义为&#xff1a; ​​​​​​​ ​​​​​​​ ​​​​​​​ G表示一个图&#xff0c;V表示点集&#xff0c;E表示边集。集合E的每一个二元组都包含两个值和&#xff0c;表示…

什么是联盟营销?独立站如何通过联盟营销提高转化率?

什么是联盟营销&#xff1f;独立站如何通过联盟营销提高转化率&#xff1f; 流量紧缺是跨境电商独立站永恒不变的难题&#xff0c;对于独立站卖家来说&#xff0c;广告投放、KOL引流等推广方式都能带来流量&#xff0c;但在广告流量越来越贵的今天&#xff0c;对于跨境电商独立…

Vue快速上手和Vue指令

一、Vue快速上手 1、Vue概念 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套构建用户界面的渐进式框架 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ 构建用户界面&#xff1a;基于数据渲染出用户可以看到的界面 渐进式&#xff1a; 循序渐进&#xff0c;不一定非得把…

阿里云PAI主机网页访问测试

笔者使用的阿里云平台PAI主机(首次使用免费三个月额度)&#xff0c;由于其默认不设置公网IP&#xff0c;所以在该主机上启动HTTP服务后无法访问测试。 这里使用ssh来作隧道穿透&#xff0c;首先需要配置ssh。 云主机配置ssh 1. 修改root账号密码 在云主机上执行 passwd ro…