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

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

C 菜鸟 2年前 (2018-02-05) 15431次浏览 已收录 2个评论
[隐藏]

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

1、进制转换

请给出下列整型常量的十进制数字
(a) 077
(b) 0x77
(c) 0XABC
答:
(a) 63
(b) 119
(c) 2748

2、数据溢出

如果 i*i 超出了 int 型的最大取值,则程序 square2.c 将失败(通常会显示奇怪的答案)。
运行程序,确定导致失败的 n 的最小值。尝试将变量 i 的类型改成 short int,再次运行程序。然后尝试改成 long int 类型
总结机器用于存储整型的位数
答:
导致失败的 n 的最小值为 46341(原因:46341 开平方大于(2^31)-1 次方)
更改为 short int 类型后,导致失败的 n 的最小值为 182(原因:182 开平方大于(2^15)-1)
更改为 long int 类型后,导致失败的 n 的最小值为 3037000500(原因:3037000499 开平方大于(2^63)-1)
int 存储整型位数为 32
short int 存储整型位数为 16
long int 存储整型位数为 64

3、数字类型

下列哪些在 C 语言中不是合法的数?区分每一个合法的数是整数还是浮点数
(a) 010E2
(b) 32.1E+5
(c) 0790
(d) 100_000
(e) 3.978e-2
答:
(a) 合法。浮点型

注意:在科学计数法中使用八进制,C 编译器会将其首位的 0 忽略并理解为十进制

(b)合法。浮点数
(c)不合法,0 开头的是八进制,只有 0-7(感谢 @zyk 朋友的指正)
(d)不合法
(e)合法。浮点数

4、类型声明

下列哪些在 C 语言中不是合法的类型
(a) short unsigned int
(b) short float
(c) long double
(d) unsigned long
答: (b)和(d)

5、double 型求和

修改程序 sum2.c 以便可以进行一串 double 型值的求和运算
答:

#include <stdio.h>

main()
{
    double n, sum = 0;
	
    printf("This program sums a series of integers.\n");
    printf("enter integers (0 to terminate): ");
    scanf("%lf", &n);
    while (n != 0) {
        sum += n;
        scanf("%lf", &n);
    }
    printf("The sum is: %lf\n", sum);

    return 0;
}

6、char 类型

如果变量 c 是 char 类型,则下列哪条语句是非法的?
(a) i += c; /* i has type int */
(b) c = 2 * c – 1;
(c) putchar(c);
(d) printf(c);
答:(d)

7、数字书写方式

下列哪条在书写 65 上不是合法的方式?(假设字符集是 ASCII);
(a) ‘A’
(b) 0b1000001
(c) 0101
(d) 0x41
答:都合法

8、getchar

修改程序 square2.c 以便它在每 24 次平方后暂停并显示如下信息:
Press Enter to continue…
在显示完消息后,程序应该使用 getchar 函数读入一个字符。getchar 函数将不允许程序继续执行直到用户输入回车键
注意:由于 scanf()和 getchar()混用,记得在使用 getchar()暂停之前处理 scanf()在缓冲区遗留的\n

#include <stdio.h>

main()
{
    int i, n;

    printf("This program prints table of squares.\n");
    printf("Enter number of entries in table: ");
    scanf("%d", &n);
    getchar();

    for (i = 1; i <= n; i++) {
        printf("%10d%10d\n", i, i * i);
        if (! (i % 24) && (i != n)) {
            printf("Press Enter to continue...");
            while (getchar() != '\n') {
                ;
            }
        }
    }

    return 0;
}

9、电话号码

编写程序可以把字母格式的电话号码翻译成数值格式
Enter phone number: CALLATT
2255288
字母在键盘上的对应关系:2=ABC, 3=DEF, 4=GHI, 5=JKL, 6=MNO, 7=PQRS, 8=TUV, 9=WXYZ
如果原始的电话号码包含非字母的字符(例如,数字或标点符号),那么保留下来不做变化
Enter phone number: 1-800-COL-LECT
1-800-265-5328

#include <stdio.h>
#include <ctype.h>

main()
{
    char ch;

    printf("Enter phone number: ");
    for (;;) {
        ch = toupper(getchar());
        if (ch == '\n') {
            putchar('\n');
            break;
        }

        switch (ch) {
            case 'A':
            case 'B':
            case 'C':
                putchar('2');
                break;
            case 'D':
            case 'E':
            case 'F':
                putchar('3');
                break;
            case 'G':
            case 'H':
            case 'I':
                putchar('4');
                break;
            case 'J':
            case 'K':
            case 'L':
                putchar('5');
                break;
            case 'M':
            case 'N':
            case 'O':
                putchar('6');
                break;
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
                putchar('7');
                break;
            case 'T':
            case 'U':
            case 'V':
                putchar('8');
                break;
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
                putchar('9');
                break;
            default:
                putchar(ch);
                break;
        }        
    }
    return 0;
}

10、拼字游戏

在十字拼字游戏中,玩家利用小卡片组成单词,每个卡片包含字母和面值。面值根据字母的不同而不同
1——AEILNORSTU,2——DG,3——BCMP,4——FHVWY,5——K,8——JX,10——QZ
编写程序通过对字母对应的面值求和来计算单词的值。
Enter a work: pitfall
Scrabble value: 12
答:

#include <stdio.h>
#include <ctype.h>

main()
{
    int number = 0;
    char alpha;
    printf("Enter a work: ");
    
    while ((alpha = getchar()) != '\n') {
        alpha = toupper(alpha);
        switch (alpha) {
            case 'A':
            case 'E':
            case 'I':
            case 'L':
            case 'N':
            case 'O':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
                number += 1;
                break;
            case 'D':
            case 'G':
                number += 2;
                break;
            case 'B':
            case 'C':
            case 'M':
            case 'P':
                number += 3;
                break;
            case 'F':
            case 'H':
            case 'V':
            case 'W':
            case 'Y':
                number += 4;
                break;
            case 'K':
                number += 5;
                break;
            case 'J':
            case 'X':
                number += 8;
                break;
            case 'Q':
            case 'Z':
                number += 10;
                break;
        }
    }
    printf("Scrabble value: %d\n", number);

    return 0;
}

11、飞机票

飞机票有冗长的标识数字,例如 47715497443。为了有效,最后一位数字必须与其他位的数字为整体除以 7 后的余数相匹配
编写程序检查机票号是否有效:
Enter ticket number: 47715497443
VALID
使用 getchar 函数逐个获取数字。一次执行一个数字的除法

#include <stdio.h>

main()
{
    int i, dividend, remainder = 0, checkId;
    
    printf("Enter ticket number: ");
    dividend = getchar() - '0';
    for (i = 1; i <= 10; i++) {
        remainder = dividend % 7;
        if (i == 10) {
            break;
        }
        dividend = remainder * 10 + (getchar() - '0');
    }

    checkId = getchar() - '0';
    if (remainder == checkId) {
        printf("VALID\n");
    } else {
        printf("NOTVALID\n");
    }

    return 0;
}

12、类型空间大小

编写程序显示 sizeof(int)、sizeof(short int)、sizeof(long int)、sizeof(float)、sizeof(double)和 sizeof(long double)的值
答:

#include <stdio.h>

main()
{
    printf("sizeof(int): %ld\n", sizeof(int));
    printf("sizeof(short int): %ld\n", sizeof(short int));
    printf("sizeof(long int): %ld\n", sizeof(long int));
    printf("sizeof(float): %ld\n", sizeof(float));
    printf("sizeof(double): %ld\n", sizeof(double));
    printf("sizeof(long double): %ld\n", sizeof(long double));

    return 0;
}
[root@localhost lianxiti_7]# ./tSizeOf 
sizeof(int): 4
sizeof(short int): 2
sizeof(long int): 8
sizeof(float): 4
sizeof(double): 8
sizeof(long double): 16

13、整型提升

假设变量 i 和变量 j 都是 int 类型,那么表达式 i / j + ‘a’是什么类型
答:int 类型

14、隐式转换判断 1

假设变量 i 是 int 类型,变量 j 是 long int 类型,并且变量 k 是 unsigned int 类型,那么表达式 i + (int)j * k 是什么类型?
答:unsigned int 类型

15、隐式转换判断 2

假设变量 i 是 int 类型,变量 f 是 float 类型,并且变量 d 是 double 类型,那么表达式 i * f / d 是什么类型
答:double 类型

16、隐式转换判断 3

假设变量 i 是 int 类型,变量 f 是 float 类型,并且变量 d 是 double 类型,请解释在执行下列语句时发生了什么转换?
d = i + f
答:首先 i + f 发生了算术隐式转换,将变量 i 的类型转换为了 float。然后执行赋值操作时,发生赋值隐式转换,将(i + f)表达式的类型从 float 转换为 double 类型

17、类型转换练习

假设程序包含下列声明:
char c = ‘\1’;
short int s = 2;
int i = -3;
long int m = 5;
float f = 6.5;
double d = 7.5;
请给出下列每个表达式的值和类型
(a) c * i
(b) s + m
(c) f / c
(d) d / s
(e) f – d
(f) (int) f
答:
(a) -3 int
(b) 7 long int
(c) 6.5 float
(d) 3.75 double
(e) -1 double
(f) 6 int

18、显式(强制)转换

下列语句是否始终可以正确地计算出 f 的小数部分(假设 f 和 frac_part 都是 float 型变量)
frac_part = f – (int) f;
如果不是,那么是出了什么问题
答:是的

19、typedef

使用 typedef 产生名为 Int8、Int16 和 Int32 的类型。定义这些类型以便他们可以在你的机器上分别表示 8 位、16 位和 32 位的整数
答:
typedef Int8 char
typedef Int16 short int
typedef Int32 int

知识点:
1、char 可以用来存储小值整数。C 语言是按照小整数方式来处理字符的
2、char 在 32 位机器和 64 位机器上都分配 1 个字节
3、short int 在 32 位机器和 64 位机器上都分配 2 个字节
4、int 在 32 位机器和 64 位机器上都分配 4 个字节


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

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 第三题0790不合法吧,以零开头的是八进制的9不在0-7内
    zyk2019-03-03 11:14 回复
    • 菜鸟
      啊哈哈,确实,感谢您的指正 :oops: (不好意思,回复晚了..
      菜鸟2019-03-10 18:59 回复