c++入门教程(十三)
来源:互联网 发布:域名能绑定端口吗 编辑:程序博客网 时间:2024/06/09 16:07
假设在一个程序中想要查看一段代码的运行所需时间 那么想要知道总时间就需要知道开始时间和结束时间.于是,有下面流程图
输出时间部分的代码大概长这样子(这部分暂时不用知道什么意思)
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;}
对应代码如下
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后面的值
- C语言入门教程 (十三) 函数递归
- C语言入门教程 (二十三) 文件操作
- c++入门教程(十三)
- ExtJs 入门教程十三[储存:Store]
- SDL入门教程(十三):2、初识多线程
- SDL入门教程(十三):3、封装多线程
- SDL入门教程(十三):2、初识多线程
- SDL入门教程(十三):3、封装多线程
- ReportStudio入门教程(二十三) - 提示页
- ExtJs 入门教程十三[上传图片:File]
- OPENCV入门教程十三:GaussianBlur高斯平滑
- Scrapy爬虫入门教程十三 Settings(设置)
- OPENCV入门教程十三:GaussianBlur高斯平滑
- 十三 v4l2_device.c浅析
- Visual C++/MFC入门教程
- Visual C++/MFC入门教程
- Visual C++/MFC入门教程
- Visual C++/MFC入门教程
- [LeetCode]654. Maximum Binary Tree
- 第三章 预测物理
- python高并发
- 养成良好的JS代码风格记录
- 用最大堆实现优先队列(c++)
- c++入门教程(十三)
- 关于使用jenv安装管理不同jdk版本
- Java基础(二)类与对象相关
- <8/17>集训日记
- 2017年8月18日 读书笔记始 1.Halcon机器视觉系统 应用手册(第一版)
- ubuntu 1704 安装 nginx
- Linked List 链表
- 机器学习基础-学习笔记 优化分析(一)
- POJ 1185 状态压缩DP