C语言程序代码(四)

文章目录

四十、冒泡排序(函数)
c 复制代码
// 禁用 Visual Studio 编译器对不安全函数的安全警告(如 scanf 被认为不安全)
#define _CRT_SECURE_NO_WARNINGS 1

// 包含标准输入输出库,用于使用 printf 和 scanf 函数
#include <stdio.h>

// 函数声明:Sort
// 功能:对一个整型数组进行升序排序
// 参数:
//   int a[] - 待排序的整数数组
//   int n   - 数组中元素的个数
void Sort(int a[], int n);

int main()
{
    int i;           // 循环变量,用于遍历数组
    int a[10];       // 定义一个长度为 10 的整型数组,存储用户输入的 10 个数字

    // 提示用户输入数据
    printf("请输入十个数:");

    // 使用 for 循环读取 10 个整数
    // i 从 0 到 9(共 10 次),依次将输入的值存入 a[0] ~ a[9]
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);  // %d 读取整数,&a[i] 是第 i 个元素的地址
    }

    printf("\n");  // 输出一个换行,使界面更清晰

    // 调用冒泡排序函数,对数组 a 进行升序排序,共 10 个元素
    Sort(a, 10);

    // 排序完成后输出结果
    printf("从小到大的顺序:");

    // 遍历已排序的数组,输出每个元素
    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);  // 每个数字后加一个空格,便于阅读
    }
    printf("\n");  // 最后再输出一个换行符,保持格式整洁

    return 0;  // 主函数执行成功,返回 0 表示正常结束
}

/**
 * 冒泡排序函数(升序)
 *
 * 原理:
 *   相邻两个元素比较,如果前一个比后一个大,就交换它们。
 *   每一轮会把当前未排序部分的最大值"浮"到右边。
 *
 * 参数:
 *   int a[] - 要排序的整型数组(传入的是首地址)
 *   int n   - 数组中元素的个数
 */
void Sort(int a[], int n)
{
    int i, j;     // i: 外层循环控制排序轮数;j: 内层循环用于相邻元素比较
    int temp;     // 临时变量,用于交换两个元素的值

    // 外层循环:控制排序的轮数
    // 总共需要 n-1 轮才能确保所有元素有序
    for (i = 0; i < n - 1; i++)
    {
        // 内层循环:在每一轮中,从第一个元素开始,两两比较相邻元素
        // 注意:每完成一轮,最大值已经"沉底",所以范围是 j < n - 1 - i
        for (j = 0; j < n - 1 - i; j++)
        {
            // 如果当前元素大于下一个元素,则交换它们(实现升序)
            if (a[j] > a[j + 1])
            {
                temp = a[j];          // 将 a[j] 存入临时变量
                a[j] = a[j + 1];      // 将较小的 a[j+1] 放到前面
                a[j + 1] = temp;      // 将原来的 a[j] 放到后面
            }
        }
    }
}
四十一、输入一个整数,设计一个函数,计算整数的各位数字之和
c 复制代码
// 禁用安全警告(用于 Visual Studio 编译器,避免 scanf 被标记为不安全函数)
#define _CRT_SECURE_NO_WARNINGS 1

// 引入标准输入输出库,用于 printf 和 scanf
#include <stdio.h>

// 函数声明:Score 函数接收一个整数参数,返回该数个位、十位、百位数字之和
int Score(int a);

int main()
{
    int a, score;  // 定义两个整型变量:a 存储用户输入的整数,score 存储计算结果

    // 提示用户输入一个整数
    printf("请输入一个整数:");

    // 使用 scanf 读取用户输入的整数,存储到变量 a 的地址中
    scanf("%d", &a);

    // 调用 Score 函数,传入 a,计算其个位、十位、百位数字之和,并将结果赋值给 score
    score = Score(a);

    // 输出最终结果
    printf("结果是:%d\n", score);

    // 主函数正常结束,返回 0 表示程序执行成功
    return 0;
}

/**
 * Score 函数:计算一个整数的个位、十位和百位上的数字之和
 * 
 * 参数:
 *   int a - 输入的整数(可以是正数或负数)
 * 
 * 返回值:
 *   int - 个位 + 十位 + 百位 数字的和
 * 
 * 注意:对于负数,由于 % 运算符在 C 中对负数的行为依赖编译器,
 *       实际运行时可能产生负的结果。建议先取绝对值以确保正确性。
 */
int Score(int a)
{
    int score;     // 用于存储三个位上的数字之和
    int ge;        // 存储个位数字
    int shi;       // 存储十位数字
    int bai;       // 存储百位数字

    // 取个位:a % 10 得到最后一位数字
    // 例如:123 % 10 = 3
    ge = a % 10;

    // 取十位:先将 a 除以 10 去掉个位,再对 10 取模
    // 例如:(123 / 10) = 12, 12 % 10 = 2
    shi = (a / 10) % 10;

    // 取百位:先将 a 除以 100 去掉个位和十位,再对 10 取模
    // 例如:(123 / 100) = 1, 1 % 10 = 1c
    bai = (a / 100) % 10;

    // 将个位、十位、百位上的数字相加
    score = ge + shi + bai;

    // 返回计算得到的和
    return score;
}
四十二、编写一个函数,由实参传来一个字符串,统计字母、数字、空格及其他字符的个数
c 复制代码
// 禁用 Visual Studio 编译器对不安全函数(如 gets)的安全警告
#define _CRT_SECURE_NO_WARNINGS 1

// 包含标准输入输出库,用于使用 printf、scanf、gets 等函数
#include <stdio.h>

// 函数声明:count 是一个无返回值函数,参数为字符数组 a[]
// 功能:统计字符串中各类字符的数量
void count(char a[]);

// 全局变量定义(跨函数共享):
int zm = 0;  // zm: 字母计数器(初始为 0),记录英文字母 a-z 和 A-Z 的个数
int sz = 0;  // sz: 数字计数器(初始为 0),记录字符 '0'~'9' 的个数
int kg = 0;  // kg: 空格计数器(初始为 0),记录空格字符 ' ' 的个数
int qt = 0;  // qt: 其他字符计数器(初始为 0),记录不属于前三类的所有字符(如标点符号等)

int main()
{
    char a[80];  // 定义一个长度为 80 的字符数组,最多可存储 79 个字符 + 1 个字符串结束符 '\0'

    printf("请输入一行文本(建议不超过79个字符):");  // 提示用户输入信息

    gets(a);     // 从键盘读取一整行输入并存储到数组 a 中,直到遇到换行符为止

    count(a);    // 调用 count 函数,传入字符串 a,开始统计各类字符数量

    // 输出最终的统计结果
    printf("字母:%d\n", zm);   // 打印字母总数
    printf("数字:%d\n", sz);   // 打印数字字符总数
    printf("空格:%d\n", kg);   // 打印空格字符总数
    printf("其它:%d\n", qt);   // 打印其余字符总数

    return 0;    // 主函数执行成功,返回 0 表示正常退出
}

/**
 * 函数名:count
 * 参数:char a[] - 接收一个以 '\0' 结尾的字符串
 * 功能:遍历字符串中的每一个字符,根据其类型进行分类统计
 */
void count(char a[])
{
    int i = 0;      // 当前字符的索引位置,初始指向第一个字符(下标 0)
    char c;         // 临时变量,用于保存当前正在处理的字符

    // 使用 while 循环逐个访问字符串中的每个字符
    // 条件:将 a[i] 赋值给 c,并判断 c 是否不是字符串结束符 '\0'
    while ((c = a[i]) != '\0')
    {
        // 判断当前字符是否为英文字母(小写 a-z 或大写 A-Z)
        if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
        {
            zm = zm + 1;  // 是字母,则字母计数器 zm 加 1
        }

        // 判断当前字符是否为数字字符('0' 到 '9')
        else if (c >= '0' && c <= '9')  
        {
            sz = sz + 1;  // 是数字字符,则数字计数器 sz 加 1
        }

        // 判断当前字符是否为空格字符(ASCII 值为 32)
        else if (c == ' ')
        {
            kg = kg + 1;  // 是空格,则空格计数器 kg 加 1
        }

        // 如果以上条件都不满足,则归类为"其他字符"
        else
        {
            qt = qt + 1;  // 其他字符计数器 qt 加 1c
        }

        i++;  // 移动到下一个字符的位置(即下标加 1)
    }
}
四十三、求总分、平均分、不及格人数(结构体数组+函数)
c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1  // 禁用安全警告(用于允许使用 scanf 等函数)
#include <stdio.h>                 // 包含标准输入输出库

// 定义学生信息的结构体
struct student {
    int num;           // 学号(整数类型)
    char name[20];     // 姓名(字符数组,最多存放19个字符 + '\0' 结束符)
    char sex;          // 性别('M' 表示男,'F' 表示女)
    float score;       // 成绩(浮点数类型,修正原拼写错误 scroe -> score)
} body[5] = {          // 定义包含5个学生的全局数组 body
    {101, "Li Ping", 'M', 45},       // 第一个学生数据
    {102, "Zhang Ping", 'M', 92.5},  // 第二个学生数据
    {103, "He Fang", 'F', 82.5},     // 第三个学生数据
    {104, "Cheng Ling", 'F', 87},    // 第四个学生数据
    {105, "Wang Ming", 'M', 58}      // 第五个学生数据
};

// 函数声明(也叫函数原型)------ 告诉编译器这些函数将在后面定义
void printTable(struct student stu[], int n);           // 打印学生表格
float calculateSum(struct student stu[], int n);        // 计算总成绩
float calculateAverage(float sum, int n);               // 计算平均成绩
int countFail(struct student stu[], int n);             // 统计不及格人数

// 主函数:程序入口
int main()
{
    int n = 5;  // 学生人数固定为5人
    
    // 调用函数打印学生信息表格
    printTable(body, n);
    
    // 分别调用函数计算各项统计数据
    float sum = calculateSum(body, n);           // 获取总分
    float average = calculateAverage(sum, n);    // 根据总分计算平均分
    int failCount = countFail(body, n);          // 统计不及格人数

    // 输出统计结果
    printf("----------------------------------------\n");
    printf("总分是:%.2f\n", sum);               // 保留两位小数输出总分
    printf("平均分是:%.2f\n", average);         // 保留两位小数输出平均分
    printf("不及格有:%d人\n", failCount);       // 输出不及格人数

    return 0;  // 返回0表示程序正常结束
}

// ==================== 函数定义 ====================

/*
 * 函数名:printTable
 * 功能:打印学生信息表格,包括表头和所有学生数据
 * 参数:
 *   stu[]: 学生结构体数组(传入要打印的数据)
 *   n:     数组中学生数量
 * 输出格式使用 %-6d 等对齐方式实现整齐排版
 */
void printTable(struct student stu[], int n)
{
    // 打印表头(列名),%-6s 表示左对齐并占6个字符宽度
    printf("%-6s %-12s %-6s %-8s\n", "学号", "姓名", "性别", "成绩");
    printf("----------------------------------------\n");  // 分隔线

    // 遍历每个学生,逐行打印其信息
    for (int i = 0; i < n; i++) {
        printf("%-6d %-12s %-6c %-8.2f\n", 
               stu[i].num,      // 学号
               stu[i].name,     // 姓名
               stu[i].sex,      // 性别
               stu[i].score);   // 成绩(保留两位小数)
    }
}

/*
 * 函数名:calculateSum
 * 功能:遍历学生数组,累加所有学生的成绩得到总分
 * 参数:
 *   stu[]: 学生结构体数组
 *   n:     学生人数
 * 返回值:float 类型的总成绩
 */
float calculateSum(struct student stu[], int n)
{
    float sum = 0;              // 初始化总分为0
    for (int i = 0; i < n; i++) {
        sum += stu[i].score;    // 累加每位学生的成绩
    }
    return sum;                 // 返回总分
}

/*
 * 函数名:calculateAverage
 * 功能:根据总分和人数计算平均分
 * 参数:
 *   sum: 总成绩
 *   n:   学生人数
 * 返回值:float 类型的平均成绩
 */
float calculateAverage(float sum, int n)
{
    return sum / n;  // 直接返回总分除以人数的结果
}

/*
 * 函数名:countFail
 * 功能:统计成绩低于60分的学生人数(不及格人数)
 * 参数:
 *   stu[]: 学生结构体数组
 *   n:     学生人数
 * 返回值:不及格的人数(整数)
 */
int countFail(struct student stu[], int n)
{
    int count = 0;                    // 计数器初始化为0
    for (int i = 0; i < n; i++) {
        if (stu[i].score < 60) {      // 判断是否不及格
            count++;                  // 满足条件则计数+1
        }
    }
    return count;                     // 返回不及格总人数
}
四十三、求总分、平均分、不及格人数(结构体数组)
c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1  // 禁用 Visual Studio 中的安全警告(如不允许使用 scanf)
#include <stdio.h>                 // 包含标准输入输出头文件,用于 printf 和 scanf

// 定义一个名为 student 的结构体,用来表示学生信息
struct student {
    int num;           // 学号:整数类型
    char name[20];     // 姓名:字符数组,最多可存储19个字符 + 1个字符串结束符 '\0'
    char sex;          // 性别:单个字符,'M' 表示男,'F' 表示女
    float scroe;       // 成绩:浮点数类型(注意:此处拼写错误应为 score,但不影响运行)
} body[5] = {          // 定义一个包含5个学生的全局数组 body,并进行初始化
    {101, "Li Ping", 'M', 45},       // 第1个学生数据
    {102, "Zhang Ping", 'M', 92.5},  // 第2个学生数据
    {103, "He Fang", 'F', 82.5},     // 第3个学生数据
    {104, "Cheng Ling", 'F', 87},    // 第4个学生数据
    {105, "Wang Ming", 'M', 58}      // 第5个学生数据
};  // 结构体定义和变量声明同时完成

int main()  // 主函数:程序的入口点
{
    int i;              // 循环变量,用于遍历学生数组
    int count = 0;      // 计数器,统计不及格(成绩 < 60)的学生人数
    float sum = 0;      // 累加器,用于计算总成绩
    float average;      // 存储平均分的结果

    // 输出表格标题(表头),%-6s 表示左对齐并占至少6个字符宽度
    printf("%-6s %-12s %-6s %-8s\n", "学号", "姓名", "性别", "成绩");
    // 打印一条分隔线,增强可读性
    printf("----------------------------------------\n");

    // 使用 for 循环遍历所有5个学生
    for (i = 0; i < 5; i++) {
        // 打印当前学生的信息,各字段左对齐并对齐列宽
        printf("%-6d %-12s %-6c %-8.2f\n",
               body[i].num,      // 学号(整数,左对齐占6位)
               body[i].name,     // 姓名(字符串,左对齐占12位)
               body[i].sex,      // 性别(字符,左对齐占6位)
               body[i].scroe);   // 成绩(浮点数,保留两位小数,占8位)

        // 累加当前学生的成绩到总分
        sum = sum + body[i].scroe;

        // 判断当前学生成绩是否低于60分(不及格)
        if (body[i].scroe < 60) {
            count = count + 1;   // 如果不及格,则计数器加1
        }
    }

    // 输出统计结果
    printf("\n总分是:%.2f\n", sum);             // 总分,保留两位小数
    average = sum / 5;                           // 计算平均分(总分除以5人)
    printf("平均分是:%.2f\n", average);         // 输出平均分
    printf("不及格有:%d人\n", count);           // 输出不及格人数

    return 0;  // 返回0表示程序正常结束
}
四十四、录入学生联系方式
c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1  // 禁用 Visual Studio 对不安全函数(如 gets)的警告
#include <stdio.h>                 // 包含标准输入输出库,用于 printf 和 gets

#define Num 3  // 定义宏常量 Num 表示要录入的学生(成员)数量为 3

// 定义一个名为 member 的结构体,用来存储一个人的基本联系信息
struct member {
    char name[20];     // 姓名:字符数组,最多可存 19 个字符 + '\0' 结束符
    char phone[12];    // 联系电话:最多支持 11 位号码 + '\0'
};  // 注意:这里只定义了类型,还没有分配内存空间给具体变量

int main()
{
    struct member man[Num];  // 定义一个结构体数组 man,包含 Num (3) 个元素
    int i;                   // 循环控制变量,用于遍历数组

    // 使用 for 循环,依次为每个成员输入姓名和联系电话
    for (i = 0; i < Num; i++) {
        printf("请输入第 %d 位的姓名:", i + 1);  // 提示用户输入姓名
        gets(man[i].name);                       // 使用 gets 函数读取整行字符串(包括空格),存入 name 字段

        printf("请输入联系电话:");               // 提示用户输入电话号码
        gets(man[i].phone);                      // 将输入的电话号码存入 phone 字段
    }

    // 输出换行,分隔输入与输出部分
    printf("\n");

    // 打印表格标题
    printf("姓名\t\t\t联系电话\n");             // \t 是制表符,用于对齐列
    printf("----------------------------------\n");  // 分隔线,增强可读性

    // 再次使用循环,输出所有已录入的成员信息
    for (i = 0; i < Num; i++) {
        printf("%s\t\t\t%s\n",                  // 格式化输出:姓名 和 电话
               man[i].name,                     // 当前成员的姓名
               man[i].phone);                   // 当前成员的联系电话
    }

    return 0;  // 主函数正常结束,返回 0
}
相关推荐
别动哪条鱼11 分钟前
FFmpeg 核心数据结构关系图
数据结构·ffmpeg
小龙报12 分钟前
《算法通关指南数据结构和算法篇(2)--- 链表专题》
c语言·数据结构·c++·算法·链表·学习方法·visual studio
万物挽挽16 分钟前
数据结构概述
数据结构
wangwangmoon_light27 分钟前
1.10 数据结构之图
数据结构
艾莉丝努力练剑32 分钟前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
醉颜凉34 分钟前
环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧
c语言·算法·动态规划
大雨淅淅37 分钟前
一文搞懂动态规划:从入门到精通
算法·动态规划
不去幼儿园39 分钟前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
随意起个昵称40 分钟前
【二分】洛谷P2920,P2985做题小记
c++·算法
没书读了1 小时前
计算机组成原理-考前记忆清单
线性代数·算法