《C Primer Plus》第7章复习题与编程练习

复习题

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;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值