第三章分支语句
看书时候瞎想到的一些东西:
1、猜生日的例程为什么能猜到生日?
P53
猜数字,这个东西还是说实话比较有意思的。
需要搞清楚为什么是这样做的。看到了8421的时候,基本就能理解了,大概就是利用2进制表示数字,关键是这个集合为什么要这么设置?
看到set1里面都是 非16不可表示的数字,也就是必须有16才能表示这个个数字,其他的集合也是如此。
接下来就是,是每个集合里面的元素都刚刚好么?换句话说就是我担心这个集合他写的过少,或者我是不是可以给他简化一下。
发现不行,每个集合都是刚好24个元素,并且一个不多,一个不少。
究其本质是:
0000 0000,就拿set1来看,是0001 0000 然后后面一直加数字加到31.也就是后面的数字轮番上针,把这个数儿从16撑到31。就相当于是 后面0000 到1111 的排列也就是=24,那换set2 也就是 8的那一块儿是:0000 1000,把 第4位跟后面3位拿出来做排列,依然是24种情况。所以会发现,每一个set都是一个矩阵块儿。并且都有且仅有16个元素。
一想到自己要输出这些个矩阵块儿,就觉得很麻烦,所以,用了如下的方式:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
//int set1 = 0x1f;//31
int set1 = 0x10;//16
int set2 = 0x8;
int set3 = 0x4;
int set4 = 0x2;
int set5 = 0x1;
//int j = 0;
bool flag = false;
//cout << set4 << endl;
for (int i = 0; i < 32; i++){
//不不不,当且仅当 这个数字^0x10为真才行
if ((set5&i) == set5){
cout<<setw(2)<<i<<" ";
flag = true;
//j++;
}
if (flag==true)
if ((i+1) % 4 == 0)cout << endl;
}
system("pause");
}
运行结果,但是并不能做到都对齐。后面的集合就对不齐了。
2、
P56程序输出结果 如下: 那个3.4 有点奇怪。并不知道 是怎么输出来的。
3、昨天输出了以下税款:
#include <iostream>
#pragma warning(disable:4703)
using namespace std;
/* 计算税款,根据美国2002年的数据
说实话连人家的这些例子都觉得特别棒!!!
*/
int singleFilers[5] = { 6000, 27950, 67700, 141250, 307050 };
int marriedFileJointly[5] = {12000,46700,112850,171950,307050};
int marriedFileSeparately[5] = { 6000, 23350, 56425, 85975, 153525 };
int headOfHousehold[5] = { 10000, 37450, 96700, 15600, 307050 };
#define stageOne 10.0
#define stageTwo 15.0
#define stageThree 27.0
#define stageFour 30.0
#define stageFive 35.0
#define stageSix 38.6
double taxStageRate[6] = { stageOne / 100, stageTwo / 100, stageThree/100, stageFour/100, stageFive/100, stageSix/100 };
/*
根据这个人的状态和 挣到的钱,来决定纳税金额。
现在的想法就是是不是可以因为这一组数据很有规律,所以想做一个数组,来规范这样的话,只需要根据不同的状态,来分不同的税率阶段就可以了
*/
double getTax(int status,double money){
int* MoneyStage;
if (status == 0){
MoneyStage = singleFilers;
}
else if(status ==1){
MoneyStage = marriedFileJointly;
}
else if (status ==2){
MoneyStage = marriedFileSeparately;
}
else if (status == 3){
MoneyStage = headOfHousehold;
}
double tax = 0;
if (money <= MoneyStage[0]){
tax = money*taxStageRate[0];//10
}
else if (money <= MoneyStage[1]){
for (int i = 0; i < 5; i++){
cout << MoneyStage[i] << endl;
}
for (int i = 0; i < 6; i++){
cout << taxStageRate[i] << endl;
}
tax = MoneyStage[0] * taxStageRate[0] + (money - MoneyStage[0]) * taxStageRate[1];//6000*10+(money-6000)*15
}
else if (money <= MoneyStage[2]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (money - MoneyStage[1])*taxStageRate[2];
}
else if (money <= MoneyStage[3]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (money - MoneyStage[2])*taxStageRate[3];
}
else if (money <= MoneyStage[4]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (MoneyStage[3] - MoneyStage[2]) * taxStageRate[3] + (money - MoneyStage[3])*taxStageRate[4];
}
else{
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (MoneyStage[3] - MoneyStage[2]) * taxStageRate[3] + (MoneyStage[4] - MoneyStage[3]) * taxStageRate[4] + (money - MoneyStage[4])*taxStageRate[5];
}
return tax;
}
int main(){
cout << getTax(0, 400000);
system("pause");
return 0;
}
比较陌生的点
1、随机数种子在之前说过,现在又忘记的差不多了,好在就是一些函数的调用不至于太复杂:看一下以前的笔记吧:
先用时间函数得到随机数种子; int seed= time(0);//#include <ctime>
然后是 srand(seed);
Int myrandom = rand();
2、输出格式控制:
有这样一些函数包含在iomanip头文件中分别是:
Setw(width)
控制符 |
描述 |
Setw(width) |
指定打印字段的宽度 |
Setprecision(n) |
设置一个浮点数的精度 |
Fixed |
将一个浮点数以定点数的形式输出 |
Showpoint |
将一个浮点数以带小数点、带结尾0的形输出,即便它没有小数部分 |
Left |
输出内容左对齐 |
Right |
输出内容右对齐 |
3、Setw(n)
4、setprecision(n)
Setprecision(n)的顺延有效性。
5、
fixed强制将一个double型的数字按照非科学计数法的形式输出。
如果直接这样输出的话,里面有一个默认转换的机制帮我们把结果按照科学计数法来输出,所以,当我们使用fixed控制符时,会把数字强行按照小数形式输出:如:
fixed默认是小数点后面保留6位。
6、可以借助setprecision 控制符。控制小数点后面的位数。
precision里面是几位,小数点后面就是几位。
6、right left对齐方式:
左右对齐,这个了解一下就行了,毕竟这个也就是自己人看,格式稍微整齐一些就行,主要是后面基本上都是图像化界面,很少有普通用户去接触这个的。所以这些函数在的估计在培训机构里面出现的也就少了。毕竟都在使用QT或者 vs这样的东西。
所以这些函数制作了解吧。
7、枚举类型:习惯上一个枚举类型名的每个单词的首字母大写,而枚举值的名称类似常量。
举例:
enum Day{MONDAY,TUESDAY,WEDNESDAY,THURSDAY};
8、继续深化一个点要多读书,之前视频里面讲到的,在书里都有!!!如果没有 去看什么黑客编程里面也会介绍一些关于作弊器如何应用的边角案例。总之要多读书。像这里面就说了可以为枚举类型里面的内容赋值。
习题:
3.1列出6个比较运算符。
!=,==,>,<,<=,>=
3.2 假定x的值为1,给出下列布尔表达式的结果:
(x>0) //true
(x<0) //false
(x!=0) //true
(x>=0) //true
(x!=1) //false
3.3下面代码有什么错误?
if radius >=0 //这里应该用括号括起来形如:if(radius>=0)
{
area = radius*radius*PI;
cout<< “The area for the circle of “<< “radius”<<radius<<” is “<<area;
}
3.4假设 x的值是1,给出下列布尔表达式的结果:
(true)&&(3>4)//false
!(x>0)&&(x>0)//false
(x>0)||(x<0)//true
(x!=0)||(x==0)//true
(x>=0)||(x<0)//true
(x!=1)==!(x==1)//true
3.5写出一个布尔表达式,当变量num的值在1~100之间时其值为真。
num>=1&&num<=100
3.6写出一个布尔表达式,当变量num的值在1~100之间或为负数时气质为真。
(num>=1&&num<=100)||(num<0)
3.7 假定x和y是int型变量,下列表达式中那些是正确的?
x>y>0 //正确 解释: 把x>y 的结果跟0比较,x>y的结果非0即1.最终结果非true即false
x=y&&y//正确 解释 把y&&y 的结果赋给x,必然是1,但是要求为y初始化,否则异常
x/=y //正确
x or y//不正确
x and y//不正确
(x!=0)||(x=0)//正确 且结果恒为1
3.8 下面代码中 的类型转换时C++所允许的么?如果是允许的,转换结果是什么?
bool b = true;
int i = b;//1
i = 1;
b = i;//true;
是
3.9 假定x的值是1,下面的表达式计算完毕后x的值是什么?
(x>1)&& (x++>1)
1//解释,先做前半句,1>1么?非。短路连接,不做后半句了,所以 不会执行x++。短路连接就是&&前为非,后面不再执行,还有||前为是,后面不再执行。利用的是&& 和||的特性。所以由于不会执行x++,所以 x的值是1.
3.10 给出下面程序的输出结果:
#include <iostream>
using namespace std;
Int main(){
Char x=’a’;
Char y =’c’;
Cout<<++x<<endl;//b
Cout<<y++<<endl;//c
Cout<<(x>y)<<endl;//0
Cout<<(x-y)<<endl;//2,这个是-2
Return 0;
}
3.11 假定 x= 3,y = 2,给出下面程序的输出结果。当x= 3,y = 4,时,输出结果是什么?x =2,y =2呢?画出程序的流程图。
if(x>2){
if(y>2){
int z = x+y;
cout<< “ z is “ <<z<<endl;
}
}
else
cout << “ x is “<< x << endl;
x= 3,y = 2 没结果。
x= 3,y = 4 z is 7
x =2,y =2 x is 2
3.12 下面语句中那些是等价的? 那些有正确缩进的?
a形式
if(i>0) if
(j>0)
x=0;else
if (k>0) y=0;
else z=0;
b形式
if(i>0){
if(j>0)
x=0;
else if (k>0)
y=0;
}
else
z=0;
c形式
if(i>0)
if(j>0)
x=0;
else if (k>0)
y=0;
else
z=0;
d 形式
if(i>0)
if(j>0)
x=0;
else if (k>0)
y=0;
else
z=0;
所以 acd等价。
bc正确缩进。
3.13假定x = 2,y = 3给出下面程序的输出结果。当x = 3,y = 2时,输出结果是什么?x = 3,y = 3呢?(提示:请先调整好程序的缩进。)
if (x>2)
if (y>2){
int z = x+y;
cout<< “z is “<<z<<endl;
}
else
cout<<” x is “<<x<<endl;
提示很重要:
首先调整缩进顺序:
if (x>2)
if (y>2){
int z = x+y;
cout<< “z is “<<z<<endl;
}
else
cout<<” x is “<<x<<endl;
x = 2,y = 3没有结果
x = 3,y = 2 x is 3
x = 3,y = 3 z is 6 【怎么感觉刚做过,那个时候是7】
3.14 下面两条语句是等价的么?
if (income <=10000)
tax = income * 0.1;
else if(income <=20000)
tax = 1000+(income -10000)*0.15;
代码块儿二:
if (income <=10000)
tax = income * 0.1;
else if(income>10000&&income <=20000)
tax = 1000+(income -10000)*0.15;
是等价的。
3.15 下面那个可能是调用函数rand()返回的结果?
323.4,5,34,1,0.5,0.234
_Check_return_ _CRTIMP int __cdecl rand(void);
所以,整数应该是 rand()返回的结果,所以5 34 1有可能是rand()返回的结果
3.16 如何生成一个随机数i,使得0<=i<20?
如何生成一个随机数i,使得 10<=i<20?
如何生成一个随机数i,使得 10<=i<=50?
int seed = time(0);
srand(seed);
int i1 = rand()%20;
int i2 = rand()%10+10;
int i3 = rand()%10+40;
3.17 C++要求switch 变量的数据类型是什么?如果在一个case子句末尾使用关键字break,那么下一条被执行的语句是什么?你能将一个switch语句转换为一个等价的if语句吗?反过来呢?使用switch语句的好处是什么?
byte int short char enum。应该是吧,Java里面是的。
是switch外面的一句话
可以的,也可以的【并且无论是否击穿的转换都是可以做的】
看起来清晰吧。并不知道还有什么别的好处。。。
3.18下面的switch语句执行完毕后,y的值是什么?
x = 3;y = 3;
switch(x+3){
case 6: y=1;
default: y+=1;
}
y = 2;
3.19 用switch 语句重写下面if语句,并画出switch语句的流程图:
if(a==1)
x +=5;
else if(a==2)
x +=10;
else if(a==3)
x +=16;
else if(a==4)
x +=34;
重写:
switch(a){
case 1:
x +=5;
break;
case 2:
x+=10;
break;
case 3:
x +=16;
break;
case 4:
x+=34;
break;
}
3.20使用条件表达式重写下面的if语句:
if(count%10==0)
cout<<coutn<<”\n”;
else
cout<<count<<” “;
什么是 条件表达式?
喔喔喔!!!传说中的三目运算符 也叫问号表达式。
count%10==0?cout<<coutn<<”\n”:cout<<count<<” “;
这个题可以有!!!记下来。
3.21 为了使用流格式控制符,必须包含那个头文件?
iomanip
3.22 给出下面语句的输出结果:
cout<<setw(10)<<”C++”<<setw(6)<<101<<endl;
cout<<setw(8)<<”Java”<<setw(5)<<101<<endl;
cout<< setw(6) <<”HTML” <<setw(4)<<101<<endl;
^^^^^^^C++^^^101
^^^^Java^^101
^^HTML^101
上面^表示空格
3.23给出下面语句的输出结果:
double number = 93123.1234567;
cout <<setw(10)<<setprecision(5) << number;//93123
cout <<setw(10) << setprecision(4) << number;//9312
cout << setw(10) <<setprecision(3) <<number;//931
cout << setw(10) <<setprecision(8) <<number;//93123.123
写错喽。。。
3.24给出下面语句的输出结果:
double x = 1345.4567;
double y = 866.887234;
cout << fixed << setprecision(2);
cout << setw(8)<<monthlyPayment<<endl;
cout<<setw(8)<<totalPayment<<endl;
【这里应该是x跟y吧。】
^1345.46
^^866.89
3.25 给出下面语句的输出结果:
cout <<right;
cout<<setw(6)<<21.23<<endl;
cout<<setw(6)<<51.34<<endl;
^21.23
^51.34
3.26 给出下面语句的输出结果:
cout<<left;
cout<<setw(6)<<21.23<<endl;
cout<<setw(6)<<51.34<<endl;
21.23
51.34
3.27 列出布尔运算负的优先级顺序。计算下列布尔表达式:
true||true&&false //true
true&& true||false //true
3.28 给出下面程序的输出结果,并解释为什么会有这样的输出?
- int i = 0;
i = i+(i=1);
cout<<i<<endl;//
b. int i =0;
i =(i=1)+i;//2
cout<<i<<endl;
做错//都是2.
3.29假定在下列表达式执行之前有int a = 1,double d = 1.0,而且表达式是相互无关的,计算这些表达式的结果。
a = (a =3)+a;//6
a+=a+(a=3);//12
a=5+5*2%a--;//5
a=4+1+4*5%(++a+1);//7
d+=1.5*3+(++d);//8.5
d-=1.5*3+d++;//-3.5
不检验了,有问题欢迎网友斧正了。
程序设计练习
3.1 检验一个三角形是否合法?(任意两边之和大于第三边)
#include <iostream>
using namespace std;
bool isTriangle(double a,double b,double c){
if (a + b > c&&a + c > b&&b + c > a)
return true;
return false;
}
int main(){
cout << "验证三角形是否合法:" << endl;
cout << "输入三角形的三条边:" << endl;
int a = 0, b = 0, c = 0;
cin >> a >> b >> c;
if (isTriangle(a, b, c))
cout << "这是一个三角形" << endl;
else
cout << "这不是一个三角形" << endl;
system("pause");
return 0;
}
3.2 验证是否偶数?
每次这样很烦哎。要是能有一个什么东西就好了应该有预置模板的吧。。。
#include <iostream>
using namespace std;
int main(){
cout << "验证一个数字是否是偶数?" << endl;
system("pause");
return 0;
}
3.3被整除
#include <iostream>
using namespace std;
void canItBeDevided(int number){
//或里面有和。不是和的话只能满足其一
//所以:
if (number % 5 == 0 || number % 6 == 0){
cout << number << "能 被5或6整除" << endl;
if (number % 5 == 0 && number % 6 == 0){
cout << number << "能 被5和6同时整除" << endl;
cout << number << "不能 被5和6之一,且只被其一整除" << endl;//
}
else{
cout << number << "不能 被5和6同时整除" << endl;//
cout << number << "能 被5和6之一,且只被其一整除" << endl;
}
}
else{//
cout << number << "能 被5或6整除" << endl;
cout << number << "不能 被5和6同时整除" << endl;//
cout << number << "不能 被5和6之一,且只被其一整除" << endl;//
}
}
int main(){
cout << "判断一个数是否能被整除?" << endl;
int number = 0;
cout << "请输入一个数字:" << endl;
cin >> number;
canItBeDevided(number);
system("pause");
return 0;
}
3.4 修改货币数量程序:
#include <iostream>
using namespace std;
/* 找零程序,不要想得太多太复杂,先把框架搭起来实现了,然后再具体而微。不能一下就做成什么样子的。
这个程序现在做就是了解一下那个时候的美元的货币币值,
或者想象成是在就是外国人要这样开发,就这几种币值。
给出11.56 输出11个1美元,2个25美分,0个10美分,1个5美分,1个1美分
*/
void getDetails(double money){
int dollarsCount = static_cast<int>(money);
int centsPart = static_cast<int>((money - dollarsCount) * 100);//56
int quartersCount = centsPart / 25;//2
int dimesCount = (centsPart - quartersCount * 25) / 10;//0
int nickelsCount = (centsPart - quartersCount * 25 - dimesCount * 10) / 5;
int pennies = (centsPart - quartersCount * 25 - dimesCount * 10) % 5;
cout << "your amout " << money << "consists of" << endl;
if (dollarsCount==1){
cout << 1 << " dollar" << endl;
}
else if(dollarsCount>1){
cout << dollarsCount << " dollars" << endl;
}
if (quartersCount == 1){
cout << 1 << " quarter" << endl;
}
else if (quartersCount>1){
cout << quartersCount << " quarters" << endl;
}
if (dimesCount == 1){
cout << 1 << " dime" << endl;
}
else if (dimesCount>1){
cout << dimesCount << " dimes" << endl;
}
if (nickelsCount == 1){
cout << 1 << " nickel" << endl;
}
else if (nickelsCount>1){
cout << nickelsCount << " nickels" << endl;
}
if (pennies == 1){
cout << 1 << " penny" << endl;
}
else if (pennies>1){
cout << pennies << " pennies" << endl;
}
}
int main(){
cout << "输入货币值比如11.56" << endl;
double money = 0;
cin >> money;
getDetails(money);
cout << "新版输入1156" << endl;
int amount = 0;
cin >> amount;
getDetails(amount);
system("pause");
return 0;
}
3.5对三个整数排序:
#include <iostream>
using namespace std;
void sort(int a1, int a2, int a3){
if (a1<=a2){
if (a2 <= a3){
cout << a1 << "<=" << a2 << "<=" << a3 << endl;
}//否则 a3<a2
else if (a1 <= a3){
cout << a1 << "<=" << a3 << "<=" << a2 << endl;
}//否则 a3<a1
else {
cout << a3 << "<=" << a1 << "<=" << a2 << endl;
}
}
else{//a1>a2 a2 a1
if (a1 <= a3){
cout << a2 << "<=" << a1 << "<=" << a3 << endl;
}//否则 a3<a1
else if (a2 <= a3){
cout << a2 << "<=" << a3 << "<=" << a1 << endl;
}//否则
else {
cout << a3 << "<=" << a2 << "<=" << a1 << endl;
}
}
}
int main(){
cout << "对三个整数排序" << endl;
int a1, a2, a3;
cout << "输入三个整数" << endl;
cin >> a1 >> a2 >> a3;
sort(a1, a2, a3);
system("pause");
return 0;
}
3.6 计算三角形周长
#include <iostream>
using namespace std;
bool isTriangle(double a, double b, double c){
if (a + b > c&&a + c > b&&b + c > a)
return true;
return false;
}
//perimeter 周长
double getPremeterofTriangle(double a, double b, double c){
return a + b + c;
}
int main(){
cout << "计算三角形周长" << endl;
cout << "输入三角形三边" << endl;
double a, b, c;
cin >> a >> b >> c;
if (isTriangle(a, b, c)){
cout << "三角形周长为:"<<getPremeterofTriangle(a, b, c) << endl;
}
else {
cout << "此三角形非法" << endl;
}
system("pause");
return 0;
}
3.7好在补充完了。。。他妹的。。那个程序简直不想写再一次。。。
前面写了,这里就不赋值了
3.8
求一个月的天数
#include <iostream>
using namespace std;
/*
当初大一或者大二落下的东西现在才算明白。
闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。
凡阳历中有闰日(二月为二十九日)的年,闰余(岁余置闰。阴历每年与回归年相比所差的时日)。
通常的解释是说一年有多少天多少小时多少分,取整数365还有多余的,累积达到一天24小时后,就多加一天的年是闰年。这个解释只是告诉了大家怎么计算,是人为设置的东西。
最根本的原因是:地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来。因此每四百年中要减少三个闰年。所以公历规定:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的年份,即使是4的倍数也不是闰年。
这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,2100年则是平年。
*/
bool isLeapYear(int year){//我从开始学 就搞不懂到底啥事闰年。。。并且也不知道为什么
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
return false;
}
int getDayOfAMonth(int year , int month){
if (month == 2){
if (isLeapYear(year)){
return 29;
}
else return 28;
}
else if (month == 4 || month == 6 || month == 9 || month == 11){
return 30;
}
else if (month==1||month==3||month==5||month==7||month==8||month==10||month==12){
return 31;
}
return 38;
}
int main(){
cout << "求一个月的天数" << endl;
cout << "输入年份,跟月份" << endl;
int month, year;
cin >> year >> month;
cout << "这个月有 "<<getDayOfAMonth(year,month) <<" 天。" << endl;
system("pause");
return 0;
}
3.9貌似跟3.10 是一个事儿啊
三个数相加 要求 三个数字都不大于100。
//要是三个数字的和不能大于100呢?我觉得很多面试题做不出来,都是以为不会抽取,先把简单的想出来,再想难的,往往能想出来,但是直接想一个中等难度的问题反而要更困难。
#include <iostream>
#include <ctime>
using namespace std;
int* getThreeNumbers(void){
int *array = new int[3];
srand(time(0));
for (int i = 0; i < 3; i++){
array[i] = rand()%100;
}
return array;
}
bool checkResult(int* array,int result){
if (result == array[0] + array[1] + array[2])
return true;
return false;
}
int getSum(int* array){
return array[0] + array[1] + array[2];
}
int main(){
cout << "加法学习工具,随机生成三个数字,要你计算答案喽:" << endl;
int* array = getThreeNumbers();
cout << array[0] << " + " << array[1] << " + " << array[2] << " 等于多少?" << endl;
int result;
cout << "你的计算结果是?" << endl;
cin >> result;
if (checkResult(array, result))
cout << "计算正确" << endl;
else
cout << "计算错误,正确结果是:" << getSum(array) << endl;
system("pause");
delete[]array;
return 0;
}