文章目录
- 7.12.1
- 7.12.2
- 7.12.3
- 7.12.4
- 7.12.5
- 7.12.6
- 7.12.7
- 7.12.8
- 7.12.9
- 7.12.10
- 7.12.11
7.12.1
/**
***编写一个程序,读到#字符停止,然后报告读取的空格数,换行符数和其他字符的数量
**/
#include <stdio.h>
#include <ctype.h>
int main()
{
char ch;
int sc = 0; // space数
int nc = 0; // \n数
int oc = 0; // other字符数
printf("Please enter, # to quit -> ");
while ((ch = getchar()) != '#')
{
if (ch == '#')
break;
else
{
if (ch == ' ')
sc++;
else if (ch == '\n')
nc++;
else
oc++;
}
}
printf("%d space,%d enter,%d other", sc, nc, oc);
return 0;
}
7.12.2
/**
***编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCLL码(十进制)。
***一行打印8个字符。建议:使用字符计数和求模运算符%,在每8个循环周期时打印一个换行符。
**/
#include <stdio.h>
int main()
{
char ch; //输入字符
int i = 0; //循环变量
while ((ch = getchar()) != '#' && ch != '\n')
{
printf("%c %3d\t", ch, ch);
i++;
if (i % 8 == 0)
printf("\n");
}
return 0;
}
7.12.3
/**
***编写一个程序,读取整数直到用户输入0。
***输入结束后,程序应报告用户输入的偶数(不包括0)个数。这些偶数平均值、输入的奇数个数及平均值。
**/
#include <stdio.h>
int main()
{
int i_num; //输入的数
int i_even_num = 0; //偶数个数
int i_even_average; //偶数平均值
int i_even_sum = 0; //偶数总数
int i_odd_num = 0; //奇数个数
int i_odd_average; //奇数平均值
int i_odd_sum = 0; //奇数总数
printf("\nPlease enter the number ( 0 to quit) -> ");
while (scanf("%d", &i_num) == 1)
{
if (i_num == 0)
break;
if (i_num % 2 == 0) //如果输入的数能被2整除
{
i_even_num++; //偶数个数递增
i_even_sum = i_even_sum + i_num; //偶数总和等于自身+输入的偶数
i_even_average = i_even_sum / i_even_num; //偶数平均值 = 偶数总数/偶数个数
}
else //输入的数不能被2整除
{
i_odd_num++; //奇数个数递增
i_odd_sum = i_odd_sum + i_num; //与偶数同理
i_odd_average = i_odd_sum / i_odd_num; //与偶数同理
}
}
printf("The even number have %d, average is %d.\n\n", i_even_num, i_even_average);
printf("The odd number have %d, average is %d.\n", i_odd_num, i_odd_average);
return 0;
}
7.12.4
/**
***使用 if else 语句编写一个程序读取输入,读到 # 停止。用感叹号替换句号,用两个感叹号替换原来的感叹号
***最后报告进行了多少次替换。
**/
#include <stdio.h>
int main()
{
char ch;
int change = 0;
while ((ch = getchar()) != '#')
{
if (ch == '.')
{
printf("!");
change++;
}
else if (ch == '!')
{
printf("!!");
change++;
}
else
putchar(ch);
}
printf("It's change %d time.", change);
return 0;
}
7.12.5
/**
***使用 switch 语句编写一个程序读取输入,读到 # 停止。用感叹号替换句号,用两个感叹号替换原来的感叹号
***最后报告进行了多少次替换。
**/
#include <stdio.h>
int main()
{
char ch;
int change = 0;
while ((ch = getchar()) != '#')
{
switch (ch)
{
case '.':
printf("!");
change++;
break;
case '!':
printf("!!");
change++;
break;
default:
putchar(ch);
}
}
printf("It's change %d time.", change);
return 0;
}
7.12.6
/**
***编写程序读取输入,读到 # 停止, 报告 ei 出现的次数。
*** 【注意】
*** 该程序要记录前一个字符和当前字符。用“Receive your eieio award”这样的输入来测试。
**/
#include <stdio.h>
int main()
{
char ch;
char prev = 0;
int i = 0;
while ((ch = getchar()) != '#')
{
if (ch == 'i' && prev == 'e')
i++;
prev = ch;
}
printf(" ei 一共出现了%d次", i);
return 0;
}
7.12.7
/**
***编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金、净收入。做如下假设:
*** a.基本工资 = 100美元/小时
*** b.加班(超过40小时) = 1.5倍时间
*** c.税率: 前300美元为15%
*** 续150美元为20%
*** 余下的25%
***
***用define定义符号的常量。
**/
#include <stdio.h>
#define WORK_TIME 40 //一周正常工作时间
#define HOUR_SALARY 100 //每个小时薪资: 美元/时
#define SALARY1 WORK_TIME *HOUR_SALARY //一周满工时的基本工资。40*100=4000美元
int main()
{
const double TAX1 = 300 * 0.15; //0~300美元的纳税金
const double TAX2 = 150 * 0.2; //301~450美元的纳税金
int work_time; //用户输入的时间
double work_salary; //薪资
double tax; //纳税
double net_income; //净收入
printf("Please enter your work time on a week --> ");
scanf("%d", &work_time);
//计算工资
if (work_time <= 40)
{
work_salary = work_time * HOUR_SALARY;
}
else
{
work_salary = SALARY1 + ((work_time - WORK_TIME) * HOUR_SALARY * 1.5);
}
if (work_salary <= 300)
{
tax = work_salary * 0.15;
}
else if (work_salary > 300 && work_salary <= 450)
{
tax = TAX1 + ((work_salary - 300) * 0.2);
}
else
{
tax = TAX1 + TAX2 + (work_salary - 450) * 0.25;
}
net_income = work_salary - tax; //净收入 = 基本工资 - 纳税
printf("收入:%.2f\n", work_salary);
printf("纳税:%.2f\n", tax);
printf("净收入:%.2f\n", net_income);
return 0;
}
7.12.8
/**
***修改练习7 的假设a,让程序可以给出一个供选择的工资等级菜单。使用switch 完成工资等级选择。
***运行程序后,显示的菜单应该类似这样:
*** ******************************************************************
*** Enter the number corresponding to the desired pay rate or action:
*** 1) $8.75/h 2) $9.33/h
*** 3) $10.00/h 4) $11.2/h
*** 5) quit
*** ******************************************************************
***
***计算用户的收入,税金,和净收入
***如果选择1~4其中一个数字,程序应该询问用户工作的小时数。程序要循环运行,除非输入5.如果1~5以外的数字,
***程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。使用#define创建符号常量表示各工资和税率。
**/
#include <stdio.h>
#define ST_WORK_TIME 40 //一周基本工时
#define ST_SALARY_WEEK i_choice * 40 //一周满40小时标准工薪
#define TAX1 d_salary * 0.15 //首300以内15%
#define TAX2 TAX1 + (d_salary - 300) * 0.2 //续150以内20%
#define TAX3 TAX1 + TAX2 + (d_salary - 450) * 0.25 //余下的25%
int main()
{
int i_choice; // i_选择:用来存放用户输入的时薪选项
int i_work_time; // i_工作时间:用来存放用户输入的一周工作时间
double d_salary; // d_薪资:用来存放 时间*时薪 的变量
double d_tax; // d_税率:用来存放用户应缴纳的税金
double d_net_income; // d_净收入:用来存放用户最后的净收入
a:
printf("********************************************************************\n");
printf("Enter the number corresponding to the desired pay rate or action ->\n\n");
printf("1) $8.75/h \t\t 2)9.33/h \n");
printf("3) $10.0/h \t\t 4)11.2/h \n");
printf("5) quit\n");
printf("********************************************************************\n");
printf("->");
scanf("%d", &i_choice);
switch (i_choice)
{
case 1:
printf("Please enter your work hours a week:");
scanf("%d", &i_work_time);
break;
case 2:
printf("Please enter your work hours a week:");
scanf("%d", &i_work_time);
break;
case 3:
printf("Please enter your work hours a week:");
scanf("%d", &i_work_time);
break;
case 4:
printf("Please enter your work hours a week:");
scanf("%d", &i_work_time);
break;
case 5:
goto b;
break;
default:
printf("Please enter number in 1 ~ 5 ->\n");
goto a;
}
if (i_work_time <= 40)
{
d_salary = i_choice * i_work_time;
}
else
{
d_salary = ST_SALARY_WEEK + (i_work_time - ST_WORK_TIME) * i_choice * 1.5;
}
printf("\n\nYour salary is : \t$%.2f\n", d_salary);
//计算税率
if (d_salary <= 300)
{
d_tax = TAX1;
}
else if (d_salary <= 450)
{
d_tax = TAX2;
}
else
{
d_tax = TAX3;
}
printf("You need to pay taxes :\t $%.2f\n", d_tax);
d_net_income = d_salary - d_tax;
printf("Your net income is :\t $%.2f\n\n\n\n", d_net_income);
goto a;
b:
printf("\n\nSee you !\n");
return 0;
}
7.12.9
/**
***编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
**/
#include <stdio.h>
#include <stdbool.h>
int main()
{
int range;
int i, j;
bool num_is_primes;
printf("Enter a positive integer ->"); //输入一个正整数
while (scanf("%d", &range) == 1 && range > 0)
{
// if (range < 1)
// printf("This number can't be calculated\n"); //这个数字无法计算
for (i = 2; i < range; i++)
{
for (j = 2, num_is_primes = true; (j * j) <= i; j++)
{
if (i % j == 0)
num_is_primes = false;
}
if (num_is_primes)
printf("\n%d是素数\n", i);
}
printf("Again(q to quit) ->");
}
printf("Done!");
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)美元。
***编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。程序应通过循环让用户可以多次输入。
**/
#include <stdio.h>
int main()
{
int i_state; //婚姻状态
double d_income; //收入
double d_tax = 0.00; //税金
do
{
printf("-----------------------------------------");
printf("\n\t请输入您当前的婚姻状态 (0 to quit) ->\n");
printf("\n\t1、单身\t\t 2、户主\n");
printf("\t3、已婚、共有\t 4、已婚、离异\n");
printf("\t-> ");
a:
scanf("%d", &i_state);
if (!i_state)
break;
if (i_state > 0 && i_state < 5)
{
printf("\n\t请输入您的收入 ->");
scanf("%lf", &d_income);
switch (i_state)
{
case 1:
d_tax = d_income <= 17850 ? d_income * 0.15 : (0.15 * 17850) + (0.28 * (d_income - 17850));
break;
case 2:
d_tax = d_income <= 23900 ? d_income * 0.15 : (0.15 * 23900) + (0.28 * (d_income - 23900));
break;
case 3:
d_tax = d_income <= 29750 ? d_income * 0.15 : (0.15 * 29750) + (0.28 * (d_income - 29750));
break;
case 4:
d_tax = d_income <= 14875 ? d_income * 0.15 : (0.15 * 14875) + (0.28 * (d_income - 14875));
break;
}
printf("\n\t您应缴纳税金为: $%.2f\n", d_tax);
}
else
{
printf("\n\t请输入1~4之间的数:");
goto a;
}
} while (i_state != 0);
printf("感谢您使用 烙了个大饼牌税金计算器 。");
return 0;
}
7.12.11
/*
* ABC邮购杂货店出售的洋蓟售价为$2.05/lb, 甜菜售价为$1.15/lb, 胡萝卜售价为$1.09/lb
* 在添加运费之前,$100的订单有5%的打折优惠.
* <=5lb的订单收取$6.5运费和包装费
* 5~20lb的订单收取$14
* >20lb的订单在$14的基础上每续重1lb增加$0.5
*
* 写一个程序, 在循环中使用switch语句实现用户输入不同的字母有不同的响应
* 即输入a是选择洋蓟, 输入b是选择甜菜, 输入c是选择胡萝卜,q是退出订购
* 程序要记录累计的重量. 即,用户输入4lb的甜菜, 然后输入5lb的甜菜,程序应报告9lb的甜菜.
* 然后程序要计算货物总价, 折扣(若有的话), 运费和包装费.
*
* 随后程序应显示所有购买信息: 物品售价,订单重量(lb),订购的蔬菜费用,订单的总费用,折扣(若有的话), 运费包装费, 所有费用总额
*/
#include <stdio.h>
#define ARTICHOKE_PRICE 2.05 // 洋蓟售价
#define BEET_PRICE 1.15 // 甜菜售价
#define CARROT_PRICE 1.09 // 胡萝卜售价
#define DISCOUNT 0.05 // 超$100(不含运费)的折扣
int main(void)
{
char goods = 0; //商品选择
int lb = 0; //磅数
int artiCountLb = 0; //洋蓟总磅数
int beetCountLb = 0; //甜菜总磅数
int carrotCountLb = 0; //胡萝卜总磅数
double artiCountPrice = 0.0; //洋蓟总磅数
double beetCountPrice = 0.0; //甜菜总磅数
double carrotCountPrice = 0.0; //胡萝卜总磅数
double freight = 0; // 运费包装费
double goodsPrice = 0; //商品总价
int countLb = 0; // 商品总重量
printf("\n\t------------------------- ABC邮购杂货店 -------------------------\n");
printf("\n\ta.洋蓟 $2.05/lb\t\tb.甜菜 $1.15/lb\t\tc.胡萝卜$1.09/lb");
printf("\n\tq.退出订购\n");
do
{
rechoose:
printf("\n\t请选择:");
fflush(stdin);
scanf("%c", &goods);
if (goods == 113)
break;
if ((goods > 99 || goods < 97) && goods != 113)
{
printf("\t请输入 a / b / c 或 q.");
goto rechoose;
}
printf("\n\t请输入要购买的数量(lb): ");
scanf("%d", &lb);
switch (goods)
{
case 97:
artiCountLb += lb;
artiCountPrice = artiCountLb * ARTICHOKE_PRICE;
break;
case 98:
beetCountLb += lb;
beetCountPrice = beetCountLb * BEET_PRICE;
break;
case 99:
carrotCountLb += lb;
carrotCountPrice = carrotCountLb * CARROT_PRICE;
break;
}
} while (goods != 113);
goodsPrice = artiCountPrice + beetCountPrice + carrotCountPrice;
countLb = artiCountLb + beetCountLb + carrotCountLb;
// * <=5lb的订单收取$6.5运费和包装费
// * 5~20lb的订单收取$14
// * >20lb的订单在$14的基础上每续重1lb增加$0.5
if (countLb > 0 && countLb <= 5)
freight = 6.5;
else if (countLb > 5 && countLb <= 20)
freight = 14;
else if (countLb > 20)
freight = (countLb - 20) * 0.5 + 14;
else
freight = 0;
printf("\t-----------------------------订单详情----------------------------\n");
printf("\t\t 物品售价\t订单重量(lb)\n");
printf("\t\t洋蓟 $%.2lf/lb\t\t%d\n", 2.05, artiCountLb);
printf("\t\t甜菜 $%.2lf/lb\t\t%d\n", BEET_PRICE, beetCountLb);
printf("\t\t胡萝卜 $%.2lf/lb\t\t%d\n", CARROT_PRICE, carrotCountLb);
printf("\t\n");
printf("\t\t订购素蔬菜费用:\t\t%.2lf\n", beetCountPrice + carrotCountPrice);
printf("\t\t商品总费用(不含运费):\t%.2lf\n", goodsPrice);
printf("\t\t折扣:\t\t\t%.2lf\n", goodsPrice > 100 ? DISCOUNT : 0.00);
printf("\t\t运费包装费:\t\t%.2lf\n", freight);
printf("\t\t总计:\t\t\t%.2lf\n", goodsPrice > 100 ? goodsPrice * DISCOUNT + freight : goodsPrice + freight);
return 0;
}