【C语言精选函数结构体代码题】
C语言精选函数结构体代码题
- 五、函数
- 5.1最大公约数🚀
- 5.2最小公倍数
- 5.3斐波那契
- 5.4汉诺塔🚀🚀🚀
- 5.5n的阶乘🚀
- 六、结构体
- 6.1学生信息结构体🚀🚀🚀
- 6.2 共有体案例
- 6.3枚举类型使用案例
- 6.4 位运算的使用案例
- 6.5文件操作
五、函数
5.1最大公约数🚀
#include <stdio.h>
//greatest common divisor
//普通搜索方法求最大公约数
int gcd1(int a, int b){
//初始化认为最大公约数就是a,b之中较小的那个
int result = a < b ? a : b;
//暴力往前搜素,第一个符合条件的就是最大公约数
while(result > 0) {
if(a % result == 0 && b % result == 0){
return result;
}
result--;
}
}
//辗转相除法
int gcd2(int a, int b){
int remainder = a % b;
while(remainder != 0){
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
//辗转相除法递归
int gcd3(int m, int n){
if(n == 0)
return m;
else
return gcd3(n, m % n);
}
int main(){
int a, b;
scanf("%d %d", &a, &b);
printf("%d", gcd1(a, b));
return 0;
}
辗转相除法背过就好了
5.2最小公倍数
#include <stdio.h>
// 求最大公约数函数(辗转相除法)
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
// 利用公式:最小公倍数 = (m * n) / 最大公约数
int lcm = (m * n) / gcd(m, n);
printf("%d\n", lcm);
return 0;
}
最小公倍数 = (m * n) / 最大公约数
5.3斐波那契
#include <stdio.h>
//递归斐波那契数列
int fb(int n) {
if(n==1||n==2){
return 1;
}
return fb(n-1)+fb(n-2);
}
int main() {
int n,m,i=1;
scanf("%d", &n); // 输入两个整数
while(i<=n){
m=fb(i++);
printf("%d ",m);
}
return 0;
}
斐波那契数列一般就是递归算法入门时的一个案例,要点就是想好终止条件和递归代码
5.4汉诺塔🚀🚀🚀
#include <stdio.h>
// 递归函数解决汉诺塔问题
void hanoi(int n, char from_rod, char aux_rod, char to_rod) {
if (n == 1) { // 基本情况:只有1个盘子时直接移动
printf("Move disk 1 from rod %c to rod %c\n", from_rod, to_rod);
return;
}
// 将n-1个盘子从from_rod借助to_rod移动到aux_rod
hanoi(n - 1, from_rod, to_rod, aux_rod);
// 移动第n个盘子
printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
// 将n-1个盘子从aux_rod借助from_rod移动到to_rod
hanoi(n - 1, aux_rod, from_rod, to_rod);
}
int main() {
int n;
scanf("%d", &n); // 输入盘子数量
hanoi(n, 'A', 'B', 'C'); // 调用函数,A为起始柱,C为目标柱
return 0;
}
核心思路:递归分解问题
汉诺塔的递归逻辑基于一个关键思想:把复杂问题拆解为规模更小的同类问题。对于 n 个盘子,操作可拆分为三步:
将前 n-1 个盘子从起始柱(A)借助目标柱(C)移动到辅助柱(B)
(此时问题规模缩小为 n-1,但柱子的 “角色” 变化:原本的目标柱 C 变成辅助柱,B 成为新的目标柱)。
将第 n 个盘子直接从起始柱(A)移动到目标柱(C)
(这是唯一能直接操作的步骤,因为第 n 个盘子最大,可直接移动)。
将前 n-1 个盘子从辅助柱(B)借助起始柱(A)移动到目标柱(C)
(再次处理规模为 n-1 的问题,柱子角色又变化:A 成为辅助柱,C 是目标柱)。
5.5n的阶乘🚀
#include <stdio.h>
int factorial(int n) {
if (n == 0) { //注意0的阶乘是1!
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int n;
scanf("%d", &n);
int result = factorial(n);
printf("%d", result);
return 0;
}
0的阶乘是1
六、结构体
6.1学生信息结构体🚀🚀🚀
#include <stdio.h>
#include <string.h>
struct Student {
char name[11];
char gender[11];
int age;
char student_id[11];
}; //别忘了这里的分号!
int main() {
int n;
scanf("%d", &n);
struct Student students[n];
for (int i = 0; i < n; i++) {
scanf("%s %s %d %s", students[i].name, students[i].gender, &students[i].age, students[i].student_id);
for (int j = 0; j < i; j++) { //检查是否有重复的ID
if (strcmp(students[i].student_id, students[j].student_id) == 0) {
printf("Student ID already exists. Please enter a unique ID.\n");
i--; //重新录入
break;
}
}
}
printf("%-10s %-10s %-10s %-10s\n", "Name", "Gender", "Age", "Student ID");
for (int i = 0; i < n; i++) {
printf("%-10s %-10s %-10d %-10s\n", students[i].name, students[i].gender, students[i].age, students[i].student_id);
}
return 0;
}
6.2 共有体案例
#include <stdio.h>
union Data {
int intData;
double doubleData;
char charData;
};
int main() {
union Data myData;
int choice;
scanf("%d", &choice);
switch(choice) {
case 1:
scanf("%d", &myData.intData);
printf("有效数据为:%d\n", myData.intData);
printf("共用体的字节大小为:%lu\n", sizeof(myData));
break;
case 2:
scanf("%lf", &myData.doubleData);
printf("有效数据为:%.4lf\n", myData.doubleData);
printf("共用体的字节大小为:%lu\n", sizeof(myData));
break;
case 3:
scanf(" %c", &myData.charData);
printf("有效数据为:%c\n", myData.charData);
printf("共用体的字节大小为:%lu\n", sizeof(myData));
break;
default:
printf("无效选择\n");
}
return 0;
}
6.3枚举类型使用案例
#include <stdio.h>
// 定义枚举类型表示不同颜色
enum Color {
RED=1,
GREEN,
BLUE
}; //注意里面是逗号
int main() {
enum Color selectedColor;
int colorNum;
// 输入数字代表颜色
scanf("%d", &colorNum);
// 根据输入的数字选择对应的颜色
switch(colorNum) {
case RED:
printf("选择的颜色是红色");
break;
case GREEN:
printf("选择的颜色是绿色");
break;
case BLUE:
printf("选择的颜色是蓝色");
break;
default:
printf("无效输入");
}
return 0;
}
6.4 位运算的使用案例
#include <stdio.h>
int main() {
int num1, num2;
// 输入两个整数
scanf("%d %d", &num1, &num2);
// 与运算
printf("与运算结果:%d\n", num1 & num2);
// 或运算
printf("或运算结果:%d\n", num1 | num2);
// 异或运算
printf("异或运算结果:%d\n", num1 ^ num2);
// 取反运算
printf("取反运算结果:%d\n", ~num1);
// 左移两位
printf("左移两位结果:%d\n", num1 << 2);
// 右移两位
printf("右移两位结果:%d\n", num1 >> 2);
return 0;
}
6.5文件操作
#include <stdio.h>
int main() {
// 读取刚才创建的文件
FILE* input_1 = fopen("input_1.txt", "r");
if (input_1 == NULL) {
return 0;
}
// 创建文件(拷贝目标)
FILE* output_1 = fopen("output_1.txt", "w");
if (output_1 == NULL) { // 这里原代码判断条件错误,应为output_1,修正后抄写
return 0;
}
// 开始操作
char ch = 0;
while (1) {
// 复制
ch = fgetc(input_1);
if (ch == EOF)
break;
// 粘贴
fputc(ch, output_1);
}
// 关闭文件
fclose(input_1);
fclose(output_1);
return 0;
}