复习题
1. 判断下列表达式是true还是false
a. 100 > 3 && ‘a’>‘c’
b. 100 > 3 || ‘a’>‘c’
c. !(100>3)
a. false
b. true
c. false
2. 根据下列描述的条件,分别构造一个表达式:
a. number等于或大于90,但是小于100
b. ch不是字符q或k
c. number在1~9之间(包括1和9),但不是5
d. number不在1~9之间
a. number >= 90 && number < 100
b. ch != 'q' && ch != 'k'
c. number >= 1 && number <= 9 && number != 5
d. !(number >= 1 && number <= 9)
3. 下面的程序关系表达式过于复杂,而且还有些错误,请简化并改正
#include <stdio.h>
int main(void) /* 1 */ { /* 2 */
int weight, height; /* weight以磅为单位,height以英寸为单位 *//* 4 */
scanf("%d , weight, height); /* 5 */
if (weight < 100 && height > 64) /* 6 */
if (height >= 72) /* 7 */
printf("You are very tall for your weight.\n");
else if (height < 72 &&> 64) /* 9 */
printf("You are tall for your weight.\n");/* 10 */
else if (weight > 300 && !(weight <= 300) /* 11 */
&& height < 48) /* 12 */
if (!(height >= 48)) /* 13 */
printf(" You are quite short for your weight.\n");
else /* 15 */
printf("Your weight is ideal.\n"); /* 16 */ /* 17 */
return 0;
}
改正:
#include <stdio.h>
int main(void)
{
int weight, height; /* weight以磅为单位,height以英寸为单位 */
scanf("%d %d", &weight, &height);
if (weight < 100 && height > 64)
if (height >= 72)
printf("You are very tall for your weight.\n");
else /* 9 */
printf("You are tall for your weight.\n");
else if (weight > 300 && height < 48)
printf(" You are quite short for your weight.\n");
else
printf("Your weight is ideal.\n");
return 0;
}
4. 下列个表达式的值是多少
a.5 > 2
b.3 + 4 > 2 && 3 < 2
c.x >= y || y > x
d.d = 5 + ( 6 > 2 )
e.‘X’ > ‘T’ ? 10 : 5
f.x > y ? y > x : x > y
a. 1 b. 0 c. 1 d. 6 e. 10 f. 0
5. 下面的程序将打印什么
#include <stdio.h>
int main(void)
{
int num;
for (num = 1; num <= 11; num++)
{
if (num % 3 == 0)
putchar('$');
else
putchar('*');
putchar('#');
putchar('%');
}
putchar('\n');
return 0;
}
6. 下面的程序将打印什么
#include <stdio.h>
int main(void)
{
int i = 0;
while (i < 3)
{
switch (i++)
{
case 0:
printf("fat ");
case 1:
printf("hat ");
case 2:
printf("cat ");
default:
printf("Oh no!");
}
putchar('\n');
}
return 0;
}
fat hat cat Oh no!
hat cat Oh no!
cat Oh no!
7. 下面的程序有哪些错误
#include <stdio.h>
int main(void)
{
char ch;
int lc = 0; // 统计小写字母
int uc = 0; // 统计大写字母
int oc = 0; // 统计其他字母
while ((ch = getchar()) != '#')
{
if ('a' <= ch >= 'z')
lc++;
else if (!(ch < 'A') || !(ch > 'Z')
uc++;
oc++;
}
printf(%d lowercase, %d uppercase, %d other, lc, uc, oc);
return 0;
}
改正后:
#include <stdio.h>
int main(void)
{
char ch;
int lc = 0; // 统计小写字母
int uc = 0; // 统计大写字母
int oc = 0; // 统计其他字母
while ((ch = getchar()) != '#')
{
if ('a' <= ch && ch <= 'z')
lc++;
else if (!(ch < 'A') && !(ch > 'Z')
uc++;
else:
oc++;
}
printf("%d lowercase, %d uppercase, %d other", lc, uc, oc);
return 0;
}
8. 下面的程序将打印什么
#include <stdio.h>
int main(void)
{
int age = 20;
while (age++ <= 65)
{
if ((age % 20) == 0) /* age是否能被20整除? */
printf("You are %d.Here is a raise.\n", age);
if (age = 65)
printf("You are %d.Here is your gold watch.\n", age);
}
return 0;
}
重复打印You are 65.Here is your gold watch.
【每一次赋值都会重置age为65】
9. 给定下面的输入时,以下程序将打印什么
q
c
h
b
#include <stdio.h>
int main(void)
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch == '\n')
continue;
printf("Step 1\n");
if (ch == 'c')
continue;
else if (ch == 'b')
break;
else if (ch == 'h')
goto laststep;
printf("Step 2\n");
laststep:
printf("Step 3\n");
}
printf("Done\n");
return 0;
}
Step 1
Step 2
Step 3
Step 1
Step 1
Step 3
Step 1
Done
10. 重写复习题9,但这次不能使用continue和goto语句
#include <stdio.h>
int main(void)
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch == '\n')
else
{
printf("Step 1\n");
if (ch == 'c')
else
{
if (ch == 'b')
break;
else if (ch == 'h')
else
printf("Step 2\n");
printf("Step 3\n");
}
}
}
printf("Done\n");
return 0;
}
编程练习
1. 统计字符数量
编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char ch;
int blank = 0, newline = 0, other = 0;
while ((ch = getchar()) != '#')
{
switch (ch)
{
case ' ':
blank++;
break;
case '\n':
newline++;
break;
default:
other++;
}
}
printf("空格数:%d,换行符数:%d,其他字符数:%d\n", blank, newline, other);
system("pause");
return 0;
}
2. 打印“字符-ASCII码”组合
编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。一行打印8个“字符-ASCII码”组合。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
int count=0;
while ((ch = getchar()) != '#')
{
count++;
putchar(ch);
printf("-%d ", ch);
if(count % 8 == 0)
{
printf("\n");
}
}
printf("\n");
system("pause");
return 0;
}
3. 统计奇偶数
编写一个程序,读取整数直到用户输入 0。输入结束后,程序应报告用户输入的偶数(不包括 0)个数、这些偶数的平均值、输入的奇数个数及其奇数的平均值。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int number;
int count_even = 0, count_odd = 0;
int sum_even = 0, sum_odd = 0;
while (scanf("%d", &number) == 1 && number != 0)
{
if (number % 2)
{
count_odd++;
sum_odd += number;
}
else
{
count_even++;
sum_even += number;
}
}
printf("奇数个数:%d,奇数平均值:%f\n偶数个数:%d,偶数平均值:%f\n", count_odd, (float)sum_odd / count_odd, count_even, (float)sum_even / count_even);
system("pause");
return 0;
}
4. 字符替换
使用if else语句编写一个程序读取输入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
int replace_period = 0, replace_exclamation = 0;
while ((ch = getchar()) != '#')
{
if (ch == '.')
{
printf("!");
replace_period++;
}
else if (ch == '!')
{
printf("!!");
replace_exclamation++;
}
else
{
putchar(ch);
}
}
printf("\n替换句号%d次,替换感叹号%d次。\n", replace_period, replace_exclamation);
system("pause");
return 0;
}
5. 使用switch重写练习4
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
int replace_period = 0, replace_exclamation = 0;
while ((ch = getchar()) != '#')
{
switch (ch)
{
case '.':
printf("!");
replace_period++;
break;
case '!':
printf("!!");
replace_exclamation++;
break;
default:
putchar(ch);
}
}
printf("\n替换句号%d次,替换感叹号%d次。\n", replace_period, replace_exclamation);
system("pause");
return 0;
}
6. 报告ei出现的次数
编写程序读取输入,读到#停止,报告ei出现的次数。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
int count = 0; //计数ei出现的次数
bool condition = false; //触发条件
while ((ch = getchar()) != '#')
{
if (ch == 'e')
{
condition = true;
}
if (ch == 'i' && condition == true)
{
count++;
condition = false;
}
else if (ch != 'e')
{
condition = false;
}
}
printf("ei出现了%d次\n", count);
system("pause");
return 0;
}
7. 打印工资总额、税金和净收入
编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:
a.基本工资 = 10美元/小时
b.加班(超过40小时) = 1.5倍的时间
c.税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define定义符号常量。不用在意是否符合当前的税法。
代码:
#include <stdio.h>
#include <stdlib.h>
#define BASIC_SALARY_UNIT 10.00 //基本工资
#define BASIC_TIME 40 //不加班的最长工作时间
#define RATIO 1.5 //倍率
#define FRONT_TAX 0.15 // 前300美元
#define ADD_TAX 0.20 //续150美元
#define REMAINING_TAX 0.25 // 余下的
#define FRONT_SALARY 300 // 300美元
#define ADD_SALARY 150 // 150美元
int main(void)
{
int time; //工作时间
float salary = 0.0; // 工资总额
float tallage = 0.0; // 税金
printf("请输入一周工作的小时数: ");
scanf("%d", &time);
// 计算salary
if (time > 0 && time <= BASIC_TIME)
{
salary = BASIC_SALARY_UNIT * time;
}
else if (time > BASIC_TIME)
{
salary = BASIC_SALARY_UNIT * ((time - BASIC_TIME) * RATIO + BASIC_TIME);
}
// 计算tallage
if (salary <= FRONT_SALARY)
{
tallage = salary * FRONT_TAX;
}
else if (salary < FRONT_SALARY + ADD_SALARY)
{
tallage = FRONT_SALARY * FRONT_TAX + (salary - FRONT_SALARY) * ADD_TAX;
}
else
{
tallage = FRONT_SALARY * FRONT_TAX + ADD_SALARY * ADD_TAX + (salary - FRONT_SALARY - ADD_SALARY) * REMAINING_TAX;
}
printf("工资总额为:%f\n税金为:%f\n净收入为:%f\n", salary, tallage, salary - tallage);
system("pause");
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创建符号常量表示各工资等级和税率。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define PAY_RATE1 8.75
#define PAY_RATE2 9.33
#define PAY_RATE3 10.00
#define PAY_RATE4 11.20
#define TIME_BASE 40
#define OVERTIME 1.5
#define BREAK1 300
#define BREAK2 450
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
int main(void)
{
int num;
bool judge = false; // 这里的标志位必须为false,以防用户一开始就输入非数字
double pay_rate;
double hours;
double gross, tax, net;
printf("*****************************************************************\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");
//读取正确输入,直达是1-5之间才退出循环
while (scanf("%d", &num) == 1)
{
judge = true; //每次循环标志位置为true
switch (num)
{
case 1:
pay_rate = PAY_RATE1;
break;
case 2:
pay_rate = PAY_RATE2;
break;
case 3:
pay_rate = PAY_RATE3;
break;
case 4:
pay_rate = PAY_RATE4;
break;
case 5:
printf("Bye!\n");
break;
default:
printf("\nPlease enter the right number!\n");
printf("*****************************************************************\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");
judge = false;
}
if (judge)
break;
}
if (judge && num != 5)
{
printf("Enter your work hours in a week: ");
scanf("%lf", &hours);
if (hours > TIME_BASE)
hours = TIME_BASE + (hours - TIME_BASE) * OVERTIME;
gross = hours * pay_rate;
if (gross < BREAK1)
tax = gross * RATE1;
else if (gross < BREAK2)
tax = BREAK1 * RATE1 + (gross - BREAK1) * RATE2;
else
tax = BREAK1 * RATE1 + (BREAK2 - BREAK1) * RATE2 + (gross - BREAK2) * RATE3;
net = gross - tax;
printf("gross: %.2lf, tax: %.2lf, net: %.2lf\n", gross, tax, net);
}
system("pause");
return 0;
}
9. 显示素数
编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int number;
bool isPrime;
scanf("%d", &number);
for (int i = 2; i <= number; i++)
{
isPrime = true;
for (int j = 2; j * j <= i; j++)
{
if (i % j == 0)
{
isPrime = false;
}
}
if (isPrime)
{
printf("%d是素数。\n", i);
}
}
system("pause");
return 0;
}
10. 计算税金
1988年的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。 下面是该税收计划的摘要(美元数为应征税的收入):
例如,一位工资为20000美元的单身纳税人,应缴纳税0.15×17850+0.28×(20000−17850)美元。编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。程序应通过循环让用户可以多次输入。
代码:
#include <stdio.h>
#include <stdlib.h>
#define BASEPAY1 17850
#define BASEPAY2 23900
#define BASEPAY3 29750
#define BASEPAY4 14875
#define RATE1 0.15
#define RATE2 0.28
void print_prompt();
int main(void)
{
int type;
double income;
double basepay;
double tax;
print_prompt();
while (scanf("%d", &type) == 1)
{
switch (type)
{
case 1:
basepay = BASEPAY1;
break;
case 2:
basepay = BASEPAY2;
break;
case 3:
basepay = BASEPAY3;
break;
case 4:
basepay = BASEPAY4;
break;
}
if (type > 0 && type < 5)
{
printf("Enter your income: ");
scanf("%lf", &income);
printf("\n");
if (income <= basepay)
{
tax = income * RATE1;
}
else
{
tax = BASEPAY1 * RATE1 + (income - BASEPAY1) * RATE2;
}
printf("Your tax is %lf.\n", tax);
print_prompt();
}
else if (type == 5)
{
printf("Bye!\n");
break;
}
else
{
printf("Please enter right number.\n");
print_prompt();
}
}
system("pause");
return 0;
}
void print_prompt()
{
printf("*****************************************************************\n");
printf("Enter the number corresponding to the desired tax type or action:\n");
printf("1) 单身 2) 户主\n");
printf("3) 已婚,共有 4) 已婚,离异\n");
printf("5) quit\n");
printf("******************************************************************\n");
}
11. ABC 邮购杂货店
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磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额
代码:
#include <stdio.h>
#include <stdlib.h>
// 蔬菜单价
#define MOSS_UNIT 2.05
#define BEET_UNIT 1.15
#define CARROT_UNIT 1.09
// 打折信息
#define DISCOUNT 100
#define DISCOUNT_PERCENT 0.05
// 重量收费标准
#define POUND_5 6.5
#define POUND_5_20 14
#define POUND_20 0.5
int main(void)
{
char option; // 蔬菜选项
float moss = 0; // 洋藓计数器
float beet = 0; // 甜菜计数器
float carrot = 0; // 胡萝卜计数器
float expense; // 初始费用
float all_expense; // 蔬菜减去折扣的总费用
float weight; // 总重量
float add; // 每次添加的蔬菜重量
float discount = -1; // 折扣
float freight = 0; // 运费和包装费用
printf("请输入你要购买的蔬菜选项:\n");
printf("a)洋藓 2.05美元/磅\nb)甜菜 1.15美元/磅\nc)胡萝卜 1.09美元/磅\nq)结束选择\n");
while ((option = getchar()) != 'q')
{
switch (option)
{
case 'a':
printf("请输入重量:");
scanf("%f", &add);
moss += add;
printf("洋藓----%f磅\n\n", moss);
break;
case 'b':
printf("请输入重量:");
scanf("%f", &add);
beet += add;
printf("甜菜----%f磅\n\n", beet);
break;
case 'c':
printf("请输入重量:");
scanf("%f", &add);
carrot += add;
printf("胡萝卜---%f磅\n\n", carrot);
break;
}
while (getchar() != '\n')
continue;
printf("选择蔬菜:");
}
expense = moss * MOSS_UNIT + beet * BEET_UNIT + carrot * CARROT_UNIT;
if (expense > DISCOUNT)
{
discount = expense * DISCOUNT_PERCENT;
all_expense = expense - discount;
}
else
{
all_expense = expense;
}
weight = moss + beet + carrot;
if (weight <= 5)
{
freight = POUND_5;
}
else if (weight > 5 && weight <= 20)
{
freight = POUND_5_20;
}
else
{
freight = (weight - 20) * POUND_20 + POUND_5_20;
}
all_expense += freight;
printf("**************************************************\n");
if (moss > 0)
{
printf("洋藓 2.05美元/磅----%f磅\n", moss);
}
if (beet > 0)
{
printf("甜菜 1.15美元/磅----%f磅\n", beet);
}
if (carrot > 0)
{
printf("胡萝卜 1.09美元/磅--%f磅\n", carrot);
}
printf("订购的总重量----------%f(磅)\n", weight);
printf("订购的蔬菜总费用------%f美元\n", expense);
if (discount > 0)
{
printf("折扣------------------%f美元\n", discount);
}
printf("运费包装费用----------%f美元\n", freight);
printf("所有的费用总额--------%f美元\n", all_expense);
printf("**************************************************\n");
system("pause");
return 0;
}