课后作业

2023/11/24

# 第六课

# 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。例如, 字符AASCII值是65,则输出YES,若输入字符BASCII值是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;
}
上次更新: 2024-10-19 10:01:51