C++初学者必练基础编程题第一期

Posted 海轰Pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初学者必练基础编程题第一期相关的知识,希望对你有一定的参考价值。

前言

Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!

7-1 厘米换算英尺英寸 (15 分)

题目

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170

输出样例:

5 6

解答

难点不在编程上,在于题目的理解!

(foot+inch/12)×0.3048
这个公式的意思是:
因为 一英尺=12英寸
inch/12 的意思是 转化为英尺
比如6英寸 需要先转换为英寸 6/12=0.5英尺
然后 通过乘以0.3048得到单位米

简单的理解:
英尺与米的关系是:
foot*0.3088=m
如果有inch存在 先转换为foot就好了
(如果之间给出这个公式就不会混淆了)

举例说明:
如果现在一个东西的长度是5英尺+6英寸
首先转化为英尺
6inch=6/12foot=0.5foot
一共是:5+0.5 foot = 5.5foot
转换为米:5.5*0.3048约等于1.67
转换为cm:差不多就是170(根据题目就是这样 没办法)

#include <iostream>
using namespace std;
int main()
{
	// 输入数 单位cm
	double cm;
	// foot:英尺 inch:英寸
	int foot, inch;
	cin >> cm;
	// 转行为m
	cm /= 100.0;
	// 计算总英寸数
	inch = cm / 0.3048 * 12;
	// 求英尺数
	foot = inch / 12;
	// 求英寸数
	inch = inch - foot * 12;
	cout << foot << " " << inch << endl;
	return 0;
}

7-2 然后是几点 (15 分)

题目

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 5300 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310

解答

方法:

  • 提取小时、分钟数,通过除法、余数就可以
  • 转换为分钟后与流逝时间进行运算
  • 再转换为4位数 小时*100+分钟数即可

特别注意:

030这种状况
比如输入030 0
不做特殊处理的话
输出结果是30(没有前导0)
所以最后加个判断即可

#include <iostream>
using namespace std;
int main()
{   
	// 起始时间
	int start;
	// 流逝时间
	int expend;
	cin >> start >> expend;
	// 起始时间的小时数 
	int hour;
	// 起始时间的分钟数
	int minute;
	// 转换 小时取前两位 分钟取后两位
	hour = start / 100;
	minute = start % 100;
	// 转换为分钟数
	int minutes = hour * 60 + minute;
	// 与流逝时间运算
	minutes += expend;
	int ans = 0;
	// 计算之后的时间 小时*100+分钟
	ans = minutes / 60 * 100 + minutes % 60;
	// 特殊判断
	// 030这种 0时还是需要输出0的!
	if (ans / 100)
	{
		cout << ans << endl;
	}
	else
	{
		cout << "0" << ans << endl;
	}

	return 0;
}

7-3 逆序的三位数 (10 分)

题目

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321

解答

#include <iostream>
using namespace std;
int main()
{
	int num;
	int ans = 0;
	cin >> num;
	while (num)
	{
		ans = ans * 10 + num % 10;
		num /= 10;
	}
	cout << ans << endl;
	return 0;
}

7-4 BCD解密 (10 分)

题目

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

解答

简单的理解就是将一个十六进制转换为10进制

注意题目:一个[0, 153]范围内的正整数 对应十进制其实就只有2位数

#include <iostream>
using namespace std;
int main()
{
	int num;
	cin >> num;
	int ans;
	ans = num / 16 * 10 + num % 16;
	cout << ans << endl;
	return 0;
}

7-5 表格输出 (5 分)

题目

本题要求编写程序,按照规定格式输出表格。

输入格式:

本题目没有输入。

输出格式:
要求严格按照给出的格式输出下列表格:

解答

#include <iostream>
using namespace std;
int main()
{
    cout<<"------------------------------------"<<endl;
    cout<<"Province      Area(km2)   Pop.(10K)"<<endl;
    cout<<"------------------------------------"<<endl;
    cout<<"Anhui         139600.00   6461.00"<<endl;
    cout<<"Beijing        16410.54   1180.70"<<endl;
    cout<<"Chongqing      82400.00   3144.23"<<endl;
    cout<<"Shanghai        6340.50   1360.26"<<endl;
    cout<<"Zhejiang      101800.00   4894.00"<<endl;
    cout<<"------------------------------------"<<endl;
	return 0;
}

7-6 混合类型数据格式化输入 (5 分)

题目

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:

2.12 88 c 4.7

输出样例:

c 88 2.12 4.70

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	double num1;
	int num2;
	char num3;
	double num4;
	cin >> num1 >> num2 >> num3 >> num4;
	cout << num3 << " " << num2 << " ";
	cout << fixed << setprecision(2) << num1 << " ";
	cout << fixed << setprecision(2) << num4 << endl;
	return 0;
}

7-7 12-24小时制 (15 分)

题目

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。

输入样例:

21:11

输出样例:

9:11 PM

解答

#include <iostream>
using namespace std;
int main()
{
	int hour;
	int minute;
	char c;
	cin >> hour >> c >> minute;
	string s = " AM";
	if (hour > 11)
	{
		s = " PM";
	}
	if (hour > 12)
	{
		hour %= 12;
	}
	cout << hour << ":" << minute << s;
	return 0;
}

7-8 超速判断 (10 分)

题目

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:

输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:

在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。

输入样例1:

40

输出样例1:

Speed: 40 - OK

输入样例2:

75

输出样例2:

Speed: 75 - Speeding

解答

#include <iostream>
using namespace std;
int main()
{
	int speed;
	cin >> speed;
	if (speed > 60)
	{
		cout << "Speed: " << speed << " - Speeding" << endl;
	}
	else
	{
		cout << "Speed: " << speed << " - OK" << endl;
	}
	return 0;
}

7-9 用天平找小球 (10 分)

题目

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:

输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

1 1 2

输出样例:

C

解答

核心:异或运算

异或记住相同两个数亦或为0

因为只有三个数a b c
加上其中两个相同
比如a=1 b=2 c=1
那么 abc=121=2^0=2
0异或任何数等于这个数

#include <iostream>
using namespace std;
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	int ans = a ^ b ^ c;
	if (ans == a)
	{
		cout << "A" << endl;
	}
	else if (ans == b)
	{
		cout << "B" << endl;
	}
	else
	{
		cout << "C" << endl;
	}
	return 0;
}

7-10 计算工资 (15 分)

题目

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。

输入格式:

输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。

输出格式:

在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:

5 40

输出样例1:

2000.00

输入样例2:

3 50

输出样例2:

1650.00

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	int years;
	int hours;
	cin >> years >> hours;
	int wage;
	if (years >= 5)
	{
		wage = 50;
	}
	else
	{
		wage = 30;
	}
	double wages;
	if (hours <= 40)
	{
		wages = hours * wage;
	}
	else
	{
		wages = 40 * wage + (hours - 40) * wage * 1.5;
	}
	cout << fixed << setprecision(2) << wages << endl;
	return 0;
}

结语

文章仅作为学习笔记,记录从0到1的一个过程

希望对您有所帮助,如有错误欢迎小伙伴指正~

我是 海轰ଘ(੭ˊᵕˋ)੭

如果您觉得写得可以的话,请点个赞吧

谢谢支持❤️

以上是关于C++初学者必练基础编程题第一期的主要内容,如果未能解决你的问题,请参考以下文章

C++初学必练基础题第三期

C++初学必练基础题第二期

题解5道c++面试题第一期(含解题思路答案解析和实现代码)

题解5道c++面试题第一期(含解题思路答案解析和实现代码)

总结一下Python小白必练九十五道基础编程题含解答(四万字长文,建议收藏!)

周刷题第一期总结(two sum and two numbers)