• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

《C语言程序设计:现代方法》第五章练习

C 菜鸟 2年前 (2018-01-20) 21004次浏览 已收录 2个评论
[隐藏]

        本篇为菜鸟在学习《C 语言程序设计:现代方法》中第五章做的练习题,如果有错误或疑问的话,欢迎大家指正~

1、关系和判等

假设 i、j 和 k 都是 int 型变量。请列出每道题中的输出结果
(a)
        i = 2 ; j = 3;
        k = i * j == 6;
        printf(“%d”, k);
(b)
        i = 5; j = 10; k = 1;
        printf(“%d”, k > i < j);
(c)
        i = 3; j = 2; k = 1;
        printf(“%d”, i < j == j < k);
(d)
        i = 3; j = 4; k = 5;
        printf(“%d”, i % j + i < k);
答:(a) 1 (b) 1 (c) 1 (d) 0

2、逻辑

假设 i、j 和 k 都是 int 型变量。请列出每道题中的输出结果
(a)
        i = 10; j = 5;
        printf(“%d”, !i < j);
(b)
        i = 2; j = 1;
        printf(“%d”, !!i + !j);
(c)
        i = 5; j = 0; k = -5;
        printf(“%d”, i && j || k);
(d)
        i = 3; j = 4; k = 5;
        printf(“%d”, i < j || k);
答:(a) 1 (b) 1 (c) 1 (d) 1

3、逻辑短路

假设 i、j 和 k 都是 int 型变量。请列出每道题中的输出结果
(a)
        i = 3; j = 4; k = 5;
        printf(“%d”, i < j || ++j < k);
        printf(“%d %d %d”, i, j, k);
(b)
        i = 7; j = 8; k = 9;
        printf(“%d”, i – 7 && j++ < k);
        printf(“%d %d %d”, i, j, k);
(c)
        i = 7; j = 8; k = 9;
        printf(“%d”, (i = j) || (j = k));
        printf(“%d %d %d”, i, j, k);
(d)
        i = 1; j = 1; k = 1;
        printf(“%d”, ++i || ++j && ++k);
        printf(“%d %d %d”, i, j, k);
答:
(a) 1 3 5 5
(b) 0 7 9 9
(c) 1 8 9 9
(d) 1 2 2 2

4、三元/条件操作符

编写一个单独的表达式,要求这个表达式的值根据 i 是否小于、等于或大于 j 而分别为-1、0 或+1
答:(i < j)? -1 : ((i = j) ? 0 : +1)

5、数字位数

编写程序来确定一个数的位数,假设输入的数最多不超过 4 位
Enter a number: 374
The number 374 has 3 digits
答:

#include <stdio.h>

#define POSITIVE 1
#define NEGATIVE 0 

main()
{
    int x, numberDigit, numberFlag;
    printf("Enter a number: ");
    scanf("%d", &x);
    if (x >= 0) {
        numberFlag = POSITIVE;
    } else {
        numberFlag = NEGATIVE;
        x = -x;
    }
    if ((0 <= x) && (x < 10)) {
        numberDigit = 1;
    } else if ((10 <= x) && (x < 100)) {
        numberDigit = 2;
    } else if ((100 <= x) && (x < 1000)) {
        numberDigit = 3;
    } else if ((1000 <= x) && (x < 10000)) {
        numberDigit = 4;
    }

    printf("The number %d has %d digis\n", (numberFlag) ? x : -x, numberDigit);

    return 0;
}

6、时间格式

编写一个程序,要求用户输入 24 小时制的时间,然后显示 12 小时制的格式。注意 12:00 不要显示成 0:00
Enter a 24-hour time: 21:11
Equivalent 12-hour time: 9:11 PM
答:

#include <stdio.h>

#define MORNING 1
#define AFTERNOON 0

main()
{
    int hour, minute, date12Flag;
    
    while (1) {
        printf("Enter a 24-hour time (e.g. 9:00): ");
        scanf("%d:%d", &hour, &minute);
        
        if ((hour < 0) || (hour > 23) || (minute < 0) || (minute > 59)){
            printf("The date formate is incorrect! Please inpute again!\n");
        } else {
            break;
        }
    }

    if ((hour < 12) && (hour != 0)) {
        date12Flag = MORNING;
    } else {
        date12Flag = AFTERNOON;
        hour -= 12;
    }
    
    printf("Equivalent 12-hour time: %d:%-.2d %s\n", (hour < 0) ? -hour : hour, minute, (date12Flag) ? "AM" : "PM");

    return 0;
}

7、交易佣金

同时采用以下两点对程序 broker.c 进行修改
a) 不再直接用交易额,而是要求用户输入股票的数量和每股的价格
b) 增加语句来计算经纪人竞争对手的佣金(少于 2000 股时佣金为每股 33 美元+3 美分,2000 股或更大股时佣金为每股 33 美元+2 美分)。显示原有的经纪人的佣金同时,显示竞争对手的佣金
答:

#include <stdio.h>

main()
{
    float ownCommission, competitorCommission, stockNumber, cost, value;

    printf("Enter number of stock: ");
    scanf("%f", &stockNumber);
    printf("Enter cost of one stock: ");
    scanf("%f", &cost);
    value = stockNumber * cost;

    if (value < 2500.00) {
        ownCommission = 30.00 + .017 * value;
    } else if (value < 6250.00) {
        ownCommission = 56.00 + .0066 * value;
    } else if (value < 20000.00) {
        ownCommission = 76.00 + .0034 * value;
    } else if (value < 50000.00) {
        ownCommission = 100.00 + .0022 * value;
    } else if (value < 500000.00) {
        ownCommission = 155.00 + .0011 * value;
    } else {
        ownCommission = 255.00 + .0009 * value;
    }

    if (ownCommission < 39.00) {
        ownCommission = 39.00;
    }

    if (stockNumber < 2000) {
        competitorCommission =  33 + 0.03 * stockNumber;
    } else {
        competitorCommission = 33 + 0.02 * stockNumber;
    }

    printf("Own Commission: $%.2f\n", ownCommission);
    printf("Competitor Commission: $%.2f\n", competitorCommission);

    return 0;
}

8、风力

蒲福风力简单分级。编写一个程序,要求用户输入风速,然后显示相应描述

速率(=海里/小时) 描述
小于 1 Calm(无风)
1-3 Light air(轻风)
4-27 Breeze(微风)
28-47 Gale(大风)
48-63 Storm(暴风)
大于 63 Hurricane(飓风)

答:

#include <stdio.h>

main()
{
    float speed;

    printf("Enter the speed of wind: ");
    scanf("%f", &speed);
    
    if (speed < 1) {
        printf("Calm\n");
    } else if ((1 <= speed) && (speed <= 3)) {
        printf("Light air\n");
    } else if ((4 <= speed) && (speed <= 27)) {
        printf("Breeze\n");
    } else if ((28 <= speed) && (speed <= 47)) {
        printf("Gale\n");
    } else if ((48 <= speed) && (speed <= 63)) {
        printf("Storm\n");
    } else if (63 <= speed) {
        printf("Hurricane\n");
    }

    return 0;
}

9、所得税

未婚居民需要负担下列所得税。编写一个程序,要求用户输入需纳税收入,然后显示税金

收入 税金
未超过 750 美元 收入的 1%
750-2250 美元 7.50 美元加上超出 750 美元部分的 2%
2250-3750 美元 37.50 美元加上超出 2250 美元部分的 3%
3750 美元-5250 美元 82.50 美元加上超出 3750 美元部分的 4%
5250 美元-7000 美元 142.50 美元加上超出 5250 美元部分的 5%
超过 7000 美元 230.00 美元加上超出 7000 美元部分的 6%

答:

#include <stdio.h>

main()
{
    float income, tax;
    
    printf("Enter your income: ");
    scanf("%f", &income);

    if (income <= 750) {
        tax = income * 0.01;
    } else if ((750 < income) && (income <= 2250)) {
        tax = 7.50 + (income - 2250) * 0.02;
    } else if ((2250 < income) && (income <= 3750)) {
        tax = 37.50 + (income - 2250) * 0.03;
    } else if ((3750 < income) && (income <= 5250)) {
        tax = 82.50 + (income - 3750) * 0.04;
    } else if ((5250 < income) && (income <= 7000)) {
        tax = 142.50 + (income - 5250) * 0.05;
    } else if (7000 < income) {
        tax = 230.00 + (income - 7000) * 0.06;
    }
    
    printf("Your tax is: %.2f\n", tax);

    return 0;
}

10、检查 UPC

修改 4.1 程序 upc.c,使其可以检测 UPC 的有效性。在用户输入 UPC 后,程序将显示 VALID 或 NOTVALID
答:

#include <stdio.h>

main()
{
    int choiceFlag, firstSum, secondSum, total, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, checkdigit;
    
    
    printf("Choice option:\n");
    printf("\t1. Get check digit\n");
    printf("\t2. Check the UPC\n");
    printf("Enter your choice (1 or 2): ");
    scanf("%d", &choiceFlag);
    
    printf("Enter the first (single) digit: ");
    scanf("%1d", &i1);
    printf("Enter first group of five digits: ");
    scanf("%1d%1d%1d%1d%1d", &i2, &i3, &i4, &i5, &i6);
    printf("Enter second group of five digits: ");
    scanf("%1d%1d%1d%1d%1d", &i7, &i8, &i9, &i10, &i11);
    firstSum = i1 + i3 + i5 + i7 + i9 + i11;
    secondSum = i2 + i4 + i6 + i8 + i10;
    total = 3 * firstSum + secondSum;

    switch (choiceFlag) {
        case 1:
            printf("Check digit: %d\n", 9 - ((total - 1) % 10));
            break;
        case 2:
            printf("Enter check digit: ");
            scanf("%d", &checkdigit);
            if (checkdigit == (9 - ((total - 1) % 10))) {
                printf("VALID\n");
            } else {
                printf("NOTVALID\n");
            }
            break;
    }

    return 0;
}

11、关系判断 1

下列 if 语句在 C 语言中是否合法?

If (n >= 1 <= 10)
       printf("n is between 1 and 10\n");

如果合法,那当 n 等于 0 时语句如何执行
答:合法。当 n=0 时,n>=1 得到 0,然后 0<=10 得到 1,判断表达式结果为真,执行 printf 语句输出信息

12、关系判断 1

下列 if 语句在 C 语言中是否合法?

If(n == 1 – 10)
       printf("n is between 1 and 10\n");

如果合法,那么当 n 等于 5 时语句如何执行
答:合法。当 n=5 时,1-10 得到-9,然后 5==-9 得到 0,判断表达式结果为假,不执行 printf 语句

13、三元表达式判断

如果 i 的值为 17,那么下列语句显示的结果是什么?如果 i 的值为-17,那么下列结果又是什么?
printf(“%d\n”, i >= 0 ? i : -i);
答:当 i=17 时,输出 17。当 i=-17 时,输出 17

14、成绩分级

利用 switch 语句编写一个程序,把数字显示的成绩转化为字母显示的等级
Enter numerical grade: 84
Letter grade: B
使用下面这套等级评定规则:A=90-100, B=80-89, C=70-79,D=60-69,F=0-59。
如果成绩高于 100 或低于 0 显示错误信息
答:

#include <stdio.h>

main()
{
    int numerical, z;
    char grade;
    printf("Enter numerical grade: ");
    scanf("%d", &numerical);

    if ((numerical > 100) || (numerical < 0)) {
        printf("The numerical is error!\n");
        return 1;
    }

    z = numerical / 10;
    switch (z) {
        case 10:
        case 9:
            grade = 'A';
            break;
        case 8:
            grade = 'B';
            break;
        case 7:
            grade = 'C';
            break;
        case 6:
            grade = 'D';
            break;
        default:
            grade = 'F';
            break;
    }
    printf("Letter grade: %c\n", grade); 

    return 0; 
}

15、数字英文单词

编写一个程序,要求用户输入一个两位数字,然后显示这个数的英文单词
Enter a two-digit number: 45
You entered the number forty-five
答:

#include <stdio.h>

main()
{
    int number, x, y;
    char *str, *englishX, *englishY;
    printf("Enter a two-digit number: ");
    scanf("%d", &number);

    if ((number < 10) || (number > 99)) {
        printf("Please enter a two-digit!\n");
        return -1;
    } else if (number <= 20) {
        switch (number) {
            case 10:
                str = "ten";
                break;
            case 11:
                str = "eleven";
                break;
            case 12:
                str = "twelve";
                break;
            case 13:
                str = "thirteen";
                break;
            case 14:
                str = "fourteen";
                break;
            case 15:
                str = "fifteen";
                break;
            case 16:
                str = "sixteen";
                break;
            case 17:
                str = "seventeen";
                break;
            case 18:
                str = "eighteen";
                break;
            case 19:
                str = "nineteen";
                break;
            case 20:
                str = "twenty";
                break;
        }
        printf("You entered the number %s\n", str);
    } else {
        x = number / 10;
        y = number % 10;
        switch (x) {
            case 2:
                englishX = "twenty";
                break;
            case 3:
                englishX = "thirty";
                break;
            case 4:
                englishX = "forty";
                break;
            case 5:
                englishX = "fifty";
                break;
            case 6:
                englishX = "sixty";
                break;
            case 7:
                englishX = "seventy";
                break;
            case 8:
                englishX = "eighty";
                break;
            case 9:
                englishX = "ninety";
                break;
        }

        switch (y) {
            case 1:
                englishY = "one";
                break;
            case 2:
                englishY = "two";
                break;
            case 3:
                englishY = "three";
                break;
            case 4:
                englishY = "four";
                break;
            case 5:
                englishY = "five";
                break;
            case 6:
                englishY = "six";
                break;
            case 7:
                englishY = "seven";
                break;
            case 8:
                englishY = "eight";
                break;
            case 9:
                englishY = "nine";
                break;
        }
        printf("You entered the number %s-%s\n", englishX, englishY);
    }

    return 0;
}

16、switch 语句

写出下面程序的输出结果?(假设 i 是整型变量)

int i = 1;
switch (i % 3) {
	case 0: printf("zero");
	case 1: printf("one");
	case 2: printf("two");
}

答:onetwo


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明《C 语言程序设计:现代方法》第五章练习
喜欢 (2)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 第十六题应该是onetwo吧(话说这是个什么网站。。偶然进来了
    bazinga2019-10-01 16:28 回复
    • 菜鸟
      嗯嗯 谢谢 :oops: ,当时应该扫了一眼 大脑里想成除法了 :sad: 。 (这网站是我随便记录东西的,欢迎><
      菜鸟2019-10-09 11:30 (7天前)回复