【C++习题笔记】谭浩强C++程序设计(第三版)第三章

1. 表达式和表达式语句的区别:

主要参考自:https://segmentfault.com/q/1010000005850429/a-1020000005856050

表达式+分号=表达式语句,一般用表达式语句时只关心它的作用,而不关心它的值,如put("hello"),只关心该语句的作用是输出hello,而不关心put的返回值。

2. 输入圆的半径和高,求圆的周长、面积、球的表面积、体积、圆柱体积,保留两位小数

//输入圆的半径和高,求圆的周长、面积、球的表面积、体积、圆柱体积
#include <iostream>
#include <cmath>
#include<iomanip>
using namespace std;
#define pi 3.1415926
int main()
{
	float r,h,c,a,s,v1,v2;
	cout << "please input r and h:";
	cin >> r >> h;
	if(r <= 0 || h <= 0) cout << "Please enter a number greater than zero";
	else
	{
		//圆周长
		c = 2 * r * pi;
		cout << "The circumference of the circle is "<<setiosflags(ios::fixed)<<setprecision(2)<<c << '\n';
		//圆面积
		a = pi * r *r;
		cout << "The area of the circle is " << a << '\n';
		//球表面积
		s = 4 * pi * r * r;
		cout << "The surface area of the sphere is " << s <<'\n';
		//球体积
		v1 = 4.0/3.0 * pi * pow(r,3); //pow(x,y)返回x的y次方
		cout << "The volume of the sphere is "<< v1 << '\n';
		//圆柱体积
		v2 = a * h;
		cout << "The volume of a cylinder is "<< v2 << '\n';

	}
        return 0;
}

此题注意几点:

(1)C++中pi的定义:

直接定义:double const PI=3.14159265;

定义宏:#define PI 3.14159265 (末尾没有分号)

通过反三角函数求的: double   const   PI   =   acos(double(-1));  //这里得到的是3.14159

(2)C++中次方函数:

头文件加上#include <cmath>,使用pow(x,y)函数,表示x的y次方。

(3)C++中保留固定的小数位数:

头文件加上#include<iomanip>;

setiosflags(ios::fixed)表示设置浮点数以固定的小数位数显示;

setprecision(n)设置浮点数的精度为n,在以一般十进制小数形式输出时,n指有效数字位数,在fixed(固定小数位数)形式及scientific(指数)形式显示时,n为小数,这也就是本题中为啥加上述setioslflags的原因,否则输出会一共两位。

(4)分数的表达:

如果想要结果是浮点数,一定写成浮点数形式,否则就会求出整数。

3. 华氏温度转换为摄氏温度,公式c = 5/9(F-32),保留两位小数。

//华氏温度转换为摄氏温度,公式c = 5/9(F-32)
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
	float c,F;
	cout << "Please enter Fahrenheit: ";
	cin >> F;
	c = 5.0/9.0 * (F-32);
	cout << "The Celsius temperature corresponding to the Fahrenheit temperature is "
		 <<setiosflags(ios::fixed) 
		 <<setprecision(2)
		 << c;
        return 0;
}

4. getchar()读入两个字符,分别用putchar()和cout输出

//getchar()读入两个字符,分别用putchar()和cout输出
#include <iostream>
using namespace std;
int main()
{
	char c1,c2;
	int a1,a2;
	c1 = getchar();
	c2 = getchar();

	//putchar输出
	putchar(c1);
	putchar(c2);
	putchar('\n');
	
	//cout输出
	cout << c1;	
	cout << c2;
	putchar('\n');

	//ASCII码
	a1 = c1;
	a2 = c2;
	cout << a1;
	cout << a2;

	return 0;

}

此时注意:

(1)getchar和putchar每次都只能输入输出一个字符,所以连续两个字符输入时中间不应该有空格,否则会把空格当做字符传给putchar();

(2)要ASCII码时,把字符型赋给整型,用cout输出即可

5. char和int型任何时候都可以互相代替吗?

不可以:

char的范围是有符号-128 ~ 127无符号0 ~ 255;
int的范围是-32768 ~ 32767;
所以只有当你表示的数据的值在它们的公共范围之内是可以替换的,如果不在公共范围之内就不可以替换。

解释可见:https://blog.csdn.net/zhjqxy/article/details/52975140

6. C++中的算数运算、关系运算以及逻辑运算:

详见:https://blog.csdn.net/zl3090/article/details/84303183

7. C++中如何表示“真”和“假”?系统如何判定一个量的“真”和“假?

C++编译系统在表示逻辑运算结果时,以数值1代表“真”,以0代表“假”,比如:a、b的值分别是0、4,则a||b的值为1,a&&b的值为0。但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”,比如:a=4,因为a的值为非0,被认作“真”,所以对它进行“非”运算!a=0。

参考自:https://zhidao.baidu.com/question/193053972.html

9.  输出a,b,c三个整数中最大的数

#include <iostream>
using namespace std;
int main()
{
	int a, b, c, max;
	cin >> a >> b >> c;
	max = (a > b) ? a : b;
	max = (c > max) ? c : max;
	cout << max;
	return 0;
}

在c++中max和min都不是关键词,所以可以作为变量名,关于c++中max和min的用法可以详见:

https://blog.csdn.net/wings_zhang/article/details/79053861

https://blog.csdn.net/a_ran/article/details/74911031

10. 函数y = \left\{\begin{matrix}x ,(x<1) \\ 2x-1,(1\leq x<10)) \\ 3x-11,(x\geq 10) \end{matrix}\right.,输入x,求y的值

//分段函数求值
#include <iostream>
using namespace std;
int main()
{
	int x,y;
	cin >>x;
	if (x<1) y = x;
	else if (x<10) y = 2*x - 1;
	else y = 3 * x - 11;
	cout << y;
	return 0;
}

11. 给定分数输出等级:

//给定分数输出等级
#include <iostream>
using namespace std;
int main()
{
	int score,grade;
	cin >> score;
	if (score>=90) cout << 'A';
	else if (score >= 80) cout << 'B';
	else if (score >= 70) cout << 'C';
	else if (score >= 60) cout << 'D';
	else cout << 'F';
	return 0;
}

此题需要注意:不用switch的原因是,case后边要的是常量表达式,score是变量而不是常量所以在case后加score>90之类的表达式,除非把score全都枚举出来可以用case。

12. 打印一个不多于5位的正整数,要求:

(1)输出位数;

(2)打印每一位数字;

(3)逆序打印每一位数字

#include <iostream>
using namespace std;
int main()
{
	int x;
	int flag;
	int temp;
	int i,j,k;
	int num[5];
	cin >> x;
	flag = 0;
	temp = x;	
	i = 0;
	j = 0;
	k = 0;
	//求位数
	while(temp > 0)
	{
		num[i] = temp % 10;
		cout << num[i];
		i ++;
		temp = temp / 10;
		flag ++;
	}
	cout <<"位数:"<< flag <<'\n';

	cout <<"顺序打印每一位"<<'\n';
	for (j = flag-1; j >= 0; j--)
	{
		cout << num[j]<<'\t';
	}
	cout <<'\n';
	cout <<"逆序打印每一位"<<'\n';
	for (k = 0; k < flag; k++)
	{
		cout << num[k]<<'\t';
	}

}

此处要注意的是边界问题,

while中的条件,如果设置为>10,则会落下第一位,>0可以保证所有的位都被单独求出;

顺序打印时,j从后往前取,要注意数组是0开头的,所以实际最后一位的索引是它位数值减去1;

逆序打印时,从前往后取,第一位的索引为0,停止条件仍然是取到了最后一位,还是索引值减一。

更多思路详见:https://blog.csdn.net/qq_15029743/article/details/79634725

13.阶梯奖金问题:分别用if和switch编程

(1)if的代码:

//阶梯奖金问题
#include <iostream>
using namespace std;
int main()
{
	float i,y;
	cin >> i;
	i = i/100000;
	if (i<=1) y = i*0.1;
	else if (1<i<=2) y = 1*0.1+(i-1)*0.075;
	else if (2<i<=4) y = 1*0.1+1*0.075+(i-2)*0.05;
	else if (4<i<=6) y = 1*0.1+1*0.075+2*0.05+(i-4)*0.03;
	else if (6<i<=10) y = 1*0.1+1*0.075+2*0.05+4*0.03 +(i-6)*0.015;
	else y = 1*0.1+1*0.075+2*0.05+4*0.03 +4*0.015 + (i-10)*0.01;
	y = y*100000;
	cout << y;
}

(2)switch的代码:

#include <iostream>
using namespace std;
int main()
{
	float i,y;
	int c;
	y = 0;
	cin >> i;
	if (i>1000000) c = 11;
	else c = i/100000;
	i = i/100000;
	switch(c)
	{
	case 0: 
	case 1: y = i*0.1;break;
	case 2: y = 1*0.1+(i-1)*0.075;break;
	case 3:
	case 4: y = 1*0.1+1*0.075+(i-2)*0.05;break;
	case 5:
	case 6: y = 1*0.1+1*0.075+2*0.05+(i-4)*0.03;break;
	case 7:
	case 8:
	case 9:
	case 10: y = 1*0.1+1*0.075+2*0.05+4*0.03 +(i-6)*0.015;break;
	case 11: y = 1*0.1+1*0.075+2*0.05+4*0.03 +4*0.015 + (i-10)*0.01;break;

	}
	y = y*100000;
	cout << y;
}

14.输入4个整数,由小到大输出

此处用了冒泡排序

//4个整数排序
#include <iostream>
using namespace std;
int main()
{
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	int num[4]={a,b,c,d};
	int i = 0,j = 0,t = 0,k =0;
	for (i=0;i<=3;i++)
	{
		for (j=i+1;j<=3;j++)
		{
			if (num[i]>num[j]) 
			{
				t = num[i];
				num[i] = num[j];
				num[j] = t;
			}
		}
	}
	cout <<"由小到大输出:"<<'\n';
	for (k=0;k<=3;k++)
	{
		cout<<num[k]<<'\t';
	}
}

15. 求两个数的最大公约数和最小公倍数

可以用辗转相除法求最大公约数,然后用两数乘积除以最大公约数则可得到最小公倍数,

方法详解见:https://blog.csdn.net/passandpass/article/details/53039923

//最大公约数和最小公倍数
#include <iostream>
using namespace std;
int main()
{
	int m,n,a,b,c;
	cin >> m >> n;
	if (m > 0 && n > 0)
	{
		a = m;
		b = n;
		do{
			c = a % b;
			a = b;
			b = c;

		}while(c);
		cout << "最大公约数为:"<< a <<'\n';
		cout <<"最小公倍数为:" << n*m/a <<'\n';
	}
	else
		cout <<"请重新输入数字"<<'\n';
}

16. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

//统计字符串中英文字母、空格及其他的个数
#include <iostream> 
using namespace std; 
int main () 
{ 
	char c;
	int letters=0,spaces=0,digits=0,others=0;
	while((c=getchar())!='\n')
	{
		if (c>='a'&& c <= 'z'||c>='A'&&c<='Z')
			letters ++;
		else if (c == ' ')
			spaces ++;
		else if (c>=0&&c<=9)
			digits ++;
		else
			others ++;
	}
	cout << "字母共有:"<<letters<<'\n';
	cout << "空格共有:"<<spaces<<'\n';
	cout << "数字共有:"<<digits<<'\n';
	cout << "其他共有:"<<others<<'\n';

}

此题巧用了while,一边输入一边判断,避免了字符串逐个读出的过程。

17. 求Sn = a+aa+aaa+...+aaa...aaa(n个a)的值,a代表1-9的某个数字

//求Sn=a+aa+aaa+...
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int a,n,Sn,i,s;
	cin >> a >> n;
	Sn = 0;
	s = 0;
	for (i = 0; i<n; i++)
	{
		s = s + a * pow(10,i);
		Sn = Sn + s;
	}
	cout << "Sn的结果为:"<< Sn;
}

18. 求\sum n!,即1!+2!+...+n!

//求阶乘的和
#include <iostream>
using namespace std;
int main()
{
	int n,s,Sn,i;
	cin >> n;
	s = 1;
	Sn =0;
	for (i =1; i<=n; i++)
	{
		s = s * i;
		Sn = Sn + s;
	}
	cout << "阶乘之和为:" << Sn;

}

19. 输出所有三位的水仙花数,水仙花数是每个数字的立方和等于该数,如153 = 1^3+5^3+3^3

 //水仙花数
#include <iostream>
using namespace std;
int main()
{
	int n,a,b,c;
	for (n=100;n<=999;n++)
	{
		a = n % 10;//个位
		b = n % 100/10;//十位
		c = n/100;//百位

		if (a*a*a + b*b*b +c*c*c == n)
			cout <<"水仙花数有:"<< n <<'\n';

	}
}

20. 输出1000之内所有的完数,完数是指该数等于其所有因子的和,如6=1+2+3

//完数
#include <iostream>
using namespace std;
int main()
{
	int m,s,i;
	for (m = 2; m <= 1000; m++)
	{
		s = 0;
		for (i = 1; i < m; i++)
		{
			if ((m%i)==0) 
				s = s + i; //因子和
		}
		if (s == m)
		{
			cout<<m<<" is a完数"<<endl;
			cout<<"its factors are:";
			for (i=1;i<m;i++)
			if (m%i==0)  cout<<i<<" ";
			cout<<endl;
		}
	}
}

此题注意,跳出固定思维,先找因子,再找完数,直接在第一次需要因子时直接求和就好。

21. 序列求和:\frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8}...

//数列求和
#include <iostream>
using namespace std;
int main()
{
	int n,i,t;
	float a,b,s;
	a = 1;
	b = 2;
	s = 0;
	cin >> n;
	for (i = 1; i<=n; i++)
	{
		s = s + b / a;
		t = b;
		b = a + b;
		a = t;		
	}
	cout << s <<'\n';
}

此题要注意的是t为int型,而a,b,s均为浮点型

22. 猴子吃桃问题:猴子第1天摘了若干个桃子,当即吃了一半零一个;第2剩下的吃了一半零一个,一次循环。到第十天时想吃就剩下一个桃子。求第一天摘了几个桃子?

//猴子吃桃
#include <iostream>
using namespace std;
int main()
{
	int a,i;
	a = 1;
	for (i = 9; i >= 1; i --)
	{
		a = 2 * a + 2;
	}
	cout << a;
}

此题采用逆向思维比较顺:

假设第n天剩下的桃子数为an,总桃子数为s;

据题意:a1 = s - (s/2+1) = s/2-1

              a2 = a1 - (a1/2+1) = a1/2-1

              an = a(n-1)/2-1

已知a10 = 1,由此可以逆推a9,以此类推,直到a1,再由a1逆推出s

逆推公式为:a(n-1) = 2*an +2,因此得到上述代码。

23. 用迭代法求  x=\sqrt{a},求平方根的迭代公式为 Xn+1=(1/2)(Xn+a/Xn),要求前后两次求出的X的差的绝对值小于10-5。

//迭代法求根号a
#include <iostream>
#include <cmath>
using namespace std;
int main()
 {float a,x0,x1;
  cout<<"enter a positive number:";
  cin>>a;            // 输入a的值 
  x0=a/2;
  x1=(x0+a/x0)/2;
  do
    {x0=x1;
     x1=(x0+a/x0)/2;
     }
  while(fabs(x0-x1)>=1e-5);
  cout<<"The square root of "<<a<<" is "<<x1<<endl;
  return 0;
 } 

24. 输出以下图形

//输出星号图案
#include <iostream>
using namespace std;
int main()
{
	int i,k;
	//上半部分
	for (i = 0; i < 4; i++)
	{
		for (k = 0; k < 2*i+1; k++)
		{
			cout <<'*'; 
		}
		cout <<'\n';
	}
	//下半部分
	for (i = 0; i <= 2; i++)
	{
		for(k = 0; k <= 4-2*i; k++)
		{
			cout << '*';
		}
		cout <<'\n';
	}
}

此题依然需要注意边界问题

25.  两个乒乓球队进行比赛,各出三人。甲队为A、B、C 3人,乙队为X、Y、Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Y比,请编程序找出3三队选手的对阵名单。

//乒乓球赛
#include <iostream>
using namespace std;
int main()
{
	char i,j,k;                //i是a的对手;j是b的对手;k是c的对手
	for (i='X';i<='Z';i++)
		for (j='X';j<='Z';j++)
			if (i!=j)//排除相同的人和自己比
				for (k='X';k<='Z';k++)
					if (i!=k && j!=k)//排除相同的人和自己比
					if (i!='X' && k!='X' && k!='Z') //题目中限制的三个条件同时满足
						cout<<"A--"<<i<<"  B--"<<j<<"  C--"<<k<<endl;
    return 0;
}

此题用了三重循环,即把X,Y,Z分别枚举自己后边跟着谁,排除自己后按照题中的限写出即可。

猜你喜欢

转载自blog.csdn.net/zl3090/article/details/84614046