文章目录
四十、冒泡排序(函数)
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
}