《由浅入深学C语言基础、进阶与必做430题》课后习题参考答案

第1章 第一个C程序
第2章 C语言基础
第3章 变量和数据类型
第4章 顺序结构程序设计
第5章 条件结构程序设计
第6章 循环结构程序设计
第7章 数组
第8章 指针
第9章 函数
第10章 结构型、共用型、枚举型及用户自定义型数据
第12章 文件
第14章 预处理宏命令

第1章 第一个C程序

习题答案

一、选择题

  1. C

二、填空题

  1. 补全下面的程序,让其完整。
    #include<stdio.h>
    void main() 
    {
        int a=1;
        printf("%d\n", a);
    }
    

三、编程题

  1. 参照例题,编写一个程序输出如下所示的一个倒三角形。
    *********************
      *****************
        *************
          *********
            *****
              *
    
    #include<stdio.h>
    
    void main() 
    {
        printf("*********************\n");
        printf("  *****************  \n");
        printf("    *************    \n");
        printf("      *********      \n");
        printf("        *****        \n");
        printf("          *          \n");
    }
    
  2. 从键盘输入一个数,输出该数的相反数。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        scanf("%d", &x);
        if (x < 0)
        {
            x = -x;
        }
        printf("%d\n", x);
    }
    
  3. 编写一个程序,实现两个数相加并将结果输出至屏幕。
    #include<stdio.h>
    
    void main() 
    {
        int x, y, z;
        scanf("%d%d", &x, &y);
        z = x + y;
        printf("%d\n", z);
    }
    
  4. 从键盘输入一个数,判断其是否能被 3 和 5 整除,若能整除则输出“yes”,否则输出“no”。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        scanf("%d", &x);
        if (x % 3 == 0 && x % 5 == 0)
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    
  5. 从键盘输入一个数,通过 printf() 函数输出该数的 2 倍数。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        scanf("%d", &x);
        printf("%d\n", 2 * x);
    }
    
  6. 从键盘输入两个数,求这两个数的乘积并输出至屏幕。
    #include<stdio.h>
    
    void main() 
    {
        int x, y, z;
        scanf("%d%d", &x, &y);
        z = x * y;
        printf("%d\n", z);
    }
    
  7. 编写一个程序,判断一个数是否为偶数。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        scanf("%d", &x);
        if (x % 2 == 0)
        {
            printf("该数是偶数\n");
        }
        else
        {
            printf("该数是奇数\n");
        }
    }
    

第2章 C语言基础

C语言特点

  1. 简单、方便灵活
    • 9中控制语句
    • 32个关键字
  2. 运算符种类丰富
    • 34种运算符
  3. 数据结构类型丰富
    • 7种类型
  4. 绘图功能强大
  5. 结构式语言
  6. 对语法限制不严格
  7. 生成代码质量高、执行效率高
  8. 可移植性好

C程序编译执行过程

  1. 编辑
  2. 编译
    1. 词法分析
    2. 语法分析
    3. 语义分析
    4. 中间代码生成
    5. 中间代码优化
    6. 目标代码生成
  3. 链接
  4. 执行

习题答案

一、填空题

  1. 5,6
  2. 4,4
  3. 4,3
  4. 9

二、编程题

  1. 求1~100的和。
    #include<stdio.h>
    
    void main() 
    {
        int sum = 0;
        sum = (float)(1 + 100) / 2 * 100;
        printf("%d\n", sum);
    }
    
  2. 从键盘输入两个数,求出这两个数中的小者并将结果输出,要求比较操作单独编写一个函数。
    #include<stdio.h>
    
    int min(int x, int y) {
        int z;
        if (x > y) {
            z = y;
        }
        else {
            z = x;
        }
        return z;
    }
    
    void main() 
    {
        int x, y;
        int z = 0;
        scanf("%d%d", &x, &y);
        z = min(x, y);
        printf("%d\n", z);
    }
    
  3. 从键盘输入两个数,将这两个数交换后输出。
    #include<stdio.h>
    
    void main() 
    {
        int x, y;
        int z = 0;
        scanf("%d%d", &x, &y);
        z = x;
        x = y;
        y = z;
        printf("%d %d\n", x, y);
    }
    
  4. 从键盘输入一个数,编写程序输出该数的绝对值至屏幕。
    #include<stdio.h>
    #include<math.h>
    
    void main() 
    {
        int x;
        scanf("%d", &x);
        printf("%d\n", (int)fabs(x));
    }
    
  5. 编写程序,从键盘输入两个数,求出其中的大者。
    #include<stdio.h>
    
    void main() 
    {
        int x, y;
        int max;
        scanf("%d%d", &x, &y);
        if (x > y)
        {
            max = x;
        } 
        else
        {
            max = y;
        }
        printf("%d\n", max);
    }
    
  6. 编写程序,求 1~100 中的素数。
    #include<stdio.h>
    
    void main() 
    {
        for (int i = 1; i < 100; i++)
        {
            int count = 0;
            for (int j = 1; j <= i; j++) {
                if (i % j == 0)
                {
                    count++;
                }
            }
            if (count < 3)
            {
                printf("%d\n", i);
            }
        }
    }
    
  7. 编写程序,从键盘输入一个数并求其阶乘值。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        int y = 1;
        scanf("%d", &x);
        for (; x >= 1; x--)
        {
            y *= x;
        }
        printf("%d\n", y);
    }
    
  8. 编写程序,求 1~100 中所有奇数的和。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        for (int i = 1; i <= 100; i++)
        {
            if (i % 2 != 0)
            {
                x += i;
            }
        }
        printf("%d\n", x);
    }
    
  9. 编写程序,要求从键盘键入n, 求 1/3+2/4+3/5+...+n-2/n的值。
    #include<stdio.h>
    
    void main() 
    {
        int n = 0;
        double sum = 0;
        scanf("%d", &n);
    
        for (int i = 3; i <= n; i++)
        {
            sum += (double)(i - 2) / i;
        }
    
        printf("%lf\n", sum);
    }
    

第3章 变量和数据类型

C语言的基本数据类型

  • 基本类型
    • 整型
      • 短整型(short)
      • 整型(int)
      • 长整型(long)
    • 浮点型
      • 单精度浮点(float)
      • 双精度浮点(double)
    • 字符型(char)
  • 构造类型
    • 数组
    • 结构体(struct)
    • 共用体(union)
    • 枚举类型(enum)
  • 指针类型
  • 空类型(void)

习题答案

一、选择题

  1. B
  2. B
  3. B

二、填空题

  1. (1)10 (2)10 (3)20 (4)0 (5)100
  2. z=0,t=1074087854
    • 备注:一定要用正确的格式控制符输出对应的数据类型,否则会输出一个垃圾值,这是一个悲伤的故事。。。
  3. 34,40,30,39
  4. 97,98
  5. 7,7
  6. 32,45
  7. 5,14
  8. 6,6
  9. 4,5,5,5
  10. 11,8
  11. 57,9
  12. 2,1,c,g

三、编程题

  1. 从键盘输入 3 个数,判断其是否能构成直角三角形,若能则输出该直角三角形的面积,否则输出不能构成三角形的提示信息。
    #include<stdio.h>
    
    void main() 
    {
        double a, b, c; // 三角形的三条边
        double area = 0;    // 三角形的面积
    
        printf("请输入三角形的三边的边长:");
        scanf("%lf%lf%lf", &a, &b, &c);
    
        // 判断是否能构成直角三角形
        if (a * a + b * b == c * c)
        {
            area = 1.0 / 2 * a * b;
            printf("直角三角形的面积是:%lf\n", area);
        }
        else if (a * a + c * c == b * b)
        {
            area = 1.0 / 2 * a * c;
            printf("直角三角形的面积是:%lf\n", area);
        }
        else if (b * b + c * c == a * a)
        {
            area = 1.0 / 2 * b * c;
            printf("直角三角形的面积是:%lf\n", area);
        }
        else
        {
            printf("不能构成直角三角形\n");
        }
    }
    
  2. 编写一个程序,输入一个华氏温度,按照公式 C=5/9*(F-32) 输出摄氏温度。
    #include<stdio.h>
    
    void main() 
    {
        double f = 0;
        double c = 0;
    
        printf("请输入华氏温度值:");
        scanf("%lf", &f);
    
        c = (double)5 / 9 * (f - 32);
        printf("对应的摄氏温度是:%lf\n", c);
    }
    
  3. 输入一个年份,判断该年是否为闰年,若为闰年则输出“yes”,否则输出“no”。
    #include<stdio.h>
    
    void main() 
    {
        int year = 0;
        scanf("%d", &year);
    
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    
  4. 从键盘输入一个学生的5门科目成绩,计算其平均值并输出。
    #include<stdio.h>
    
    void main() 
    {
        int score1 = 0;
        int score2 = 0;
        int score3 = 0;
        int score4 = 0;
        int score5 = 0;
        double average = 0;
    
        printf("请输入5门课程的成绩:");
        scanf("%d%d%d%d%d", &score1, &score2, &score3, &score4, &score5);
    
        average = (double)(score1 + score2 + score3 + score4 + score5) / 5;
    
        printf("平均成绩是:%.2lf\n", average);
    }
    
  5. 从键盘输入3个数,输出其中的最大者。
    #include<stdio.h>
    
    void main() 
    {
        int a = 0, b = 0, c = 0;
        int max = 0;
    
        printf("请输入3个整数:");
        scanf("%d%d%d", &a, &b, &c);
    
        max = a;
        if (max < b)
        {
            max = b;
        }
        if (max < c)
        {
            max = c;
        }
    
        printf("最大者是:%d\n", max);
    }
    
  6. 从键盘输入3个数,将其从小到大排序后输出。
    #include<stdio.h>
    #define ARR_LEN 3
    
    void main() 
    {
        int arr[ARR_LEN] = { 0 };
        int temp = 0;
    
        // 读入三个数
        for (int i = 0; i < ARR_LEN; i++)
        {
            printf("请输入第%d个数的值:", i + 1);
            scanf("%d", &arr[i]);
        }
    
        // 排序
        for (int i = 0; i < ARR_LEN - 1; i++)
        {
            for (int j = 0; j < ARR_LEN - 1 - i; j++)
            {
                if (arr[j] > arr[j + 1])
                {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    
        // 输出结果
        for (int i = 0; i < ARR_LEN; i++)
        {
            printf("arr[%d] = %d\n", i, arr[i]);
        }
    }
    
  7. 编写程序,输出1~1000之间的偶数。
    #include<stdio.h>
    #define ARR_LEN 3
    
    void main() 
    {
        for (int i = 1; i <= 1000; i++)
        {
            if (i % 2 == 0)
            {
                printf("%4d  ", i);
            }
            // 十个数字一行
            if (i % 20 == 0)
            {
                printf("\n");
            }
        }
    }
    
  8. 从键盘输入一串字符,输出至屏幕。
    #include<stdio.h>
    #define ARR_LEN 3
    
    void main() 
    {
        char arr[100] = "\0";
        scanf("%s", arr);
        printf("%s\n", arr);
    }
    
  9. 编写一个程序,输入半径,求圆的面积和体积。
    #include<stdio.h>
    #define PI 3.14
    
    void main() 
    {
        double r = 0;
        printf("请输入圆的半径:");
        scanf("%lf", &r);
    
        printf("圆的周长:%.2lf\n", 2 * PI * r);
        printf("圆的面积:%.2lf\n", PI * r * r);
    }
    
  10. 从键盘输入两个数,对其进行加减乘除操作并将结果输出至屏幕。
    #include<stdio.h>
    
    void main() 
    {
        int a = 0;
        int b = 0;
        
        printf("请输入两个整数:");
        scanf("%d%d", &a, &b);
    
        printf("%d + %d = %d\n", a, b, a + b);
        printf("%d - %d = %d\n", a, b, a - b);
        printf("%d * %d = %d\n", a, b, a * b);
        printf("%d / %d = %d\n", a, b, a / b);
    }
    

第4章 顺序结构程序设计

常用输入输出函数

  • scanf()
  • printf()
  • getchar():用户输入的数据会被放入键盘缓冲区,当按下回车键时,系统就会从缓冲区中每次读入一个字符。
  • putchar()

习题答案

一、选择题

  1. A
  2. C
  3. C
  4. B
  5. B
  6. D
  7. A
  8. A
  9. B
  10. C 注意:printf()函数中的表达式时按照从右往左的顺序进行计算的。

二、填空题

  1. 0,3
  2. 10
  3. 0
  4. 如下:
    x=35,y=32
    x=#,y= 
    c=104,d=115
    m=0,n=0
    
  5. 5,1
  6. a
  7. 456,78
  8. 80
  9. h,104
  10. a,g
  11. 12,7
  12. a=5,b=5
  13. a,,
  14. e
  15. a,g

三、编程题

  1. 计算一元二次方程的 x²+4x+1=0 的根,结果保留两位小数。
    #include<stdio.h>
    #include<math.h>
    
    void main() 
    {
        double x1, x2;
    
        x1 = (-4 - sqrt(4 * 4 - 4 * 1 * 1)) / (2 * 1);
        x2 = (-4 + sqrt(4 * 4 - 4 * 1 * 1)) / (2 * 1);
    
        printf("x1 = %.2lf, x2 = %.2lf\n", x1, x2);
    }
    
  2. 已知三角形的三边,计算三角形的面积,结果保留3位小数。
    #include<stdio.h>
    #include<math.h>
    
    void main() 
    {
        float a = 0.0f;
        float b = 0.0f;
        float c = 0.0f;
        float s = 0.0f;
        float area = 0.0f;
    
        printf("请输入三角形的三边:");
        scanf("%f%f%f", &a, &b, &c);
    
        s = (float)1 / 2 * (a + b + c);
        area = (float)sqrt(s * (s-a) * (s - b) * (s - c));
    
        printf("面积位:%.2f\n", area);
    }
    
  3. 已知一个圆的周长,编写一个程序求其面积。要求从键盘输入圆的周长,将计算得出的面积输出至屏幕。
    #include<stdio.h>
    #include<math.h>
    
    void main() 
    {
        double length = 0.0;
        double r = 0.0;
        double area = 0.0;
    
        printf("请输入圆的周长:");
        scanf("%lf", &length);
    
        r = length / 2 / 3.14;
        area = 3.14 * r * r;
    
        printf("面积位:%lf\n", area);
    }
    
  4. 编写一个程序,从键盘输入一个字符,实现输出临近该字符的5个字符(包括该字符,并以该字符为中心)。
    #include<stdio.h>
    
    void main() 
    {
        char c = '\0';
        c = getchar();
        printf("%c%c%c%c%c\n", c -2, c - 1, c, c + 1, c + 2);
    }
    
  5. 编写一个程序,从键盘输入一个梯形的上底、下底和高,求其面积并将结果输出至屏幕。
    #include<stdio.h>
    
    void main() 
    {
        double top_len = 0.0;
        double bottom_len = 0.0;
        double height = 0.0;
        double area = 0.0;
    
        printf("请输入梯形的上底下底和高:");
        scanf("%lf%lf%lf", &top_len, &bottom_len, &height);
    
        area = (double)1 / 2 * (top_len + bottom_len) * height;
    
        printf("面积为:%.2lf\n", area);
    }
    
  6. 从键盘输入一串字符,从该字符串中统计字符a的个数。
    #include<stdio.h>
    
    void main() 
    {
        int count = 0;
        char c = '\0';
    
        while ((c = getchar()) != '\n') 
        {
            if (c == 'a')
            {
                count++;
            }
        }
    
        printf("字母a出现的次数为:%d\n", count);
    }
    
  7. 从键盘输入3个数,编写一个程序计算其总和及平均值。
    #include<stdio.h>
    
    void main() 
    {
        int a = 0;
        int b = 0;
        int c = 0;
        int sum = 0;
        float average = 0.0f;
    
        printf("请输入三个整数:");
        scanf("%d%d%d", &a, &b, &c);
    
        sum = a + b + c;
        average = (float)sum / 3;
    
        printf("总和是:%d, 平均值是:%.2f\n", sum , average);
    }
    
  8. 编写程序将时间转化为秒后输出,例如8时20分45秒转化过程为83600+2060+45。
    #include<stdio.h>
    
    void main() 
    {
        int hour = 0;
        int minute = 0;
        int second = 0;
        int result = 0;
    
        printf("请输入时分秒:");
        scanf("%d%d%d", &hour, &minute, &second);
    
        result = hour * 3600 + minute * 60 + second;
    
        printf("等价于%d秒\n", result);
    }
    
  9. 从键盘输入两个数,交换两个数的值,再输出至屏幕。
    #include<stdio.h>
    
    void main() 
    {
        int a = 0;
        int b = 0;
        int temp = 0;
    
        printf("请输入两个整数:");
        scanf("%d%d", &a, &b);
    
        printf("交换之前的值是:a=%d, b=%d\n", a, b);
    
        temp = a;
        a = b;
        b = temp;
    
        printf("交换后的值是:a=%d, b=%d\n", a, b);
    }
    
  10. 现有函数 y=5x+3,从键盘输入一个数,输出对应的 y 值。
    #include<stdio.h>
    
    void main() 
    {
        int x = 0;
        int y = 0;
    
        printf("请输入x的值:");
        scanf("%d", &x);
    
        y = 5 * x + 3;
    
        printf("y的值是:%d\n", y);
    }
    
  11. 从键盘输入一个小写字母,要求将其转换为大写字母后输出。
    #include<stdio.h>
    
    void main() 
    {
        char c = '\0';
    
        c = getchar();
    
        if ('a' <= c && c <= 'z')
        {
            c -= 32;
            printf("对应的大写字母为:%c\n", c);
        }
        else
        {
            printf("输入不合法\n");
        }
    }
    

第5章 条件结构程序设计

分类

  • if-else
  • switch-case

习题答案

一、选择题

  1. D
  2. C
  3. C
  4. D
  5. C
  6. D
  7. D
  8. B
  9. B
  10. B
  11. A
  12. B
  13. B
  14. A
  15. C

二、填空题

  1. second
  2. 2,3,2
  3. 1,2
  4. 2
  5. 0,1,1
  6. &x, x > 0, %d, y
  7. a, 1 <= a && a <= 7, case 5, else
  8. 20,30
  9. zerofive
  10. 0
  11. 9或3
  12. 1,1,1
  13. 5
  14. 5
  15. 11
  16. 5
  17. 1
  18. 7
  19. $$16

三、编程题

  1. 输入三个数,输出其中的最大数和最小数。
    #include<stdio.h>
    
    void main() 
    {
        int a = 0;
        int b = 0;
        int c = 0;
        int max = 0;
        int min = 0;
    
        printf("请输入三个整数:");
        scanf("%d%d%d", &a, &b, &c);
    
        // 计算最大数
        max = a;
        if (max < b)
        {
            max = b;
        }
        if (max < c)
        {
            max = c;
        }
    
        // 计算最小数
        min = a;
        if (min > b)
        {
            min = b;
        }
        if (min > c)
        {
            min = c;
        }
    
        // 输出最大数和最小数
        printf("最大数是:%d\n最小数是:%d\n", max, min);
    }
    
  2. 用*号输出字母C的团。
    #include<stdio.h>
    
    void main() 
    {
        printf("*****\n");
        printf("*\n");
        printf("*\n");
        printf("*\n");
        printf("*****\n");
    }
    
  3. 某班进行学习成绩评估,若学习成绩大于或等于90分的同学用A表示,60~89分之间的同学用B表示,60分以下的同学用C表示。利用条件运算符的嵌套来完成此题。
    #include<stdio.h>
    
    void main() 
    {
        int score = 0;
        
        printf("请输入成绩:");
        scanf("%d", &score);
    
        if (score >= 90)
        {
            printf("A");
        }
        else if (score >= 60)
        {
            printf("B");
        }
        else
        {
            printf("C");
        }
    }
    
  4. 输入一个年份,判断该年是否为闰年。
    #include<stdio.h>
    
    void main() 
    {
        int year = 0;
    
        printf("请输入年份:");
        scanf("%d", &year);
    
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
        {
            printf("%d年是闰年\n", year);
        }
        else
        {
            printf("%d年不是闰年\n", year);
        }
    }
    
  5. 输入某年某月某日,判断并输出这一天是这一年的第几天。
    #include<stdio.h>
    #include<stdbool.h>
    
    void main() 
    {
        int year = 0;
        int month = 0;
        int day = 0;
        int sum = 0;
        bool flag = false;
    
        printf("请输入年月日:");
        scanf("%d%d%d", &year, &month, &day);
    
        switch (month)
        {
        case 1:
            sum = 0;
            break;
        case 2:
            sum = 31;
            break;
        case 3:
            sum = 50;
            break;
        case 4:
            sum = 90;
            break;
        case 5:
            sum = 120;
            break;
        case 6:
            sum = 151;
            break;
        case 7:
            sum = 181;
            break;
        case 8:
            sum = 212;
            break;
        case 9:
            sum = 243;
            break;
        case 10:
            sum = 273;
            break;
        case 11:
            sum = 304;
            break;
        case 12:
            sum = 334;
            break;
        default:
            break;
        }
    
        sum += day;
    
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
        {
            flag = true;
        }
    
        if (flag && month > 2)
        {
            sum += 1;
        }
    
        printf("对应的天数是:%d\n", sum);
    }
    
  6. 输入一个数,判断其为奇数还是偶数。
    #include<stdio.h>
    
    int main()
    {
        int a = 0;
    
        printf("请输入一个整数:");
        scanf("%d", &a);
    
        // 判断是否是偶数
        if (a % 2 == 0)
        {
            printf("%d 是偶数\n", a);
        }
        else
        {
            printf("%d 是奇数\n", a);
        }
        return 0;
    }
    
  7. 从键盘输入两个数,调换这两个数的值。
    #include<stdio.h>
    
    int main()
    {
        int a = 0;
        int b = 0;
        int temp = 0;
    
        // 从键盘输入两个整数
        printf("请输入两个整数:");
        scanf("%d%d", &a, &b);
    
        // 输出交换前的值
        printf("交换前:a=%d, b=%d\n", a, b);
    
        // 交换这两个数
        temp = a;
        a = b;
        b = temp;
    
        // 输出交换后的结果
        printf("交换后:a=%d, b=%d\n", a, b);
        return 0;
    }
    
  8. 输入一个不超过5位的数字,求:(1)求其是几位数;(2)分别输出这几位数字;(3)把这几位数分别加1再输出。
    #include<stdio.h>
    
    int main()
    {
        long a = 0; // 输入的数字
        int count = 0; // 数字的位数
        long temp = 0;  // 用于保存输入的数字的副本
        int i = 0; // 循环变量
    
        // 输入一个不超过5位的数字
        printf("请输入一个不超过5位的整数:");
        scanf("%ld", &a);
    
        // 求该数是几位数并输出至屏幕
        if (a > 9999)
        {
            count = 5;
        }
        else if (a > 999)
        {
            count = 4;
        }
        else if (a > 99)
        {
            count = 3;
        }
        else if (a > 9)
        {
            count = 2;
        }
        else
        {
            count = 1;
        }
        printf("该数是%d位数\n", count);
    
        // 分别输出各个位的数字
        printf("\n该数的各个位的数字是:\n");
        i = count;
        temp = a;
        while (i)
        {
            printf("%d 位数字是:%d\n", i, temp % 10);
            temp /= 10;
            i--;
        }
        // 各个位的数字加1后输出
        printf("\n该数的各个位的数字加1是:\n");
        i = count;
        temp = a;
        while (i)
        {
            printf("%d 位数字是:%d\n", i, temp % 10 + 1);
            temp /= 10;
            i--;
        }
    
        return 0;
    }
    
  9. 编写一个程序输入一个学生三次的成绩,并判断该学生三次是否都及格。若不及格则输出“有不及格科目”,若都及格则输出三次的平均成绩。
    #include<stdio.h>
    
    int main()
    {
        int a = 0;
        int b = 0;
        int c = 0;
        float average = 0.0f;
    
        // 输入三门成绩
        printf("请输入三门课程的成绩:");
        scanf("%d%d%d", &a, &b, &c);
    
        // 判断是否存在不及格的科目
        if (a >= 60 && b >= 60 && c >= 60)
        {
            average = (float)(a + b + c) / 3;
            printf("三门课程的平均分是:%.2f\n", average);
        }
        else
        {
            printf("存在不及格的科目\n");
        }
    
        return 0;
    }
    
  10. 输出特殊图案,把下面代码在C环境中运行看看,Very Beautiful!
    #include<stdio.h>
    
    int main()
    {
        char a = 176, b = 219;
    
        printf("%c%c%c%c%c\n", b, a, a, a, b);
        printf("%c%c%c%c%c\n", a, b, a, b, a);
        printf("%c%c%c%c%c\n", a, a, b, a, a);
        printf("%c%c%c%c%c\n", a, b, a, b, a);
        printf("%c%c%c%c%c\n", b, a, a, a, b);
        return 0;
    }
    

第6章 循环结构程序设计

分类

  • for
  • while
  • do-while

习题答案

一、选择题

  1. B
  2. B
  3. D
  4. B
  5. B
  6. B
  7. A
  8. B
  9. B
  10. A

二、填空题

  1. 12
  2. main, int, %d
  3. 4,8
  4. 0,3
  5. x >= 0, max < x, %d, %d
  6. 7
  7. 3
  8. 运行结果是:
    *****
    ****
    ***
    **
    *
    
  9. ***27
  10. 1
  11. 6
  12. 1,2
  13. 4
  14. 18
  15. 1.283333
  16. 27
  17. 运行结果为:
    #
    ##
    ###
    
  18. 24

三、编程题

  1. 编写一个程序,求出1000以内的完全数。
    #include<stdio.h>
    
    int main()
    {
        int sum = 0; // 存放因子之和
    
        for (int i = 1; i < 1000; i++)
        {
            sum = 0;
            for (int j = 1; j < i; j++)
            {
                if (i % j == 0)
                {
                    sum += j;
                }
            }
            if (sum == i)
            {
                printf("%3d\n", i);
            }
        }
        return 0;
    }
    
  2. 百马百担问题:现有100匹马,100担货,大马驼3担,中马驼2担,两匹小马驼1担,问大马、中马、小马各应需多少匹。
    #include<stdio.h>
    
    int main()
    {
        for (int i = 0; i <= 33; i++)
        {
            for (int j = 0; j <= 50; j++)
            {
                for (int k = 0; k <= 200; k += 2)
                {
                    if ((i + j + k == 100) && (3 * i + 2 * j + k / 2 == 100))
                    {
                        printf("需大马%d匹、中马%d匹、小马%d匹\n", i, j, k);
                    }
                }
            }
        }
        return 0;
    }
    
  3. 编写程序求出0~200中能被4整除余3的数。
    #include<stdio.h>
    
    int main()
    {
        for (int i = 0; i <= 200; i++)
        {
            if (i % 4 == 3)
            {
                printf("%d\n", i);
            }
        }
        return 0;
    }
    
  4. 从键盘输入一个数n,求其阶乘n!。
    #include<stdio.h>
    
    int main()
    {
        int num = 0;
        int sum = 1;
    
        printf("请输入一个整数:");
        scanf("%d", &num);
    
        for (int i = num; i > 1; i--)
        {
            sum *= i;
        }
    
        printf("%d! = %d\n", num, sum);
        return 0;
    }
    
  5. 现有100元,用来买7元、8元、9元的商品,问将100元花完总共有多少种方式。
    #include<stdio.h>
    
    int main()
    {
        int count = 0;
    
        for (int i = 0; i <= 14; i++)
        {
            for (int j = 0; j < 12; j++)
            {
                for (int k = 0; k < 11; k++)
                {
                    if (7 * i + 8 * j + 9 * k == 100)
                    {
                        printf("7元商品%d件、8元商品%d件、9元商品%d件\n", i, j, k);
                        count++;
                    }
                }
            }
        }
        printf("总共有%d种花法\n", count);
        return 0;
    }
    
  6. 猜数游戏:游戏中随机产生一个1~100之间的数,请用户猜数。若10次之内猜中则提示成功,若10次之内没有猜中则提示失败。
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<stdbool.h>
    
    int main()
    {
        int guess = 0;
        bool flag = false;
        int num = 0;    // 用户输入的数字
    
        srand((unsigned)time(NULL));
        guess = rand() % 101;
    
        for (int i = 0; i < 10; i++)
        {
            printf("猜第 %d 次:", i + 1);
            scanf("%d", &num);
    
            if (num == guess)
            {
                flag = true;
                break;
            }
            else
            {
                printf("哎呀,猜错了,再猜一次吧!\n");
            }
        }
    
        if (flag)
        {
            printf("恭喜您猜对啦\n");
        }
        else
        {
            printf("您已经猜了10次,都没有猜对哦\n");
        }
        return 0;
    }
    
  7. 求出100~400中满足条件的所有数,要求三个数字之积为24,三个数字之和为12。
    #include<stdio.h>
    
    int main()
    {
        
        for (int i = 100; i <= 400; i++)
        {
            // 计算各个位数字之和
            int sum = i % 10 + i % 100 / 10 + i / 100;
    
            // 计算各个位数字之积
            int temp = (i % 10) * (i % 100 / 10) * (i / 100);
    
            // 判断是否是要找的数字
            if (temp == 24 && sum == 12)
            {
                printf("%d\n", i);
            }
        }
        return 0;
    }
    
  8. 从键盘输入20个数,求出其中正数的个数及其平均值。
    #include<stdio.h>
    
    int main()
    {
        int num = 0; // 每次输入的数字
        int count = 0; // 正数的个数
        int sum = 0; // 所有正数的和
    
        // 输入20个数字
        for (int i = 0; i < 20; i++)
        {
            printf("请输入第 %d 个数字:", i+1);
            scanf("%d", &num);
    
            if (num > 0)
            {
                count++;
                sum += num;
            }
        }
    
        // 求平均数并输出
        printf("正数的个数是 %d 个,其平均值是 %.2f\n", count, (float)sum / count);
        return 0;
    }
    
  9. 编写一个程序,打印出所有的水仙花数。
    #include<stdio.h>
    
    int main()
    {
        int a = 0; // 保存个位数
        int b = 0; // 保存十位数
        int c = 0; // 保存百位数
        int d = 0; // 保存各个位的平方之和
    
        for (int i = 100; i < 1000; i++)
        {
            a = i % 10;
            b = i % 100 / 10;
            c = i / 100;
            d = a * a * a + b * b * b + c * c * c;
            if (d == i)
            {
                printf("%d\n", i);
            }
        }
        return 0;
    }
    
  10. 输入一串字符,统计其中的字母、空格、数字及其他字符的个数。
    #include<stdio.h>
    #define STR_LEN 100
    
    int main()
    {
        char str[STR_LEN] = { '\0' };
        int alpha = 0;
        int blank = 0;
        int digit = 0;
        int other = 0;
    
        // 输入一串字符
        printf("请输入一个字符串:\n");
        gets_s(str, STR_LEN);
    
        // 计算每种类型的字符的个数
        for (int i = 0; i < STR_LEN && str[i] != '\0'; i++)
        {
            if (('a' <= str[i] && str[i] <= 'z') || ('A' <= str[i] && str[i] <= 'Z'))
            {
                alpha++;
            }
            else if ('0' <= str[i] && str[i] <= '9')
            {
                digit++;
            }
            else if (str[i] == ' ')
            {
                blank++;
            }
            else
            {
                other++;
            }
        }
    
        // 输出统计的结果
        printf("字母有 %d 个\n空格有 %d 个\n数字有 %d 个\n其他有 %d 个\n", alpha, blank, digit, other);
        return 0;
    }
    
  11. 编写程序,从键盘输入一个数,判断是否为素数并输出相应的信息至屏幕。
    #include<stdio.h>
    #include<stdbool.h>
    
    int main()
    {
        int num = 0;
        bool flag = true;
    
        printf("请输入一个整数:");
        scanf("%d", &num);
    
        for (int i = 2; i < num / 2; i++)
        {
            if (num % i == 0)
            {
                flag = false;
            }
        }
    
        if (flag)
        {
            printf("%d是素数\n", num);
        }
        else
        {
            printf("%d不是素数\n", num);
        }
        return 0;
    }
    
  12. 编写程序,打印九九乘法表。
    #include<stdio.h>
    
    int main()
    {
        for (int i = 1; i <= 9; i++)
        {
            for (int j = 1; j <= i; j++)
            {
                printf("%d*%d=%-2d\t", i, j, i * j);
            }
            printf("\n");
        }
        return 0;
    }
    

第7章 数组

习题答案

一、选择题

  1. A
  2. B
  3. C
  4. A
  5. A
  6. B
  7. B
  8. C
  9. A

二、填空题

  1. abcdef
  2. 10101010101010101010
  3. min > a[i], k = i, a[k]
  4. gets(s[i]), strcpy(c, s[i])
  5. 运行结果如下:
    1234
    5678
    9000
    
  6. 6
  7. aceg
  8. 1471013
  9. 02345078
  10. 1-11-11
  11. Hello world!
  12. 80
  13. 运行结果如下:
    第1个元素为1
    第2个元素为2
    第3个元素为3
    第4个元素为4
    第5个元素为5
    第6个元素为6
    第7个元素为7
    第8个元素为8
    第9个元素为9
    第10个元素为10
    

三、编程题

  1. 设有以下10个数(4,2,7,8,9,10,11,24,5,6),编写程序用选择排序法使这10个数按升序排序,并输出排序后的结果。
    #include<stdio.h>
    
    int main()
    {
        int num[10] = { 4, 2, 7, 8, 9, 10, 11, 24, 5, 6 };
        int k = 0;
        int temp = 0;
    
        for (int i = 0; i < 9; i++)
        {
            k = i;
            for (int j = i + 1; j < 10; j++)
            {
                if (num[i] > num[j])
                {
                    k = j;
                }
            }
            if (k != i)
            {
                temp = num[i];
                num[i] = num[k];
                num[k] = temp;
            }
        }
    
        for (int i = 0; i < 10; i++)
        {
            printf("%3d", num[i]);
        }
        printf("\n");
    
        return 0;
    }
    
  2. 从键盘输入30个整数,统计并输出这些数字中正数的个数。
    #include<stdio.h>
    #define STR_LEN 30
    
    int main()
    {
        int num[STR_LEN] = { 0 };
        int count = 0;
    
        // 从键盘输入数据
        for (int i = 0; i < STR_LEN; i++)
        {
            scanf("%d", &num[i]);
        }
    
        for (int i = 0; i < STR_LEN; i++)
        {
            if (num[i] > 0)
            {
                count++;
            }
        }
    
        printf("正数的个数是%d\n", count);
        return 0;
    }
    
  3. 从键盘输入一个字符串,编写一个程序实现从键盘输入一个数,可删除字符串该位置上的字符并输出改变后的字符串。
    #include<stdio.h>
    #define STR_LEN 100
    
    int main()
    {
        char str[STR_LEN] = { '\0 ' };
        int position = 0;
    
        printf("请输入一个字符串:\n");
        gets(str, STR_LEN);
    
        printf("请输入一个整数:\n");
        scanf("%d", &position);
    
        // 删除制定位置的字符
        for (int i = position - 1; i < STR_LEN - 1; i++)
        {
            str[i] = str[i + 1];
        }
    
        // 输出结果
        puts(str);
        return 0;
    }
    
  4. 编写一个程序,实现从键盘输入10个整数,将其逆序输出。
    #include<stdio.h>
    #define ARR_LEN 10
    
    int main()
    {
        int num[ARR_LEN] = { 0 };
    
        // 从键盘输入ARR_LEN个数字
        for (int i = 0; i < ARR_LEN; i++)
        {
            printf("请输入第%d个数字:", i + 1);
            scanf("%d", &num[i]);
        }
    
        // 逆序输出
        for (int i = ARR_LEN - 1; i >= 0; i--)
        {
            printf("%d  ", num[i]);
        }
        printf("\n");
        return 0;
    }
    
  5. 现有一个长度为4X5的二维数组,要求将该数组的行和列元素互换,保存至另外一个数组中,并输出交换后的结果。
    #include<stdio.h>
    
    int main()
    {
        int num[4][5] = {
            {1, 2, 3, 4, 5},
            {6, 7, 8, 9, 10},
            {11, 12, 13, 14, 15},
            {16, 17, 18, 19, 20}
        };
        int result[5][4] = { 0 };
    
        // 行列元素互换保存到另一个数组里
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                result[j][i] = num[i][j];
            }
        }
    
        // 输出结果
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                printf("%4d", result[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    
        return 0;
    }
    
  6. 编写一个程序,实现两个字符串的合并。
    #include<stdio.h>
    
    int main()
    {
        char str1[50] = "hello world!";
        char str2[50] = " hello code!";
        char result[100] = "";
        int i = 0;
    
        for (int j = 0; str1[j] != '\0'; i++, j++)
        {
            result[i] = str1[j];
        }
        for (int j = 0; str2[j] != '\0'; i++, j++)
        {
            result[i] = str2[j];
        }
        result[i] = '\0';
    
        puts(result);
        return 0;
    }
    
  7. 编写一个程序,将字符串倒序并输出至屏幕。
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        char str[100] = "";
    
        // 从键盘输入字符串
        gets(str, 100);
    
        // 倒序输出
        for (int i = strlen(str) - 1; i >= 0; i--)
        {
            putchar(str[i]);
        }
        putchar('\n');
    
        return 0;
    }
    
  8. 从键盘输入10个数据,利用冒泡排序法对其从小到大排序后输出至屏幕。
    #include<stdio.h>
    
    int main()
    {
        int num[10] = { 0 };
        int temp = 0;
    
        // 从键盘输入10个整数
        for (int i = 0; i < 10; i++)
        {
            printf("请输入第%d个整数:", i + 1);
            scanf("%d", &num[i]);
        }
    
        // 冒泡排序(从小到大)
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 9 - i; j++)
            {
                if (num[j] > num[j + 1])
                {
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        }
    
        // 输出至屏幕
        for (int i = 0; i < 10; i++)
        {
            printf("%d  ", num[i]);
        }
        printf("\n");
    
        return 0;
    }
    
  9. 从键盘输入一串字符,以#为结束标志,统计其中字符的个数。
    #include<stdio.h>
    
    int main()
    {
        char str[100] = "";
        int count = 0;
    
        // 从键盘输入一个字符串
        printf("请输入一个字符串:\n");
        gets(str, 100);
    
        // 统计#前面的字符的个数
        for (int i = 0; str[i] != '#' && str[i] != '\0'; i++)
        {
            count++;
        }
    
        // 输出结果
        printf("字符个数为:%d\n", count);
        return 0;
    }
    
  10. 现有一个字符串,删除特定位置上的字符串,输出至屏幕。
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        char str[100] = "Hello World! Hello Beijing!";
        int position = 3;
        char *p = NULL;
    
        p = str;
        strcpy((p + 2), (p + 3));
    
        printf("%s\n", str);
    
        return 0;
    }
    

第8章 指针

习题答案

一、选择题

  1. C
  2. D
  3. B
  4. D
  5. C
  6. B
  7. B
  8. B
  9. B
  10. B
  11. B
  12. C
  13. B
  14. B
  15. A

二、填空题

  1. 3
  2. a,b
  3. Hello, happy
  4. abcdshkg
  5. s, %s, *p++
  6. 1 2 3 4 5 6
  7. 4
  8. He
  9. 1 4 7 10 13 16 19 22
  10. 7
  11. 6,8,9
  12. 45
  13. C LanguageP
  14. 5,6

三、编程题

  1. 编写一个函数,实现字符串的复制功能。
    #include<stdio.h>
    #define ARR_LEN 100
    
    int main()
    {
        char str1[ARR_LEN] = "hello world!";
        char str2[ARR_LEN] = "hello c program.";
        char *p1 = NULL;
        char *p2 = NULL;
    
        p1 = str1;
        p2 = str2;
    
        while (*p2)
        {
            *p1 = *p2;
            p1++;
            p2++;
        }
        *p1 = '\0';
    
        printf("str1 = %s\n", str1);
    
        return 0;
    }
    
  2. 从键盘输入5个字符串,对这5个字符串从小到大排列并输出排列结果。
    #include<stdio.h>
    #include<string.h>
    #define STR_LEN 100
    
    int main()
    {
        char s[5][STR_LEN] = { '\0' };
        char *str[5] = { NULL };
        char *p = NULL;
    
        // 从键盘输入5个字符串
        for (int i = 0; i < 5; i++)
        {
            gets(s[i], STR_LEN);
            str[i] = s[i];
        }
    
        // 排序
        for (int i = 0; i < 4; i++)
        {
            for (int j = i + 1; j < 5; j++)
            {
                if (strcmp(str[i], str[j]) > 0)
                {
                    p = str[i];
                    str[i] = str[j];
                    str[j] = p;
                }
            }
        }
    
        // 输出排序后的结果
        for (int i = 0; i < 5; i++)
        {
            puts(str[i]);
        }
        
        return 0;
    }
    
  3. 编写一个函数,通过指针实现两个数的交换。
    #include<stdio.h>
    
    void swap(int *pa, int *pb)
    {
        int temp = 0;
        temp = *pa;
        *pa = *pb;
        *pb = temp;
    }
    
    int main()
    {
        int a = 3;
        int b = 5;
        int *pa = &a;
        int *pb = &b;
        void(*pswap)() = swap;
    
        // 交换之前
        printf("交换之前 a=%d, b=%d\n", a, b);
    
        // 交换
        pswap(pa, pb);
    
        // 交换之后
        printf("交换之后 a=%d, b=%d\n", a, b);
    
        return 0;
    }
    
  4. 从键盘输入一个字符串,分别统计字符串中字母、数字及其他字符的个数并输出。
    #include<stdio.h>
    
    int main()
    {
        char str[100] = { '\0' };
        char *p = str;
        int alpha = 0;
        int digit = 0;
        int other = 0;
    
        // 从键盘上输入一个字符串
        gets(p, 100);
    
        // 统计字符个数
        while (*p)
        {
            if ('0' <= *p && *p <= '9')
            {
                digit++;
            }
            else if (('a' <= *p && *p <= 'z') || ('A' <= *p && *p <= 'Z'))
            {
                alpha++;
            }
            else
            {
                other++;
            }
            p++;
        }
    
        // 输出统计结果
        printf("字母有%d个,数字有%d个,其他有%d个\n", alpha, digit, other);
    
        return 0;
    }
    
  5. 从键盘输入一个字符串和一个数字n,要求从字符串第n个字符开始至字符串的末尾重新组成一个字符串输出。
    #include<stdio.h>
    
    int main()
    {
        char str[100] = { '\0' };
        char str2[100] = { '\0' };
        char *p = NULL;
        char *p2 = NULL;
        int n = 0;
    
        // 从键盘上输入一个字符串
        gets(str, 100);
        scanf("%d", &n);
    
        p = str;
        p += n - 1;
        p2 = str2;
        while (*p2++ = *p++)
        {
            ;
        }
        
        // 输出结果
        puts(str2);
    
        return 0;
    }
    
  6. 编写一个程序,要求利用指针求任意数据的绝对值。
    #include<stdio.h>
    
    int main()
    {
        int num = 0;
        int *p = NULL;
    
        // 从键盘输入一个整数
        printf("请输入一个整数:");
        scanf("%d", &num);
    
        // 求num的绝对值
        p = #
        if (*p < 0)
        {
            *p = -*p;
        }
    
        // 输出num的绝对值
        printf("%d\n", *p);
    
        return 0;
    }
    
  7. 从键盘输入10个数至数组中,然后将其中的元素进行逆序存放后输出。
    #include<stdio.h>
    #define ARR_LEN 10
    
    int main()
    {
        int num[ARR_LEN] = { 0 };
        int num_other[ARR_LEN] = { 0 };
        int *p1 = NULL;
        int *p2 = NULL;
    
        // 从键盘输入ARR_LEN个数字
        for (int i = 0; i < ARR_LEN; i++)
        {
            printf("请输入第 %2d 个数:", i + 1);
            scanf("%d", &num[i]);
        }
    
        // 逆序存入另一个数组
        p1 = num;
        p2 = num_other;
    
        for (int i = 0; i < ARR_LEN; i++)
        {
            *(p2 + ARR_LEN - 1 - i) = *(p1 + i);
        }
    
        // 输出逆序后的数组
        for (int i = 0; i < ARR_LEN; i++)
        {
            printf("%d ", *(p2 + i));
        }
    
        return 0;
    }
    
  8. 从键盘输入一个字符串,将其逆序输出。
    #include<stdio.h>
    #include<string.h>
    #define ARR_LEN 100
    
    int main()
    {
        char str[ARR_LEN] = { '\0' };
        char *p = NULL;
    
        // 从键盘输入一个字符串
        gets(str, ARR_LEN);
    
        // 逆序输出
        p = str;
        p += strlen(str) - 1;
        for (int i = 0; i < strlen(str); i++)
        {
            putchar(*p);
            p--;
        }
    
        return 0;
    }
    
  9. 从键盘输入两个字符串s1和s2,将s2连接至s1后输出。
    #include<stdio.h>
    #include<string.h>
    #define ARR_LEN 100
    
    int main()
    {
        char s1[ARR_LEN] = { '\0' };
        char s2[ARR_LEN] = { '\0' };
        char *p1 = NULL;
        char *p2 = NULL;
    
        // 从键盘输入连个字符串
        gets(s1, ARR_LEN);
        gets(s2, ARR_LEN);
    
        // 连接字符串
        p1 = s1;
        p2 = s2;
        while (*p1)
        {
            p1++;
        }
        while (*p1 = *p2)
        {
            p1++;
            p2++;
        }
        *p1 = '\0';
    
        // 输出连接后的字符串
        puts(s1);
    
        return 0;
    }
    
  10. 从键盘输入两个字符串,编写一个程序拍段两个字符串是否相等。
    #include<stdio.h>
    #include<stdbool.h>
    #define ARR_LEN 100
    
    int main()
    {
        char s1[ARR_LEN] = { '\0' };
        char s2[ARR_LEN] = { '\0' };
        char *p1 = NULL;
        char *p2 = NULL;
    
        // 从键盘输入两个字符串
        gets(s1, ARR_LEN);
        gets(s2, ARR_LEN);
    
        // 比较字符串
        p1 = s1;
        p2 = s2;
        while (true)
        {
            if (*p1 > *p2)
            {
                printf("s1 > s2\n");
                break;
            }
            else if (*p1 < *p2)
            {
                printf("s1 < s2\n");
            }
            else
            {
                p1++;
                p2++;
                continue;
            }
        }
    
        return 0;
    }
    

第9章 函数

习题答案

一、选择题

  1. B
  2. B
  3. D
  4. A
  5. D
  6. B
  7. A

二、填空题

  1. 10
  2. 10,20
  3. 运行结果如下:
    1, 2, 3, 4, 
    6, 7, 8, 9, 6, 7, 8, 9, 
    
  4. 246
  5. 1,2
  6. 1346869105
  7. 10,20,30,40
  8. 6,1
  9. -5,5
  10. 7,3,11
  11. 8
  12. 3,9
  13. 5,5
  14. 23456
  15. gggggggh

三、编程题

  1. 编写一个函数,从键盘输入一个字符串,将其反序输出。
    #include <stdio.h>
    #include<string.h>
    
    int reverse(char str[])
    {
        int len = strlen(str);
        for (int i = len - 1; i >= 0; i--)
        {
            printf("%c", str[i]);
        }
        printf("\n");
    }
    
    int main()
    {
        char str[100] = "";
        printf("请输入一个字符串:\n");
        gets(str, 100);
        reverse(str);
        return 0;
    }
    
  2. 从键盘输入一个数n,求1+2+3+...+n的值,要求用递归的方式求解。
#include<stdio.h>

int iterate(int n)
{
    if (n == 1)
    {
        return 1;
    }
    else
    {
        return n + iterate(n - 1);
    }
}

int main()
{
    int n = 0;
    
    printf("请输入一个整数:");
    scanf("%d", &n);
    
    printf("值为:%d\n", iterate(n));
    
    return 0;
}
  1. 从键盘输入一个字符串,要求从该字符串的第n个位置开始至末位组成一个新的字符串并将结果输出至屏幕。
    #include<stdio.h>
    
    int main()
    {
        char str[100] = "";
        int n = 0;
        char *p = NULL;
        
        scanf("%s", str);
        scanf("%d", &n);
        
        p = str;
        p += n - 1;
        printf("%s\n", p);
        
        return 0;
    }
    
  2. 从键盘输入一个字符串,统计其中字母的个数。
    #include<stdio.h>
    
    int count(char *p)
    {
        int n = 0;
        while (*p)
        {
            if (('a' <= *p && *p <= 'z') || ('A' <= *p && *p <= 'Z'))
            {
                n++;
            }
            p++;
        }
        return n;
    }
    
    int main()
    {
        char str[100] = "";
        
        gets(str);
        
        printf("%d\n", count(str));
        
        return 0;
    }
    
    
  3. 编写一个函数,判断一个数是否为素数。
    #include<stdio.h>
    #include<stdbool.h>
    
    bool sushu(char num)
    {
        bool flag = true;
        
        for (int i = 2; i <= num / 2; i++)
        {
            if (num % 2 == 0)
            {
                flag = false;
            }
        }
        return flag;
    }
    
    int main()
    {
        int n = 0;
        
        printf("请输入一个整数:");
        scanf("%d", &n);
        
        printf("%d %s是素数\n", n, sushu(n) ? "" : "不");
        
        return 0;
    }
    
  4. 从键盘输入多个字符串,编写一个函数对这些字符串从大到小排序,并输出排序结果。
    #include<stdio.h>
    #include<string.h>
    
    void sort(char *p[])
    {
        char *temp = NULL;
        
        for (int i = 0; i < 4; i++)
        {
            for (int j = i + 1; j < 5; j++)
            {
                if (strcmp(p[i], p[j]) < 0)
                {
                    temp = p[i];
                    p[i] = p[j];
                    p[j] = temp;
                }
            }
        }
        
        for (int i = 0; i < 5; i++)
        {
            printf("%s\n", p[i]);
        }
    }
    
    int main()
    {
        char str[5][100] = { "" };
        char *p[5] = { NULL };
        
        for (int i = 0; i < 5; i++)
        {
            gets(str[i]);
            p[i] = str[i];
        }
        
        sort(p);
        
        return 0;
    }
    
  5. 编写一个程序,求1!+2!+3!+4!的值。
    #include<stdio.h>
    
    int sum(int n)
    {
        int a = 1;
        int sum = 0;
        
        for (int i = 1; i <= n; i++)
        {
            a *= i;
            sum += a;
        }
        
        return sum;
    }
    
    int main()
    {
        int n = 4;
        
        printf("%d\n", sum(n));
    
        return 0;
    }
    
  6. 编写一个函数,判断一个字母是否为小写字母,若为小写字母则转化成大写字母后输出。
    #include<stdio.h>
    
    char touppercase(char c)
    {
        if ('a' <= c && c <= 'z')
        {
            c -= 32;
        }
        
        return c;
    }
    
    int main()
    {
        char c = 'a';
        
        printf("%c\n", touppercase(c));
    
        return 0;
    }
    
  7. 编写一个函数,将字符串逆序输出至屏幕。
    #include<stdio.h>
    #include<string.h>
    
    void fun(char *p)
    {
        for (int i = (int)strlen(p) - 1; i >= 0; i--)
        {
            printf("%c", *(p + i));
        }
        printf("\n");
    }
    
    int main()
    {
        char str[100] = "Hello World!";
        
        fun(str);
        
        return 0;
    }
    
  8. 编写一个函数,实现字符串的连接功能。
    #include<stdio.h>
    #include<string.h>
    
    void fun(char *str1, char *str2)
    {
        char *temp = NULL;
        temp = str1;
        
        while (*str1)
        {
            str1++;
        }
        while ((*str1 = *str2))
        {
            str1++;
            str2++;
        }
        *str1 = '\0';
        
        printf("%s\n", temp);
    }
    
    int main()
    {
        char str1[100] = "Hello World!";
        char str2[100] = " Hello C!";
        
        fun(str1, str2);
        
        return 0;
    }
    

第10章 结构型、共用型、枚举型及用户自定义型数据

结构体类型

  • 定义
    struct 结构体名
    {
        结构体成员
    };
    
  • 引用
    结构体变量名.成员名;
    

结构指针

  • 定义
    struct 结构体类型 *指针名;
    
  • 引用
    (*指针名).成员名;
    指针名->成员名;
    

共用体

  • 定义
    union 共用体名
    {
        成员表
    };
    

枚举型

  • 定义
    enum 枚举类型名 {枚举元素表};
    

用户自定义类型

  • 定义
    typedef 类型名 标识名;
    

习题答案

一、填空题

  1. D
  2. C
  3. D
  4. A
  5. A
  6. B
  7. A
  8. B
  9. B
  10. 262

二、填空题

  1. 9
  2. 8
  3. abcdef
  4. 3,8
  5. 17
  6. 16
  7. W
  8. 5,6,0
  9. 1,3,5,7,9,11,13,15,17,19,
  10. 8
  11. 0,1,2,3
  12. 4
  13. yangwu,90
  14. 运行结果如下:
    5,89.5
    8,91.7
    
  15. 20,Marry10,Marry

三、编程题

  1. 编写一个程序,用来记录一个学生的信息。
    #include <stdio.h>
    
    int main()
    {
        struct student
        {
            char name[10];  // 姓名
            int num;    // 学号
            int age;    // 年龄
            char sex;   // 性别
            int score;  // 成绩
        };
        struct student stu;
    
        printf("请输入学生的信息:");
        scanf("%s %d %d %c %d", stu.name, &stu.num, &stu.age, &stu.sex, &stu.score);
    
        printf("%s, %d, %d, %c, %d\n", stu.name, stu.num, stu.age, stu.sex, stu.score);
    
        return 0;
    }
    
  2. 现有5名学生,要求编写程序从键盘输入这5名学生的信息,其中包括学号、姓名、性别、成绩等信息,再将其输出。
    #include <stdio.h>
    
    int main()
    {
        struct student
        {
            char name[10];  // 姓名
            int num;    // 学号
            int age;    // 年龄
            char sex;   // 性别
            int score;  // 成绩
        };
        struct student stu[5];
    
        printf("请输入学生的信息:\n");
        for (int i = 0; i < 5; i++)
        {
            printf("str[%d] -> ", i);
            scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score);
        }
    
        for (int i = 0; i < 5; i++)
        {
            printf("str[%d] -> ", i);
            printf("%s, %d, %d, %c, %d\n", stu[i].name, stu[i].num, stu[i].age, stu[i].sex, stu[i].score);
        }
    
        return 0;
    }
    
  3. 编写程序,利用结构体输入若干个学生的信息,将其写至文件中。
    #include <stdio.h>
    
    int main()
    {
        struct student
        {
            char name[10];  // 姓名
            int num;    // 学号
            int age;    // 年龄
            char sex;   // 性别
            int score;  // 成绩
        };
        struct student stu[5];
        FILE *fp = NULL;
    
        printf("请输入学生的信息:\n");
        for (int i = 0; i < 5; i++)
        {
            printf("str[%d] -> ", i);
            scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score);
        }
        fp = fopen("students.txt", "w");
        fwrite(stu, sizeof(struct student), 5, fp);
        fclose(fp);
        return 0;
    }
    
  4. 创建一个链表,输入若干个学生的信息,其中包括学号、姓名、成绩,将结果输出至屏幕。
    #include <stdio.h>
    #include <stdlib.h>
    
    struct student
    {
        int num; // 学号
        char name[20]; // 姓名
        int score; // 成绩
        struct student *next;
    };
    
    int main()
    {
        int n = 0; // 学生的数量
        struct student *head = NULL;
        struct student *tail = NULL;
        struct student *temp = NULL;
        
        printf("请输入学生的数量:");
        scanf("%d", &n);
        
        for (int i = 0; i < n; i++)
        {
            temp = malloc(sizeof(struct student));
            
            printf("请输入第 %d 个学生的信息:\n", i + 1);
            scanf("%d%s%d", &temp->num, temp->name, &temp->score);
            
            if (i == 0)
            {
                head = temp;
                tail = temp;
                tail->next = NULL;
            }
            else
            {
                temp->next = NULL;
                tail->next = temp;
                tail = temp;
            }
        }
        
        temp = head;
        while (temp)
        {
            printf("%d, %s, %d\n", temp->num, temp->name, temp->score);
            temp = temp->next;
        }
        
        return 0;
    }
    
  5. 编写一个函数,在链表的任意位置上插入一个结点。
    /* 在第4题基础上增加了插入功能 */
    #include <stdio.h>
    #include <stdlib.h>
    
    struct student
    {
        int num; // 学号
        char name[20]; // 姓名
        int score; // 成绩
        struct student *next;
    };
    
    void print_stu(struct student *stu)
    {
        struct student *temp = NULL;
        temp = stu;
        while (temp)
        {
            printf("%d, %s, %d\n", temp->num, temp->name, temp->score);
            temp = temp->next;
        }
    }
    
    int main()
    {
        int n = 0; // 学生的数量
        int p = 1; // 在某一位置之后插入节点(编号从1开始)
        int i = 0; // 计数器
        struct student *head = NULL;
        struct student *tail = NULL;
        struct student *temp = NULL;
        struct student *temp2 = NULL;
        
        printf("请输入学生的数量:");
        scanf("%d", &n);
        
        for (int i = 0; i < n; i++)
        {
            temp = malloc(sizeof(struct student));
            
            printf("请输入第 %d 个学生的信息:\n", i + 1);
            scanf("%d%s%d", &temp->num, temp->name, &temp->score);
            
            if (i == 0)
            {
                head = temp;
                tail = temp;
                tail->next = NULL;
            }
            else
            {
                temp->next = NULL;
                tail->next = temp;
                tail = temp;
            }
        }
        
        print_stu(head);
        
        // 在第p个位置之后插入节点
        printf("\n请输入位置:");
        scanf("%d", &p);
        
        i = 1;
        temp = head;
        
        while (temp)
        {
            if (i == p)
            {
                temp2 = malloc(sizeof(struct student));
                printf("请输入学生的信息:\n");
                scanf("%d%s%d", &temp2->num, temp2->name, &temp2->score);
                temp2->next = temp->next;
                temp->next = temp2;
                break;
            }
            temp = temp->next;
            i++;
        }
        
        print_stu(head);
    
        return 0;
    }
    
  6. 编写一个程序,打印出5名学生的信息至屏幕,要求输出单独编写成一个函数。
    #include <stdio.h>
    
    struct student
    {
        char name[10];  // 姓名
        int num;    // 学号
        int age;    // 年龄
        char sex;   // 性别
        int score;  // 成绩
    };
    
    void print_stu(struct student stu)
    {
        printf("%s, %d, %d, %c, %d\n", stu.name, stu.num, stu.age, stu.sex, stu.score);
    }
    
    int main()
    {
        struct student stu[5];
    
        printf("请输入学生的信息:\n");
        for (int i = 0; i < 5; i++)
        {
            printf("str[%d] -> ", i);
            scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score);
        }
    
        for (int i = 0; i < 5; i++)
        {
            printf("str[%d] -> ", i);
            print_stu(stu[i]);
        }
    
        return 0;
    }
    

第12章 文件

文件

  • 文件指针
    FILE *指针名;
    
  • 打开文件
    fopen(文件名, 打开方式);
    
  • 关闭文件
    fclose(文件指针名);
    
  • 文件读写函数
    fputc();
    fgetc();
    fread();
    fwrite();
    fprintf();
    fscanf();
    
  • 文件定位函数
    feof();
    rewind();
    fseek();
    ftell();
    
  • 出错检查函数
    ferror();
    clearerr();
    

习题答案

一、选择题

  1. C
  2. C
  3. D
  4. A
  5. D
  6. C
  7. C
  8. B

二、填空题

  1. ajig
  2. abcd
  3. abcdef
  4. Hello 15
  5. Beijing shanghai tianjin
  6. 0123456789
  7. 7
  8. 运行结果如下:
    Lili,89
    Wangming,90
    Yanghua,78
    Zhangxiao,88
    
  9. abcsade
  10. aajkcnal

三、编程题

  1. 编写程序,将磁盘文件中的内容显示在屏幕上。
    #include <stdio.h>
    
    int main()
    {
        FILE *fp = NULL;
        fp = fopen("test.txt", "r");
        if (fp == NULL)
        {
            printf("打开文件失败\n");
            return 1;
        }
        while (!feof(fp))
        {
            putchar(fgetc(fp));
        }
        printf("\n");
    
        fclose(fp);
        return 0;
    }
    
  2. 编写一个程序,由键盘输入5个学生的信息,并将数据保存在名为student.txt的文本文件中。
    #include <stdio.h>
    
    struct student
    {
        char name[20];
        int score;
    };
    
    int main()
    {
        struct student stu[5];
        FILE *fp = NULL;
        fp = fopen("student.txt", "w");
        if (fp == NULL)
        {
            printf("打开文件失败\n");
            return 1;
        }
    
        // 从键盘上输入5个学生的信息
        for (int i = 0; i < 5; i++)
        {
            scanf("%s%d", &stu[i].name, &stu[i].score);
        }
    
        // 将信息写入文件中
        for (int i = 0; i < 5; i++)
        {
            fwrite(&stu[i], sizeof (struct student), 1, fp);
        }
    
        fclose(fp);
        return 0;
    }
    
  3. 编写一个程序,实现文件的复制功能。
    #include <stdio.h>
    
    int main()
    {
        FILE *fp1 = NULL;
        FILE *fp2 = NULL;
    
        fp1 = fopen("student.txt", "r");
        fp2 = fopen("studentcopy.txt", "w");
        if (fp1 == NULL)
        {
            printf("打开 student.txt 失败\n");
            return 1;
        }
        if (fp2 == NULL)
        {
            printf("打开 studentcopy.txt 失败\n");
            return 1;
        }
    
        while (!feof(fp1))
        {
            fputc(fgetc(fp1), fp2);
        }
    
        fclose(fp1);
        fclose(fp2);
        return 0;
    }
    
  4. 编写程序,实现两个文件的合并,即将两个文件中的内容复制到其中一个文件中。
    #include <stdio.h>
    
    int main()
    {
        FILE *fp1 = NULL;
        FILE *fp2 = NULL;
    
        fp1 = fopen("student.txt", "r");
        fp2 = fopen("studentcopy.txt", "a");
        if (fp1 == NULL)
        {
            printf("打开 student.txt 失败\n");
            return 1;
        }
        if (fp2 == NULL)
        {
            printf("打开 studentcopy.txt 失败\n");
            return 1;
        }
    
        while (!feof(fp1))
        {
            fputc(fgetc(fp1), fp2);
        }
    
        fclose(fp1);
        fclose(fp2);
        return 0;
    }
    
  5. 编写程序,从文件中隔一个字符进行读取,例如文件中内容为“jajasiddeb”,则输出jjsdc至屏幕上。
    #include <stdio.h>
    
    int main()
    {
        FILE *fp1 = NULL;
    
        fp1 = fopen("test.txt", "r");
        if (fp1 == NULL)
        {
            printf("打开 test.txt 失败\n");
            return 1;
        }
    
        while (!feof(fp1))
        {
            putchar(fgetc(fp1));
            fgetc(fp1);
        }
        putchar('\n');
    
        fclose(fp1);
        return 0;
    }
    

第14章 预处理宏命令

  • 不带参数的宏
    #define 用户标识符 字符串
    #undef 用户标识符
    
  • 带参数的宏
    #define 宏名 字符串
    
  • 带参数的宏和函数的关系
    • 函数调用参数传递的过程中会产生一个中间值,而带参数的宏只是进行字符串的替换,不会产生中间值。
    • 函数中实参要与形参的类型一致,而宏定义不要求一致。
    • 函数只能返回一个值,而宏定义可以返回多个值。

文件包含

#define <文件名称>
或 
#include "文件名称"

条件编译

#ifdef 标识符
    程序1
#else
    程序2
#endif

不同存储类型的变量

  • 自动类型变量
    [auto] 类型 变量名;
    
  • 静态变量
    static 类型 变量名;
    
  • 寄存变量
    rigister 类型 变量名;
    
  • 外部变量
    extern 类型 变量名;
    

习题答案

一、选择题

  1. B
  2. B
  3. A
  4. A
  5. A
  6. A
  7. C
  8. B
  9. C
  10. B
  11. A
  12. B

二、填空题

  1. 28
  2. 4
  3. 4,17
  4. 52
  5. 29
  6. 4
  7. 5,0
  8. 95 24
  9. 20,-16
  10. 4
  11. 5,49
  12. 3,3,5
  13. acjaahnldne

三、编程题

  1. 编写函数求出1~100中的素数。
    #include <stdio.h>
    #include <stdbool.h>
    
    int main()
    {
        bool flag = true;
    
        for (int i = 1; i <= 100; i++)
        {
            flag = true;
            for (int j = 2; j <= i / 2; j++)
            {
                if (i % j == 0)
                {
                    flag = false;
                }
            }
    
            if (flag)
            {
                printf("%d\n", i);
            }
        }
        return 0;
    }
    
  2. 利用带参数的宏,从三个数中找出最大值。
    #include <stdio.h>
    #define MIN(x, y, z) x < y ? (x < z ? x : z) : (y < z ? y : z)
    #define MAX(x, y, z) x > y ? (x > z ? x : z) : (y > z ? y : z)
    
    int main()
    {
        int a = 34;
        int b = 23;
        int c = 54;
    
        printf("min = %d, max = %d\n", MIN(a, b, c), MAX(a, b, c));
    
        return 0;
    }
    
  3. 从键盘输入一个数,利用宏求出其平方值及其平方根。
    #include <stdio.h>
    #include <math.h>
    
    #define H(x) (x)*(x)
    #define S(x) sqrt(x)
    
    int main()
    {
        double num = 0;
    
        printf("请输入一个整数:");
        scanf("%lf", &num);
    
        printf("%lf, %lf\n", H(num), S(num));
    
        return 0;
    }
    
  4. 从键盘输入一个圆锥的半径和高度,通过宏定义求出圆锥体积。
    #include <stdio.h>
    
    #define PI 3.14
    #define S(r, h) PI*(r)*(r)*(h)/3.0
    
    int main()
    {
        double r = 0.0;
        double h = 0.0;
    
        printf("请输入圆锥的半径和高度:");
        scanf("%lf%lf", &r, &h);
    
        printf("圆锥的表面积是:%lf\n", S(r, h));
        return 0;
    }
    

推荐阅读更多精彩内容

  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 224评论 0 0
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 1,450评论 2 12
  • 前言:指针是 C语言一个重要概念,也是C 语言的一个重要特色。使程序简洁、紧凑、高效。指针乃是C之精华。 数据在内...
    潇湘候晨雪阅读 114评论 0 0
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 1,526评论 2 42
  • //出自51博客:www.Amanda0928.51.com 第一章 一、选择题 1.B; (typedef ,t...
    Damongggggg阅读 2,795评论 0 1