热门IT资讯网

【小白到大牛之路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
0