【小白到大牛之路11】交换机后台管理之端口管理的优化
发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,项目需求项目10中的使用port1,port2,port3,port4,prot5,以及set_port1, set_port2, set_port3, set_port4, set_port5来管理
项目需求
项目10中的使用port1,port2,port3,port4,prot5,以及set_port1, set_port2, set_port3, set_port4, set_port5来管理5个端口。代码臃肿、重复,不便于维护。
解决方案:
使用结构体数组。
项目实现
修改部分:
//定义了5个端口变量//struct port port1;//struct port port2;//struct port port3;//struct port port4;//struct port port5;void show_port(struct port port) { printf("名称[%s]\t状态[%s]\tIP[%-15s]\t类型[%s]\n", port.name, port.status == 0 ? "禁用":"激活", port.ip, port.type);}void show_ports(struct port ports[]) { system("cls"); printf("---端口状态---\n"); /* printf("PORT1:\t"); show_port(port1); printf("PORT2:\t"); show_port(port2); printf("PORT3:\t"); show_port(port3); printf("PORT4:\t"); show_port(port4); */ int n; for (n=0; n<5; n++) { printf("PORT%d:\t", n+1); show_port(ports[n]); //传递端口结构体的值 } system("pause");}void set_port1(void) {void set_port(struct port ports[], int num) { system("cls"); printf("---设置PORT1端口---\n"); printf("请输入端口名称: "); scanf("%s", ports[num].name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &ports[num].status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", ports[num].type); printf("请输入端口的IP地址: "); scanf("%s", ports[num].ip); system("pause");}void set_port2(void) { system("cls"); printf("---设置PORT2端口---\n"); printf("请输入端口名称: "); scanf("%s", port2.name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &port2.status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", port2.type); printf("请输入端口的IP地址: "); scanf("%s", port2.ip);}void set_port3(void) { system("cls"); printf("---设置PORT3端口---\n"); printf("请输入端口名称: "); scanf("%s", port3.name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &port3.status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", port3.type); printf("请输入端口的IP地址: "); scanf("%s", port3.ip);}void set_port4(void) { system("cls"); printf("---设置PORT4端口---\n"); printf("请输入端口名称: "); scanf("%s", port4.name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &port4.status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", port4.type); printf("请输入端口的IP地址: "); scanf("%s", port4.ip);}void set_port5(void) { system("cls"); printf("---设置PORT5端口---\n"); printf("请输入端口名称: "); scanf("%s", port5.name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &port5.status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", port5.type); printf("请输入端口的IP地址: "); scanf("%s", port5.ip);}void set_ports(struct port ports[]) { char n; while(1) { system("cls"); printf("---端口设置---\n"); printf("1. PORT1\n"); printf("2. PORT2\n"); printf("3. PORT3\n"); printf("4. PORT4\n"); printf("5. PORT5\n"); printf("6. 返回\n"); printf("请选择: "); fflush(stdin); scanf("%c", &n); switch (n) { case '1': set_port1(); break; case '2': set_port2(); break; case '3': set_port3(); break; case '4': set_port4(); break; case '5': set_port5(); break; case '6': return; default: input_error(); break; } if (n >= '1' && n <= '5') { int num = n - '1'; set_port(ports, num); } else if (n == '6') { return; } else { input_error(); } }}void port_admin(struct port ports[]) { char n; while(1) { system("cls"); printf("1. 查看端口\n"); printf("2. 设置端口\n"); printf("3. 返回主菜单\n"); printf("请选择: "); fflush(stdin); scanf("%c", &n); if (n == '1') { show_ports(ports); } else if (n == '2') { set_ports(ports); } else if (n == '3') { break; } else { input_error(); } }}int main(void) { char n; //用户选择的菜单编号 struct port ports[5]; init(); //初始化 login(); //登录 while (1) { show_memu(); fflush(stdin); scanf("%c", &n); switch (n) { case '1': create_user(); break; case '2': ip_admin(); break; case '3': logout(); break; case '4': port_admin(ports); break; default: input_error(); break; } } return 0;}
完整代码
#include #include #include FILE *file; struct port { char name[16]; int status; //1: 激活 0:禁用 char ip[16]; char type[4]; //端口类型 LAN WAN};//定义了5个端口变量//struct port port1;//struct port port2;//struct port port3;//struct port port4;//struct port port5;void init(void) { //打开文件 file = fopen("users.txt", "r"); if (!file) { //等效于 file == NULL printf("文件打开失败"); //return 1; exit(1); }}void login(void) { char name[32]; char password[16]; char line[128]; char name_tmp[32]; char password_tmp[16]; char *ret; //输入用户名和密码 while (1) { system("cls"); // 输入用户名和密码 printf("请输入用户名:"); scanf("%s", name); printf("请输入密码:"); scanf("%s", password); //从文件中读取账号,并进行判断! while (1) { //读一行 ret = fgets(line, sizeof(line), file); //line: "admin 123456\n" if (!ret) { break; } sscanf(line, "%s %s", name_tmp, password_tmp); if (!strcmp(name, name_tmp) && !strcmp(password, password_tmp)) { break; } } if (ret) { //用户名和密码匹配成功 break; } else { printf("用户名或密码错误!\n"); system("pause"); system("cls"); fseek(file, 0, SEEK_SET); //把文件内部的位置指针设置到文件头 } }}void create_user(void) { system("cls"); printf("\n\n---创建账号---\n\n"); printf("待实现...\n\n"); printf("\n\n按任意键返回主菜单"); fflush(stdin); getchar();}void ip_admin(void) { system("cls"); printf("\n\n---IP管理---\n\n"); printf("待实现...\n\n"); printf("\n\n按任意键返回主菜单"); fflush(stdin); getchar();}void logout(void) { system("cls"); fclose(file); exit(0);}void input_error(void) { system("cls"); printf("\n\n输入错误!\n\n"); printf("\n\n按任意键后,请重新输入\n\n"); fflush(stdin); getchar();}void show_memu(void) { system("cls"); // 打印功能菜单 printf("---交换机后台管理---\n"); printf("1. 创建账号\n"); printf("2. IP管理\n"); printf("3. 退出\n"); printf("4. 端口管理\n"); printf("请选择: ");}void show_port(struct port port) { printf("名称[%s]\t状态[%s]\tIP[%-15s]\t类型[%s]\n", port.name, port.status == 0 ? "禁用":"激活", port.ip, port.type);}void show_ports(struct port ports[]) { system("cls"); printf("---端口状态---\n"); /* printf("PORT1:\t"); show_port(port1); printf("PORT2:\t"); show_port(port2); printf("PORT3:\t"); show_port(port3); printf("PORT4:\t"); show_port(port4); */ int n; for (n=0; n<5; n++) { printf("PORT%d:\t", n+1); show_port(ports[n]); //传递端口结构体的值 } system("pause");}//void set_port1(void) {void set_port(struct port ports[], int num) { system("cls"); printf("---设置PORT1端口---\n"); printf("请输入端口名称: "); scanf("%s", ports[num].name); printf("请输入端口的状态:[0:禁止] [1:激活] "); scanf("%d", &ports[num].status); printf("请输入端口的类型:[LAN 或 WAN] "); scanf("%s", ports[num].type); printf("请输入端口的IP地址: "); scanf("%s", ports[num].ip); system("pause");}void set_ports(struct port ports[]) { char n; while(1) { system("cls"); printf("---端口设置---\n"); printf("1. PORT1\n"); printf("2. PORT2\n"); printf("3. PORT3\n"); printf("4. PORT4\n"); printf("5. PORT5\n"); printf("6. 返回\n"); printf("请选择: "); fflush(stdin); scanf("%c", &n); /* switch (n) { case '1': set_port1(); break; case '2': set_port2(); break; case '3': set_port3(); break; case '4': set_port4(); break; case '5': set_port5(); break; case '6': return; default: input_error(); break; } */ if (n >= '1' && n <= '5') { int num = n - '1'; set_port(ports, num); } else if (n == '6') { return; } else { input_error(); } }}void port_admin(struct port ports[]) { char n; while(1) { system("cls"); printf("1. 查看端口\n"); printf("2. 设置端口\n"); printf("3. 返回主菜单\n"); printf("请选择: "); fflush(stdin); scanf("%c", &n); if (n == '1') { show_ports(ports); } else if (n == '2') { set_ports(ports); } else if (n == '3') { break; } else { input_error(); } }}int main(void) { char n; //用户选择的菜单编号 struct port ports[5]; init(); //初始化 login(); //登录 while (1) { show_memu(); fflush(stdin); scanf("%c", &n); switch (n) { case '1': create_user(); break; case '2': ip_admin(); break; case '3': logout(); break; case '4': port_admin(ports); break; default: input_error(); break; } } return 0;}
项目精讲
1.为什么要使用数组
使用场合:
需要保存很多同类型的数据,而且这些数据有严格的顺序。
数组的存储方式:
按地址递增的方向,依次存储。
2.数组的定义
数组的定义
请复习项目四
数组的初始化
请复习项目四
结构体数组的定义和初始化
#include #include struct position { int x; int y;};int main (void){ struct position ps[10] = { {10,20}, {20,30}, {.x=50, .y=80}, }; for (int i=0; i<10; i++) { printf("x=%d, y=%d\n", ps[i].x, ps[i].y); } return 0;}
3.变长数组(VLA)
demo1
#include int main(void) { int x; int buff[x]; //程序运行时,很可能崩溃!因为x的值此时是不确定的,很可能是一个很大的数。 printf("x="); scanf("%d", &x); printf("%d\n", sizeof(buff)); return 0;}
demo2
#include int main(void) { int x; int buff[x]; //程序运行时,很可能崩溃!因为x的值此时是不确定的,很可能是一个很大的数。 printf("x="); scanf("%d", &x); printf("%d\n", sizeof(buff)); return 0;}
在全局变量中,不能使用变长数组。
4. 二维数组
二维数组的使用场合
每个班有50名学生
学校一共有20个班级
每个学生可用结构来表示
另外:数学计算中的矩阵也常常使用二维数组。
二维数组的定义
#include int main(void) { //3年2班,有5名同学 //每个同学有3门课程 //现在需要定义一个数组,来表示这些成绩。 //相当于: 有5行,3列(每行有3个) // [行数][列数] int score[5][3]; }
二维数组的存储方式(以行序为主序)
把第一行存储完之后,再存储第二行......
逐行存储!
二维数组的初始化
#include int main(void) { //方式1 /* int score[5][3] = { 60,61,62, //socre[0] 依次为: score[0][0], score[0][1], score[0][2] 63,64,65, 66,67,68, 69,70,71, 72,73,74 }; */ //方式2 /* int score[5][3] = { {60,61,62}, {63,64,65}, {66,67,68} }; */ //方式3 int score[5][3] = { [1] = {63, 64, 65}, [0] = {60, 61, 62} }; //打印整个数组 for (int i=0; i<5; i++) { for (int j=0; j<3; j++) { printf("%d\t", score[i][j]); } printf("\n"); } return 0;}
二维数组的使用
1.不能对二维数组的数组名,直接设置值
int a[3][2] = {1,2,3};
int b[3][2];
b = a; ///error
b[0] = {1,2}; //error
b[0][1] = 9; //正确!
2.char类型的二维数组,可以存储多个字符串
char data[3][16]; printf("Please input your name: "); scanf("%s", data[0]); printf("name=%s\n", data[0]); printf("Please input your telephone: "); scanf("%s", data[1]); printf("Tel=%s\n", data[1]);
5.多维数组
补充:二维数组的初始化
char data[][4] = {1,2,3,4,5,6}; printf("%d", sizeof(data)); //8 char data2[4][] = {1,2,3,4,5,6}; //error!
多维数组的使用场合
1)3D处理
2)图像处理
char pic[800][600][3];
多维数组的定义、初始化、使用
demo
#include int main(void) { //data[0][0][0], data[0][0][1], data[0][1][0] int data[2][3][2] = {1,2,3,4,5,6,7,8,9,10,11,12}; int data2[2][3][2] = { { //data2[0] {1,2}, {3,4}, {5,6} }, { //data2[1] {7,8}, {9,10}, {11,12} }, }; for (int i=0; i<2; i++) { for (int j=0; j < 3; j++) { for (int k=0; k<2; k++) { printf("data2[%d][%d][%d] = %d\n", i, j, k, data2[i][j][k]); } } } return 0;}
6.数组作为函数的参数
demo.
#include /* 某班有10名学生 每个学生有一个考试成绩 1. 定义一个函数,计算平均成绩 2. 定义一个函数,如果某个成绩低于60分,就增加5分。 */ float average(int data[]) { float s = 0; for (int i=0; i<10; i++) { s += data[i]; } s = s / 10; printf("size=%d\n", sizeof(data)); return s; } float add_score(int n, int data[n]) { for (int i=0; i
项目练习
练习1
独立实现项目11
练习2
有4名学员,每个学员有3门课程。
要求输入这4名学员的所有成绩,并分别计算每个课程平均成绩,和所有课程的平均成绩。
提示:要求用二维数组保存成绩。
练习3
定义一个函数,实现方阵的逆转。
原理分析:
参考:
#include void reverse(int n, int data[n][n]) { int tmp; for (int i=0; i