关灯
得知互动 门户 互联网+ SEO/SEM 查看内容
0

「小白到大牛之路9」互换机背景管理体系之函数优化

摘要: 【小白到大牛之路9】互换机背景管理体系之函数优化项目需求项目8的实现,main函数太痴肥,未便于浏览和维护。项目实现用函数来优化。#include<stdio.h>#include<string.h>#include<stdlib.h>FILE*file;v ...

【小白到大牛之路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("文件翻开失败");
//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("请选择: ");
}

int main(void) {
char n; //用户选择的菜单编号

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;
default:
input_error();
break;
}
}

return 0;
}

项目精讲

1. 为什么要利用函数

已有main函数,为什么还要自界说函数?

1) "制止重复制造轮子",进步开辟服从


2)便于维护


2. 函数的声明、界说和利用

函数的计划方法:

1) 先确定函数的功能

2) 确定函数的参数

是否必要参数,参数的个数,参数的范例

3) 确定函数的返回值

是否必要返回值,返回值的范例


函数的声明


函数的利用


3. 函数的值通报

调用函数时,形参被赋值为对应的实参,

实参自己不会受到函数的影响!

「小白到大牛之路9」互换机背景管理体系之函数优化

4. 函数的栈空间

要制止栈空间溢出。

当调用一个函数时,就会在栈空间,为这个函数,分配一块内存地区,

这块内存地区,专门给这个函数利用。

这块内存地区,就叫做"栈帧"。


「小白到大牛之路9」互换机背景管理体系之函数优化

「小白到大牛之路9」互换机背景管理体系之函数优化


demo1

#include <stdio.h>
#include <string.h>

void test(void) {
//运行时将由于栈帧空间溢出,而瓦解
char buff[1024*1024*2];
memset(buff, 0, sizeof(buff));
}

int main(void) {
test();
return 0;
}

demo2

#include <stdio.h>
#include <string.h>

void test(int n) {
char buff[1024*256];
memset(buff, 0, sizeof(buff));

if (n==0) {
return;
}

printf("n=%d\n", n);
test(n-1);
}

int main(void) {
//test(5);
//由于每个栈帧有256K以上, 10个栈帧超出范围
test(10);
return 0;
}

5. 递归函数

界说:在函数的内部,直接大概间接的调用本身。


要点:

再界说递归函数时,肯定要确定一个"完毕条件"!!!


利用场所:

处置惩罚一些特殊复杂的题目,难以直接办理。

但是,可以有办法把这个题目变得更简朴(转换成一个更简朴的题目)。


盗梦空间

「小白到大牛之路9」互换机背景管理体系之函数优化


比方:

1) 迷宫题目

2) 汉诺塔题目


斐波那契数列

1, 1, 2, 3, 5, 8, 13, 21, ....

盘算第n个数是多少?


f(n)

当n >2时,f(n) = f(n-1) + f(n-2)

当n=1或n=2时, f(n)就是1


int fib(int n) {

int s;


if (n == 1|| n == 2) {

return 1;

}


s = fib(n-1) + fib(n-2);

return s;

}


递归函数的缺点:

性能很低!!!


项目训练

1. 训练1

独立完成项目9

2. 训练2

界说一个函数,实现1+2+3+...+n

#include <stdio.h>

int sum(int n) {
int i;
int s = 0;

for (i=1; i<=n; i++) {
s += i;
}

return s;
}

int main(void) {
int value;

printf("请输入一个整数: ");
scanf("%d", &value);
if (value < 0) {
printf("必要大于0\n");
return 1;
}

printf("%d\n", sum(value));

return 0;
}

3. 打印金字塔

打印指定范例的金字塔,用自界说函数实现。

结果如下:

「小白到大牛之路9」互换机背景管理体系之函数优化

代码:

#include <stdio.h>

void show(char c, int n) {
int i;
int j;

for (i=1; i<=n; i++) {
for (j=0; j<n-i; j++) {
printf(" ");
}
for (j=0; j<2*i-1; j++) {
printf("%c", c);
}
printf("\n");
}
}

int main(void) {
char c;
int n;

printf("请输入金字塔的构成字符: ");
scanf("%c", &c);
if (c == '\n' || c == ' ' || c == '\t') {
printf("请输入一个非空缺字符\n");
return 1;
}

printf("请输入金字塔的层数: ");
scanf("%d", &n);
if (n < 1) {
printf("层数必要大于0\n");
return 1;
}

show(c, n);

return 0;
}

4. 用递归函数实现训练2

#include <stdio.h>

int sum(int n) {
int s;

if (n == 1) {
return 1;
}

s = n + sum(n-1);

return s;
}

int main(void) {
int value;

printf("请输入一个整数: ");
scanf("%d", &value);

if (value < 0) {
printf("必要大于0\n");
return 1;
}

printf("%d\n", sum(value));

return 0;
}

5. 用递归函数实现汉诺塔

#include <stdio.h>

void hanoi(int n, char pillar_start[], char pillar_mid[], char pillar_end[]) {
if (n == 1) {
printf("从%s移动到%s\n", pillar_start, pillar_end);
return;
}

hanoi(n-1, pillar_start, pillar_end, pillar_mid);
printf("从%s移动到%s\n", pillar_start, pillar_end);
hanoi(n-1, pillar_mid, pillar_start, pillar_end);
}

int main(void) {
char name1[] = "A柱";
char name2[] = "B柱";
char name3[] = "C柱";
int n = 3; //盘子数

hanoi(3, name1, name2, name3);

return 0;
}

路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有0条评论

最新评论...

本文作者
2020-9-26 03:20
  • 0
    粉丝
  • 2588
    阅读
  • 0
    回复

关注帮客优品

扫描关注,了解最新资讯

联系人:叶先生
Q Q:956130084
EMAIL:956130084@qq.com
地址:中国·武汉
热门评论
排行榜

关注我们:微信订阅号

官方微信

APP下载

全国服务Q Q:

956130084

中国·湖北

Email:956130084@qq.com

Copyright   ©2015-2022  站长技术交流论坛|互联网技术交流平台Powered by©Discuz!技术支持:得知网络  

鄂公网安备 42018502006730号

  ( 鄂ICP备15006301号-5 )