【小白到大牛之路11】交换机后台管理之端口管理的优化

项目需求

项目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 <stdio.h>
#include <string.h>
#include <stdlib.h>

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 <stdio.h>
#include <string.h>

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 <stdio.h>

int main(void) {
    int x;
    int buff[x];
//程序运行时,很可能崩溃!因为x的值此时是不确定的,很可能是一个很大的数。

    printf("x=");
    scanf("%d", &x);

    printf("%d\n", sizeof(buff));

    return 0;
}

demo2

#include <stdio.h>

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 <stdio.h>

int main(void) {
    //3年2班,有5名同学
    //每个同学有3门课程
    //现在需要定义一个数组,来表示这些成绩。
    //相当于: 有5行,3列(每行有3个)
    //     [行数][列数]
    int score[5][3];
}

二维数组的存储方式(以行序为主序)
把第一行存储完之后,再存储第二行......
逐行存储!
二维数组的初始化

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

/*
 某班有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<n; i++) {
         if (data[i] < 60) {
             data[i] += 5;
         }
     }
 }

 int main(void) {
     int scores[10] = {80, 70, 55, 40, 30, 38, 95, 85, 77, 61};
     printf("平均成绩是:%.2f\n", average(scores));

     add_score(10, scores);

     for (int i=0; i<10; i++) {
        printf("%d\t", scores[i]);
     }

     printf("\n");
     return 0;
 }

项目练习

练习1

独立实现项目11

练习2

有4名学员,每个学员有3门课程。
要求输入这4名学员的所有成绩,并分别计算每个课程平均成绩,和所有课程的平均成绩。
提示:要求用二维数组保存成绩。

练习3

定义一个函数,实现方阵的逆转。

原理分析:

参考:

#include <stdio.h>

void reverse(int n, int data[n][n]) {
    int tmp;

    for (int i=0; i<n-1; i++) {
        for (int j=i+1; j<n; j++) {
            //data[i][j] 和 data[j][i]互换
            tmp = data[i][j];
            data[i][j] = data[j][i];
            data[j][i] = tmp;
        }
    }
}

void show(int n, int data[n][n]) {
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("%d\t", data[i][j]);
        }
        printf("\n\n");
    }
}

int main(void) {
    int buff[5][5];
    int val = 100;

    //设置数组buff的值
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            buff[i][j] = val++;
        }
    }

    printf("逆转之前:\n");
    show(5, buff);
        reverse(5, buff);

    printf("\n逆转之后:\n");
    show(5, buff);

    return 0;
}

原文地址:https://blog.51cto.com/14632565/2462152

时间: 2024-10-07 05:36:44

【小白到大牛之路11】交换机后台管理之端口管理的优化的相关文章

【小白到大牛之路】交换机后台管理之用户输入

项目需求 用户登录时,需要输入用户名和密码. 项目实现 #include <stdio.h> int main(void) {// 定义变量,用来表示用户名和密码char name;int password; // 输入用户名和密码 printf("请输入用户名:"); scanf("%c", &name); printf("请输入密码:"); scanf("%d", &password); /*

【小白到大牛之路】交换机后台管理之登录菜单

交换机后台管理之登录菜单 项目需求 用户打开交换机后台管理程序时,需要进行"登录"操作,以确认用户身份的合法性.所以,我们需要先实现一个登录菜单,以提示用户执行相关操作. 项目实现 启动命令窗口:在运行窗口输入notepad++,再单击"确定". 设置notepad++的语言为C语言: 设置notepad++的编码为ANSI格式编码(便于再CMD中显示中文) main.c #include <stdio.h> int main(void) {// 打印登

【小白到大牛之路12】交换机后台管理之端口管理的再次优化

项目12交换机后台管理之端口管理的再次优化项目精讲 1.为什么要使用指针 函数的值传递,无法通过调用函数,来修改函数的实参. 2.指针定义 指针是什么 指针本质是一个地址值: #include <stdio.h> int main(void){ int age; //定义了一个指针 //指针是一个变量 //这个变量的名称是 p //这个指针,可以用来指向一个整数! //就是说:p的值是一个整数的地址!!! int * p; //指针p指向了age //p的值,就是变量age的地址 p = &a

TB级(小白到大牛之路)技术视频资源福利大放送

因此民工哥连夜整理了相关的资源放出,相关详情请点击下面的链接查看TB级(小白到大牛之路)技术视频资源福利大放送 更多内容请关注民工哥公众号 原文地址:http://blog.51cto.com/mingongge/2058991

【小白到大牛之路9】交换机后台管理系统之函数优化

项目需求 项目8的实现,main函数太臃肿,不便于阅读和维护. 项目实现 用函数来优化. #include <stdio.h> #include <string.h> #include <stdlib.h> FILE *file; void init(void) { //打开文件 file = fopen("users.txt", "r"); if (!file) { //等效于 file == NULL printf("

【小白到大牛之路7】换机后台管理之多用户账号登录

项目需求 实现多个账号 项目实现 #include <stdio.h> #include <string.h> int main(void) { // 定义变量,用来表示用户名和密码 char name[32]; char password[16]; FILE *file; //定义了一个档指针变量,变量名是file char line[128]; char name_tmp[32]; char password_tmp[16]; char *ret; //打开档 file = f

小白的python之路11/3内存 进程 二进制软件包 rpm yum

一 分区 查看swap分区 swapon -s mkswap /dev/sdb8 激活 swapon -a /dev/sdb8 swapon -s (sdb8进入了文件中) 提供内存服务 free (buffers cached) 查看所有系统信息 uname -a 当前操作系统版本 cat /etc/redhat.release free -m (以M为单位显示) swapon -s (查看swap分区) swapoff /dev/sdb8 (关闭sdb8分区) 二 进程一次动态执行 守护进程

厚着脸皮求领导写了一篇java小白进阶大牛之路!!!

缘起&应朋友之邀 2019年已经过去两个月了,应朋友之邀,写写自己的个人经历,与其说经历还不如是自我的总结与反思.2012年2月份只身一人拖着行李箱来到北京库巴科技有限公司实习,那时候库巴处在高速发展的阶段,我记得那一年库巴招了300多个应届毕业生,光技术就招了50多人,有运维.测试.开发.产品经理.那时候公司有宿舍,4个人一间,上下铺,条件虽然艰苦了一些,但认识了很多好朋友,至今还在保持着联系.下班之余大家经常一起吃饭喝酒,也就是那个时间胖了很多,回学校答辩的时候老师说:“你怎么胖成这样了,都

influxdb 小白到大牛之路

https://github.com/influxdata/influxdb