C语言零基础入门教程:101-126节

目录

101. 训练:求平方和

目标

计算从1到N(N是用户输入的)的所有整数的平方和。

实现过程

  1. 用户输入N:让用户输入一个整数N。
  2. 计算平方和:通过循环遍历1到N的每个数字,并累加它们的平方。
  3. 输出结果:最终输出从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

目标

从用户输入的数开始,倒数五个数。

实现过程

  1. 用户输入数值:用户输入一个数字,并检查其是否大于等于5。
  2. 倒数五次:如果数字符合条件,则从该数字开始倒数五次。
  3. 输出结果:每次倒数后打印当前数字。

代码

#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。
  2. 延迟处理:在每次倒数后,程序等待1秒钟。
  3. 输出结果:每次倒数后输出当前的数字,倒数完成后输出“倒数完成”。

代码

#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. 训练:阶乘

目标

用户输入一个正整数,计算它的阶乘。

实现过程

  1. 用户输入数字:让用户输入一个正整数。
  2. 计算阶乘:通过for循环计算数字的阶乘。
  3. 输出结果:输出计算出的阶乘。

代码

#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. 外循环:外循环从1到9,用来控制打印的行数。
  2. 内循环:内循环也从1到当前外循环的数字,用来控制每行中打印的内容。
  3. 输出:打印每行的乘法表。

代码

#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且仅能被1和自身整除的数。
  2. 判断逻辑:通过遍历从2到输入数的平方根,检查是否有其他因数。
  3. 输出结果:判断是否为素数,并输出相应的提示。

代码

#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. 训练:简单的乘法表

目标

生成并打印一个正整数的乘法表。

实现过程

  1. 用户输入数字:让用户输入一个数字。
  2. 打印乘法表:通过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. 训练:简单绘画正方形

目标

打印一个指定大小的正方形图案。

实现过程

  1. 用户输入正方形的大小:用户输入一个数字,指定正方形的边长。
  2. 打印正方形:使用嵌套循环打印每一行和每一列的星号。
  3. 输出结果:输出正方形图案。

代码

#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. 训练:简单绘画三角形

目标

打印一个指定大小的三角形图案。

实现过程

  1. 用户输入三角形的大小:用户输入一个数字,指定三角形的高度。
  2. 打印三角形:使用嵌套循环打印每一行的星号。每行打印的星号数等于当前行数。
  3. 输出结果:输出三角形图案。

代码

#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;
}

解释

  • 逐行打印:外层循环控制行数,内层循环根据当前行号打印星号。
  • 逐渐增加的星号数:随着行号的增大,每行打印的星号数逐渐增加。

继续按照之前的模板,以下是 110126 的博客内容。


110. 训练:九九乘法表

目标

打印九九乘法表,显示从1到9的所有乘法计算结果。

实现过程

  1. 嵌套循环:外层循环控制行数,内层循环控制列数。
  2. 打印乘法表:每个数字与1到9的乘积按格式打印。
  3. 格式化输出:确保输出结果整齐。

代码

#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. 训练:判断数字是否为素数

目标

判断一个用户输入的数字是否是素数。

实现过程

  1. 判断素数:通过除法检查用户输入的数字是否能被2到它的平方根之间的其他数字整除。
  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. 训练:打印矩形图案

目标

打印一个矩形图案,用户可以自定义矩形的长和宽。

实现过程

  1. 用户输入矩形的长和宽:用户输入矩形的行数和列数。
  2. 打印矩形:使用嵌套循环按用户输入的长和宽打印矩形图案。

代码

#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. 训练:打印等腰三角形

目标

打印一个指定高度的等腰三角形。

实现过程

  1. 用户输入高度:用户输入三角形的高度。
  2. 打印等腰三角形:通过控制空格和星号的打印,确保图案是等腰的。

代码

#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. 数组基础操作:数组声明和初始化

目标

演示数组的声明、初始化和基本操作。

实现过程

  1. 声明和初始化:声明一个整数类型的数组并初始化。
  2. 数组访问:通过下标访问数组中的元素。

代码

#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. 数组的作用与内存管理

目标

了解数组的作用和如何在内存中分配空间。

实现过程

  1. 数据存储:数组是存储多个相同类型数据的容器。
  2. 内存管理:数组在内存中是连续存储的,因此可以通过下标快速访问数据。

代码

#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. 数组的初步使用

目标

学习如何声明和初始化数组,并遍历数组。

实现过程

  1. 声明数组:声明一个固定大小的数组,并进行初始化。
  2. 遍历数组:使用循环遍历数组元素并打印。

代码

#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. 数组的注意事项

目标

理解数组的注意事项,包括越界访问和未初始化的数组。

实现过程

  1. 数组越界访问:防止数组访问时出现越界。
  2. 未初始化的数组:注意数组声明时未初始化的情况,可能导致垃圾值。

代码

#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. 数组的应用:学生成绩

目标

通过数组实现学生成绩的管理,包括计算总分、平均分、最高分和最低分。

实现过程

  1. 数组存储数据:将学生成绩存储在数组中。
  2. 计算统计数据:通过遍历数组计算总分、平均分、最高分和最低分。

代码

#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. 数组的注意事项

目标

学习数组在使用过程中需要注意的一些事项,包括边界检查、初始化和动态数组等。

实现过程

  1. 数组边界:数组的下标从0开始,越界访问会导致未定义行为。
  2. 初始化数组:初始化数组时,如果不全初始化,剩余元素会被自动赋值为0。
  3. 动态数组:C语言本身不支持动态数组,但可以使用指针和内存分配函数来模拟动态数组。

代码

#include <stdio.h>
#include <stdint.h>

#define SIZE 5

int main(void) {
    uint32_t numbers[SIZE] = {0};

    // 注意事项:越界访问、未初始化数组、数组大小定义等
    return 0;
}

解释

  • 未初始化的数组:数组在定义时,如果没有完全初始化,剩余的元素会被自动填充为0。
  • 越界访问和内存管理:要避免数组越界访问和内存错误。

120. 数组应用案例:学生成绩

目标

管理和处理学生成绩,包括计算总成绩、平均分、最高分、最低分等。

实现过程

  1. 数据存储:使用数组存储多个学生的成绩。
  2. 统计分析:计算成绩的总和、平均值、最高分和最低分。

代码

#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. 数组的注意事项:越界访问和初始化问题

目标

理解数组的使用注意事项,包括避免越界访问和初始化数组时的潜在问题。

实现过程

  1. 越界访问:访问数组时必须保证下标不超过数组的最大索引。
  2. 未初始化数组:未初始化的数组元素包含不确定的值,可能导致错误。

代码

#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. 数组案例:成绩管理

目标

通过数组管理多个学生的成绩,并计算平均成绩、最高分、最低分等统计数据。

实现过程

  1. 成绩数组:使用数组存储多个学生的成绩。
  2. 统计数据:通过数组进行遍历计算总分、平均分、最高分、最低分。

代码

#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. 二维数组

目标

学习如何声明和使用二维数组,并遍历二维数组的元素。

实现过程

  1. 声明二维数组:二维数组是一个数组的数组,可以通过两个索引来访问其元素。
  2. 初始化二维数组:可以用嵌套的花括号来初始化二维数组。
  3. 遍历二维数组:使用嵌套循环来访问二维数组中的每一个元素。

代码

#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") 进行换行,确保输出格式整齐。

应用场景

二维数组在处理矩阵、图像处理、棋盘游戏等场景中非常有用。例如,二维数组可以存储棋盘的状态,每个元素代表一个棋盘格的状态(如空白、黑棋、白棋等)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值