课后作业
# 第六课
# 1. 编写一个 C++
程序,提示用户输入整数、浮点数、字符三个值。使用 printf
进行输出打印,同时省略无意义的小数位部分
// 输入输出示例:
请输入一个整数: 1
请输入一个浮点数: 2.22
请输入一个字符: q
整数: 1,浮点数: 2.22,字符: q
- 你的答案
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int a;
float b;
char c;
printf("请输入一个整数: ");
cin >> a;
printf("请输入一个浮点数: ");
cin >> b;
printf("请输入一个字符: ");
cin >> c;
printf("整数: %d, 浮点数: %f, 字符: %s",a,b,&c);
return 0;
}
结果 打印错误
请输入一个整数: 1 请输入一个浮点数: 2.22 请输入一个字符: q 整数: 1, 浮点数: 2.220000, 字符: q
解析 本题考查对于
printf
的使用,printf
的格式化输出尤为重要
那么阅读题目可知需同时省略无意义的小数位部分,此项未完成,故此程序打印错误
应使用%g
或%G
: 自动选择%f
、%e
或%E
格式中输出宽度较小的一种,并省略无意义的小数位。
详见:printf参考答案
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
// 提示用户输入整数
int intValue;
cout << "请输入一个整数: ";
cin >> intValue;
// 提示用户输入浮点数
double floatValue;
cout << "请输入一个浮点数: ";
cin >> floatValue;
// 提示用户输入字符
char charValue;
cout << "请输入一个字符: ";
cin >> charValue;
// 使用printf输出,并使用 %g 自动选择较小输出宽度,并省略无意义的小数位
printf("整数: %d,浮点数: %g,字符: %c\n", intValue, floatValue, charValue);
return 0;
}
# 2. 编写一个 C++
程序,提示用户输入一行文本(最大长度 3
个字)。然后统计并输出其中的大写字母、小写字母、数字和其他字符的个数
// 输入输出示例:
请输入文本(最大长度3个字):1aA
大写字母个数:1
小写字母个数:1
数字个数:1
其他字符个数:0
- 你的答案
#include<iostream>
#include <cstdio>
using namespace std;
int main(){
char c;
int smallletters = 0, largeletters=0,digit = 0,other = 0;
cout << "请输入字符串:";
while ((c = getchar()) != '\n');
{
if (c >= 'a' && c <= 'z')
{
smallletters++;
}
else if (c >= 'A' && c <= 'Z')
{
largeletters++;
}
else if (c >= '0' && c <= '9')
{
digit++;
}
else
{
other++;
}
}
printf("大写字母个数: %d\n",largeletters);
printf("小写字母个数: %d\n",smallletters);
printf("数字个数: %d\n",digit);
printf("其他字符个数: ",other);
return 0;
}
结果 打印错误
main.cpp: In function ‘int main()’: main.cpp:38:16: warning: too many arguments for format [-Wformat-extra-args] 38 | printf("其他字符个数: ",other); | ^~~~~~~~~~~~~~~~ 请输入字符串:1aA 大写字母个数: 0 小写字母个数: 0 数字个数: 0 其他字符个数:
解析 本题考查对于
getchar
以及ASCII码
的使用
阅读题目可知最大输入3
字符且需判断每字节类型
那么此情况下使用getchar
逐个读取字符进行赋值更为快捷
同时使用ASCII码
的对应类型区间判断即可
作业答案错误之处在于错误使用while
语句,在其while
判断后加了;
破坏了其结构
本题使用循环语句进行操作的确可以节省操作,但对于未掌握语句建议使用已教学知识
同时在使用printf
打印时缺少最后语句的format
参数导致程序告警以及打印错误参考答案
#include <iostream>
using namespace std;
int main() {
char ch1, ch2, ch3;
// 提示用户输入文本
cout << "请输入文本(最大长度3个字):";
// 使用getchar逐个读取字符
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();
// 统计变量初始化
int uppercaseCount = 0, lowercaseCount = 0, digitCount = 0, otherCount = 0;
// 统计字符类型
if (ch1 >= 'A' && ch1 <= 'Z') {
uppercaseCount++;
} else if (ch1 >= 'a' && ch1 <= 'z') {
lowercaseCount++;
} else if (ch1 >= '0' && ch1 <= '9') {
digitCount++;
} else {
otherCount++;
}
if (ch2 >= 'A' && ch2 <= 'Z') {
uppercaseCount++;
} else if (ch2 >= 'a' && ch2 <= 'z') {
lowercaseCount++;
} else if (ch2 >= '0' && ch2 <= '9') {
digitCount++;
} else {
otherCount++;
}
if (ch3 >= 'A' && ch3 <= 'Z') {
uppercaseCount++;
} else if (ch3 >= 'a' && ch3 <= 'z') {
lowercaseCount++;
} else if (ch3 >= '0' && ch3 <= '9') {
digitCount++;
} else {
otherCount++;
}
// 输出统计结果
cout << "大写字母个数:" << uppercaseCount << endl;
cout << "小写字母个数:" << lowercaseCount << endl;
cout << "数字个数:" << digitCount << endl;
cout << "其他字符个数:" << otherCount << endl;
return 0;
}
# 3. 任意输入一个字符,判断其ASCII
是否是奇数,若是,输出YES
,否则,输出NO
。例如, 字符A
的ASCII
值是65
,则输出YES
,若输入字符B
(ASCII
值是66
),则输出NO
// 输入输出示例:
请输入一个字符: z
NO
- 你的答案
#include <stdio.h>
int main()
{
char c;
printf("请输入一个字符: ");
scanf("%c", &c);
if (c % 2 != 0) printf("YES");
else printf("NO");
return 0;
}
结果 打印正确
解析 本题考查对于使用
%
进行奇偶判断以及字符型变量在进行数学运算时,会隐式转换为对应的ASCII
值参考答案 无,答案程序输出完全正解
# 4. 给定一个整数,判断它能否被3
,5
,7
整除,并输出以下信息:
- 能同时被
3
,5
,7
整除(直接输岀3
5
7
,每个数中间一个空格); - 只能被其中两个数整除(输岀两个数,小的在前,大的在后。例如:
3
5
或者3
7
或者5
7
,中间用空格分隔); - 只能被其中一个数整除(输岀这个除数);
- 不能被任何数整除,输出小写字符
no
,不包括单引号。
// 输入输出示例:
// 示例1:
请输入一个整数: 105
3 5 7
// 示例2:
请输入一个整数: 15
3 5
// 示例3:
请输入一个整数: 14
7
// 示例4:
请输入一个整数: 8
no
- 你的答案
#include <stdio.h>
int main()
{
int n;
printf("请输入一个整数: ");
scanf("%d", &n);
if (n % 3 == 0) printf("3 ");
if (n % 5 == 0) printf("5 ");
if (n % 7 == 0) printf("7 ");
if (n % 3 != 0 && n % 5 != 0 && n % 7 != 0) printf("no");
return 0;
}
结果 打印正确
解析
本题考查对于if
条件语句的使用
题解无问题,对于条件判断是多种多样的,无定式,符合判断节点即可
对于作业答案可思考使用if-else链
下效果参考答案 无,答案程序输出完全正解
# 5.某商店进行促销活动,打折规则如下:购买金额在 100
元及以上的部分打 9
折,购买金额在 200
元及以上的部分打 8
折,购买金额在 300
元及以上的部分打 7
折。请编写程序,输入购买金额,然后输出实际支付金额(使用if
语句解答)。
// 输入输出示例:
// 示例1:
请输入购买金额:80
实际支付金额为:80
// 示例2:
请输入购买金额:120
实际支付金额为:108
// 示例3:
请输入购买金额:220
实际支付金额为:176
// 示例4:
请输入购买金额:350
实际支付金额为:245
// 示例5:
请输入购买金额:100
实际支付金额为:90
// 示例6:
请输入购买金额:200
实际支付金额为:160
// 示例7:
请输入购买金额:300
实际支付金额为:210
- 你的答案
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int money;
cout <<"请输入购买金额: ";
cin >>money;
if (money >= 100){
if (money >= 200){
if (money >= 300){
printf ("实际支付金额为: %d",money * 0.7);
}else{
printf ("实际支付金额为: %d",money * 0.8);
}
}else{
printf ("实际支付金额为: %d",money * 0.9);
}
}else{
printf ("实际支付金额为: %d",money);
}
return 0;
}
结果 打印错误
// 结果1: 请输入购买金额:80 实际支付金额为:80 // 结果2: 请输入购买金额:120 实际支付金额为:0 // 结果3: 请输入购买金额:220 实际支付金额为:0 // 结果4: 请输入购买金额:350 实际支付金额为:0 // 结果5: 请输入购买金额:100 实际支付金额为:0 // 结果6: 请输入购买金额:200 实际支付金额为:0 // 结果7: 请输入购买金额:300 实际支付金额为:0
解析 本题考查
if
条件语句嵌套使用
作业答案中if
条件语句嵌套并无错误,但输出错误且产生告警
应注意,在C++
中,当int
类型变量与float
类型变量进行运算时
会发生隐式类型转换。结果的类型将是更宽容(更高精度)的那个类型
如果使用%d
来输出float
类型,会导致不正确的内存解释
因为%d
是用于整数的格式化占位符。这可能导致输出错误或者未定义的行为
应考虑使用%f、%e、%g
输出参考答案
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int money;
cout << "请输入购买金额: ";
cin >> money;
double discount = 1.0; // 默认不打折
if (money >= 300) {
discount = 0.7;
} else if (money >= 200) {
discount = 0.8;
} else if (money >= 100) {
discount = 0.9;
}
double actualPayment = money * discount;
printf("实际支付金额为: %g", actualPayment);
return 0;
}