标题:研习问题的模块化求解—特殊函数
关键词:函数
内容
A. 一句话概括今日目标完成情况
(a) 复习第五章 100%
(b) 学习第六章 90%
B.具体内容
(a)第五章实例讲解求输入三个数字中的最大值,并且在程序运行结束之后询问用户是否需要进行下一次操作。
#include<iostream>
using namespace std;
double maxThree(double a,double b,double c)
{
double max;
max=a>b?a:b;
max=max>c?max:c;
return max;
}
int main()
{
double x1,x2,x3,max;
char yes;
do{
cout<<"x1? x2? x3? ";
cin>>x1>>x2>>x3;
max=maxThree(x1,x2,x3);
cout<<"最大数:"<<max<<endl;
cout<<"continue(y/n)?";
cin>>yes;
}while(yes=='Y'||yes=='y');
return 0;
}
构造求最大值的函数非常简单,主要就是在主函数中构造一个do while循环,定义一个字符型yes变量,检测用户输入的是否为Y或y,是则返回主函数的头部,进行下一轮循环。
下面是从一直数组中查找输入的数字是第几位:
#include<iostream>
using namespace std;
int Search(int a[],int n,int key)
{
int low,high,mid;
low=0;
high=n-1;
while(low<high)
{
mid=(low+high)/2;
if(key==a[mid])return mid+1;
else if(key>a[mid])low=mid+1;
else high=mid-1;
}
return -1;
}
int main()
{
int a[]={3,5,6,9,10,11,12,15,19,22,23,29,30,45,50,54};
int k,x;
char again='n';
do
{
cout<<"您要找的数?";cin>>x;
k=Search(a,18,x);
if(k>=0)cout<<x<<"是第"<<k<<"个数"<<endl;
else cout<<x<<"不在序列中!"<<endl;
cout<<"还找另外一个数字么?(y or n)?";cin>>again;
}while(again!='n');
return 0;
}
在最后执行循环的时候使用的是do while结构, 定义了字符型变量again 当他不等于n的时候,就进行下一论循环。这个用二分法来寻找输入值的方法很值得思考。
(b)
第六章第一节这个递归很厉害啊
#include<iostream>
using namespace std;
int f(int n)
{
if(n==0)
return 1;
else
return n*f(n-1);
}
int main()
{
int n;
int factorial;
cin>>n;
factorial=f(n);
cout<<factorial<<endl;
return 0;
}
不过回归这一方面还不是很懂,return n*f(n-1)我不知道他递归一个一个分下去之后是怎么回归回来的啊。
3.这个汉诺塔问题求解最后把这些个代码敲完F9F10之后我都被感动了:
#include<iostream>
using namespace std;
//函数move将一个盘子从x移到y
int s=0;
void move(char x,char y)
{
cout<<x<<"---->"<<y<<endl;
s++;
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
move(a,c);
else
{
hanoi(n-1,a,c,b); //借助C将n-1个盘子从A移到B
move(a,c); //从A移到C
hanoi(n-1,b,a,c); //借助A将n-1个盘子从B移到C
}
}
int main()
{
int m;
cout<<"请输入盘子的数量:";
cin>>m;
cout<<"移动"<<m<<"个盘子的过程如下:"<<endl;
hanoi(m,'A','B','C');
cout<<"一共需要移动"<<s<<"次。"<<endl;
return 0;
}
如此的牛逼,通过构造move函数,最后竟然连过程都可以显示出来。这个程序我好感动,想起了小时候玩大人手机上这个游戏的时候,琢磨着到底怎么样才是最快的解出答案,而如今短短几行code竟然就可以将小时候的愿望成真,很欣喜。
6.2 一般将规模很小,而使用频繁的简单函数声明为内联函数,这和6.1学习的递归函数相辅相成,互相配合。
6.3 函数重载更简单了,就是定义名字一样的不同函数,然后运行的时候,系统会自动根据参数的个数来判断使用哪一个函数,贴上最后的code把:
#include<iostream>
using namespace std;
int add(int x,int y)
{
int sum;
sum=x+y;
return sum;
}
int add(int x,int y,int z)
{
int sum;
sum=x+y+z;
return sum;
}
int add(int x,int y,int z,int t)
{
int sum;
sum=x+y+z+t;
return sum;
}
int main()
{
cout<<add(3,5)<<endl;
cout<<add(3,5,7)<<endl;
cout<<add(3,5,7,9)<<endl;
return 0;
}
6.2 6.3感觉都好简单啊 我的天
6.4 1 局部变量这节主要讲的 编译系统一般将在循环语句中定义的变量作为该循环语句的局部变量,在循环之外一般是不可以适用的。即不可被访问。
2 全局变量 说明于所有函数之外,可以为所有函数共同使用。函数中,局部变量优先于全局变量
#include<iostream>
using namespace std;
int a=3,b=5;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int a=8;
cout<<max(a,b)<<endl;
}
比如这段code中我在第三行定义了全局变量int a=3,b=5;然后我在主函数里又定义了 int a=8;此时在我的函数里面a就是8,局部的优先于全局的。形参a,b是函数的局部变量。
而当全局和局部的同名时,在函数里又想使用全局变量,咋办呢。就在变量前面加上作用域运算符::就可以了。而在定义点之前要使用全局变量时,则要使用extern语句即可。
今天交的早,因为我实在是 太!困!了!
C.明日计划
第六节的完善和巩固
我的博客:http://blog.csdn.net/andr3zzzz