C的回归基础学习6——函数(临时)
前言
编写和调用函数是敲代码的重要步骤。因为函数的存在,让我们能更好的划分问题,将大问题划为小问题,特别是递归的存在,很好的实现了一级一级解决问题的思想。其实函数我早就想讲了,但是想到了有指针和结构体存在就想拖一下咕咕咕
函数的组成
- 定义: <数据类型> 函数名(形式参数及说明){ 函数体 }
以下是几种实列
void putout(int *a)
{
for(int i=1 ; i<=a[0] ; i++)
printf("%d ",a[i]);
return ;//void函数结尾的return可要可不要
}
int max(int a,int b)
{
return a > b ? a : b;
}
float eps=0.0001;
bool compare(float a,float b)//比较a,b在eps的精度下是否相等
{
float c;
c = a - b;
if(c < eps && c > eps) return true;
return false;
}
函数的递归
- 一句话概括:自己调用自己,直到达到某一条件不在递归
下面再给出一个实例
int power(int number,int a)//快速幂
{
if(a==1) return number;
int t=power(a/2);
return a % 2? t * t * number: t * t;
}//求number的a次方
这其实是递归(也是二分)的一个典型例子,为了更快的求number(简称为n)的a次幂,我们可以先求到n的[a/2]次幂,a是奇数就补乘一个n,这样计算机就不用进行a次操作,而是log2n次,而求n的[a/2]次幂便直接调用自己,直到a=1时便直接返回a就完事儿
遍历就是基于这个递归的,汉诺塔就是另外一个典例。
这儿就只给出代码了
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int k=0;
void han(int n,char st,char mid,char en)
{
if(n==0)
return ;
han(n-1,st,en,mid);
printf("%d from %c to %c\n",n,st,en);
han(n-1,mid,st,en);
}
int main()
{
int n;
scanf("%d",&n);
k=pow(2,n)-1;
printf("%d\n",k);
han(n,'A','B','C');
return 0;
}
函数与结构体
结构体不仅仅是自己所内涵的变量丰富,它其中居然还可以藏函数!
typedef struct {
char name[100];
int age;
bool sex;
int times_of_Gu;
void Namein()
{
gets(name);
}
void Nameout()
{
printf("%s\n",name);
}
}Member;
Member me;
int main()
{
me.Namein();
me.Nameout();
return 0;
}
//输入:CHarthur
//输出:CHarthur
不过网上说这是c++的特性?(有待考察)反正没怎么用过c的我只能说:C++天下第一!
结语
函数其实还有很多我没学到的东西,但是基本上这些就够用了,因为语言的使用方法只是工具,代码时最重要的还是算法和数据结构。当然也不是说不思进取,就只学这几个,能优化常数咱们就优化常数,毕竟常数大了O(NlogN)的算法也会变成O(N2)的算法呀这可是亲身经历过的。