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 - ifor (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] 放到后面}}}
}
四十一、输入一个整数,设计一个函数,计算整数的各位数字之和
// 禁用安全警告(用于 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,计算其个位、十位、百位数字之和,并将结果赋值给 scorescore = 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 = 3ge = a % 10;// 取十位:先将 a 除以 10 去掉个位,再对 10 取模// 例如:(123 / 10) = 12, 12 % 10 = 2shi = (a / 10) % 10;// 取百位:先将 a 除以 100 去掉个位和十位,再对 10 取模// 例如:(123 / 100) = 1, 1 % 10 = 1cbai = (a / 100) % 10;// 将个位、十位、百位上的数字相加score = ge + shi + bai;// 返回计算得到的和return score;
}
四十二、编写一个函数,由实参传来一个字符串,统计字母、数字、空格及其他字符的个数
// 禁用 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)}
}
四十三、求总分、平均分、不及格人数(结构体数组+函数)
#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; // 初始化总分为0for (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; // 计数器初始化为0for (int i = 0; i < n; i++) {if (stu[i].score < 60) { // 判断是否不及格count++; // 满足条件则计数+1}}return count; // 返回不及格总人数
}
四十三、求总分、平均分、不及格人数(结构体数组)
#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表示程序正常结束
}
四十四、录入学生联系方式
#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
}
