【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.youkuaiyun.com/zhjqxy/article/details/52975140

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

详见:https://blog.youkuaiyun.com/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.youkuaiyun.com/wings_zhang/article/details/79053861

https://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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分别枚举自己后边跟着谁,排除自己后按照题中的限写出即可。

C++程序设计 扫描版,谭浩强编著,清华大学出版社,2004年6月第一版。 注意:其他两卷在本网页下面我的其它资源里可以找到 内容简介 C++是近年来国内外广泛使用的现代计算机语言,它既支持面向过程的程序设计,也支持基于对象和面问对象的程序设计。国内许多高校已陆续开设了C++程序设计课程。但是由于C++涉及概念很多,语法比较复杂,内容十分广泛使不少人感到学习难度较大,难以人门。 本书作者深入调查了我国大学的程序设计课程的现状和发展趋势参阅了国内外数十种有关C++的教材,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律。在本书中做到准确定位,合理取舍内容,设计了读者易于学习的教材体系,并且以通俗易懂的语言化解了许多复杂的概念,大大减少了初学者学习C++的困难。 考虑到许多读者在学习C++前未学过其他语言本书把入门起点降低,读者不需要具备C语言的基础。本书包括14章,分为4 篇:基本知识面向过程的程序设计;基于对象的程序设计;面向对象的程序设计。本书内容全面,例题丰富,概念清晰,循序渐进,易于学习。 本书是依据ANSI C++标准进行介绍的,引导读者从开始就按标准C++的规定编程。本书配有两本辅导教材,即《C++程序设计题解与上机指导》 和《C++编程实践指导》。 本书是大学各专业学生学习C++的基础教材,也是适于初学者学习的教材。即使没有教师讲授,读者也能看懂本书的大都分内容
目录 第1章 概述 1.1计算机程序设计语言的发展 1.2 面向对象的方法 1.3 面向对象的软件开发 1.4 信息的表示与存储 1.5 程序的开发过程 1.6 小结 习题 第2章 C++简单程序设计 2.1 C++语言概述 2.2 基本数据类型和表达式 2.3 数据的输入与输出 2.4 算法的基本控制结构 2.5 自定义数据类型 2.6 小结 习题 第3章 函数 3.1 函数的定义与使用 3.2 内联函数 3.3 带默认形参值的函数 3.4 函数重载 3.5 函数模板 3.6 使用C++系统函数 3.7 小结 习题 第4章 类与对象 4.1 面向对象的思想 4.2 面向对象程序设计的基本特点 4.3 类和对象 4.4 构造函数和析构函数 4.5 类的组合 4.6 类模板 4.7 面向对象标记 4.8 小结 习题 第5章 C++程序的结构 5.1 作用域与可见性 5.2 生存期 5.3 数据与函数 5.4 静态成员 5.5 友元 5.6 共享数据的保护 5.7 多文件结构和编译预处理命令 5.8 小结 习题 第6章 数组、指针与字符串 6.1 数组 6.2 指针 6.3 动态内存分配 6.4 字符串 6.5 小结 习题 第7章 继承与派生 7.1 继承与派生 7.2 访问控制 7.3 派生类的构造和析构函数 7.4 派生类成员的标识与访问 7.5 赋值兼容规则 7.6程序实例——用高斯消去法解线性方程组 7.7 程序实例——一个小型公司的人员信息管理系统 7.8 小结 习题 第8章 多态性 8.1 多态性概述 8.2 运算符重载 8.3 虚函数 8.4 抽象类 8.5 程序实例——用变步长梯形积分算法求解函数的定积分 8.6 程序实例——对一个小型公司的人员信息管理系统程序的改进 8.7 小结 习题 第9章 群体类 9.1 线性群体 9.2 C++标准库中的容器类 9.3 小结 习题 第10章 群体数据的组织 10.1 插入排序 10.2 选择排序 10.3 交换排序 10.4 顺序查找 10.5 折半查找 10.6 标准C++库中的算法 10.7 小结 习题 第11章 流类库与输入/输出 11.1 I/O流的概念 11.2 输出流 11.3 输入流 11.4 输入/输出流 11.5 小结 习题 第12章异常处理 12.1 异常处理的基本思想 12.2 C++异常处理的实现 12.3 异常处理中的构造与析构 12.4 小结 习题 第13章 MFC库与Windows程序开发概述 13.1 Windows的编程模式 13.2 MFC库简介 13.3 使用VisualC++开发Windows程序的步骤 13.4 小结 习题 参考文献
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值