目录
- **101. 训练:求平方和**
- **102. 训练:倒数五个数 倒数到1**
- **103. 训练:延迟毫秒扩展Sleep**
- **104. 训练:阶乘**
- **105. 训练:打印九九乘法表**
- **106. 训练:判断素数**
- **107. 训练:简单的乘法表**
- **108. 训练:简单绘画正方形**
- **109. 训练:简单绘画三角形**
- **110. 训练:九九乘法表**
- **111. 训练:判断数字是否为素数**
- **112. 训练:打印矩形图案**
- **113. 训练:打印等腰三角形**
- **114. 数组基础操作:数组声明和初始化**
- **115. 数组的作用与内存管理**
- **116. 数组的初步使用**
- **117. 数组的注意事项**
- **118. 数组的应用:学生成绩**
- **119. 数组的注意事项**
- **120. 数组应用案例:学生成绩**
- **121. 数组的注意事项:越界访问和初始化问题**
- **122. 数组案例:成绩管理**
- **126. 二维数组**
101. 训练:求平方和
目标
计算从1到N(N是用户输入的)的所有整数的平方和。
实现过程
- 用户输入N:让用户输入一个整数N。
- 计算平方和:通过循环遍历1到N的每个数字,并累加它们的平方。
- 输出结果:最终输出从1到N的平方和。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t number; // 用户要输入的整数
uint32_t sum_of_squares = 0; // 平方求和的初始化
puts("请输入一个整数N,我们将计算从1到N的所有整数的平方和!");
scanf_s("%u", &number);
for (uint32_t index = 1; index <= number; index++) {
sum_of_squares += index * index; // 加上当前数的平方
}
printf("从1到%u的所有整数平方和是%u\n", number, sum_of_squares);
return 0;
}
解释
- 初始化:
sum_of_squares初始化为0,用于存储平方和。 - 循环计算:通过
for循环遍历从1到N的所有整数,并累加它们的平方。 - 输出:最终输出平方和。
102. 训练:倒数五个数 倒数到1
目标
从用户输入的数开始,倒数五个数。
实现过程
- 用户输入数值:用户输入一个数字,并检查其是否大于等于5。
- 倒数五次:如果数字符合条件,则从该数字开始倒数五次。
- 输出结果:每次倒数后打印当前数字。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t start_number;
uint32_t total_times = 5;
puts("欢迎使用倒数5个数的程序,请输入一个数:");
scanf_s("%u", &start_number);
if (start_number >= 5) {
for (uint32_t time = 1; time <= total_times; time++) {
printf("开始倒数%u\n", start_number);
start_number--;
}
printf("倒数完成\n");
} else {
printf("输入的数不满足倒数条件\n");
}
return 0;
}
解释
- 倒数判断:首先判断用户输入的数是否大于等于5,若是,则进入倒数逻辑。
- 倒数操作:通过
for循环打印倒数值,并在每次打印后将数字减1。
103. 训练:延迟毫秒扩展Sleep
目标
在倒数过程中添加1秒的延迟,每倒数一次等待1秒。
实现过程
- 用户输入数值:用户输入一个数字,倒数到1。
- 延迟处理:在每次倒数后,程序等待1秒钟。
- 输出结果:每次倒数后输出当前的数字,倒数完成后输出“倒数完成”。
代码
#include <stdio.h>
#include <stdint.h>
#include <windows.h>
int main(void) {
uint32_t number;
puts("请输入一个数,并且倒数到1:");
scanf_s("%u", &number);
puts("倒数开始!");
for (uint32_t index = number; index > 0; index--) {
printf("倒数:%u\n", index);
Sleep(1000); // 延迟1秒
}
printf("倒数完成!");
return 0;
}
解释
- 延迟处理:使用
Sleep(1000)使程序暂停1秒钟,模拟倒数的延时。 - 倒数操作:与之前相同,使用
for循环从输入数开始倒数。
104. 训练:阶乘
目标
用户输入一个正整数,计算它的阶乘。
实现过程
- 用户输入数字:让用户输入一个正整数。
- 计算阶乘:通过
for循环计算数字的阶乘。 - 输出结果:输出计算出的阶乘。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t number; // 输入
uint32_t factorial = 1; // 阶乘初始化1
puts("请输入一个数");
scanf_s("%u", &number);
puts("倒数开始!");
for (uint32_t index = 1; index <= number; index++) {
factorial *= index; // factorial = factorial * index
}
printf("%u的阶乘为%u\n", number, factorial);
return 0;
}
解释
- 阶乘计算:使用
for循环遍历从1到N的每个数字,并将其累乘。 - 初始化:
factorial初始化为1,因为阶乘的乘积起始值是1。
105. 训练:打印九九乘法表
目标
打印并输出九九乘法表。
实现过程
- 外循环:外循环从1到9,用来控制打印的行数。
- 内循环:内循环也从1到当前外循环的数字,用来控制每行中打印的内容。
- 输出:打印每行的乘法表。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
for (uint32_t i = 1; i <= 9; i++) {
for (uint32_t j = 1; j <= i; j++) {
printf("%u*%u = %u\t", i, j, i * j);
}
printf("\n");
}
return 0;
}
解释
- 嵌套循环:外层循环控制行数,内层循环控制每行的内容。
- 格式化输出:使用
\t确保输出整齐。
106. 训练:判断素数
目标
判断用户输入的数是否为素数。
实现过程
- 素数定义:素数是指大于1且仅能被1和自身整除的数。
- 判断逻辑:通过遍历从2到输入数的平方根,检查是否有其他因数。
- 输出结果:判断是否为素数,并输出相应的提示。
代码
#include <stdio.h>
#include <stdint.h>
#include <math.h>
int main(void) {
uint32_t num;
bool is_prime = true;
puts("请输入一个正整数,除了和1之外,我们将检查它是否为素数:");
scanf_s("%u", &num);
if (num <= 1) {
is_prime = false;
puts("小于等于1,不是素数!");
} else {
for (uint32_t i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
is_prime = 0;
break;
}
}
}
if (is_prime) {
printf("%u 是素数\n", num);
} else {
printf("%u 不是素数\n", num);
}
return 0;
}
解释
- 判断条件:首先排除小于等于1的数。然后检查输入数字是否能被2到它的平方根之间的数整除。
- 性能优化:通过检查到平方根来减少不必要的运算。
107. 训练:简单的乘法表
目标
生成并打印一个正整数的乘法表。
实现过程
- 用户输入数字:让用户输入一个数字。
- 打印乘法表:通过
for循环打印从1到10的乘法表。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t num;
puts("请输入一个正整数,我们将为您生成乘法表");
scanf_s("%u", &num);
printf("乘法表%u:\n", num);
for (uint32_t index = 1; index <= 10; index++) {
printf("%u * %u = %u\n", num, index, num * index);
}
return 0;
}
解释
- 乘法表生成:通过循环遍历1到10,打印出输入数字与每个数字的乘积。
继续根据之前的模板整理博客内容,以下是 107 之后的部分:
108. 训练:简单绘画正方形
目标
打印一个指定大小的正方形图案。
实现过程
- 用户输入正方形的大小:用户输入一个数字,指定正方形的边长。
- 打印正方形:使用嵌套循环打印每一行和每一列的星号。
- 输出结果:输出正方形图案。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t size;
puts("输入图案的大小:");
scanf_s("%u", &size);
puts("打印正方形的图案");
for (uint32_t i = 0; i < size; i++) {
for (uint32_t j = 0; j < size; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
解释
- 嵌套循环:外层循环控制行数,内层循环控制每行中星号的个数。
- 图案打印:每行打印
size个星号,打印完一行后换行。
109. 训练:简单绘画三角形
目标
打印一个指定大小的三角形图案。
实现过程
- 用户输入三角形的大小:用户输入一个数字,指定三角形的高度。
- 打印三角形:使用嵌套循环打印每一行的星号。每行打印的星号数等于当前行数。
- 输出结果:输出三角形图案。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t size;
puts("请输入图案的大小:");
scanf_s("%u", &size);
puts("打印三角形图案");
for (uint32_t i = 0; i < size; i++) {
for (uint32_t j = 0; j <= i; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
解释
- 逐行打印:外层循环控制行数,内层循环根据当前行号打印星号。
- 逐渐增加的星号数:随着行号的增大,每行打印的星号数逐渐增加。
继续按照之前的模板,以下是 110 到 126 的博客内容。
110. 训练:九九乘法表
目标
打印九九乘法表,显示从1到9的所有乘法计算结果。
实现过程
- 嵌套循环:外层循环控制行数,内层循环控制列数。
- 打印乘法表:每个数字与1到9的乘积按格式打印。
- 格式化输出:确保输出结果整齐。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
for (uint32_t i = 1; i <= 9; i++) {
for (uint32_t j = 1; j <= i; j++) {
printf("%u*%u = %u\t", i, j, i * j);
}
printf("\n");
}
return 0;
}
解释
- 格式化输出:使用
\t控制每个输出之间的间隔,保证乘法表的对齐。 - 嵌套循环:外层循环控制行数,内层循环根据当前行的数字打印乘法表。
111. 训练:判断数字是否为素数
目标
判断一个用户输入的数字是否是素数。
实现过程
- 判断素数:通过除法检查用户输入的数字是否能被2到它的平方根之间的其他数字整除。
- 输出结果:如果能整除,则说明该数字不是素数,否则是素数。
代码
#include <stdio.h>
#include <stdint.h>
#include <math.h>
int main(void) {
uint32_t num;
bool is_prime = true;
puts("请输入一个正整数,除了和1之外,我们将检查它是否为素数:");
scanf_s("%u", &num);
if (num <= 1) {
is_prime = false;
puts("小于等于1,不是素数!");
} else {
for (uint32_t i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
is_prime = 0;
break;
}
}
}
if (is_prime) {
printf("%u 是素数\n", num);
} else {
printf("%u 不是素数\n", num);
}
return 0;
}
解释
- 素数检查:通过从2到数字平方根之间检查是否能整除,判断是否为素数。
- 效率优化:通过检查到数字的平方根来减少不必要的计算量。
112. 训练:打印矩形图案
目标
打印一个矩形图案,用户可以自定义矩形的长和宽。
实现过程
- 用户输入矩形的长和宽:用户输入矩形的行数和列数。
- 打印矩形:使用嵌套循环按用户输入的长和宽打印矩形图案。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t rows, cols;
puts("请输入矩形的行数和列数:");
scanf_s("%u %u", &rows, &cols);
puts("打印矩形图案:");
for (uint32_t i = 0; i < rows; i++) {
for (uint32_t j = 0; j < cols; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
解释
- 矩形打印:外层循环控制行数,内层循环控制每行的列数。
- 用户输入:通过
scanf_s函数接收用户输入的行和列数。
113. 训练:打印等腰三角形
目标
打印一个指定高度的等腰三角形。
实现过程
- 用户输入高度:用户输入三角形的高度。
- 打印等腰三角形:通过控制空格和星号的打印,确保图案是等腰的。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t height;
puts("请输入三角形的高度:");
scanf_s("%u", &height);
puts("打印等腰三角形:");
for (uint32_t i = 1; i <= height; i++) {
for (uint32_t j = 1; j <= height - i; j++) {
printf(" ");
}
for (uint32_t k = 1; k <= (2 * i - 1); k++) {
printf("*");
}
printf("\n");
}
return 0;
}
解释
- 空格和星号:外层循环控制行数,内层循环根据当前行号打印空格和星号,使图案呈现等腰形态。
- 等腰形状:随着行数增加,星号数目递增,空格数目递减。
114. 数组基础操作:数组声明和初始化
目标
演示数组的声明、初始化和基本操作。
实现过程
- 声明和初始化:声明一个整数类型的数组并初始化。
- 数组访问:通过下标访问数组中的元素。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t numbers[5] = {1, 2, 3, 4, 5};
for (uint32_t i = 0; i < 5; i++) {
printf("numbers[%u] = %u\n", i, numbers[i]);
}
return 0;
}
解释
- 数组声明与初始化:通过
numbers[5]声明一个长度为5的数组,并初始化每个元素的值。 - 访问数组元素:通过数组下标(从0开始)来访问和打印数组中的元素。
115. 数组的作用与内存管理
目标
了解数组的作用和如何在内存中分配空间。
实现过程
- 数据存储:数组是存储多个相同类型数据的容器。
- 内存管理:数组在内存中是连续存储的,因此可以通过下标快速访问数据。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t numbers[5] = {1, 2, 3, 4, 5};
for (uint32_t i = 0; i < 5; i++) {
printf("numbers[%u] = %u\n", i, numbers[i]);
}
return 0;
}
解释
- 内存分配:数组元素在内存中是连续存储的,因此可以通过下标快速定位和访问。
- 数组大小:数组大小固定,无法在运行时改变,除非使用动态内存分配。
116. 数组的初步使用
目标
学习如何声明和初始化数组,并遍历数组。
实现过程
- 声明数组:声明一个固定大小的数组,并进行初始化。
- 遍历数组:使用循环遍历数组元素并打印。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (uint32_t i = 0; i < 10; i++) {
printf("numbers[%u] = %u\n", i, numbers[i]);
}
return 0;
}
解释
- 数组的初始化:数组在声明时可以进行初始化。
- 数组遍历:使用循环访问和打印数组中的每个元素。
117. 数组的注意事项
目标
理解数组的注意事项,包括越界访问和未初始化的数组。
实现过程
- 数组越界访问:防止数组访问时出现越界。
- 未初始化的数组:注意数组声明时未初始化的情况,可能导致垃圾值。
代码
#include <stdio.h>
#include <stdint.h>
#define SIZE 5
int main(void) {
uint32_t numbers[SIZE] = {0}; // 数组初始化
// 错误1. 越界访问
// printf("%u\n", numbers[100]);
// 错误2. 未初始化数组
// uint32_t uninit_array[5];
// printf("%u", uninit_array[1]);
return 0;
}
解释
- 越界访问:数组下标从0开始,最大索引为
SIZE - 1,任何超出此范围的访问都会导致未定义行为。
- 未初始化数组:未初始化的数组会包含垃圾值,因此应始终进行初始化。
118. 数组的应用:学生成绩
目标
通过数组实现学生成绩的管理,包括计算总分、平均分、最高分和最低分。
实现过程
- 数组存储数据:将学生成绩存储在数组中。
- 计算统计数据:通过遍历数组计算总分、平均分、最高分和最低分。
代码
#include <stdio.h>
#include <stdint.h>
#define STUDENT_COUNT 5
int main(void) {
uint32_t grades[STUDENT_COUNT] = {85, 92, 88, 96, 79};
uint32_t sum = 0, max_grade = grades[0], min_grade = grades[0];
for (uint32_t i = 0; i < STUDENT_COUNT; i++) {
sum += grades[i];
if (grades[i] > max_grade) max_grade = grades[i];
if (grades[i] < min_grade) min_grade = grades[i];
}
double average = (double)sum / STUDENT_COUNT;
printf("平均成绩:%.2lf\n", average);
printf("最高成绩:%u\n", max_grade);
printf("最低成绩:%u\n", min_grade);
return 0;
}
解释
- 数组存储:成绩通过数组存储,索引对应学生编号。
- 统计计算:通过遍历数组,计算总分、平均分、最高分和最低分。
119. 数组的注意事项
目标
学习数组在使用过程中需要注意的一些事项,包括边界检查、初始化和动态数组等。
实现过程
- 数组边界:数组的下标从0开始,越界访问会导致未定义行为。
- 初始化数组:初始化数组时,如果不全初始化,剩余元素会被自动赋值为0。
- 动态数组:C语言本身不支持动态数组,但可以使用指针和内存分配函数来模拟动态数组。
代码
#include <stdio.h>
#include <stdint.h>
#define SIZE 5
int main(void) {
uint32_t numbers[SIZE] = {0};
// 注意事项:越界访问、未初始化数组、数组大小定义等
return 0;
}
解释
- 未初始化的数组:数组在定义时,如果没有完全初始化,剩余的元素会被自动填充为0。
- 越界访问和内存管理:要避免数组越界访问和内存错误。
120. 数组应用案例:学生成绩
目标
管理和处理学生成绩,包括计算总成绩、平均分、最高分、最低分等。
实现过程
- 数据存储:使用数组存储多个学生的成绩。
- 统计分析:计算成绩的总和、平均值、最高分和最低分。
代码
#include <stdio.h>
#include <stdint.h>
#define STUDENT_COUNT 5
int main(void) {
uint32_t grades[STUDENT_COUNT] = {85, 92, 88, 96, 79};
uint32_t sum = 0;
uint32_t max_grade = grades[0], min_grade = grades[0];
for (uint32_t i = 0; i < STUDENT_COUNT; i++) {
sum += grades[i];
if (grades[i] > max_grade) max_grade = grades[i];
if (grades[i] < min_grade) min_grade = grades[i];
}
double average = (double)sum / STUDENT_COUNT;
printf("平均成绩:%.2lf\n", average);
printf("最高成绩:%u\n", max_grade);
printf("最低成绩:%u\n", min_grade);
return 0;
}
解释
- 数组存储学生成绩:通过数组存储学生的成绩。
- 统计计算:通过循环遍历数组进行成绩的统计,包括平均分、最高分、最低分和总分。
121. 数组的注意事项:越界访问和初始化问题
目标
理解数组的使用注意事项,包括避免越界访问和初始化数组时的潜在问题。
实现过程
- 越界访问:访问数组时必须保证下标不超过数组的最大索引。
- 未初始化数组:未初始化的数组元素包含不确定的值,可能导致错误。
代码
#include <stdio.h>
#include <stdint.h>
#define SIZE 5
int main(void) {
uint32_t numbers[SIZE] = {0};
// 越界访问:numbers[100] 会访问越界,导致错误
// printf("%u\n", numbers[100]);
return 0;
}
解释
- 越界访问:数组下标从0开始,不能访问超出范围的元素。
- 初始化数组:未初始化的数组元素会自动赋值为零,但不完全初始化时,其他元素为垃圾值。
122. 数组案例:成绩管理
目标
通过数组管理多个学生的成绩,并计算平均成绩、最高分、最低分等统计数据。
实现过程
- 成绩数组:使用数组存储多个学生的成绩。
- 统计数据:通过数组进行遍历计算总分、平均分、最高分、最低分。
代码
#include <stdio.h>
#include <stdint.h>
#define STUDENT_COUNT 5
int main(void) {
uint32_t grades[STUDENT_COUNT] = {85, 92, 88, 96, 79};
uint32_t sum = 0;
uint32_t max_grade = grades[0], min_grade = grades[0];
for (uint32_t i = 0; i < STUDENT_COUNT; i++) {
sum += grades[i];
if (grades[i] > max_grade) max_grade = grades[i];
if (grades[i] < min_grade) min_grade = grades[i];
}
double average = (double)sum / STUDENT_COUNT;
printf("平均成绩:%.2lf\n", average);
printf("最高成绩:%u\n", max_grade);
printf("最低成绩:%u\n", min_grade);
return 0;
}
解释
- 数组操作:通过遍历数组,计算总分、平均分、最高分和最低分。
- 计算方式:使用简单的循环和条件判断计算统计数据。
抱歉遗漏了,下面是 126 的博客内容。
126. 二维数组
目标
学习如何声明和使用二维数组,并遍历二维数组的元素。
实现过程
- 声明二维数组:二维数组是一个数组的数组,可以通过两个索引来访问其元素。
- 初始化二维数组:可以用嵌套的花括号来初始化二维数组。
- 遍历二维数组:使用嵌套循环来访问二维数组中的每一个元素。
代码
#include <stdio.h>
#include <stdint.h>
int main(void) {
// 声明并初始化一个5x5的二维数组
uint32_t numbers_arr[5][5] = {
{1, 2, 3, 4, 5},
{2, 3, 4, 5, 6},
{3, 4, 5, 6, 7},
{4, 5, 6, 7, 8},
{5, 6, 7, 8, 9}
};
// 遍历并打印二维数组的每个元素
for (uint32_t i = 0; i < 5; i++) {
for (uint32_t j = 0; j < 5; j++) {
printf("%u ", numbers_arr[i][j]);
}
printf("\n");
}
return 0;
}
解释
- 二维数组声明:
uint32_t numbers_arr[5][5]声明了一个5行5列的二维数组。 - 数组初始化:二维数组可以通过嵌套的大括号进行初始化,每一对大括号代表数组的每一行。
- 遍历二维数组:使用两个嵌套的
for循环遍历数组中的每个元素,其中外层循环负责遍历行,内层循环遍历列。 - 输出格式:每行打印完后使用
printf("\n")进行换行,确保输出格式整齐。
应用场景
二维数组在处理矩阵、图像处理、棋盘游戏等场景中非常有用。例如,二维数组可以存储棋盘的状态,每个元素代表一个棋盘格的状态(如空白、黑棋、白棋等)。

4613

被折叠的 条评论
为什么被折叠?



