最近在复习C语言,目前学到了第七章,现将编程练习题及个人答案向各位分享,若在参考过程中发现有何问题或者有其他思路请评论或私信我,感谢各位!
1.编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。(我理解的是:输入一个字符,按下enter开始计数,直到输入#号并按下enter结束程序)
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int num_s = 0, num_e = 0, num_o = 0;
char ch = 0;
printf("请输入任意字符,我将为您反馈读取到的空格数、换行符数以及所有其他字符的数量(输入#时程序结束):");
while ((ch = getchar()) != '#')
{
if (ch == ' ')
{
num_s++;
}
else if (ch == '\n')
{
num_e++;
}
else
num_o++;
while (getchar() != '\n')//这一段程序就是解决输入行的剩余部分,它所做的工作就是读取并丢弃字符,防止其值被赋给ch
continue;
printf("请继续输入(输入#时程序结束):");
}
printf("您好,我所读取到的空格数为:%d,换行符数为%d,其他字符数为:%d\n", num_s, num_e, num_o);
return 0;
}
参考结果如下:
注意:程序中有一段关键的代码
while (getchar() != '\n')
continue;
这一段程序就是解决输入行的剩余部分,它所做的工作就是读取并丢弃字符,防止其值被赋给ch,即你在输入第一个值后按下Enter,你按下的这个Enter不会被计算进去。
2.编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。每行打印8个“字符-ASCII码”组合。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。(我理解的是:输入一个字符,按下enter开始计数,直到输入#号并按下enter开始按要求打印之前输入的字符,然后结束程序)
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SIZE 255
int main(void)
{
int i = 0, max = 0;
char ch[SIZE] = { 0 };
printf("请输入任意字符,我将为您打印每个输入的字符及其对应的ASCII码(输入#时程序结束):");
for (i = 0; (ch[i] = getchar()) != '#'; i++)//读取并储存字符
{
max = i;
while (getchar() != '\n')
continue;
printf("请继续输入:");
}
for (i = 1; i <= max + 1; i++)//i从1开始计数,避免0 % 8 = 0,导致在第一个字符处换行
{
printf("%c-%d ", ch[i - 1], ch[i - 1]);
if (i % 8 == 0)
{
printf("\n");
}
}
return 0;
}
参考结果如下:
注意:根据个人对题目的理解不同,得到的答案也不尽相同,我的程序仅供参考。
3.编写一个程序,读取整数直到用户输入0。输入结束后,程序应报告用户输入的偶数(不包括0)个数、这些偶数的平均值、输入的奇数个数及其奇数的平均值。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int num_imput = 0, e_num = 0, o_num = 0;
float a_e_num = 0, a_o_num = 0;
do {
printf("请输入整数,我将为您统计奇数和偶数的数量及其各自的平均值(输入0结束程序):");
scanf("%d", &num_imput);
if (num_imput == 0)
{
break;
}
if (num_imput % 2 == 0)
{
a_e_num += num_imput;
e_num++;
}
if (num_imput % 2 == 1)
{
a_o_num += num_imput;
o_num++;
}
} while (1);
printf("您所输入的偶数个数为:%d,平均数约为:%.2f\n您所输入的奇数个数为:%d,平均数约为:%.2f\n", e_num, a_e_num / e_num, o_num, a_o_num / o_num);
return 0;
}
参考结果如下:
注意:由于此题输入的数据类型只有整数,所以相比于1题和2题而言,处理要简单许多。
4.使用if else语句编写一个程序读取输入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int i = 0;
char ch = 0;
printf("请输入,我将用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换(输入#号结束程序):");
while ((ch = getchar()) != '#')
{
if (ch == '.')
{
putchar('!');
i++;
continue;
}
else if (ch == '!')
{
printf("!!");
i++;
continue;
}
else
putchar(ch);
}
printf("\n根据我的计算,总共进行了%d次替换。\n", i);
return 0;
}
参考结果如下:
5.使用switch重写练习4。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int i = 0;
char ch = 0;
printf("请输入,我将用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换(输入#号结束程序):");
while ((ch = getchar()) != '#')
{
switch (ch)
{
case '.':
putchar('!');
i++;
break;
case '!':
printf("!!");
i++;
break;
default:
putchar(ch);
}
}
printf("\n根据我的计算,总共进行了%d次替换。\n", i);
return 0;
}
参考结果如下:
6.编写程序读取输入,读到#停止,报告ei出现的次数。(注意:该程序要记录前一个字符和当前字符。用“Receive your eieio award”这样的输入来测试。)
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int i = 0, sum = 0;
char ch = 0;
printf("请输入,我将为您统计输入的内容中ei出现的次数(输入#号结束程序):");
while ((ch = getchar()) != '#')
{
if (ch == 'e')
{
i = 1;
}
else if (ch == 'i' && i == 1)
{
i = 2;
sum++;
}
else
i = 0;
}
printf("\nei出现的次数为:%d\n", sum);
return 0;
}
参考结果如下:
7.编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:
a.基本工资 = 10.00 美元/ 小时
b.加班(超过40 小时) = 1.5 倍的时间
c.税率: 前300 美元为15%
续150 美元为20%
余下的为25%
用#define 定义符号常量。不用在意是否符合当前的税法。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define BASE_SALARY 10.00
#define BASETIME 40
#define OVERTIME_SALARY 15
int main(void)
{
const float F_TAX = 0.15;
const float S_TAX = 0.20;
const float T_TAX = 0.25;
float hour = 0.0, salary = 0.0, tax = 0.0, income = 0.0;
printf("请输入您一周工作的小时数:");
scanf("%f", &hour);
if (hour <= BASETIME)
{
salary = BASE_SALARY * hour;
if (salary <= 300)
{
tax = salary * F_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
else
{
tax = 300 * F_TAX + (salary - 300) * S_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
}
if (hour > BASETIME)
{
salary = BASE_SALARY * BASETIME + OVERTIME_SALARY * (hour - BASETIME);
if (salary <= 450)
{
tax = 300 * F_TAX + (salary - 300) * S_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
else
{
tax = 300 * F_TAX + 150 * S_TAX + (salary - 450) * T_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
}
return 0;
}
参考结果如下:
注意:程序本身不复杂,梳理好有几个分支点就行。
8.修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:
*****************************************************************
Enter the number corresponding to the desired pay rate or action:
1) $8.75/hr 2) $9.33/hr
3) $10.00/hr 4) $11.20/hr
5) quit
*****************************************************************
如果选择1~4其中的一个数字,程序应该询问用户工作的小时数。程序要通过循环运行,除非用户输入5。如果输入1~5以外的数字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。使用#define创建符号常量表示各工资等级和税率。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define BASETIME 40
#define OVERTIME_SALARY 15
#define SALARY_LEVEL_1 8.75
#define SALARY_LEVEL_2 9.33
#define SALARY_LEVEL_3 10.00
#define SALARY_LEVEL_4 11.20
int main(void)
{
const float F_TAX = 0.15;
const float S_TAX = 0.20;
const float T_TAX = 0.25;
int level = 0;
float hour = 0.0, salary = 0.0, tax = 0.0, income = 0.0, base_salary = 0.0;
printf("***************************************************\n");
printf("现有以下几个工资等级供您选择(选择数字5结束程序):\n");
printf("1) $8.75/hr 2) $9.33/hr\n3) $10.00/hr 4) $11.20/hr\n5) quit\n");
printf("***************************************************\n");
printf("请输入输入数字以选择您的工资等级:");
while(scanf("%d", &level) == 1)
{
switch (level)
{
case 1:
base_salary = SALARY_LEVEL_1;
break;
case 2:
base_salary = SALARY_LEVEL_2;
break;
case 3:
base_salary = SALARY_LEVEL_3;
break;
case 4:
base_salary = SALARY_LEVEL_4;
break;
case 5:
break;
default:
printf("错误,请重新输入:");
continue;
}
break;
}
if (level != 5)
{
printf("请输入您一周工作的小时数:");
scanf("%f", &hour);
}
if (hour <= BASETIME && level != 5)
{
salary = base_salary * hour;
if (salary <= 300)
{
tax = salary * F_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
else
{
tax = 300 * F_TAX + (salary - 300) * S_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
}
if (hour > BASETIME && level != 5)
{
salary = base_salary * BASETIME + OVERTIME_SALARY * (hour - BASETIME);
if (salary <= 450)
{
tax = 300 * F_TAX + (salary - 300) * S_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
else
{
tax = 300 * F_TAX + 150 * S_TAX + (salary - 450) * T_TAX;
income = salary - tax;
printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
}
}
printf("\n程序结束,感谢您的使用!\n");
return 0;
}
参考结果如下:
9.编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int num_1 = 0, num_2 = 0, i = 0, j = 0, mark_1 = 0, mark_2 = 0;
printf("请输入一个正整数,我将为您显示所有小于和等于该数的素数(输入非数字结束程序):");
while (scanf("%d", &num_1) == 1)
{
if (num_1 > 0)
break;
else
{
printf("错误,请重新输入:");
continue;
}
break;
}
for (i = 2; i <= num_1; mark_1 = 0, i++)//第一个循环的作用为遍历所有小于或等于输入数字的数字
{
for (j = 1; j <= i; j++)//此循环的作用为判断第一个循环里的数字是否是质数
{
if (i % j == 0)
{
mark_1++;
}
}
if (mark_1 == 2)
{
printf("%5d ", i);
mark_2++;
if (mark_2 % 8 == 0)//每8个数字换行,便于查看对比
{
printf("\n");
}
}
}
return 0;
}
参考结果如下:
10.1988年的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。下面是该税收计划的摘要(美元数为应征税的收入):
类别 | 税金 |
单身 | 17850美元按15%计,超出部分按28%计 |
户主 | 23900美元按15%计,超出部分按28%计 |
已婚,共有 | 29750美元按15%计,超出部分按28%计 |
已婚,离异 | 14875美元按15%计,超出部分按28%计 |
例如,一位工资为20000美元的单身纳税人,应缴纳税费0.15×17850+0.28×(20000−17850)美元。编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。程序应通过循环让用户可以多次输入。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SALARY_TYPE_1 17850
#define SALARY_TYPE_2 23900
#define SALARY_TYPE_3 29750
#define SALARY_TYPE_4 14875
int main(void)
{
int type = 0;
float salary = 0.0, tax = 0.0;
printf("*******************************\n");
printf("1)单身 2)户主\n3)已婚,共有 4)已婚,离异\n5)退出\n");
printf("*******************************\n");
printf("请选择您的类别:");
while (scanf("%d", &type) == 1)
{
switch (type)
{
case 1:
printf("您需要缴纳税金的种类为:单身 17850美元按15%%计,超出部分按28%%计\n");
printf("请输入您的薪水,我将为您计算应缴纳的税金:");
scanf("%f", &salary);
if (salary <= SALARY_TYPE_1)
{
tax = salary * 0.15;
}
else
{
tax = SALARY_TYPE_1 * 0.15 + (salary - SALARY_TYPE_1) * 0.28;
}
printf("您需要缴纳的税金为:%.2f\n", tax);
break;
case 2:
printf("您需要缴纳税金的种类为:户主 23900美元按15%%计,超出部分按28%%计\n");
printf("请输入您的薪水,我将为您计算应缴纳的税金:");
scanf("%f", &salary);
if (salary <= SALARY_TYPE_2)
{
tax = salary * 0.15;
}
else
{
tax = SALARY_TYPE_2 * 0.15 + (salary - SALARY_TYPE_2) * 0.28;
}
printf("您需要缴纳的税金为:%.2f\n", tax);
break;
case 3:
printf("您需要缴纳税金的种类为:已婚,共有 29750美元按15%%计,超出部分按28%%计\n");
printf("请输入您的薪水,我将为您计算应缴纳的税金:");
scanf("%f", &salary);
if (salary <= SALARY_TYPE_3)
{
tax = salary * 0.15;
}
else
{
tax = SALARY_TYPE_3 * 0.15 + (salary - SALARY_TYPE_3) * 0.28;
}
printf("您需要缴纳的税金为:%.2f\n", tax);
break;
case 4:
printf("您需要缴纳税金的种类为:已婚,离异 14875美元按15%%计,超出部分按28%%计\n");
printf("请输入您的薪水,我将为您计算应缴纳的税金:");
scanf("%f", &salary);
if (salary <= SALARY_TYPE_4)
{
tax = salary * 0.15;
}
else
{
tax = SALARY_TYPE_4 * 0.15 + (salary - SALARY_TYPE_4) * 0.28;
}
printf("您需要缴纳的税金为:%.2f\n", tax);
break;
case 5:
break;
default:
printf("错误,请重新输入:");
continue;
}
if (type == 5)
{
break;
}
printf("请选择您的类别:");
}
printf("\n程序结束!感谢您的使用!\n");
return 0;
}
参考结果如下:
11.ABC邮购杂货店出售的洋蓟售价为2.05美元/磅,甜菜售价为1.15美元/磅,胡萝卜售价为1.09美元/磅。在添加运费之前,100美元的订单有5%的打折优惠。少于或等于5磅的订单收取6.5美元的运费和包装费,5磅~20磅的订单收取14美元的运费和包装费,超过20磅的订单在14美元的基础上每续重1磅增加0.5美元。编写一个程序,在循环中用switch 语句实现用户输入不同的字母时有不同的响应,即输入a 的响应是让用户输入洋蓟的磅数,b 是甜菜的磅数,c 是胡萝卜的磅数,q 是退出订购。程序要记录累计的重量。即,如果用户输入4磅的甜菜,然后输入5磅的甜菜,程序应报告9磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。
参考代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define ARTICHOKE_PRICE 2.05
#define BEET_PRICE 1.15
#define CARROT_PRICE 1.09
#define F_LEVEL 5
#define S_LEVEL 20
int main(void)
{
char type = 0;
float a_num = 0.0, b_num = 0.0, c_num = 0.0;
float t_a_num = 0.0, t_b_num = 0.0, t_c_num = 0.0;
float a_price = 0.0, b_price = 0.0, c_price = 0.0;
float t_weight = 0.0, price = 0.0, dc_price = 0.0, t_e = 0.0, g_price = 0.0;
printf("*******************\n");
printf("a)洋蓟 2.05美元/磅\nb)甜菜 1.15美元/磅\nc)胡萝卜 1.09美元/磅\n输入q退出订购,并且我将为您计算并显示所有的购买信息\n");
printf("*******************\n");
printf("请选择您要订购的货物:");
while (scanf("%c", &type) == 1)
{
switch (type)
{
case 'a':
printf("请输入您所需要的洋蓟磅数:");
scanf("%f", &a_num);
t_a_num += a_num;
break;
case 'b':
printf("请输入您所需要的甜菜磅数:");
scanf("%f", &b_num);
t_b_num += b_num;
break;
case 'c':
printf("请输入您所需要的胡萝卜磅数:");
scanf("%f", &c_num);
t_c_num += c_num;
break;
case 'q':
break;
default:
printf("错误,请重新输入:");
while (getchar() != '\n')
continue;
continue;
}
if (type == 'q')
{
printf("订购结束,接下来我将为您计算并显示所有信息:\n");
break;
}
while (getchar() != '\n')
continue;
printf("请选择您要订购的货物:");
}
t_weight = t_a_num + t_b_num + t_c_num;
a_price = t_a_num * ARTICHOKE_PRICE;
b_price = t_b_num * BEET_PRICE;
c_price = t_c_num * CARROT_PRICE;
price = a_price + b_price + c_price;
if (t_weight >= 100)
dc_price = (t_a_num * ARTICHOKE_PRICE + t_b_num * BEET_PRICE + t_c_num * CARROT_PRICE) * 0.05;
if (t_weight <= F_LEVEL)
t_e = 6.5;
else if (t_weight > F_LEVEL && t_weight <= S_LEVEL)
t_e = 14;
else
t_e = 14 + (t_weight - 20) * 0.5;
g_price = price - dc_price + t_e;
printf("洋蓟的售价为:%.2f美元/磅,甜菜的售价为:%.2f美元/磅,胡萝卜的售价为:%.2f美元/磅\n", ARTICHOKE_PRICE, BEET_PRICE, CARROT_PRICE);
printf("您订购的洋蓟的重量为:%.2f磅,甜菜的重量为%.2f磅,胡萝卜的重量为:%.2f磅\n", t_a_num, t_b_num, t_c_num);
printf("您订购的洋蓟的费用为: %.2f美元,甜菜的费用为:%.2f美元,胡萝卜的费用为:%.2f美元\n", a_price, b_price, c_price);
printf("订购蔬菜的费用为:%.2f美元,折扣为:%.2f美元,运费和包装费为:%.2f美元,总费用为:%.2f美元\n", price, dc_price, t_e, g_price);
return 0;
}
参考结果如下:
总结:程序不难,关键是理解题目中的需求来编写程序,如果各位在参考过程中发现有问题欢迎评论和私信,谢谢各位!