Linux和C语言(Day08)

一、周练习

1.题目一:(25分)

1.题目描述:输入终值,输出所有能被7整除的数值及其和

              

2.评分要求

  1. 根据接收值准确定义变量类型(2分)
  2. 提示并输入终值(2分)
  3. 阅读题目确定循环要素:起始值、终值、步长(3分)
  4. 循环判断指定范围内能被7整除的数值并输出(5分) 核心
  5. 每5个换行输出(2分)
  6. 累计全部符合条件的数值和并输出(3分)
  7. 代码中添加不少于5行的关键注释描述实现思路(3分)

3.代码解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
    int num;  // 定义变量 `num`,用于存储用户输入的终值
    printf("请输入终值:\n");  // 提示用户输入一个终值
    scanf("%d", &num);  // 获取用户输入的终值并存储在变量 `num` 中

    int a[100];  // 定义数组 `a`,用于存储能被7整除的数
    int i;  // 循环变量 `i`
    int j = 0;  // 索引变量 `j`,用于填充数组 `a`
    int count = 0, sum = 0;  // `count` 记录能被7整除的数的个数,`sum` 用于累加这些数的和

    // 循环从1到用户输入的终值 `num`
    for (i = 1; i <= num; i++) {
        if (i % 7 == 0) {  // 如果 `i` 能被7整除
            a[j] = i;  // 将 `i` 存入数组 `a`
            j++;  // 数组索引加1
            count++;  // 记录能被7整除的数的个数
        }
    }

    // 遍历存储在数组 `a` 中的能被7整除的数
    for (j = 0; j < count; j++) {
        printf("%-4d", a[j]);  // 打印数组中的元素,宽度为4个字符,左对齐
        if ((j + 1) % 5 == 0) {  // 每5个数换行一次
            printf("\n");
        }
        sum += a[j];  // 累加数组中的数,计算总和
    }

    // 打印最终的结果:能被7整除的数的总和
    printf("\n%d以内能被7整除的数值和是%d\n", num, sum);

    return 0;  // 程序结束
}

4.结果展示:
 

2.题目二: (20分)

1.题目描述:  注册账号时需输入6位密码,根据密码组成验证其安全等级

2. 评分要求

  1. 根据接收用户值定义变量类型,命名遵守规范(2分)
  2. 利用循环结构、getchar()函数 输入验证密码(3分)
  3. 判断并统计输入的密码各组成部分个数(4分) 核心
  4. 如长度不符合要求给出提示信息(1分)
  5. 根据字母、数字、特殊字符、空格个数验证密码等级(3分) 核心
  6. 代码中需要添加至少5行关键注释描述实现思路(3分)

3.代码解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
    char a[100];  // 存储用户输入的密码
    char ch;  // 用于逐个读取字符
    int i = 0;  // 数组索引
    int flag_num = 0;  // 标记是否包含数字
    int flag_letter = 0;  // 标记是否包含字母
    int flag_character = 0;  // 标记是否包含特殊字符或空格

    // 提示用户输入密码
    printf("请输入6位密码:\n");

    // 使用 getchar() 逐字符读取密码,直到遇到换行符
    while ((ch = getchar()) != '\n') {
        a[i] = ch;  // 将字符存入数组 a
        i++;
    }
    a[i] = '\0';  // 添加字符串结束符

    // 如果密码长度不是 6,提示错误信息
    if (i != 6) {
        printf("密码长度不符合要求\n");
        return 1;  // 长度不符合要求,退出程序
    }

    // 遍历密码的每个字符,判断其类别
    for (i = 0; i < 6; i++) {
        if (a[i] >= '0' && a[i] <= '9') {
            flag_num = 1;  // 存在数字
        } else if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {
            flag_letter = 1;  // 存在字母
        } else {
            flag_character = 1;  // 存在特殊字符或空格
        }
    }

    // 计算总的密码成分种类数
    int sum = flag_num + flag_letter + flag_character;

    // 根据密码成分的不同种类数,验证密码等级
    switch (sum) {
        case 3:
            printf("输入的六位密码中含有字母、数字、特殊字符或空格,等级验证为:高\n");
            break;
        case 2:
            printf("输入的六位密码中含有字母、数字,等级验证为:中\n");
            break;
        case 1:
            printf("输入的六位密码,等级验证为:低\n");
            break;
    }

    // 输出输入的密码
    printf("您输入的密码是:%s\n", a);

    return 0;
}

4.结果展示:

 

3.题目三 :(30分)

1.题目描述:  神州租车公司为提升服务质量近期展开满意度调查活动,请输入近期租车6位顾客满意度进行相关运算

2.评分要求 :

  1. 正确定义一维数组 (3分)
  2. 循环输入6位顾客的满意度值(5分) 核心
  3. 将 6位用户的满意度按由小到大的顺序排序输出(5分) 核心
  4. 统计满意度个数,计算百分比并输出 (90分为合格) (4分) 核心
  5. 判断如果百分比值低于90%则显示信息“服务质量有待改进”,否则提示“保持现有服务质量水平” (3分)
  6. 代码关键处添加不少于5行的规范注释(5分)

 3.代码解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
    int a[6];  // 存储6位顾客的满意度
    int i = 0;

    // 循环输入6位顾客的满意度
    for (i = 0; i < 6; i++) {
        printf("请输入第%d位顾客的满意度:", i + 1);
        scanf("%d", &a[i]);
    }

    // 冒泡排序,将顾客的满意度按由小到大的顺序排序
    int j = 0;
    for (i = 0; i < 6 - 1; i++) {
        int temp = 0;
        for (j = 0; j < 6 - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                // 交换满意度值
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }

    // 统计满意度在90分以上(包括90分)的顾客数量
    int flag = 6;  // 初始假设所有顾客的满意度都在90以上
    float Satisfaction = 0;

    // 输出排序后的满意度
    printf("本次满意度调查由低到高的分数值是:");
    for (i = 0; i < 6; i++) {
        printf("%-4d", a[i]);
        if (a[i] < 90) {
            flag--;  // 如果满意度低于90,则减少合格顾客数量
        }
    }

    // 计算满意度百分比
    Satisfaction = ((float)flag / (float)6) * 100;
    printf("\n     满意度为%.2f%%\n", Satisfaction);

    // 判断服务水平是否需要改进
    if (Satisfaction >= 90) {
        printf("保持现有服务水平\n");
    } else {
        printf("服务水平有待改进\n");
    }

    return 0;
}

4. 结果展现:

4.题目四 :(25分)

1.题目描述:  输入一批数,输出是3倍数的数值,计算3倍数中的最大值、最小值

    

2.评分要求

  1. 正确定义一维数组(2分)
  2. 提示并输入数组长度(2分)
  3. 循环输入数组元素的值(5分) 核心
  4. 循环判断并输出数组元素中是3倍数的元素(4分) 核心
  5. 循环查找数组元素中是3倍数的最小值,最大值并输出结果(4分) 核心
  6. 代码中添加不少于5行的关键注释描述程序实现思路(4分)

3.代码解答
 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
    int N;  // 数组长度
    printf("请输入数组长度:\n");
    scanf("%d", &N);
    
    int a[N];  // 用于存储输入的数组元素
    int b[100];  // 存储3倍数的数组
    int i, j = 0;  // 循环变量
    int max = 0, min = 0;  // 3倍数的最大值和最小值
    
    // 提示输入数组元素
    printf("请依次输入数组元素值:\n");
    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);  // 输入数组元素
        if (a[i] % 3 == 0) {  // 判断是否为3倍数
            b[j] = a[i];  // 如果是3倍数,存储到数组b中
            j++;  // 计数器增加
        }
    }
    
    // 如果有3倍数,找到最大最小值
    int temp = j;  // temp表示数组b的有效元素数量
    if (temp > 0) {
        max = b[0];  // 初始化最大值
        min = b[0];  // 初始化最小值

        // 输出数组中的3倍数
        printf("数组中是3倍数的元素包含:");
        for (j = 0; j < temp; j++) {
            printf("%-4d", b[j]);
            if (b[j] > max) {
                max = b[j];  // 找到更大的3倍数
            }
            if (b[j] < min) {
                min = b[j];  // 找到更小的3倍数
            }
        }

        // 输出最大和最小3倍数
        printf("\n数组元素中3的最小倍数是%d   最大倍数是%d\n", min, max);
    } else {
        printf("没有3倍数的元素\n");  // 如果没有3倍数,提示没有
    }
    
    return 0;
}

4.结果展示:

5.题目五:(30分)

1.题目描述:输入操作数及运算符完成数值的加、减、乘、除运算

         

2.评分要求

  1. 定义接收操作数及运算符的变量,名称要符合规范(2分)
  2. 提示并输入第一个操作数(2分)
  3. 提示并输入运算符[加减乘除用字母代表](2分)
  4. 提示并输入第二个操作数(2分)
  5. 采用多分支选择结构switch对输入的操作数进行判断,输入大小写字母都可以调用
  6. 对应的运算(3分)  核心
  7. 正常计算两数相加并输出结果(2分)核心
  8. 正常计算两数相减并输出结果(2分)核心
  9. 正常计算两数相乘并输出结果(2分)核心
  10. 正常计算两数相除并输出结果(2分)核心
  11. 如分母为0则输出提示信息“分母不能为零!”(2分)
  12. 核心语句需添加不少于5行的规范注释描述实现思路(4分)

3.代码解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
    float first_value, second_value;  // 定义接收操作数的变量
    printf("请输入第一个操作数:\n");
    scanf("%f", &first_value);  // 输入第一个操作数

    char operator;  // 定义运算符变量
    printf("请输入运算符[加-P/p 减-S/s 乘-M/m 除-D/d]:\n");
    scanf(" %c", &operator);  // 输入运算符,注意前面的空格用于跳过上次输入后的回车

    printf("请输入第二个操作数:\n");
    scanf("%f", &second_value);  // 输入第二个操作数

    printf("运算结果\n");

    // 通过switch-case结构判断运算符并执行对应运算
    switch (operator) {
        case 'P':  // 大写加法
        case 'p':  // 小写加法
            printf("%.2f + %.2f = %.2f\n", first_value, second_value, first_value + second_value);  // 进行加法运算
            break;

        case 'S':  // 大写减法
        case 's':  // 小写减法
            printf("%.2f - %.2f = %.2f\n", first_value, second_value, first_value - second_value);  // 进行减法运算
            break;

        case 'M':  // 大写乘法
        case 'm':  // 小写乘法
            printf("%.2f * %.2f = %.2f\n", first_value, second_value, first_value * second_value);  // 进行乘法运算
            break;

        case 'D':  // 大写除法
        case 'd':  // 小写除法
            if (second_value == 0) {  // 检查分母是否为零
                printf("分母不能为零!\n");  // 分母为零时提示错误
                return 0;
            }
            printf("%.2f / %.2f = %.2f\n", first_value, second_value, first_value / second_value);  // 进行除法运算
            break;

        default:
            printf("无效的运算符!\n");  // 处理无效输入
            break;
    }

    return 0;
}

4.结果展示

二、周学习内容(脑图集合)

Linux部分

 C语言部分

 

 

 

 三、周学习总结

1.学习内容概述

1. 输入输出函数

单字符输入输出

`putchar()` 和 `getchar()` 用于处理单个字符的输入输出。

字符串输入输出

`puts()` 输出字符串并自动换行;`gets()` 用于读取字符串,但因其安全隐患已不推荐使用,推荐使用 `fgets()`。

格式化输入输出

`printf()` 和 `scanf()` 进行格式化的输入输出操作,支持多种格式控制符(如 `%d`、`%f`)。

2. 选择结构

顺序结构:按书写顺序执行的代码。

选择结构:包括 `if` 语句和 `switch` 语句,根据条件执行不同的代码块。

循环结构:包括 `for`、`while` 和 `do-while` 循环,根据条件重复执行代码。

3. `if` 语句

结构:条件判断执行不同的语句块。

注意事项:条件表达式的合法性、`else` 的配对、赋值与比较的区别等。

4. `switch` 语句

结构:通过常量表达式选择执行不同的语句块。

注意事项:`case` 后的常量唯一、`break` 的使用、`default` 的作用等。

5. 数组操作

一维数组和二维数组**:声明、初始化和访问,理解内存结构和索引方式。

动态内存分配:了解如何使用 `malloc`、`calloc` 等函数动态管理数组内存。

6. 字符串操作

字符数组与字符串:如何存储和处理字符串,字符数组的初始化和访问。

常用字符串处理函数:`strlen`、`strcat`、`strcmp`、`strcpy` 等函数的使用及注意事项。

 2.学习难点

1. 输入输出函数的使用

确保正确使用 `printf()` 和 `scanf()` 的格式控制符,以避免格式不匹配。

处理字符串输入时注意安全性,避免使用已不推荐的 `gets()`。

2. `if` 和 `switch` 语句的选择

理解 `if` 语句与 `switch` 语句的适用场景及其优缺点。

注意 `switch` 中的 `case` 标签的唯一性和 `default` 的使用。

3. 数组和字符串的内存管理

掌握二维数组的内存结构,特别是如何通过索引访问元素。

在进行数组和字符串操作时,避免越界和内存溢出问题。

4. 动态内存分配

理解如何使用动态内存分配函数进行内存管理,以及如何处理内存泄漏问题。

3. 注意事项

1. 循环条件

确保循环条件能在某个时刻变为假,避免死循环。

2. 数组边界

避免数组越界访问,保证代码的稳定性和安全性。

3. 字符串的安全性

使用安全的字符串操作函数,如 `strncpy` 和 `strncat`,以防止缓冲区溢出。

4. 内存管理

在使用动态内存分配函数时,确保内存的正确分配和释放,以避免内存泄漏。

4. 未来学习重点

1. 更复杂的数据结构

学习链表、队列、栈等数据结构,处理更复杂的数据操作。

2. 算法与数据结构

掌握数组排序、查找等算法,如快速排序、二分查找等。

3. 字符串动态内存管理

深入学习如何动态分配和管理字符串内存,处理内存泄漏问题。

4. 字符编码与本地化

理解不同字符编码(如 ASCII 和 Unicode),及其在处理多语言文本中的应用。

通过本周的学习总结,可以帮助你系统地掌握C语言的基础知识,识别学习中的难点,注意常见的编程问题,并为未来的学习打下坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值