例1:一个简单的计算器
例:编程一个简单的计算器功能,实现简单的加、减、乘、除表达式的计算。
对于分支较多的情况,C++提供switch语句。switch语
句也叫开关语句、多分支语句,它计算一个表达式的值,
根据结果的不同,执行不同的分支处理语句。
算法描述:
用num1,num2,op分别表示输入的表达式的两个操
作数和一个运算符。
如果op=‘+’,则result=num1+num2,输出result;
如果op=‘-’,则result=num1-num2,输出result;
如果op=‘’,则result=num1num2,输出result;
如果op=‘/’,则
如果num2=0,显示“除数为0”
否则,计算result=num1/num2,输出result;
其他,显示“运算符错误”。
源程序:
#include<iostream> //包含输入输出头文件
#include<cmath>
using namespace std; //指定名字空间
int main()
{ double num1,num2;
char op; //声明字符变量,存放操作符
double result ; //声明变量,存放计算机结果
char caption1[20]="Error,Divided by 0!";
char caotion1[20]="Invalid opereator!";
cout<<"Please input the expression:";
cin>>num1>>num2;
swith(op)
{ case'+': result=num1+num2;
cout<<num1<<op<<num2<<"="<<result<<endl;
break; //中断
case'-': result=num1-num2;
cout<<num1<<op<<num2<<"="<<result<<result<<endl;
break; //中断
case '*': //是乘号
result=num1*num2; //计算积
cout<<num1<<op<<num2<<"="<<result<<endl;
break;
case '/': //是除号
if(fabs(num2)<1.0e-8) //除数为0 {
cout<<caption1<<endl; }
else { //除数不为0
result=num1/num2; //计算商
cout<<num1<<op<<num2<<"="<<result<<endl; }
break;
default : //以上情况都不是
cout<<caption2<<endl; }
return 0;
}
总结:
- swith的条件是整型表达式;
- fab()是求绝对值的函数,它包含在cmath头文件中;
- 在每一个case处理的最后都有一个break语句。
例2:寻找自幂数
n为1时,自幂数称为独身,0,1,2,3,4,5,6,7,8,9都是自幂数。
n为2时,没有自幂数。
n为3时,自幂数称为水仙花数,153就是一个水仙花数。
n=4, 称为四叶玫瑰数。
n=5, 称为五角星数。
n=6, 称为六合数。
n=7, 称为北斗七星数。
n=8, 称为八仙数。
n=9, 称为九九重阳数。
问题分析:
- n位自幂数,各位数字的n次方的和加起来还等于这个数。
- 两个要点,一是怎样找出“各位”,二是n次方的计算。 n次方的计算有一个数学函数可用,pow(x,n)。
- 找出各位,举例来说,153,找个位,可用153%10=3;找十位呢?(153/10)%10=5,依次类推。直接求余,就是最低位的数字,除10,原来的十位就成为新的最低位,重复这一过程,就可以求出各位,直到这个数成为0。
- 还有一个问题要解决,就是构造n位数。0是最小的一位数,10的1次方是最小的两位数,10的平方是最小的三位数,那么,10的n-1次方就是最小的n位数。
算法描述:
①输入位数n
②计算n位数的起始值和终止值
start=10^(n-1), end=10^n -1, i=start
③如果i>end转⑨
④m=1,sum=0
⑤如果m=0,转⑦
⑥a=m%10, sum=sum+d^n,m=m/10,转⑤
⑦如果sum=i,显示i.
⑧i=i+1,转③
⑨结束
源程序:
#include <iostream> //包含需要的头文
#include<cmath> //数学函数需要的头文件
using namespace std; //名字空间
int main() { int n; //表示数的位数
int start,end; //表示n位数的起始值和终止值
int m; //待分解各位的数,即待判断的数
int digit; //某个数位的值
int sum; //各位数的n次方的和 int i; //循环变量,待检验的数
cout<<"求n位自幂数,请输入位数:"; //提示信息
cin>>n; //输入位数
while(n>0){ //大于0时计算
start=pow(10,n-1); //n位数的起始值
end=pow(10,n)-1; //n位数的终止值
cout<<n<<"位自幂数:"; //输出说明信息
for(i=start;i<=end;i++){ //从起始值到终止值逐个检验
m=i; //将i赋给m //检验过程中m的值会改变,而i的值不变
sum=0; //各位数的n次方和,检验前赋
while(m!=0){ //m开始为待检验的数 digit=m%10; //取最低位数字
sum=sum+pow(digit,n); //n次方,再求和
m=m/10; //去掉个位,刚才的十位成为新个位
}
//上面的循环结束时sum就是各位数字的n次方的和
if(sum==i){ //逻辑表达式的值为true时,表示是自幂数
cout<<i<<" "; //显示该数
} }
cout<<endl; //换行
cout<<“求n位自幂数,请输入位数:”;
cin>>n; //再输入一个n表示位数
} //while循环
cout<<endl; return 0;
}
思路扩展:
本例应掌握的技巧, 一是如何分离各位数字, 二是如果一种计算会破坏(或改变)某个变量的值,而这个原始值在后
面的计算中还会使用,那就先将其赋值给另一个变量,使用新变量作“破坏性”计算,随时可以通过原来的变量获得原始值。
这实际是计算机科学中常用的一种“冗余”的思想,要获得某种保障,有意使用更多的时间、空间