翁恺老师作为国内C语言教学的王牌,把C语言的知识绘声绘色有条有理地教授,看了知乎和CSDN以及其他平台,鲜有翁恺老师C语言习题集,故在此呈现。我们学习的时候,总是夹着C++一起学习的,本次便把C语言代码用C++重塑一遍,提供C和C++两种版本实现,初学者敲完必然C语言水平能达到一定高度,我们终将实现C到C++的过渡,学习C++把这些代码敲敲又何尝不是一种好的学习呢!计划分为三次发布完,内容如下:
1.输入输出类别
1.1整数四则运算
本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。
输入格式:
输入在一行中给出2个正整数A和B。
输出格式:
在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。
输入样例:
3 2
输出样例:
3 + 2 = 5
3 - 2 = 1
3 * 2 = 6
3 / 2 = 1
C语言代码:
#include <stdio.h>
int main()
{
int m, n;
printf("输入操作数字:\n");
scanf("%d %d", &m, &n);
printf("%d+%d=%d\n", m, n, m + n);
printf("%d-%d=%d\n", m, n, m - n);
printf("%d*%d=%d\n", m, n, m * n);
printf("%d/%d=%d\n", m, n, m / n);
return 0;
}
C++代码:
#include <iostream>
using namespace std;
int main()
{
int m, n;
cout << "输入操作数字:" << endl;
cin >> m >> n;
cout << m << "+" << n << "=" << m + n << endl;
cout << m << "-" << n << "=" << m - n << endl;
cout << m << "*" << n << "=" << m * n << endl;
cout << m << "/" << n << "=" << m / n << endl;
return 0;
}
1.2厘米换算英尺英寸
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)*0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
C语言实现:
#include <stdio.h>
int main()
{
int meter, foot, inch;
printf("请输入你的身高:\n");
scanf("%d", &meter);
foot = meter / 30.48;
inch = (meter / 30.48 - foot) * 12;
printf("阁下身高是%d英尺%d英寸\n", foot, inch);
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int meter, foot, inch;
cout << "请输入你的身高:" << endl;
cin >> meter;
foot = meter / 30.48;
inch = (meter / 30.48 - foot) * 12;
cout << "阁下身高是" << foot << "英尺" << inch << "英寸" << endl;
return 0;
}
1.3然后是几点
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
C语言实现(择一即可):
#include <stdio.h>
int main()
{
int h, m, min;
printf("输入当前时间\n");
scanf("%d %d", &h, &m);
printf("输入过去时间\n");
scanf("%d", &min);
m = m + min;
if (m > 60)
{
h = h + m / 60;
m = m % 60;
}
printf("%d %d\n", h, m);
return 0;
}
#include <stdio.h>
int main()
{
int h1, h2, m1, m2, min;
printf("输入当前时间\n");
scanf("%d %d", &h1, &m1);
printf("输入过去时间\n");
scanf("%d", &min);
h2 = h1;
m2 = m1 + min;
if (m2 > 60)
{
h2 = h2 + m2 / 60;
m2 = m2 % 60;
}
printf("%d %d\n", h2, m2);
return 0;
}
C++实现(择一即可):
#include <iostream>
using namespace std;
int main()
{
int h, m, min;
cout << "输入当前时间" << endl;
cin >> h >> m;
cout << "输入过去时间" << endl;
cin >> min;
m = m + min;
if (m > 60)
{
h = h + m / 60;
m = m % 60;
}
cout << h << m << endl;
return 0;
}
#include<iostream>
using namespace std;
int main(){
int h1, h2, m1, m2, min;
cout << "输入当前时间" << endl;
cin >> h1 >> m1;
cout << "输入过去时间" << endl;
cin >> min;
h2 = h1;
m2 = m1 + min;
if (m2 > 60)
{
h2 = h2 + m2 / 60;
m2 = m2 % 60;
}
cout << h2 << m2 << endl;
return 0;
}
1.4逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
C语言实现:
#include <stdio.h>
int main()
{
int num, a, b, c;
printf("请输入一个三位数:\n");
scanf("%d", &num);
a = num / 100;
b = num / 10 - 10 * a;
c = num % 10;
printf("%d%d%d\n", c, b, a);
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int n, x, y, z;
cout << "输入你要操作的数字:" << endl;
cin >> n;
x = n / 100;
y = n / 10 - 10 * x;
z = n % 10;
cout << z * 100 + y * 10 + x;
cout << z << y << x << endl; // 前导0
return 0;
}
1.5BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
C语言实现:
#include <stdio.h>
int main()
{
int num, a, b, c;
printf("请输入一个三位数:\n");
scanf("%d", &num);
a = num / 100;
b = num / 10 - 10 * a;
c = num % 10;
printf("%d%d%d\n", c, b, a);
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int n, x, y;
cout << "输入你的操作数:" << endl;
cin >> n;
x = n / 16;
y = n % 16;
cout << x << y << endl; //两种方式
int z = n / 16 * 10 + n % 16; //两种方式
cout << z << endl;
return 0;
}
1.6超速判断
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出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
C语言实现:
#include <stdio.h>
int main() {
int speed;
printf("请输入当前车速:\n");
scanf("%d", &speed);
if (speed > 60)
printf("speed %d - Speeding\n", speed);
else
printf("speed %d - Ok\n", speed);
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int speed;
cout << "请输入当前车速:" << endl;
cin >> speed;
if (speed > 60)
cout << "speed"
<< " " << speed << " "
<< "-Speeding" << endl;
else
cout << "speed"
<< " " << speed << " "
<< "-Ok" << endl;
return 0;
}
2.条件判断类
2.1三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出1个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
103
输出样例1:
Fishing in day 103
C语言实现:
#include <stdio.h>
int main()
{
int n;
printf("输入你整活儿的天数:\n");
scanf("%d", &n);
if (n > 5)
n %= 5;
if (n >= 1 && n <= 3)
{
printf("打鱼%d天\n", n);
}
else
{
printf("晒网%d天\n", n);
}
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "输入你整活儿的天数:" << endl;
cin >> n;
if (n > 5)
n %= 5;
if (n >= 1 && n <= 3)
cout << "打鱼" <<"in the day"<<n<< endl;
else
cout << "晒网" <<"in the day"<<n<< endl;
return 0;
}
2.2用天平找小球
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:
在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C
C语言实现:
#include <stdio.h>
int main() {
int A, B, C;
printf("请依次输入每个小球的质量:\n");
scanf("%d %d %d", &A, &B, &C);
if (A == B) {
printf("C\n");
} else if (A == C) {
printf("B\n");
} else {
printf("A\n");
}
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int A, B, C;
cout << "请依次输入每个小球的质量:" << endl;
cin >> A >> B >> C;
if (A == B)
cout << "C" << endl;
else if (A == C)
cout << "B" << endl;
else
cout << "A" << endl;
return 0;
}
2.3 12-24小时制
编写一个程序,要求用户输入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
C语言实现:
#include <stdio.h>
int main()
{
int hour, minute;
printf("请输入如今的时间:\n");
scanf("%d:%d", &hour, &minute);
if (hour >= 0 && hour < 12)
{
printf("%d:%d AM\n", hour, minute);
}
else if (hour > 12 && hour < 24)
{
hour -= 12;
printf("%d:%d PM\n", hour, minute);
}
else if (hour == 24)
{
hour -= 24;
printf("%d:%d PM\n", hour, minute);
}
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int h, m;
cout << "请输入如今的时间:" << endl;
// cin>>h>>m;
scanf("%d:%d", &h, &m);
if (h >= 0 && h < 12)
cout << h << ":" << m << " AM" << endl;
else if (h > 12 && h < 24)
{
h -= 12;
cout << h << ":" << m << " PM" << endl;
}
else if (h == 24)
{
h -= 24;
cout << h << ":" << m << " PM" << endl;
}
return 0;
}
2.4成绩转换
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
- 大于等于90分为A;
- 小于90且大于等于80为B;
- 小于80且大于等于70为C;
- 小于70且大于等于60为D;
- 小于60为E。
输入格式:
输入在一行中给出1个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
输入样例:
90
输出样例:
A
C语言实现:
#include <stdio.h>
int main() {
int score;
printf("请输入你的成绩:\n");
scanf("%d", &score);
switch (score / 10) {
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("E\n");
break;
}
return 0;
}
C++来写:
#include <iostream>
using namespace std;
int main()
{
int score;
cout << "请输入你的成绩:" << endl;
cin >> score;
switch (score / 10)
{
case 10:
case 9:
cout << "A" << endl;
break;
case 8:
cout << "B" << endl;
break;
case 7:
cout << "C" << endl;
break;
case 6:
cout << "D" << endl;
break;
default:
cout << "E" << endl;
break;
}
return 0;
}
3.循环控制类
3.1求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
C语言实现:
#include <stdio.h>
int main() {
int n, i, j, k;
int cnt = 0;
printf("请输入索引数字:\n");
scanf("%d", &n);
for (i = n; i < n + 4; i++) {
for (j = n; j < n + 4; j++) {
for (k = n; k < n + 4; k++) {
if (i != j && i != k && j != k) {
printf("%d%d%d", i, j, k);
cnt++;
if (cnt % 6 == 0)
printf("\n");
else
printf(" ");
}
}
}
}
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int n, i, j, k;
int cnt = 0;
cout << "请输入索引数字:" << endl;
cin >> n;
for (i = n; i < n + 4; i++)
{
for (j = n; j < n + 4; j++) //误写成i < n + 4;
{
for (k = n; k < n + 4; k++)
{
if (i != j && i != k && j != k) //误写成i < n + 4;
{
cout << i << j << k ;
cnt++;
if (cnt % 6 == 0)
cout << endl;
else
cout << " ";
}
}
}
}
return 0;
}
3.2水仙花数
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例如:153 = 13 + 53+ 33。本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
C语言实现:
#include <stdio.h>
int main() {
int N, sum, d;
int n2, n3, n4;
printf("输入位数:\n");
scanf("%d", &N);
int n1 = N;
int i = 1;
for (; n1 > 1; n1--) {
i *= 10;
}
int I = i;
int n;
for (; i < 10 * I; i++) {
sum = 0, d = 0;
n2 = i;
n = N;
for (; n > 0; n--) {
d = n2 % 10;
n2 /= 10;
n3 = N;
n4 = d;
for (; n3 > 1; n3--) {
d *= n4;
}
sum += d;
}
if (sum == i)
printf("%d\n", i);
}
return 0;
}
C++实现:
#include <iostream>
using namespace std;
int main()
{
int N, sum, d; //定义数字位数 数字求和 每位数字
int n2, n3, n4; //定义替换操作数
cout << "输入位数:" << endl;
cin >> N;
int n1 = N; //求出下限
int i = 1;
for (; n1 > 1; n1--)
{
i *= 10; //求出下限
}
int I = i; //求出上限
int n; //定义初始化变量
for (; i < 10 * I; i++) //求出上限
{
sum = 0, d = 0;
n2 = i; //代i操作
n = N; //初始化变量
for (; n > 0; n--)
{
d = n2 % 10;
n2 /= 10;
n3 = N; //控制循环次数
n4 = d; //控制所乘数字
for (; n3 > 1; n3--)
{
d *= n4;
}
sum += d; //相加
}
if (sum == i)
cout << i << endl;
}
}
3.3打印九九口诀表
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的1位正整数N,输出从1*1到N*N的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1<=N<=9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
C语言实现:
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d*%d=", j, i);
if (i * j >= 10)
printf("%-3d", j * i);
else
printf("%-4d", j * i);
}
printf("\n");
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
cout<<j<<"*"<<i<<"=";
if(i*j>=10)
cout<<j*i<<" ";
else
cout<<j*i<<" "; //妙哉
}
cout<<endl;
}
return 0;
}
3.4统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
C语言实现:
#include <stdio.h>
int main() {
int x, y, i, j, cnt = 0, sum = 0;
int isPrime = -1;
scanf("%d %d", &x, &y);
for (i = x; i <= y; i++) {
isPrime = -1; // 初始化
for (j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = 1;
cnt++;
break;
}
}
if (isPrime != 1) {
printf("%d ", i);
sum += i;
}
}
printf("sum=%d", sum);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int x, y, i, j, cnt = 0, sum = 0;
int isPrime = -1;
cin >> x >> y;
for (i = x; i <= y; i++)
{
isPrime = -1; // 初始化
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
isPrime = 1;
cnt++;
break;
}
}
if (isPrime != 1){ //==1可以求出对应合数的性质
cout << i << " ";
sum += i;
}
}
cout << "sum=" << sum;
return 0;
}
3.5猜数字游戏
猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数、以及猜测的最大次数N。随后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
C语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int n, cnt = 0, Cnt, x;
srand(time(NULL));
n = rand() % 100 + 1;
printf("输入你限定的最大次数:\n");
scanf("%d", &Cnt);
printf("输入你猜的数字:\n");
for (; cnt < Cnt; cnt++) {
scanf("%d", &x);
if (x <= 0) {
printf("这局重开\n");
break;
}
if (x == n) {
printf("猜对了\n");
break;
} else {
if (x > n)
printf("猜大了\n");
else
printf("猜小了\n");
}
}
if (cnt == 1)
printf("神来之笔\n");
else if (cnt > 1 && cnt <= 3)
printf("妙手回春\n");
else if (cnt > 3 && cnt < Cnt)
printf("绝境逢生\n");
else
printf("这局重开\n");
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int n,cnt=0,Cnt,x;
n=rand()%100+1;
cout<<"输入你限定的最大次数:"<<endl;
cin>>Cnt;
cout<<"输入你猜的数字:"<<endl;
for(;cnt<Cnt;cnt++){
cin>>x;
if(x<=0){
cout<<"这局重开"<<endl;
break; //符合条件则跳出
}
if(x==n){
cout<<"猜对了"<<endl;
break; //符合条件则跳出
}
else{
if(x>n)
cout<<"猜大了"<<endl;
else
cout<<"猜小了"<<endl;
}
}
if(cnt==1)
cout<<"神来之笔"<<endl;
else if(cnt>1 && cnt<=3)
cout<<"妙手回春"<<endl;
else if(cnt>3 && cnt<Cnt)
cout<<"绝境逢生"<<endl;
else
cout<<"这局重开"<<endl;
return 0;
}
本次仅呈现前三部分内容,前两部分风轻云淡,第三部分的循环就开始上难度了。
若是小白,推荐看看翁恺老师的系列课程,各大平台都有,很好找。
习题参考了这位道友的博客内容,其他内容皆是原创,附上对应链接-->
原文链接:https://blog.csdn.net/fjinhao/article/details/46853171