c++入门教程(十三)

本文介绍了C++中函数的概念,如何定义和使用函数,包括返回类型、函数名、参数等要素。通过示例展示了如何封装输出时间的代码,并解释了函数作为程序模块化的意义。此外,还探讨了带有参数的函数,如求平方的函数,并给出了计算两个数次方及比较的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设在一个程序中想要查看一段代码的运行所需时间   那么想要知道总时间就需要知道开始时间和结束时间.于是,有下面流程图


输出时间部分的代码大概长这样子(这部分暂时不用知道什么意思)

    time_t rawtime;
    time(&rawtime); 
    struct tm * timeinfo;
    timeinfo = localtime(&rawtime);
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;
于是 我们的代码大概长这个样子

#include <iostream>
#include <time.h>  

using namespace std;

void main()
{

    time_t rawtime;
    time(&rawtime); 
    struct tm * timeinfo;
    timeinfo = localtime(&rawtime);
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;
	
	int a;
	cin>>a;
	cout<<"a="<<a<<endl;

    time_t rawtime1;
    time(&rawtime1); 
    struct tm * timeinfo1;
    timeinfo1 = localtime(&rawtime1);
    cout << timeinfo1->tm_hour << ":" << timeinfo1->tm_min << ":" << timeinfo1->tm_sec << endl;


}
然后我们发现 输出时间部分的代码其实是重复的,但是好像又不能用循环来简化   好气哦

为了解决这个问题(当然不只是这样),c++中提供了一种叫  函数  的东西可以把一些有共性的东西抽象出来 当成一个模块, 当需要的时候直接把这个模块放上去就好了,而不用再把组成这个模块的各个部分再拼装一次了.

写程序就像造一个机器,简单的机器可以一个人从头到尾完成,但是大型的(比如神州五号)一个人根本不可能完成,于是啊 它就被分成无数的小模块,然后最后再把小模块拼到一起.

这样子每个人的工作就相对简单,而且有些小模块可以批量生产,一按开关,一个零件就出来了.

既然是造零件嘛,也就要有些产物,所以,一个函数首先要有一个返回类型(告诉别人这最后能生产出什么零件)  然后是一个函数的名字,因为要使用这个函数总要能找到它阿.之后是个小括号(下面会讲到它的作用,暂时不用管)     然后是用大括号括起来的具体流程. 所以 一个函数看起来像下面这样

返回类型    函数名  (){

具体流程 

}

然后我们来把上面的输出时间的代码封成一个函数(只需要输出,不需要什么结果  所以 返回类型是void    函数名随意取吧     具体流程就是上面那部分)  然后变成这样子

void printTime(){
	time_t rawtime;
    time(&rawtime); 
    struct tm * timeinfo;
    timeinfo = localtime(&rawtime);
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;
}

然后  我们试着把这块东西拼装到程序中

#include <iostream>
#include <time.h>  

using namespace std;


void printTime(){
	time_t rawtime;
    time(&rawtime); 
    struct tm * timeinfo;
    timeinfo = localtime(&rawtime);
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;
}

void main()
{

	printTime();

	int a;
	cin>>a;
	cout<<"a="<<a<<endl;

	printTime();


}

上面这部分有点要注意的地方是  在main中使用了printTime 函数   在使用前要先让程序知道这家伙长什么样子(至少要知道有这么个家伙而且要知道它会出来个啥),所以   我们把这个函数的定义放在了这个函数使用之前. 或者其实使用的时候并不需要知道里面的具体流程,只要知道有这么个家伙而且要知道它会出来个啥就好了,所以  代码也可以写成这样

#include <iostream>    
#include <time.h>      
    
using namespace std;    
    
void printTime();  
    
void main()    
{    
    
    printTime();    
    
    int a;    
    cin>>a;    
    cout<<"a="<<a<<endl;    
    
    printTime();    
    
    
}    
    
void printTime(){    
    time_t rawtime;    
    time(&rawtime);     
    struct tm * timeinfo;    
    timeinfo = localtime(&rawtime);    
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;    
}

这里面第六行只是告诉程序有这么一个东西,而且它会产出个什么东西(这部分叫函数声明)

后面第22行之后包括了函数的具体实现(这部分叫函数定义)

然后  我们默默的发现  main  入口main长得好像一个函数阿   好巧啊   没错,这货就是一个函数,一般叫main函数  或 主函数   是一个程序的入口.

我们刚刚的显示时间的函数不需要什么投入,也不需要什么产出,只要显示一下时间就可以了.但是有些时候是需要投入和产出的  我们已经知道返回类型可以告诉我们产出的会是什么了,现在我们来讨论一下投入的问题.

向函数中传入数据 是在函数名后面的括号里完成的,形势类似下面

返回类型  函数名(参数类型1   参数名称1,参数类型2 参数名称2, .....参数类型n 参数名称n){

具体流程

}

注意,这里的参数可以有多个,来源一般是使用函数前已有的数据,在函数内部使用参数的时候就当作是一个变量来用就好,只不过这个变量已经有了一个初始值(传入的实际值)了

假如我们定义一个求一个数的平方的函数如下

int square(int a){
	int c;
	c = a * a;
	return c;
}
因为我们要拿到的是一个数的平方 是一个整数,所以  返回类型是  int    要求一个数的平方首先要把这个数当成原料放进去  所以 参数里面有一个  int a  然后最后要拿到的具体值用return 得到


实际使用方法如下

#include <iostream>  
using namespace std;  
  
int square(int a);  
void main()  
{  
    int d;  
    d = square(6); 
    cout<<d<<endl;  
  
    int b = 5;  
    d=square(b);  
    cout<<d<<endl;  
}  
  
int square(int a){  
    int c;  
    c = a * a;  
    return c;  
}  



注意 这里在调用函数的时候(第八行的6)实际传进去的参数可以是变量,也可以是常量,也可以是些其它的东西,只要结果是整数就可以.  函数执行后得到的产物可以直接赋值给变量(有些时候也可以当一个变量来使用[这种的话因为没有什么东西来记录这个结果,所以用过一次这个结果就没了])

来看下面一个问题

输入两个整数 a  b   

求出a的b次方 和  b的a次方

输出上面两个值的大小关系

输出a的b次方 减 b的a次方的绝对值

拆分成模块的流程图如下


然后我们再来看模块1的具体实现的流程图


对应代码如下

int pow(int a, int b){
	int c = 1;
	for(int d=0;d<b;d++){
		c *= a;
	}
	return c;
}


然后输出a的b次方和b的a次方的大小关系

对应代码如下

void myCompare(int c,int d){
	if(c > d){
		cout<<"a的b次方大于b的a次方"<<endl;
	}else{
		cout<<"a的b次方不大于b的a次方"<<endl;
	}
}
输出差的绝对值

代码如下

void abj(int e, int f){
	if(e > f){
		cout<<e-f<<endl;
	}else{
		cout<<f -e<<endl;
	}
}

然后把这些小模块拼接起来代码如下


#include <iostream>
using namespace std;

int pow(int a, int b);
void myCompare(int c,int d);
void abj(int e, int f);
void main()
{
	int x,y,j,k;
	cin>>x>>y;
	j = pow(x,y);
	k = pow(y,x);
	cout<<x<<"的"<<y<<"次方="<<j<<endl;
	cout<<y<<"的"<<x<<"次方="<<k<<endl;
	myCompare(j,k);
	abj(j,k);

}

int pow(int a, int b){
	int c = 1;
	for(int d=0;d<b;d++){
		c *= a;
	}
	return c;
}

void myCompare(int c,int d){
	if(c > d){
		cout<<"a的b次方大于b的a次方"<<endl;
	}else{
		cout<<"a的b次方不大于b的a次方"<<endl;
	}
}

void abj(int e, int f){
	if(e > f){
		cout<<e-f<<endl;
	}else{
		cout<<f -e<<endl;
	}
}

结果如下


最后还要注意一点  无论在函数的哪里调用了return 语句  该函数都会立即结束,函数返回的结果就使当前retrun后面的值









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值