IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言-函数 -> 正文阅读

[C++知识库]C语言-函数

函数概念

函数是一个功能模块,它把实现某个功能的代码打包起来,并起一个函数名字。这个功能模块通过函数名供别人调用,如printf函数,system函数,是程序运行当中包装起来的一个步骤

如何定义一个函数

int jiShuan();

int jiShuan(int a)
{
	int b;
	b = a+1
	return 0;
}
  • 返回值
  • 形式参数
  • 函数名
  • 函数体——代码块

调用函数:

函数名(实际参数);
函数名();

为什么要用函数?

1、代码简洁,便于浏览
2、对每个功能分模块后,能快速定位程序错误位置
3、可重复性的调用
4、便于项目里程序功能模块的分工编写
5、函数可以多级调用,在函数里调用函数

函数的基本调用

#include <stdio.h>

int zaoShang()
{
	printf("早上好!\n");
	return 0;
}

int zhongWu()
{
	printf("中午好!\n");
	return 0;
}

int xiaWu()
{
	printf("下午好!\n");
	return 0;
}

int wanShang()
{
	printf("晚上好!\n");
	return 0;
}

int main()
{
	zaoShang();
    zhongWu();
    xiaWu();
    wanShang();
    system("pause");
    return 0;
}

带参数函数

无返回值

  • void代表无返回值,不需要return
  • void代表返回值的类型是无类型,return要写,只不过return后面不用加变量
void zaoShang()
{
}

int jinShu是形式参数,类似于变量定义,写法也类似变量定义。如:int a

void buyRice(int jinShu)//接受调用函数的传送的实际参数
{
}

/*函数调用:
buyRice();
*/

如果调用函数带有参数,必须传参
调用的时候,传递的参数叫实际参数,对格式没有要求,对数据的类型严格要求```

代码示例:


#include <stdio.h>

void buyRice()
{
	printf("买米。。。。\n");
}

void buyRice2(int jinShu)
{
	printf("买%d斤米。。。。\n",jinShu);//如果错误提示中包含\243、\254的错误,说明写了中文符号
}

void printWelcome()
{
	printf("=======================================\n");
    printf("=======================================\n");
    printf("=================函数例子==============\n");
    printf("=======================================\n");
    printf("=======================================\n");
    
}

int main()
{
	int a = 10;
	printWelcome();
	buyRice();
	buyRice2(a);
    buyRice2(3);

    system("pause");
    return 0;
}

形式参数

1、形式参数,作用域仅限于该函数
2、形式参数,也是一个变量,局部变量,有自己的内存空间

  • 内存空间是当函数被调用时,才申请了该空间,才有这个变量
    • 同时,这个空间内的数据被赋值成实际参数的值
    • 就是函数拷贝了一份main函数里传来的实际参数的值给到形式参数
  • 函数执行结束后,该空间由内存管理单元自动回收(释放)内存空间

buyRice()函数的jinShu变量的地址是和main函数里的实际参数变量a的地址是不同的,但也有可能因为虚拟地址映射的原因会一样

如果调用函数带有形式参数,在调用函数时必须传参

#include <stdio.h>

void buyRice(int jinShu)//jinShu 它是局部变量,同时它也是一个形式参数,作用域仅限于该函数
{
	printf("买%d斤米。。。。\n",jinShu);
    printf("buy:jinShu地址:%p\n",&jinShu);
    jinShu++;
    printf("buy:jinShu=%d\n",jinShu);
}

int main()
{
	int a = 20;
	buyRice(a);
    printf("main:a=%d\n",a);
    printf("main:a地址:%p\n",&a);

    system("pause");
    return 0;
}

局部变量

形式参数也是局部变量,作用域仅限于该函数,限制了其作用范围


#include <stdio.h>

void test1()
{
	int data;
	data = 10;
	printf("test1:data=%d\n",data);
}

void test2()
{
	int data;
	data = 13;
	printf("test2:data=%d\n",data);
}

void test3()
{
	int data;
	data = 16;
	printf("test3:data=%d\n",data);
}

void test4(int data)
{
	printf("test4:data=%d\n",data);
}

int main()
{
	test1();
    test2();
    test3();
    test4(30);//调用函数带有形式参数,调用函数时必须传参
    test4(349);//调用函数带有形式参数,调用函数时必须传参
    system("pause");
    return 0;
}

有返回值

传单个参数

1、参数怎么传

  • 需要注意参数的类型
  • 需要注意参数的个数

2、函数的返回值

  • 需要注意返回值的类型

3、通过函数名来体现功能

#include <stdio.h>

int f(int x)
{
	int y = 0;
    printf("f:y=%d\n",y);
	y = 2*x+1;
    return y;//把函数执行的结果返回给调用者,该函数的返回值一定是一个整数,至于整数为多少,取决于return后面的变量
}

int main()
{
	int y = 0;
    int x = 20;
    y = f(x);
	printf("main:y=%d\n",y);
    system("pause");
    return 0;
}

return ++a;
++a 的意思是把现有的值加一后在使用
a++ 的意思是先使用现有的值后在加一

有传多个参数

1、有两个参数,两个参数都是整数
2、有一个整数返回值

#include <stdio.h>

int add(int x,int y)
{
	int z = 0;
	z = x+y;
    return z;
}

int main()
{
	int data1 = 0;
    int data2 = 0;
	int ret = 0;
	while(1){
		printf("input one a numbe:\n");
		scanf("%d",&data1);
        if(data1 == 0){break;}
        printf("input two a numbe:\n");
		scanf("%d",&data2);
        if(data2 == 0){break;}
        ret = add(data1,data2);
        printf("result:%d+%d=%d\n",data1,data2,ret);
    }

    system("pause");
    return 0;
}

实现加减乘除函数调用代码示例:

不同类型数据运算时,比如两个整数相除,必须将除数或者被除数强制转换成小数,否则小数点后面的数据会被忽略

#include <stdio.h>

int add(int x,int y)
{
	int z = 0;
	z = x+y;
    return z;
}

int min(int x,int y)
{
	int z = 0;
	z = x-y;
    return z;
}

int mul(int x,int y)
{
	int z = 0;
	z = x*y;
    return z;
}

float div(int x,int y)
{
	float z = 0;
	z = (float)x/y;//不同类型数据运算时,比如两个整数相除,必须将除数或者被除数强制转换成小数,否则小数点后面的数据会被忽略
    return z;
}

int main()
{
	int data1 = 0;
    int data2 = 0;
	int ret = 0;
    float retChu = 0;
	while(1){
		printf("input one a numbe:\n");
		scanf("%d",&data1);
        printf("input two a numbe:\n");
		scanf("%d",&data2);
        ret = add(data1,data2);
        printf("加法结果:%d+%d=%d\n",data1,data2,ret);
        ret = min(data1,data2);
        printf("减法结果:%d-%d=%d\n",data1,data2,ret);
        ret = mul(data1,data2);
        printf("乘法结果:%dx%d=%d\n",data1,data2,ret);
        retChu = div(data1,data2);
        printf("除法结果:%d/%d=%f\n",data1,data2,retChu);
    }

    system("pause");
    return 0;
}

占位符拓展
%f
小数占位符
%d
整数占位符
%p
打印地址占位符
%c
字符占位符
%s
字符串占位符

getchar();
吸收回车字符

计算器代码优化:

#include <stdio.h>

int add(int x,int y)
{
	int z = 0;
	z = x+y;
    return z;
}

int min(int x,int y)
{
	int z = 0;
	z = x-y;
    return z;
}

int mul(int x,int y)
{
	int z = 0;
	z = x*y;
    return z;
}

float div(int x,int y)
{
	float z = 0;
	z = (float)x/y;
    return z;
}

void tips()
{
    printf("**********************************\n");
    printf("***** 请输入一种算法:+ - x / ****\n");
    printf("******************* 作者:yyc ****\n");
    printf("**********************************\n");
}



int main()
{
	int data1 = 0;
    int data2 = 0;
	int ret = 0;
    float retChu = 0;
    char shuanFa;
    
    int mark = 0;
    
	while(1){
		tips();
        if(mark !=0){
			getchar();
        }
        mark = 1;
        scanf("%c",&shuanFa);
        getchar();
        switch(shuanFa){
			case '+':
				printf("你选择了加法\n");
                printf("请输入第一个数:\n");
				scanf("%d",&data1);
				printf("请输入第二个数:\n");
				scanf("%d",&data2);
                ret = add(data1,data2);
                printf("计算结果:%d+%d=%d\n",data1,data2,ret);
				break;
            case '-':
				printf("你选择了减法\n");
                printf("请输入第一个数:\n");
				scanf("%d",&data1);
				printf("请输入第二个数:\n");
				scanf("%d",&data2);
                ret = min(data1,data2);
                printf("计算结果:%d-%d=%d\n",data1,data2,ret);
				break;
            case 'x':
				printf("你选择了乘法\n");
                printf("请输入第一个数:\n");
				scanf("%d",&data1);
				printf("请输入第二个数:\n");
				scanf("%d",&data2);
                ret = mul(data1,data2);
                printf("计算结果:%dx%d=%d\n",data1,data2,ret);
				break;
            case '/':
				printf("你选择了除法\n");
                printf("请输入第一个数:\n");
				scanf("%d",&data1);
				printf("请输入第二个数:\n");
				scanf("%d",&data2);
                retChu = div(data1,data2);
                printf("计算结果:%d+%d=%d\n",data1,data2,retChu);
				break;
            default:
				printf("No\n");
				break;
        }
    }

    system("pause");
    return 0;
}

计算器代码优化:

#include <stdio.h>

int add(int x,int y)
{
	int z = 0;
	z = x+y;
    return z;
}

int min(int x,int y)
{
	int z = 0;
	z = x-y;
    return z;
}

int mul(int x,int y)
{
	int z = 0;
	z = x*y;
    return z;
}

float div(int x,int y)
{
	float z = 0;
	z = (float)x/y;
    return z;
}

void tips()
{
    printf("**********************************\n");
    printf("***** 请输入一种算法:+ - x / ****\n");
    printf("******************* 作者:yyc ****\n");
    printf("**********************************\n");
}

int tipsWhicCalc(char shuanFa)
{
	int ret = 1;
    switch(shuanFa){
		case '+':
			printf("你选择了加法\n");
			break;
        case '-':
			printf("你选择了减法\n");
			break;
        case 'x':
			printf("你选择了乘法\n");
			break;
        case '/':
			printf("你选择了除法\n");
			break;
        default:
			printf("输入错误!\n");
            ret = 0;
   			break;
    }
    return ret;
}

void realCalc(int data1,int data2,char shuanFa)
{
    switch(shuanFa){
		case '+':
			printf("%d+%d=%d\n",data1,data2,add(data1,data2));
			break;
        case '-':
			printf("%d-%d=%d\n",data1,data2,min(data1,data2));
			break;
        case 'x':
			printf("%dx%d=%d\n",data1,data2,mul(data1,data2));
			break;
        case '/':
			printf("%d/%d=%f\n",data1,data2,div(data1,data2));
			break;
    }
}

int choose()
{
	int ret = 0;
	char a[] = {0};
	printf("是否继续运算:yes/no\n");
	scanf("%s",a);
	if(strcmp("yes",a) == 0){
		ret = 1;
    }else if(strcmp("no",a) == 0){
		ret = 0;
    }
    
    return ret;
}

int calc(char shuanFa)
{
	int data1 = 0;
    int data2 = 0;
    int ret = 0;
    
    ret = tipsWhicCalc(shuanFa);
	if(ret == 1){
		printf("请输入第一个数:\n");
		scanf("%d",&data1);
		printf("请输入第二个数:\n");
		scanf("%d",&data2);
    }
    
    realCalc(data1,data2,shuanFa);
    ret = choose();
    return ret;
}

int main()
{
    char shuanFa;
    int mark = 0;
    int ret = 0;
    
	while(1){
		tips();
		if(mark !=0){
			getchar();
		}
		mark = 1;
		scanf("%c",&shuanFa);
		getchar();
        ret = calc(shuanFa);
        if(ret == 0){
			break;
        }
    }
    
    system("pause");
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 11:44:21  更:2021-09-01 11:45:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:57:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码