首页 > 编程语言 >大学教材《C语言程序设计》(浙大版)课后习题解析 | 第五、六章

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第五、六章

时间:2024-03-31 09:58:05浏览次数:36  
标签:ch return 函数 int number C语言 课后 习题 main

概述

      本文主要提供《C语言程序设计》(浙大版) 第五、六章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第七、八章节课后习题解析,如想了解更多,请持续关注该专栏。

专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客icon-default.png?t=N7T8http://t.csdnimg.cn/ZtcgY

一.第五章(函数)

选择题

[5-1]

在 C 语言程序中,若对函数类型未加显式说明,则函数的隐含类型为( )。
A. void

B. double

C. char

D. int

答:D

解析:在不返回结果的函数定义中,void 不能省略;否则,函数类型被默认定义为 int 。

[5-2]

以下正确的说法是( )。
A.实参与其对应的形参共同占用一个存储单元

B.实参与其对应的形参各占用独立的存储单元

C.只有当实参与其对应的形参同名时才占用一个共同的存储单元

D.形参是虚拟的,不占用内存单元

答:B

解析:按照 C 语言的规定,在参数传递过程中,将实参的值复制给形参。所以他们各自占用独立的存储单元。

[5-3]

以下不正确的说法是( )。
A.实参可以是常量、变量或表达式

B.实参可以是任何类型

C.形参可以是常量、变量或表达式

D.形参应与对应的实参类型一致

答:C

解析:实参和形参一一对应,数量应相同,顺序应一致。实参可以是常量、变量或表达式。

形参不可以是常量。

[5-4]

在函数调用 Fume(exp1, exp2+exp3, exp4*exp5) 中,实参的数量是( )。
A.3

B.4

C.5

D.语法错误

答:A

解析:参数使用逗号分割,所以题目中是3个参数。

[5-5]

下列程序的输出结果是( )。

fun(int a, int b, int c)
{
    c = a * b;
}
int main(void)
{
    int c;
    fun(2, 3, c);
    printf("%d\n", c);
    return 0;
}

A.0

B.1

C.6

D.无法确定

答:D

解析:在 main() 中,变量 c 并没有初始值,因为它是局部变量,在没有初始化的时候,系统会分配随机值。在调用函数时,这里将数值 2,3,c 作为实参传递给形参 a,b,c。在函数中 c 的值为 a *b 是 6,但是不影响 main() 中变量 c 的值。main() 中的打印变量 c 的值,还是最初系统分配的那个随机值。

[5-6]

以下程序的运行结果是( )。

int x = 5, y = 6;
void incxy()
{
    x++;
    y++;
}
int main(void)
{
    int x = 3;
    incxy();
    printf("%d,%d\n", x, y);
    return 0;
}

A.3,6

B.4,7

C.3,7

D.6,7

答:C

解析:

首先分析变量,第一行定义了两个变量 x 和 y ,值分别是 5 和 6 。这是两个全局变量。就是在所有的函数中都可以使用。然后是自定义函数 incxy() ,里面就 2 行代码,x++ 和 y++。然后是 main(),而实际上程序是从 mian() 函数开始执行,这里先定义了一个变量,也叫 x ,初始值为 3,然后调用自定义函数 incxy(),执行函数后,x 和 y 分别子增 1,这里的 x 和 y 也就是上面的全局变量,所以自定义函数执行结束后,全局变量 x 和 y 的值分别是 6 和 7 。自定义函数结束后,main() 继续向下执行,打印 x 和 y 的值,那么这个 x ,是哪个呢?根据 C 语言的规则,当一个函数中,局部变量和全局变量名相同的时候,那么函数中操作的是局部变量,所以打印的是 main() 里面定义的局部变量 x 的值为 3,而 y,在main() 没有定义,那么自然就是全局变量 y 值为 7。

填空题

[5-1]

下列程序的输出结果为( )。

int funp(int m);
int main(void)
{
    int n;
    for(n=1; n<10; n++)
        if(funp(n)==1)    printf("%d#", n);
    return 0;
}
int funp( int m)
{
    int i;
    if(m==2||m==3)    return 1;
    if(m<2|| m%2==0)    return 0;
    for(i=3; i<m; i=i+2)
        if(m%i==0)    return 0;
    return 1;
}

答:2#3#5#7#

解析:

main() 中主要就是一个 for 循环,变量 n 的值从 1 累加到 10后,结束循环。

第一次循环 n 为 1,循环条件成立,执行循环体,循环里是一个 if 语句,if 条件是一个函数调用 funp(),判断函数的返回值是否为 1。将 n 的值为 1,作为参数,传递给自定义函数,形参 m 的值就是 1。该函数中,当 m 的值为 1 时第一个 if 语句条件不成立, 第二个 if语句条件成立,因为 m < 2,函数返回 0。回到 main() 的循环中,if 语句的条件就不成立了。然后 n++,n的值为 2。

第二次循环 n 为 2,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 2。那么在自定义函数中 m 的值就是 2。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中, if 语句的条件成立,打印 2#。然后 n++,n 的值为3。

第三次循环 n 为 3,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 3。那么在自定义函数中 m 的值就是 3。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中, if 语句的条件成立,打印 3#。然后 n++,n 的值为4。

第四次循环 n 为 4,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 4。那么在自定义函数中 m 的值就是 4。第一个 if 语句条件不成立,第二个 if 语句条件成立,自定义函数返回值为 0。回到 main() 的循环中,if 语句的条件就不成立了。然后 n++,n的值为 5。

第五次循环 n 为 5,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 5。那么在自定义函数中 m 的值就是 5。第一个 if 语句条件不成立,第二个 if 语句条件也不成立,进入 for 循环,整个循环结束也没有返回值,那么执行最后的return 1。回到 main() 的循环中, if 语句的条件成立,打印 5#。然后 n++,n 的值为6。

往下依次类推。。。

[5-2]

判断正整数的各位数字是否按从小到大排列。输入一批正整数(以零或负数为结束标志),判断每个数从高位到低位的各位数字是否按值从小到大排列。要求定义和调用函数 fun( m) 判断 m 中各位数字是否按值从小是小到大排列,满足条件返回 1 ,否则返回 0。请填空。

_________________;
int main(void)
{
    int n;
    scanf("%d", &n);
    while (n > 0)
    {
        if (_________________)
        {
            printf("%d 中各位数字按从小到大排列\n", n);
        }
        else
        {
            printf("%d 中各位数字没有按从小到大排列\n", n);
        }
        scanf("%d", &n);
    }
    return 0;
}
int fun(_________________)
{
    int cur_digit, old_digit = m % 10;
    while (m > 10)
    {
        _________________;
        cur_digit = m % 10;
        if (cur_digit >= old_digit)
        {
            return 0;
        }
        _________________;
    }
    return 1;
}

答:

int fun(int m)

fun(n)

int m

m = m / 10

old_digit = cur_digit

解析:

因为函数的定义在下面,那首先需要函数声明,所以第一行先声明函数。在 main() 的 if 语句中调用函数。这个自定义函数是需要传入参数的,所以第三个空是定义参数 m。自定义函数里的思路就是循环获取数值的每个位上的数字,判断是否从小到大排序。

[5-3]

输出 Yes 或 No 。输入字符 'y' ,或 'Y' ,则在屏幕上输出字符串 "Yes. " ; 输入其他字符,则在屏幕上输出字符串 "No! " 。要求定义和调用函数 YesNo(ch) ,当 ch 为 'y' 或 'Y' 时输出 "Yes. " ,当 ch 为其他字符时输出 "No! " 。请填空。

void YesNo(_________________)
{
    switch (ch)
    {
    case 'y':
    case 'Y':
        _________________
    default:
    _________________
    }
}
int main(void)
{
    char ch;
    printf("Please input a character: \n");
    ch = getchar();
    _________________
    return 0;
}

答:

char ch

printf("Yes."); break;

printf("No!");

YesNo(ch);

解析:

自定义函数,主要是用来判断输入的字符是否是 y 或者 Y 的。所以需要通过参数传入,那么在定义函数的时候需要形参,所以第一个空是定义参数。然后进行判断字符是否是 y 或 Y。如果是打印 "Yes. ",其他的字符都打印 "No! ",那么写在 default 里就可以了。最后在 main() 中调用该函数。

程序设计题

[5-1]

使用函数计算分段函数的值:输入 x ,计算并输出下列分段函数 f(x) 的值。要求定义和调用函数 sign(x) 实现该分段函数。试编写相应程序。
 
答案代码:

#include <stdio.h>
int sign(int x)
{
    int f;
    if (x < 0)
    {
        f = -1;
    }
    else if (x > 0)
    {
        f = 1;
    }
    else
        f = 0;
    return f;
}
int main(void)
{
    // 习题(5.3.1)
    /*
    使用函数计算分段函数的值:输入 x ,计算并输出下列分段函数 f(x) 的值。
    要求定义和调用函数 sign(x) 实现该分段函数。
    */
    int x, y;
    printf("input x:");
    scanf("%d", &x);
    y = sign(x);
    printf("f(x) = %d\n", y);
    return 0;
}

[5-2]

使用函数求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数 even(n) 判断数的奇偶性,当 n 为偶数时返回 1 ,否则返回 0。试编写相应程序。
 

答案代码:

#include <stdio.h>
int even(int n)
{
    if (n % 2 == 0)
    {
        return 1;
    }
    else
        return 0;
}
int main(void)
{
    int n, sum = 0;
    printf("input n:\n");
    while (1)
    {
        scanf("%d", &n);
        if(n <= 0){
            break;
        }
        if (even(n) == 0) //调用函数返回值为0时,奇数和。当even(n)==1时,偶数和。
        {
            sum += n;
        }
    }
    printf("sum= %d\n", sum);
    return 0;
}

运行结果:

[5-3]

使用函数计算两点间的距离:给定平面任意两点坐标 (x1, y1) 和 (x2, y2) , 求这两点之间的距离 (保留 2 位小数) 。要求定义和调用函数 dist(x1, y1, x2, y2)计算两点间的距离。试编写相应程序。
 

答案代码:

#include <stdio.h>
#include <math.h>
double dist(double x1, double y1, double x2, double y2)
{
    double s = 0;
    s = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
    return s;
}
int main(void)
{
    double x1, y1, x2, y2, dis;
    printf("input x1,y1,x2,y2:");
    scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
    dis = dist(x1, y1, x2, y2);
    printf("两点之间的距离是: %.2lf\n", dis);
    return 0;
}

运行结果:

[5-4]

利用函数计算素数个数并求和:输入两个正整数 m 和 n ( 1≤m, n≤500), 统计并输出 m 和 n 之间的素数的个数以及这些素数的和。要求定义并调用函数 prime(m) 判断 m 是否为素数。试编写相应程序。
 

答案代码:

#include <stdio.h>
#include <math.h>
//判断m是否为素数
int prime(int m)
{
    int j;
    // 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
    if (m == 1)
    {
        return 0;
    }
    // 判断除 1 外的自然数
    for (j = 2; j <= sqrt(m); j++)
    {
        if (m % j == 0)
        {
            return 0;
        }
    }
    return 1;
}
int main(void)
{
    int m = 1, n = 100, i, sum = 0, count = 0;
    printf("input m,n(m>=1,n<=500):");
    scanf("%d%d", &m, &n);
    for (i = m; i <= n; i++) //将i的值传到自定义函数里
    {
        if (prime(i) == 1)
        {
            sum += i;
            count++;
        }
    }
    printf("%d~%d 之间的素数个数为 %d,和为 %d\n", m, n, count, sum);
    return 0;
}

运行结果:

[5-5]

使用函数统计指定数字的个数:读入一个整数,统计并输出该数中 “2” 的个数。要求定义并调用函数 countdigit( number, digit),它的功能是统计整数 number 中数字 digit 的个数。例如,countdigit( 12 292, 2) 的返回值是 3 。试编写相应程序。
 

答案代码:

#include <stdio.h>
int countdigit(int number, int digit)
{
    int count = 0;
    while (number > 0)
    {
        if (number % 10 == digit)
        {
            count++;
        }
        number = number / 10;
    }
    return count;
}
int main(void)
{
    int number, digit = 2, count;
    printf("input number:");
    scanf("%d", &number);
    count = countdigit(number, digit);
    printf("%d 中的 %d 的个数为 %d\n", number, digit, count);
    return 0;
}

运行结果:

[5-6]

使用函数输出水仙花数:输入两个正整数 m 和 n (1≤m, n≤1000) 输出 m~n 之间的所有满足各位数字的立方和等于它本身的数。要求定义并调用函数 is(number) 判断 number 的各位数字之立方和是否等于它本身。试编写相应程序。
 

答案代码:

#include <stdio.h>
#include <math.h>
int is(int number)
{
    int x, sum, y;
    y = number;
    sum = 0;
    do
    {
        x = y % 10;
        sum += pow(x, 3);
        y = y / 10;
    } while (y > 0);
    if (sum == number)
    {
        return sum;
    }
    else
        return 0;
}
int main(void)
{
    int m, n, i, result = 0;
    printf("input m,n(m>=1,n<=1000):");
    scanf("%d%d", &m, &n);
    for (i = m; i <= n; i++)
    {
        result = is(i);
        if (result >= m && result <= n)
        {
            printf("%d\n", result);
        }
    }
    return 0;
}

运行结果:

[5-7]

使用函数求余弦函数的近似值:输入精度e,用下列公式求 cosx 的近似值,精确到最后项的绝对值小于 e 。 要求定义和调用函数 funcos(e,x) 求余弦函数的近似值。试编写相应程序。
 
 
答案代码:

#include <stdio.h>
#include <math.h>
double fact(int n)
{
    int i;
    double f = 1;
    for (i = 1; i <= n; i++)
    {
        f *= i;
    }
    return f;
}
double funcos(double e, double x)
{
    int flag = 1, i = 0;
    double cosx = 0, item = 1; 
    while (fabs(item) >= e)
    {
        item = flag * pow(x, i) / fact(i);
        cosx += item;
        i += 2;
        flag = -flag;
    }
    return cosx;
}
int main(void)
{
    double e, x, sum;
    printf("input e,x:");
    scanf("%lf%lf", &e, &x);
    sum = funcos(e, x);
    printf("cosx = %lf\n", sum);
    return 0;
}

运行结果:

[5-8]

输入一个正整数 n ,输出 n 行空心的数字金字塔。要求定义和调用函数hollow_pyramid(n) 输出 n 行空心的数字金字塔。当 n=5 时,5 行空心的数字金字塔如下所示。

    1
   2 2
  3   3
 4     4
555555555

答案代码:

#include <stdio.h>
void hollow_pyramid(int n)
{
    int i, j;
    for (i = 1; i < n; i++) //共n-1行
    {
        for (j = 1; j <= n - i; j++) //上三角空格
        {
            printf(" ");
        }
        printf("%d", i); //左斜下数字,只打印一个数字,不用在内循环里
        if (i == 1)
        {
            printf("\n");
            continue;
        }
        for (j = 1; j <= 2 * (i - 1) - 1; j++) //中间三角空格 .i=2时,j=1;i=3时,j=3
        {
            printf(" ");
        }
        printf("%d", i); //右斜下数字
        printf("\n");
    }
    for (j = 1; j <= 2 * n - 1; j++) //底层数字
    {
        printf("%d", n);
    }
    printf("\n");
}
int main(void)
{
    int n;
    printf("input n:");
    scanf("%d", &n);
    hollow_pyramid(n);
    return 0;
}

运行结果:

二.第六章(回顾数据类型和表达式)

选择题

[6-1]

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

B. '\101'

C. '\x41'

D. '\0x41'

答:D

解析:

十六进制表示字符用 \x 开头。

[6-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,这样写。

[6-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。

[6-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 。

[6-5]

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

B. 1

C. 0

D. 2

答:C

解析:

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

[6-6]

若表达式 sizeof( int) 的值为 2 ,则 int 类型数据可以表示的最大整数为( )。
A. 2^16-1

B. 2^15-1

C. 2^32-1

D. 2^31-1

答:B

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

填空题

[6-1]

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


答:

1000000001111111

1111111110000000

1111111110000001

解析:

按照原码,反码,补码的规则,正数的原码,反码,补码都相同,即符号位是 0,其余各位表示数值。负数的原码:符号位是 1,其余各位表示数值的绝对值。反码:符号位是 1,其余各位对原码取反。补码:反码加 1 。

[6-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。

[6-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。

[6-4]

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


答:x!=0

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

[6-5]

输入 123456# `<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 。

程序设计题

[6-1]

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

答案代码:

#include <stdio.h>
int main(void)
{
    char ch;
    int letter = 0, digit = 0, blank = 0, other = 0;
    printf("input string:");
    while (ch != '\n')
    {
        scanf("%c", &ch); 
        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;
}

运行结果:

[6-2]

使用函数累加由 n 个 a 构成的整数之和:输入两个正整数 a 和 n ,求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)
{
    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;
}

运行结果:

[6-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)
{
    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;
}

运行结果:

[6-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;
    }
    for (i = 3; i <= n; i++) 
    {
        x = x1 + x2;
        x1 = x2;
        x2 = x;
    }
    return x;
    
}
int main(void)
{
    int m, n,i, count = 0;;
    printf("input m,n(m>=1,n<=10000):");
    scanf("%d%d", &m, &n);
    for (i = 1; fib(i) <= n; i++) { 
        if (fib(i) >= m){ //固定在m~n之间
            count++; //记录数列的项数
            printf("%6d", fib(i));
        }
    }
    if (count == 0){
        printf("No Fibonacci number\n");
    }
      printf("\n");
    return 0;
}

运行结果:

[6-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)
{
    //这里我们的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-6]

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

答案代码:

#include <stdio.h>
int reverse(int number);
int main(void)
{
    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;
}

运行结果:

[6-7]

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

答案代码:

#include <stdio.h>
int main(void)
{
    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;
}

运行结果:

[6-8]

统计一行字符,将每个单词的首字母改为大写后输出。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个,试编写相应程序。
答案代码:

#include <stdio.h>
int main(void)
{
    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;
}

运行结果:

总结

      以上为本篇文章的所有内容,后续将更新各个章节课后习题解析,如想了解更多,请持续关注该专栏。如有疑问或提供意见,请指出,谢谢!!!

   文章内容参考: 程序咖

   如想观看讲解视频或解析请参考:C语言程序设计第4版(浙大版)何钦铭颜晖著 (chengxuka.cn)icon-default.png?t=N7T8https://www.chengxuka.cn/#/mooc/outline?_id=39&title=C%25E8%25AF%25AD%25E8%25A8%2580%25E7%25A8%258B%25E5%25BA%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25AC%25AC4%25E7%2589%2588(%25E6%25B5%2599%25E5%25A4%25A7%25E7%2589%2588)%25E4%25BD%2595%25E9%2592%25A6%25E9%2593%25AD%25E9%25A2%259C%25E6%2599%2596%25E8%2591%2597

标签:ch,return,函数,int,number,C语言,课后,习题,main
From: https://blog.csdn.net/2301_80771046/article/details/137073804

相关文章

  • C语言复习 -- 指针,这篇够了
    指针 -- 地址指针就是地址,地址就是指针&--取地址运算符*取值运算符(解引用)得到地址--要访问他的值--*取值运算符-- 对地址解引用a=*(&a)----------------------------指针变量 --存放指针的变量 初始化方式--int*p;inta=10;   in......
  • 【数据结构】用C语言实现单链表及其常见操作
    【数据结构】用C语言实现单链表及其常见操作链表是一种常用的基础数据结构,可以快速插入和删除数据,但是不能随机访问。那么它在内存中是怎么存储的呢?它和数组不同,数组在内存中是连续存储的,而链表不一定是连续的,它们之间是通过指针来连接的。指针是C语言中最重要的特性之一。那......
  • C语言day01
    C语言入门环境搭建①mingw64的安装和配置环境变量②vscode安装③vscode配置,需要c/c++扩展,将mingw与vscode联系起来基本代码结构头文件、主函数、返回值程序代码分析#include导入标准库文件主函数main主函数的返回值和返回类型运行流程机制编写源文件——>预......
  • 【C语言】结构体
    个人主页点这里~结构体一、结构体类型的声明1、结构的声明2、结构体变量的创建和初始化3、声明时的特殊情况4、自引用二、结构体内存对齐1、对齐规则2、存在内存对齐的原因3、修改默认对齐数三、结构体传参四、结构体实现位段一、结构体类型的声明我们在指针终......
  • 自学-C语言-基础-注释、变量、运算符、判断、循环
    运行环境DevC++DevC++官网认识C语言C语言是一种通用的、面向过程式的计算机程序设计语言。1972年,为了移植与开发UNIX操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了C语言。C语言是一种广泛使用的计算机语言,它与Java编程语言一样普及,二者在现代软件程序员......
  • C语言学习笔记day17
    1.结构体类型得定义      struct结构体名{         数据类型1成员变量1;         数据类型2成员变量2;         数据类型3成员变量3;         ...      };2.结构体变量得定义      存......
  • 使用C语言在VS 环境下基本实现贪吃蛇游戏
    使用C语言在VS环境下基本实现贪吃蛇游戏一丶实现前的准备工作1.设置vs运行环境为window控制台而非window终端1.正确的运行环境页面2.设置正确的运行环境2.了解句柄(下面代码能看明白会照葫芦画瓢用就行)3.利用system函数丶cmd命令设置window控制台窗口的尺寸4.了......
  • C语言中char字符型数据的存取形式:ASCII码之间的转换
    unsignedcharchannelNum=49;则编译器会将ASCII码49存入变量channelNum,实际channelNum表示字符1,所以下次如果以%c形式打印出来,则输出1。e.g:查看代码unsignedcharchannelNum=49;#include"bsp_seg.h"#include"bsp_Init.h"//------------------------------------//将s......
  • c语言:用do-while输出前40项的斐波那契数值
    求Fibonacci数列的前40个元素。该数列的特点是第1、2两个数为1、1。从第3个数开始,每数是其前两个数之和。  分析:从题意可以用如下等式来表示斐波那契数列:     1,1,2,3,5,8,13,21…     f1=1     (n=1)     f2=1   ......
  • 深入理解C语言宏定义
    目录一、前言二、宏的相关语法2.1#define2.2#undef2.3#运算符2.4##运算符三、宏替换的规则四、宏与函数一、前言        我们都知道#define语句可以定义常量,在编译器预处理时会全部将名字替换为常量。与此同时,#define也允许把参数替换到文本中,这就是本......