目录
7.12.1
编写一个程序,读到#字符停止,然后报告读取的空格数,换行符数和所有其他字符的数量。
/*7.12.1. 编写一个程序,读到#字符停止,然后报告读取的空格数,换行符数和所有其
他字符的数量。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch;
int i = 0; //空格数
int n = 0; //换行符数
int k = 0; //其他字符数
while ((ch = getchar()) != '#')
{
if (ch == ' ')
i++;
else if (ch == '\n')
n++;
else
k++;
}
printf("空格数:%d,换行符数:%d,其他字符数:%d", i, n, k);
return 0;
}
运行结果:
7.12.2
编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASKII码(十进制)。每行打印8个“字符-ASKII码”组合。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
/*7.12.2. 编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的
ASKII码(十进制)。每行打印8个“字符-ASKII码”组合。建议:使用字符计数和求模运算符
(%)在每8个循环周期时打印一个换行符。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch;
int n = 0; //字符数
while ((ch = getchar()) != '#')
{
n++;
printf("%c:%d ", ch, ch);
if (n % 8 == 0)
{
printf("\n");
}
}
return 0;
}
运行结果:
7.12.3
编写一个程序,读取整数直到用户输入0。输入结束后,程序应报告用户输入的偶数(不包括0)个数,这些偶数的平均值、输入的奇数个数及其奇数的平均值。
/*7.12.3. 编写一个程序,读取整数直到用户输入0。输入结束后,程序应报告用户输入的
偶数(不包括0)个数,这些偶数的平均值、输入的奇数个数及其奇数的平均值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int num;
int even_n = 0 ; //偶数个数
int odd_n = 0; //奇数个数
float s_even = 0.0; //所有偶数的和
float s_odd = 0.0; //所有奇数的和
while (((scanf("%d", &num) == 1)) && num != 0)
{
if (num % 2 == 0)
{
s_even += num;
++even_n;
}
else
{
s_odd += num;
++odd_n;
}
}
printf("偶数个数 = %d\n奇数个数 = %d\n偶数平均值 = %.1f\n奇数平均值 = %.1f\n",
even_n, odd_n, s_even / even_n, s_odd / odd_n);
return 0;
}
运行结果:
7.12.4
使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进了多少次替换。
/*7.12.4. 使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个
感叹号替换原来的感叹号,最后报告进了多少次替换。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch;
char a = 0; //转换次数
while ((ch = getchar()) != '#')
{
if (ch == '.')
{
ch = '!';
++a;
}
if (ch == '!')
{
ch = '!!';
++a;
}
}
printf("一共转换了:%d 次\n", a);
return 0;
}
运行结果:
7.12.5
用switch重写练习4。(练习4:使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进了多少次替换。)
/*7.12.5. 用switch重写练习4。*/
/*7.12.4. 使用if else 语句编写一个整数读入,读到#停止。用感叹号替换句号,用两个
感叹号替换原来的感叹号,最后报告进了多少次替换。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch;
char a = 0; //转换次数
while ((ch = getchar()) != '#')
{
switch (ch)
{
case '.':
ch = '!';
++a;
case '!':
ch = '!!';
++a;
break;
default:
break;
}
}
printf("一共转换了:%d 次\n", a);
return 0;
}
运行结果:
7.12.6
编写程序读入输入,读到#停止,报告ei出现的次数。注意:该程序要记录前一个字符和当前字符。用"Receive your eieio award"这样的输入来测试。
/*7.12.6. 编写程序读入输入,读到#停止,报告ei出现的次数。注意:该程序要记录前
一个字符和当前字符。用"Receive your eieio award"这样的输入来测试。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define STOP '#'
int main(void)
{
char ch; //当前字符
char pre_ch = 0; //前一个字符
int n = 0; //计数
while ((ch = getchar()) != '#')
{
//if ((ch == 'i') && (pre_ch == 'e')) //两种写法都行
if((pre_ch == 'e') && (ch == 'i'))
{
n++;
}
pre_ch = ch;
}
printf("ei出现的次数:%d\n", n);
return 0;
}
运行结果:
7.12.7
编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
续150美元为20%
余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。
/*7.12.7. 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
续150美元为20%
余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define BASE_PAY 10 //基本工资
#define OVERTIME 1.5 //加班时间系数
#define BREAK1 300 //税率的第1个临界点
#define BREAK2 450 //税率的第1个临界点
#define RATE1 0.15 //前300美元的税率
#define RATE2 0.2 //续150美元的税率
#define RATE3 0.25 //大于450美元的税率
int main(void)
{
double h; //一周工作的小时数
double all_pay; //工资总额
double over_pay; //加班费
double rate; //税金
double net_in; //净收入
printf("请输入一周工作的小时数:");
scanf("%lf", &h);
while (h < 0) //此循环用来确保输入的小时数大于0
{
printf("请输入一周工作的小时数(h>0):");
scanf("%lf", &h);
}
if (h > 40)
{
over_pay = ((h - 40) * OVERTIME) * BASE_PAY;
all_pay = over_pay + 40 * (double)BASE_PAY;
}
else
all_pay = h * BASE_PAY;
if (all_pay <= BREAK1)
rate = all_pay * RATE1;
//rate = all_pay * 0.15
else if ((all_pay > BREAK1) && (all_pay <= BREAK2))
rate = (BREAK1 * RATE1) + ((all_pay - BREAK1) * RATE2);
//rate = (300 * 0.15) + ((all_pay - 300) * 0.2)
else
rate = (BREAK1 * RATE1) + (((double)BREAK2 - (double)BREAK1) * RATE2) +
((all_pay - BREAK2) * RATE3);
//rate = (300 * 0.15) + ((450-300)*0.2) + ((all_pay - 450) * 0.25)
net_in = all_pay - rate;
printf("一周工作%.1lf小时,工资总额=%.1lf美元, 税金=%.1lf美元, 净收入=%.1lf美元\n",
h, all_pay, rate, net_in);
return 0;
}
运行结果:
7.12.8
修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:
printf("********************************************");
printf("1) $8.75/hr 2) $9.33/hr");
printf("3) $10.00/hr 4) $11.2/hr");
printf("5) quit");
printf("********************************************");
如果选择1~4其中的数字,程序应该询问用户工作的小时数。程序要通过循环运行,除非用户输入5。如果输入1~5之外的数字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。使用#define创建符号常量表示各工资等级和税率。
/*7.12.8. 修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。
使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:
printf("********************************************");
printf("1) $8.75/hr 2) $9.33/hr");
printf("3) $10.00/hr 4) $11.2/hr");
printf("5) quit");
printf("********************************************");
如果选择1~4其中的数字,程序应该询问用户工作的小时数。程序要通过循环运行,除非用户输入5。
如果输入1~5之外的数字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。
使用#define创建符号常量表示各工资等级和税率。*/
/*7.12.7. 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。
做如下假设:
a.基本工资=10美元/小时
b.加班(超过40小时)= 1.5倍的时间
c.税率:前300美元为15%
续150美元为20%
余下的为25%
用#define定义常量符号。不用在意是否符合当前的税法。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#define BASE_PAY 10 //基本工资
#define OVERTIME 1.5 //加班时间系数
#define BREAK1 300 //税率的第1个临界点
#define BREAK2 450 //税率的第1个临界点
#define RATE1 0.15 //前300美元的税率
#define RATE2 0.2 //续150美元的税率
#define RATE3 0.25 //大于450美元的税率
void base_menu();
int main(void)
{
double h = -1; //一周工作的时间(初始值设为负数,是为了后面直接进入while循环)
int lever = 0; //工资等级
double base_pay = 0; //基本工资
double all_pay; //工资总额
double over_pay; //加班费
double rate; //税金
double net_in; //净收入
do
{
begin:
base_menu();
printf("请选择工资等级(1-4):");
scanf("%d", &lever);
while (getchar()!= '\n') //getchar()用来清空缓冲区
; //空字符用来占位
switch (lever)
{
case 1: base_pay = 8.75;
break;
case 2: base_pay = 9.33;
break;
case 3: base_pay = 10.00;
break;
case 4: base_pay = 11.2;
break;
case 5: printf("结束程序\n");
goto end; //输入5,直接程序结束
default:
printf("请输入正确的选项!\n");
goto begin; //输入1-5以外的,重新打印菜单,选择工资等级
}
} while (5 == lever);
while (h < 0) //此循环用来确保输入的小时数大于0
{
printf("请输入一周工作的小时数(h>0):");
scanf("%lf", &h);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
}
if (h > 40)
{
over_pay = ((h - 40) * OVERTIME) * base_pay;
all_pay = over_pay + 40 * base_pay;
}
else
{
all_pay = h * base_pay;
}
if (all_pay <= BREAK1)
rate = all_pay * RATE1;
//rate = all_pay * 0.15
else if ((all_pay > BREAK1) && (all_pay <= BREAK2))
rate = (BREAK1 * RATE1) + ((all_pay - BREAK1) * RATE2);
//rate = (300 * 0.15) + ((all_pay - 300) * 0.2)
else
rate = (BREAK1 * RATE1) + (((double)BREAK2 - (double)BREAK1) * RATE2) +
((all_pay - BREAK2) * RATE3);
//rate = (300 * 0.15) + ((450-300)*0.2) + ((all_pay - 450) * 0.25)
net_in = all_pay - rate;
printf("一周工作%.1lf小时,工资总额=%.1lf美元, 税金=%.1lf美元, 净收入=%.1lf美元\n",
h, all_pay, rate, net_in);
end:
return 0;
}
void base_menu()
{
printf("********************************************\n");
printf("1) $8.75/hr 2) $9.33/hr\n");
printf("3) $10.00/hr 4) $11.2/hr\n");
printf("5) quit\n");
printf("********************************************\n");
}
运行结果:
7.12.9
编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
解析:sqrt() 是开平方函数,需要引用头文件#include<math.h>
m = a * b
a和b中一定至少有一个数字是 <= 开平方m的
比如 16开平方等于4,16 = 2*8 = 4*4,所以判断到4就可以不用往后判断了
/*7.12.9. 编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main(void)
{
int num = 0;
int i = 0;
int k = 0;
int flag = 1; //假设返回1,是素数,返回0,不是素数
printf("请输入一个正整数:");
scanf("%d", &num);
while (num <= 0) //0既不是正数也不是负数,所以也不是正整数
{
printf("请输入一个正整数:");
scanf("%d", &num);
}
for (i = 2; i <= num; i++)
{
for (k = 2; k <= sqrt(i); k++)
//sqrt() 是开平方函数,需要引用头文件#include<math.h>
// m = a * b
//a和b中一定至少有一个数字是 <= 开平方m的
//比如 16开平方等于4,16 = 2*8 = 4*4,所以判断到4就可以不用往后判断了
//此处可写 k<i,但是 k<=sqrt(i) 计算步骤少一些
{
if (i % k == 0)
{
flag = 0;
break;
}
else
{
flag = 1;
}
}
if (flag == 1)
printf("%d是素数\n", i);
}
return 0;
}
运行结果:
7.12.10
1988年的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。
下面是该税收计划的摘要(美元数为应征税的收入):
类别 税金
单身 17850美元按15%计,超出部分按28%计
户主 23900美元按15%计,超出部分按28%计
已婚,共有 29750美元按15%计,超出部分按28%计
已婚,离异 14875美元按15%计,超出部分按28%计
例如,一位工资为20000美元的单身纳税人,应缴纳税费为0.15*17850+0.28*(20000-17850)元。编写一个程序,让用户指定缴纳税金的种类和应缴纳收入,然后计算税金。程序应通过循环让用户可以多次输入。
/*7.12.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 1
#include<stdio.h>
#define RATE1 0.15 //第1档税率
#define RATE2 0.28 //第2档税率
#define SINGLE 17850 //单身起征点
#define OWNER 23900 //户主起征点
#define COMMON 29750 //已婚共有起征点
#define DEVORCE 14875 //离异起征点
void menu();
int main(void)
{
int lever; //交税种类
double base; //起征点
double income = -1; //收入(初始值设为负数,是为了后面直接进入while循环)
double taxes; //缴税
do
{
begin:
menu();
printf("请选择缴纳税金的种类:");
scanf("%d", &lever);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
switch (lever)
{
case 1: base = SINGLE;
break;
case 2: base = OWNER;
break;
case 3: base = COMMON;
break;
case 4: base = DEVORCE;
break;
case 5: printf("结束程序\n");
goto end; //输入5,直接程序结束
default:
printf("请输入正确的选项!\n");
goto begin; //输入1-5以外的,重新打印菜单,选择税金种类
}
} while (5 == lever);
while (income < 0) //此循环用来确保输入的收入大于0
{
printf("请输入您的收入(大于0):");
scanf("%lf", &income);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
}
if (income <= base) //收入小于等于起征点时
taxes = income * RATE1; //税金 = 收入 * 0.15;
else //收入大于起征点时
taxes = base * RATE1 + (income - base) * RATE2;
//税金 = 起征点 * 0.15 + (收入 - 起征点) * 0.28;
printf("种类%d需要缴纳的税金是:%.1lf", lever, taxes);
end:
return 0;
}
void menu()
{
printf("********************************************\n");
printf("1) SINGLE 17850 2) OWNER 23900\n");
printf("3) COMMON 29750 4) DEVORCE 14875\n");
printf("5) quit\n");
printf("********************************************\n");
}
运行结果:
7.12.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磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。
/*7.12.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 1
#include<stdio.h>
#define PRICE1 2.05 //洋蓟的售价
#define PRICE2 1.15 //甜菜的售价
#define PRICE3 1.09 //胡萝卜售价
#define PACK_P1 6.5 //<=5磅订单收的运费和包装费
#define PACK_P2 14 //大于5小于等于20磅订单收的运费和包装费
#define PACK_E 0.5 //14元基础上,大于20磅订单收的运费和包装费
#define DISCOUNT 0.05 //5%的打折优惠
void menu();
int main(void)
{
char type; //品种类型
double weight_a; //单次订购洋蓟重量
double weight_b; //单次订购甜菜重量
double weight_c; //单次订购胡萝卜重量
double sum_a = 0; //洋蓟总重量
double sum_b = 0; //甜菜总重量
double sum_c = 0; //胡萝卜总重量
double sum_total = 0; //总重量
double sum_price = 0; //订购的蔬菜总费用
double pack = 0; //包装费和运费
double total = 0; //订单总费用
double discount = 0; //折扣
do
{
menu();
printf("请选择需要订购的品种:");
scanf("%c", &type);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
switch (type)
{
case 'a': printf("请输入洋蓟的磅数:");
scanf("%lf", &weight_a);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
sum_a += weight_a;
break;
case 'b': printf("请输入甜菜的磅数:");
scanf("%lf", &weight_b);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
sum_b += weight_b;
break;
case 'c': printf("请输入胡萝卜的磅数:");
scanf("%lf", &weight_c);
while (getchar() != '\n') //getchar()用来清空缓冲区
; //空字符用来占位
sum_c += weight_c;
break;
case 'q': printf("退出订购\n");
break;
default:
printf("请输入正确的指示!\n");
break;
}
} while (type != 'q');
sum_total = sum_a + sum_b + sum_c;
sum_price = sum_a * PRICE1 + sum_b * PRICE2 + sum_c * PRICE3;
if (sum_total <= 5)
pack = PACK_P1;
else if (sum_total > 5 && sum_total <= 20)
pack = PACK_P2;
else if (sum_total > 20)
pack = PACK_P2 + (sum_total - 20) * 0.5;
if (sum_price > 100)
discount = sum_price * DISCOUNT;
total = sum_price + pack - discount;
printf("洋蓟的售价是 %.2lf 美元, 甜菜的售价是 %.2lf 美元, 胡萝卜的售价是 %.2lf 美元\n",
PRICE1, PRICE2, PRICE3);
printf("订购的洋蓟重量是 %.2lf 磅, 订购的甜菜重量是 %.2lf 磅, 订购的胡萝卜重量是 %.2lf 磅\n",
sum_a, sum_b, sum_c);
printf("订购的总重量是 %.2lf 磅,订购的蔬菜费用是 %.2lf 美元\n",
sum_total, sum_price);
printf("运费和包装费是 %.2lf 美元,折扣是 %.2lf 美元\n",
pack, sum_price > 100 ? discount : 0);
printf("费用总额是 %.2lf 美元\n", total);
return 0;
}
void menu()
{
printf("*****************************************\n");
printf("a)洋蓟 b)甜菜\n");
printf("c)胡萝卜 q)退出订购\n");
printf("*****************************************\n");
}
运行结果: