一、周练习
1.题目一:(25分)
1.题目描述:输入终值,输出所有能被7整除的数值及其和
2.评分要求
- 根据接收值准确定义变量类型(2分)
- 提示并输入终值(2分)
- 阅读题目确定循环要素:起始值、终值、步长(3分)
- 循环判断指定范围内能被7整除的数值并输出(5分) 核心
- 每5个换行输出(2分)
- 累计全部符合条件的数值和并输出(3分)
- 代码中添加不少于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. 评分要求
- 根据接收用户值定义变量类型,命名遵守规范(2分)
- 利用循环结构、getchar()函数 输入验证密码(3分)
- 判断并统计输入的密码各组成部分个数(4分) 核心
- 如长度不符合要求给出提示信息(1分)
- 根据字母、数字、特殊字符、空格个数验证密码等级(3分) 核心
- 代码中需要添加至少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.评分要求 :
- 正确定义一维数组 (3分)
- 循环输入6位顾客的满意度值(5分) 核心
- 将 6位用户的满意度按由小到大的顺序排序输出(5分) 核心
- 统计满意度个数,计算百分比并输出 (90分为合格) (4分) 核心
- 判断如果百分比值低于90%则显示信息“服务质量有待改进”,否则提示“保持现有服务质量水平” (3分)
- 代码关键处添加不少于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.评分要求
- 正确定义一维数组(2分)
- 提示并输入数组长度(2分)
- 循环输入数组元素的值(5分) 核心
- 循环判断并输出数组元素中是3倍数的元素(4分) 核心
- 循环查找数组元素中是3倍数的最小值,最大值并输出结果(4分) 核心
- 代码中添加不少于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.评分要求
- 定义接收操作数及运算符的变量,名称要符合规范(2分)
- 提示并输入第一个操作数(2分)
- 提示并输入运算符[加减乘除用字母代表](2分)
- 提示并输入第二个操作数(2分)
- 采用多分支选择结构switch对输入的操作数进行判断,输入大小写字母都可以调用
- 对应的运算(3分) 核心
- 正常计算两数相加并输出结果(2分)核心
- 正常计算两数相减并输出结果(2分)核心
- 正常计算两数相乘并输出结果(2分)核心
- 正常计算两数相除并输出结果(2分)核心
- 如分母为0则输出提示信息“分母不能为零!”(2分)
- 核心语句需添加不少于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语言的基础知识,识别学习中的难点,注意常见的编程问题,并为未来的学习打下坚实的基础。
标签:Day08,int,printf,value,C语言,数组,Linux,include,输入 From: https://blog.csdn.net/weixin_65095004/article/details/141983154