当前位置: 首页 > article >正文

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

http://www.kler.cn/a/589162.html

相关文章:

  • WIN11开发环境变量记录
  • 七、Prometheus 黑盒监控-白盒监控
  • 单片机的历史与发展
  • 虚拟机USB设备连接不成功?怎么解决?
  • 根据公式和a求出假设的b,再将b代入公式中反证是否能求出a
  • 正则表达式的基本应用以及查询工具
  • 【从零开始学习计算机科学】设计模式(五)MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式
  • 多种注意力机制(文本->残差->视频)
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(58)七宝妙树破数独 - 数独求解(回溯剪枝)
  • 量子计算与佛法智慧:一场关于二元对立的跨时空对话
  • 高亮动态物体——前景提取与动态物体检测器(opencv实现)
  • Elixir语言的容量规划
  • 【金融杂谈】价格内卷死局——谁造成了价格内卷?
  • 【Java--数据结构】优先级队列( PriorityQueue)
  • 【大语言模型】【个人知识库正式内容】提示工程:如何设计模型的提示语
  • 大模型最新面试题系列:微调篇之微调基础知识
  • 使用python去编写PDF转换成为EPUB以及MOBI工具
  • Linux如何在设备树中表示和引用设备信息
  • 基于Springboot+服务器磁盘的本地文件存储方案
  • 二分算法刷题