天天看点

《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

文章目录

  • 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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}
           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

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;
}

           
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11
《C Primer Plus 》第六版 习题 第七章7.12.17.12.27.12.37.12.47.12.57.12.67.12.77.12.87.12.97.12.107.12.11

继续阅读