乐趣区

关于c:浙大版C语言程序设计第四版何钦铭颜晖-第6章-回顾数据类型和表达式-课后习题答案

你也能够上程序咖 (https://meta.chengxuka.com),关上大学幕题板块,岂但有答案,解说,还能够在线答题。

一、选择题

1. 已知字符 ‘A’ 的 ASCII 码是 65,别离对应八进制数 101 和十六进制数 41,以下()不能正确示意字符 ’A’。

A. ‘A’

B. ‘\101’

C. ‘\x41’

D. ‘\0x41’

答:D

解析:

十六进制示意字符用 \x 结尾。

2. 设 a 为整型变量,不能正确表白数学关系:10<a<15 的 C 语言表达式是()。

A.10<a<15

B. !(a<= 10lla>= 15)

C. a>10 && a<15

D. !(a<= 10)&&!(a>= 15)

答:A

解析:

在 C 语言中,不能像选项 A 中 10<a<15,这样写。

3. 执行以下程序段后,变量 c 的值是()。

int a=10, b=20, c;
c=(a%2==0)? a:b

A.0

B.5

C.10

D.20

答:C

解析:

a 的初始值是 10,b 的初始值是 20。

a %2 == 0,值为 1。所以取:前的内容赋值给 c,即 a 的值。所以为 10。

4. 设 x、y 都是整型变量,表达式()的值不为 9。

A. x=y=8, x+y, x+1

B. x=y=8, x+y, y+1

C. y=8, y+1, x=y, x+1

D. x=8 ,x+1,y=8,x+y

答:D

解析:

选项 A,x=y=8,那么 x 为 8,y 为 8,x+y 为 17,x+1 为 9。

选项 B,x=y=8,那么 x 为 8,y 为 8,x+y 为 17,y+1 为 9。

选项 C,y=8,y+1 为 9,x=y,x 为 8,x+1 为 9。

选项 D,x=8,x+1 为 9,y=8,x+y,为 16。

5. 若 a 是整型变量,表达式 ~ (a^~a) 等价于()。

A. ~a
B. 1
C. 0
D. 2

答:C

解析:

首先 a ^ ~a,为 1。~1 为 0。

6. 若表达式 sizeof(int) 的值为 2,则 int 类型数据能够示意的最大整数为()。

A. 216-1
B. 215-1
C. 232-1
D.231-1

答:B

解析:sizeof 用于返回变量或数据类型的字节长度。题目中 sizeof(int) 的值为 2,阐明占 2 个字节,那就是 16 位。所以能够示意最大的整数是 215-1。

二、填空题

1.-127 的原码为()、反码为()、补码为()。

答:

1000000001111111

1111111110000000

1111111110000001

解析:

依照原码,反码,补码的规定,负数的原码,反码,补码都雷同,即符号位是 0,其余各位示意数值。正数的原码:符号位是 1,其余各位示意数值的绝对值。反码:符号位是 1,其余各位对原码取反。补码:反码加 1。

2. 设 int a=5, b=6; 则表达式 (++a==b–) ?++a:–b 的值是()。

答:7

解析:

(++a==b–) ?++a:–b,整体是一个条件表达式。

先要看?左侧的内容是否为非 0。所以先计算 (++a==b–),这里 a 的初始值是 5,++ a 的后果是 6,a 的值通过自加 1 后也为 6。再看 b– 的值,b 的初始值为 6,b– 按 6 来算,自减 1 后,b 的值为 5。所以 (++a==b–),即为 6 == 6,为 1,那么整个条件表达式取:前的值,即 ++a 的值,a 的值之前经验过 自增 1,曾经变为 6 了,那么 ++a 就是 7。整个表达式执行完,最初 a 的值是 7,b 的值是 5。

3. 设变量定义如下,则表达式 ‘x’+1>c 的值是(),’y’!=c+2 的值是(),-a-5* b<=d+1 的值是(),b== (a=2) 的值是()。

  char c='w'; int a=1, b=2, d=-5;

答:1 0 1 1

解析:

‘x’+1>c:’x’ 的值为 120,’x’+1 的后果就是 121,’w’ 的值为 119。所以 ‘x’+1>c 成立,后果即为 1。

‘y’!=c+2:’y’ 的值为 121,c 为 ‘w’ 值为 119,c+2 的值就是 121,所以 ‘y’!=c+2,值都是 121,不成立,后果即为 0。

-a-5* b<=d+1:这里先算 <= 左侧的内容,-a-5*b,-1-10 = -11,<= 右侧的内容 d+1,是 -4,-11<=-4,成立,后果即为 1。

b== (a=2):先算 == 右侧的内容,a=2,即为 2,b==2,成立,后果即为 1。

4. 逻辑表达式 x && 1 等价于关系表达式()。

答:x!=0

解析:x !=0,就示意 x 非 0,x && 1,&& 示意并且的意思,1 为非 0,只有 x 非 0 即可。

5. 输出 13456# <Enter>,则输入后果是()。

  char ch;
  while((ch=getchar())!='#'){putchar(ch); 
      ch=getchar();}

答:135

解析:

while 循环的条件是读入一个字符到 ch 中,如果不是 #,条件就成立。

所以程序执行后,进入 while 循环后,在判断条件时先读入第一个字符 1,循环条件成立,进入循环体,打印 ch 这个字符,此时是 1,所以先打印 1。而后执行到下一行,会再读入一个字符 2。而后再来判断循环条件,那么此时再读入一个字符 3,不是 #,循环条件成立,那么进入循环体,打印 ch,此时是 3,打印输出 3,而后再读入一个字符 4。而后再来判断循环条件,那么此时再读入一个字符 5,不是 #,循环条件成立,那么进入循环体,打印 5,而后再读入一个字符 6。而后再来判断循环条件,那么此时再读入一个字符 #,循环条件不成立了,退出 while 循环。最终打印的后果就是 135。

三、程序设计题

题目 1:分类统计字符个数:输出一行字符,统计出其中的英文字母、空格、数字和其余字符的个数。试编写相应程序。

答案代码:

#include <stdio.h>
int main(void)
{// 习题 (6.3.1)
    /*
    分类统计字符个数:输出一行字符,统计出其中的英文字母、空格、数字和其余字符的个数。*/
    char ch;
    int letter = 0, digit = 0, blank = 0, other = 0;
    printf("input string:");
    while (ch != '\n')
    {scanf("%c", &ch); // 能够退出 getchar(); 用于读入并舍弃换行符,但此处是循环取值,不能够加,可参考课本 P056 例 3 -7
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
        {letter++;}
        else if (ch >= '0' && ch <= '9')
        {digit++;}
        else if (ch == ' ')
        {blank++;}
        else
        {other++; // 包含输出字符完结的那个回车}
    }
    printf("letter= %d,digit= %d,blank= %d,other= %d\n", letter, digit, blank, other);

    return 0;
}

运行后果:

题目 2:应用函数累加由 n 个 a 形成的整数之和:输出两个正整数 a 和 n,求 a +a+aa+aaa+aa…a (n 个 a) 之和。要求定义并调用函数 fn(a, n),它的性能是返回 aa…a (n 个 a)。例如,fn(3, 2) 的返回值是 33。试编写相应程序。

答案代码:

#include <stdio.h>
int fn(int a, int n)
{
    int i, sum = 0;
    for (i = 1; i <= n; i++)
    {
        sum += a;
        a = a * 10;
    }
    return sum;
}

int main(void)
{// 习题 (6.3.2)
    /*
    应用函数累加由 n 个 a 形成的整数之和:输出两个正整数 a 和 n,求 a +a+aa+aaa+aa...a (n 个 a) 之和。要求定义并调用函数 fn(a, n),它的性能是返回 aa...a (n 个 a)。例如,fn(3, 2) 的返回值是 33。*/
    int n, a, sum = 0;
    printf("input a,n:");
    scanf("%d%d", &a, &n);
    while (n != 0)
    {sum += fn(a, n);
        n--;
    }
    printf("sum= %d\n", sum);

    return 0;
}

运行后果:

题目 3:应用函数输入指定范畴内的完数:输出两个正整数 m 和 n (1≤m,n≤1 000),输入 m~n 之间的所有完数,完数就是因子和与它自身相等的数。要求定义并调用函数 factorsum(number),它的性能是返回 number 的因子和。例如,factorsum(12) 的返回值是 16(1+2+3+4+6)。试编写相应程序。

答案代码:

#include <stdio.h>

// 获取 number 的因子的和
int factorsum(int number)
{
    int i, sum = 0;
    for (i = 1; i <= number / 2; i++)
    {if (number % i == 0)
        { // number 是 i 的倍数
            sum += i;
        }
    }
    return sum;
}
int main(void)
{// 习题 (6.3.3)
    /*
    应用函数输入指定范畴内的完数:输出两个正整数 m 和 n (1≤m,n≤1 000),输入 m~n 之间的所有完。完数就是 因子和 与它自身相等的数。要求定义并调用函数 factorsum(number),它的性能是返回 number 的因子和。例如,factorsum(12) 的返回值是  16(1+2+3+4+6)。*/
    int m, n, j, result = 0;
    printf("input m,n(m>=1,n<=10000):");
    scanf("%d%d", &m, &n);
    printf("%d~%d 之间的完数为:", m, n);
    for (j = m; j <= n; j++)
    {result = factorsum(j);
        if (result == j)
        {printf("%6d", j);
        }
    }

    printf("\n");
    return 0;
}

运行后果:

题目 4:应用函数输入指定范畴内的斐波那契数:输出两个正整数 m 和 n (1≤m,n≤10 000),输入 m~n 之间所有的斐波那契数。斐波那契序列(第 1 项起):1 1 2 3 5 8 13 21… 要求定义并调用函数 fib(n),它的性能是返回第 n 项斐波那契数。例如,fib(7) 的返回值是 13。试编写相应程序。

答案代码:

#include <stdio.h>
/*int fib(int n)// 返回斐波那契数列第 n 项
{// 递归
    if(n==1||n==2){// 第一项和第二项后果都为 1,返回 1
        return 1;
    }
    else return fib(n-1)+fib(n-2);// 从第三项开始,等于前两项之和
}*/
int fib(int n) // 非递归,更易了解
{
    int x1 = 1, x2 = 1, x = 0, i;
    if (n < 3)
    {return 1;}
    else
    {for (i = 0; i <= n - 3; i++) // 只循环 n - 2 次,当 n = 3 时,x=3
        {
            x = x1 + x2;
            x1 = x2;
            x2 = x;
        }
        return x;
    }
}
void fibon(int m, int n)
{
    int i, count = 0;
    for (i = 1; fib(i) <= n; i++) // 数列到 <= n 时终止循环,不然会死循环
    {if (fib(i) >= m)
        {             // 固定在 m~n 之间
            count++; // 记录数列的项数
            printf("%6d", fib(i));
        }
    }
    if (count == 0)
    {printf("No Fibonacci number\n");
    }
}
int main(void)
{// 习题 (6.3.4)
    /*
    应用函数输入指定范畴内的斐波那契数:输出两个正整数 m 和 n (1≤m,n≤10 000),输入 m~n 之间所有的斐波那契数。斐波那契序列(第 1 项起):1 1 2 3 5 8 13 21... 要求定义并调用函数 fib(n),它的性能是返回第 n 项斐波那契数。例如,fib(7) 的返回值是 13。*/
    int m, n, t;
    printf("input m,n(m>=1,n<=10000),t:");
    scanf("%d%d%d", &m, &n, &t);
    printf("fib(%d)=%d\n", t, fib(t));
    fibon(m, n);
    return 0;
}

运行后果:

题目 5:应用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可示意为两个奇素数之和。例如 6=3+3,8=3+5,…,18=5+13。将 6~100 之间的偶数都示意成两个素数之和。打印时一行打印 5 组。试编写相应程序。

答案代码:

#include <stdio.h>
#include <math.h>
int prime(int m);
int main(void)
{// 习题 (6.3.5)
    /*
    应用函数验证哥德巴赫猜想:任何一个不小于  6 的偶数均可示意为两个奇素数之和。例如 6=3+3,8=3+5,...,18=5+13。将 6~100 之间的偶数都示意成两个素数之和。打印时一行打印 5 组。*/
    // 这里咱们的 m、n 的值曾经给定了,当然也能够本人输出
    int i, m = 6, n = 100, count;
    // 循环区间,都是偶数所以 m+=2
    for (m = 6; m <= n; m += 2)
    {
        // 初始化 i =3,最小奇素数是 3
        for (i = 3; i <= m; i += 2)
        {
            // 奇数不肯定为素数,所以须要判断
            if (prime(i) && prime(m - i))
            {printf("%d=%d+%d\t\t", m, i, m - i);
                count++;
                if (count % 5 == 0)
                {printf("\n"); // 每行打印 5 个
                }
            }
        }
    }

    return 0;
}

int prime(int m)
{
    // 只有 1 和它自身能被其整除,1 不是素数,2 是素数
    int i;
    if (m == 1)
    {return 0;}
    else
    {for (i = 2; i <= sqrt(m); i++)
        {if (m % i == 0)
            {return 0;}
        }
        return m;
    }
}

运行后果:

题目 6:应用函数输入一个整数的逆序数:输出一个整数,将它逆序输入。要求定义并调用函数 reverse(number),它的性能是返回 number 的逆序数。例如,rever(12345) 的返回值是 54321。试编写相应程序。

答案代码:

#include <stdio.h>
int reverse(int number);
int main(void)
{// 习题 (6.3.6)
    /*
    应用函数输入一个整数的逆序数:输出一个整数,将它逆序输入。要求定义并调用函数 reverse(number),它的性能是返回 number 的逆序数。例如,rever(12345) 的返回值是 54321。*/
    int in = 12345, res;
    printf("input a number:");
    scanf("%d", &in);
    res = reverse(in);
    printf("%d\n", res);
    return 0;
}
int reverse(int number)
{
    int flag, res;
    if (number >= 0)
        flag = 1;
    else
    {
        flag = -1;
        number = -number;
    }
    res = 0;
    do
    {
        res = res * 10 + number % 10;
        number /= 10;
    } while (number != 0);
    return flag * res;
}

运行后果:

题目 7:简略计算器:模仿简略运算器的工作,输出一个算式(没有空格),遇等号”=”阐明输出完结,输入后果。假如计算器只能进行加、减、乘、除运算,运算数和后果都是整数,4 种运算符的优先级雷同,按从左到右的程序计算。例如,输出“1+2*10-10/2=”后,输入 10。试编写相应程序。

答案代码:

#include <stdio.h>
int main(void)
{// 习题 (6.3.7)
    /*
    简略计算器:模仿简略运算器的工作,输出一个算式(没有空格),遇等号”=”阐明输出完结,输入后果。假如计算器只能进行加、减、乘、除运算,运算数和后果都是整数,4 种运算符的优先级雷同,按从左到右的程序计算。例如,输出“1+2*10-10/2=”后,输入 10。*/

    int a, b, sum = 0;
    char ch;
    printf("输出一个算式:");
    scanf("%d", &a); // 取输出算式的第一个数
    while ((ch = getchar()) != '=')
    {scanf("%d", &b); // 取算式的第二个数,取算式的第三个数
        switch (ch)
        { // 判断运算符
        case '+':
            sum = a + b;
            break; // 每次一个运算符就完结,再赋值,就能满足从左到右(从整个输出的那个大算式看),加减乘除看似违反先乘除再加减的法令
        case '-':
            sum = a - b;
            break;
        case '*':
            sum = a * b;
            break;
        case '/':
            if (b != 0)
            {sum = a / b;}
            break;
        default:
            printf("error");
            return 0; // 如果不是运算符间接完结程序
        }
        a = sum; // 前两个数算完后, 须要把 sum 赋给 a 再次进入循环
    }
    printf("%d\n", a);
    return 0;
}

运行后果:

题目 8:统计一行字符,将每个单词的首字母改为大写后输入。所谓“单词”是指间断不含空格的字符串,各单词之间用空格分隔,空格数能够是多个,试编写相应程序。

答案代码:

#include <stdio.h>
int main(void)
{// 习题 (6.3.8)
    /*
    统计一行字符,将每个单词的首字母改为大写后输入。所谓“单词”是指间断不含空格的字符串,各单词之间用空格分隔,空格数能够是多个
    */

    int word = 0; // 满足非空格字符转换条件
    char ch;
    while ((ch = getchar()) != '\n')
    {if (ch == ' ')
        {word = 0; // 合乎多空格也能够满足条件,同时在此条件下,进行字符转换}
        else if (word == 0)
        { // 字符非空格,此时 word( 定义的时候的)=0, 判断并转化为大写字母
            if (ch >= 'a' && ch <= 'z')
            {
                ch = ch - 32;
                word = 1; // 在没遇到空格时,小写输入,同时保障只输入一个大写字母
            }
        }
        putchar(ch); // 输入大写字母后,Word=1,第一个 if 不进,第一个 else 也不进,间接到这原样输入字符(即小写)}
    printf("\n");
    return 0;
}

运行后果:

退出移动版