您好,登錄后才能下訂單哦!
項目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;
}
使用場合:
需要保存很多同類型的數據,而且這些數據有嚴格的順序。
數組的存儲方式:
按地址遞增的方向,依次存儲。
數組的定義
請復習項目四
數組的初始化
請復習項目四
結構體數組的定義和初始化
#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;
}
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;
}
在全局變量中,不能使用變長數組。
每個班有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]);
補充:二維數組的初始化
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;
}
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;
}
獨立實現項目11
有4名學員,每個學員有3門課程。
要求輸入這4名學員的所有成績,并分別計算每個課程平均成績,和所有課程的平均成績。
提示:要求用二維數組保存成績。
定義一個函數,實現方陣的逆轉。
原理分析:
參考:
#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;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。