1. 第1题
1.1 题目描述
编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。
1.2 编程源码
# include<stdio.h>
int main(){
int sp_n = 0;
int line_n = 0;
int alp_n = 0;
char c;
while((c=getchar()) && c != EOF){
if(' ' == c) ++sp_n;
else if('\n' == c) ++line_n;
else ++alp_n;
}
printf("空格数:%d\n换行数:%d\n其他字符:%d\n", sp_n,line_n,alp_n);
return 0;
}
1.3 结果显示
2. 第2题
2.1 题目描述
编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的 ASCII 码 (十进制)。一行打印8个字符。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
2.2 编程源码
# include<stdio.h>
int main(){
int num = 0;
char c;
while((c=getchar()) && c != '#'){
putchar(c);
if(++num%8 == 0) putchar('\n');
}
return 0;
}
2.3 结果显示
3. 第3题
3.1 题目描述
编写一个程序,读取整数直到用户输入0。输入结束后,程序应报告用户输入的偶数 (不包括0)个数、这些偶数的平均值、输入的奇数个数及其奇数的平均值。
3.2 编程源码
# include<stdio.h>
int main(){
int e_num = 0;
int o_num = 0;
float e_sum = 0;
float o_sum = 0;
int num = 0;
printf("\n");
while(1 == scanf("%d", &num) && num){
if(num%2){
++o_num;
o_sum += num;
}else{
++e_num;
e_sum += num;
}
}
printf("偶数的个数:%d\n", e_num);
printf("偶数的平均值:%f\n", e_num == 0?0:e_sum/e_num);
printf("奇数的个数:%d\n", o_num);
printf("奇数的平局值:%f\n", o_num == 0?0:o_sum/o_num);
return 0;
}
3.3 结果显示
4. 第4题
4.1 题目描述
使用 if else 语句编写一个程序读取输入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告迸行了多少次替换。
4.2 编程源码
# include<stdio.h>
int main(){
int num = 0;
char c;
printf("\n");
while((c=getchar()) && c != '#'){
if('.' == c){
++num;
putchar('!');
}else if('!' == c){
++num;
putchar('!');putchar('!');
}else putchar(c);
}
printf("\n共计替换:%d\n", num);
return 0;
}
4.3 结果显示
5. 第5题
5.1 题目描述
使用 switch 重写练习4。
5.2 编程源码
# include<stdio.h>
int main(){
int num = 0;
char c;
printf("\n");
while((c=getchar()) && c != '#'){
switch(c){
case '.':++num; putchar('!'); break;
case '!':++num; putchar('!');putchar('!');break;
default: putchar(c);break;
}
}
printf("\n共计替换:%d\n", num);
return 0;
}
5.3 结果显示
6. 第6题
6.1 题目描述
编写程序读取输入,读到#停止,报告 ei 出现的次数。
注意:该程序要记录前一个字符和当前字符。用"Receive your eieio award" 这样的输入来测试。
6.2 编程源码
# include<stdio.h>
int main(){
int num = 0;
char c_pre;
char c;
printf("\n");
while((c=getchar()) && c != '#'){
if(c_pre == 'e'){
if(c == 'i'){
++num;
c_pre = ' ';
}
}else{
if(c == 'e')
c_pre = 'e';
}
}
printf("\n共计替换:%d\n", num);
return 0;
}
6.3 结果显示
7. 第7题
7.1 题目描述
编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:
a. 基本工资 =1000 美元/小时
b. 加班(超过 40小时) = 1.5倍的时间
c. 税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define 定义符号常量。不用在意是否符合当前的税法。
7.2 编程源码
# include<stdio.h>
# define BASE 1000
# define BASE_HOURS 40
# define RATE_OVERTIEM 1.5
# define LINE_PRE 300
# define RATE_PRE 0.15
# define LINE_XU 150
# define RATE_XU 0.2
# define RATE_LAST 0.25
int main(){
float num = 0;
float salary_sum = 0;
float salary_rate = 0;
float salary = 0;
float work_hours = 0;
printf("\n请输入您一周的工作小时数:");
scanf("%f", &num);
work_hours = num>BASE_HOURS?BASE_HOURS+(num-BASE_HOURS)*RATE_OVERTIEM:num;
salary_sum = work_hours * BASE;
if(salary_sum <= LINE_PRE){
salary_rate = salary_sum * RATE_PRE;
salary = salary_sum - salary_rate;
}else if(salary_sum <= LINE_PRE + LINE_XU){
salary_rate = LINE_PRE * RATE_PRE + (salary_sum - LINE_PRE) * RATE_XU;
salary = salary_sum - salary_rate;
}else{
salary_rate = LINE_PRE * RATE_PRE + LINE_XU * RATE_XU + (salary_sum - LINE_XU) * RATE_LAST;
salary = salary_sum - salary_rate;
}
printf("工资总计:%f\n", salary_sum);
printf("工资税金:%f\n", salary_rate);
printf("工资到手:%f\n", salary);
return 0;
}
7.3 结果显示
8. 第8题
8.1 题目描述
修改练习7的假设 a,让程序可以给出一个供选择的工资等级莱单。使用 switch 完成工资等级选择。运行程序后, 显示的莱单应该类似这样:
Enter the number corresponding to the desired pay rate or action:
- $8.75/hr 2) $9.33/hr
- $10.00/hr 4) $11.20/hr
5)quit
如果选择 1~4其中的一个数字,程序应该询问用户工作的小时数。程序要通过循环运行, 除非用户输入 5。如果输入 1-5以外的数字,程序应提醒用户输入正确的选项,然后再重复显示莱单提示用户输入。使用#define 创建符号常量表示各工资等级和税率。
8.2 编程源码
# include<stdio.h>
# define BASE_HOURS 40
# define RATE_OVERTIEM 1.5
# define LINE_PRE 300
# define RATE_PRE 0.15
# define LINE_XU 150
# define RATE_XU 0.2
# define RATE_LAST 0.25
void display(void){
printf("\n**************************************************************************\n");
printf("Enter the number corresponding to the desired pay rate or action: \n");
printf("1) $8.75/hr 2) $9.33/hr\n");
printf("3) $10.00/hr 4) $11.20/hr\n");
printf("5)quit\n");
printf("**************************************************************************\n");
printf("请输出您的选项(1~5):");
}
float get_a(void){
int id ;
float num = 0;
display();
while(scanf("%d", &id) == 1){
if(id>5) {
printf("\n2请根据菜单提示输入。");
display();
continue;
}
switch(id){
case 1:num = 8.75;return(num);
case 2:num = 9.33;return(num);
case 3:num = 10;return(num);
case 4:num = 11.2;return(num);
case 5:return -1;
default:break;
}
}
return -1;
}
int main(){
float num = 0;
float base = 0;
float salary_sum = 0;
float salary_rate = 0;
float salary = 0;
float work_hours = 0;
while( base = get_a()){
if(base < 0)break;
printf("\n请输入您一周的工作小时数:");
scanf("%f", &num);
work_hours = num>BASE_HOURS?BASE_HOURS+(num-BASE_HOURS)*RATE_OVERTIEM:num;
salary_sum = work_hours * base;
if(salary_sum <= LINE_PRE){
salary_rate = salary_sum * RATE_PRE;
salary = salary_sum - salary_rate;
}else if(salary_sum <= LINE_PRE + LINE_XU){
salary_rate = LINE_PRE * RATE_PRE + (salary_sum - LINE_PRE) * RATE_XU;
salary = salary_sum - salary_rate;
}else{
salary_rate = LINE_PRE * RATE_PRE + LINE_XU * RATE_XU + (salary_sum - LINE_XU) * RATE_LAST;
salary = salary_sum - salary_rate;
}
printf("工资总计:%f\n", salary_sum);
printf("工资税金:%f\n", salary_rate);
printf("工资到手:%f\n\n", salary);
}
return 0;
}
8.3 结果显示
9. 第9题
9.1 题目描述
编写一个程序, 只接受正整数输入,然后显示所有小于或等于该数的素数。
9.2 编程源码
# include<stdio.h>
int is_prime(int num){
if(2 == num) return 1;
for(int i=2;i<num;++i){
if(num%i == 0) return 0;
}
return 1;
}
int main(){
int num;
printf("\n请输入一个正整数:");
scanf("%d", &num);
for(int i=2;i<=num;++i){
if(is_prime(i))printf("%d\t",i);
}
printf("\n");
return 0;
}
9.3 结果显示
10. 第10题
10.1 题目描述
1988牟的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。
下面是该税收计划的摘要 (美元数为应征税的收入 ):
类别 | 税金 |
---|---|
单身 | 17850美元按15%计,超出部分按28%计 |
户主 | 23900美元按15%计,超出部分按28%计 |
已婚,共有 | 29750美元按15%计,超出部分按28%计 |
已婚,离异 | 14875美元按15%计,超出部分按28%计 |
例如,一位工资为 20000 美元的单身纳税人,应缴纳税费0.15X17850+0.28*(20000-17850)美
元。编写一个程序,让用户指定缴纳税金的种类和应纳税收入, 然后计算税金。程序应通过循环
让用户可以多次输入。
10.2 编程源码
# include<stdio.h>
# define RATE_BASE 0.15
# define RATE_LAST 0.28
void display(void){
printf("\n**************************************************************************\n");
printf("您当前的状态是: \n");
printf("1) 单身 2) 户主\n");
printf("3) 已婚,共有/hr 4) 已婚,离异\n");
printf("5)quit\n");
printf("**************************************************************************\n");
printf("请输出您的选项(1~5):");
}
float get_a(void){
int id ;
float num = 0;
display();
while(scanf("%d", &id) == 1){
if(id>5) {
printf("\n2请根据菜单提示输入。");
display();
continue;
}
switch(id){
case 1:num = 17850;return(num);
case 2:num = 23900;return(num);
case 3:num = 29750;return(num);
case 4:num = 14875;return(num);
case 5:return -1;
default:break;
}
}
return -1;
}
int main(){
float num = 0;
float base = 0;
float salary_rate = 0;
float salary = 0;
while( base = get_a()){
if(base < 0)break;
printf("\n请输入您的应税金额:");
scanf("%f", &num);
salary_rate = num > base? base*RATE_BASE+(num-base)*RATE_LAST:num*RATE_BASE;
salary = num - salary_rate;
printf("工资总计:%f\n", num);
printf("工资税金:%f\n", salary_rate);
printf("工资到手:%f\n\n", salary);
}
return 0;
}
10.3 结果显示
11. 第11题
11.1 题目描述
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磅的甜莱。然后,该程序要计算货物总价、折扣 (如果有的话)运费和包装费。随后,程序应显示所有的购买信息: 物品售价、订购的重量 (单位:磅)、订购的蔬莱费用、订单的总费用、折扣 (如果有的话)、运费和包装费、以及所有的费用总额。
11.2 编程源码
# include<stdio.h>
# define PRICE_O 2.05
# define PRICE_S 1.15
# define PRICE_P 1.09
# define LINE_DR 100
# define RATE_D 0.05
# define LINE_TR_F 5
# define LINE_TR_S 20
# define BASE_TR_F 6.5
# define BASE_TR_S 14
# define BASE_TR_T 0.5
void display(void){
printf("\n**************************************************************************\n");
printf("蔬菜种类为: \n");
printf("a) 洋蓟 b) 甜菜\n");
printf("c) 胡萝卜 q) 退出\n");
printf("**************************************************************************\n");
printf("请输出您的选项(字母):");
}
int main(){
float num = 0;
float num_o = 0;
float num_s = 0;
float num_p = 0;
float num_t = 0;
float mon_o = 0;
float mon_s = 0;
float mon_p = 0;
float mon_t = 0;
float rate = 0;
float tr = 0;
float mon = 0;
char c;
display();
while((c=getchar()) && c != 'q'){
int flag = 0;
char t;
while((t=getchar()) && t!= '\n');
printf("请输入蔬菜的磅数:");
scanf("%f", &num);
while((t=getchar()) && t!= '\n');
switch(c){
case 'a':num_o += num;break;
case 'b':num_s += num;break;
case 'c':num_p += num;break;
default:flag = 1;break;
}
if(flag) {
printf("\n2请根据菜单提示输入。");
display();
continue;
}
mon_o = num_o * PRICE_O;
mon_s = num_s * PRICE_S;
mon_p = num_p * PRICE_P;
num_t = num_o + num_p + num_s;
mon_t = mon_o + mon_p + num_s;
rate = mon_t > LINE_DR?mon_t*(1-RATE_D):0;
if(num_t<=LINE_TR_F){
tr = BASE_TR_F;
}else if(num_t < LINE_TR_S){
tr = BASE_TR_S;
}else{
tr = BASE_TR_S + (num_t - LINE_TR_S)*BASE_TR_T;
}
mon = tr + mon_t;
printf("\n-------------------------------------------------------------------------\n");
printf("|\t蔬菜\t|\t购买磅数\t|\t价格\t|\t总价\t|\n");
printf("-------------------------------------------------------------------------\n");
printf("|\t洋蓟\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_o, PRICE_O, mon_o);
printf("|\t甜菜\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_s, PRICE_S, mon_s);
printf("|\t胡萝卜\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_p, PRICE_P, mon_p);
printf("-------------------------------------------------------------------------\n");
printf("|\t总计\t|\t%.2f\t\t|\t--\t|\t%.2f\t|\n", num_t, mon_t);
printf("-------------------------------------------------------------------------\n");
printf("|\t优惠\t|\t%.2f\t\t|\t运费\t|\t%.2f\t|\n", rate, tr);
printf("|\t总金额\t|\t%.2f\t\t\t\t\t\t|\n", mon);
printf("-------------------------------------------------------------------------\n\n");
display();
}
return 0;
}