「C系列」C 经典练习实例


在这里插入图片描述

C语言经典练习实例及详细代码可以涵盖多个方面,从基础输入输出到复杂算法的实现。

当然,以下是更多C语言经典练习实例,按照不同的主题进行分类,并附带了简要的代码示例和说明:

1. 基本输入输出

1.1 Hello World

#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}

1.2 输入输出数字

#include <stdio.h>
int main() {
    int a, b;
    printf("请输入两个整数: ");
    scanf("%d %d", &a, &b);
    printf("你输入的数字是: %d 和 %d\n", a, b);
    return 0;
}

2. 字符串操作

2.1 字符串连接

#include <stdio.h>
int main() {
    char str1[50] = "Hello, ";
    char str2[] = "World!";
    strcat(str1, str2);
    printf("%s\n", str1); // 输出 "Hello, World!"
    return 0;
}

3. 数组与循环

3.1 数组排序(冒泡排序)

#include <stdio.h>
void bubbleSort(int arr[], int n) {
    // 排序逻辑...
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    // 输出排序后的数组...
    return 0;
}

3.2 查找数组中的最大值

#include <stdio.h>
int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int max = arr[0];
    for (int i = 1; i < 5; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    printf("最大值是: %d\n", max);
    return 0;
}

4. 函数与递归

4.1 阶乘计算

#include <stdio.h>
unsigned long long factorial(int n) {
    if (n == 0) return 1;
    return n * factorial(n - 1);
}

int main() {
    int n;
    printf("请输入一个整数: ");
    scanf("%d", &n);
    printf("%d 的阶乘是: %llu\n", n, factorial(n));
    return 0;
}

4.2 斐波那契数列

(已在前面的回答中给出)

5. 逻辑与条件

5.1 奇偶判断

#include <stdio.h>
int main() {
    int num;
    printf("请输入一个整数: ");
    scanf("%d", &num);
    if (num % 2 == 0) {
        printf("%d 是偶数\n", num);
    } else {
        printf("%d 是奇数\n", num);
    }
    return 0;
}

6. 数学问题

6.1 计算最大公约数(GCD)

(已在前面的回答中给出)

6.2 判断质数

#include <stdio.h>
int isPrime(int n) {
    // 判断质数的逻辑...
}

int main() {
    int num;
    printf("请输入一个整数: ");
    scanf("%d", &num);
    if (isPrime(num)) {
        printf("%d 是质数\n", num);
    } else {
        printf("%d 不是质数\n", num);
    }
    return 0;
}

7. 数字与数学

7.1 判断闰年

#include <stdio.h>

int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return 1; // 是闰年
    }
    return 0; // 不是闰年
}

int main() {
    int year;
    printf("请输入一个年份: ");
    scanf("%d", &year);
    if (isLeapYear(year)) {
        printf("%d 是闰年\n", year);
    } else {
        printf("%d 不是闰年\n", year);
    }
    return 0;
}

7.2 计算最大公约数(GCD)

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    int num1, num2, result;
    printf("请输入两个整数: ");
    scanf("%d %d", &num1, &num2);
    result = gcd(num1, num2);
    printf("GCD of %d and %d is %d\n", num1, num2, result);
    return 0;
}

8. 数组与字符串

8.1 字符串反转

#include <stdio.h>
#include <string.h>

void reverseString(char str[]) {
    int length = strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

int main() {
    char str[100];
    printf("请输入一个字符串: ");
    scanf("%s", str);
    reverseString(str);
    printf("反转后的字符串是: %s\n", str);
    return 0;
}

8.2 二进制到十进制的转换

#include <stdio.h>

int binaryToDecimal(int binary) {
    int decimal = 0, base = 1;
    while (binary > 0) {
        int reminder = binary % 10;
        decimal += reminder * base;
        binary /= 10;
        base *= 2;
    }
    return decimal;
}

int main() {
    int binary;
    printf("请输入一个二进制数: ");
    scanf("%d", &binary);
    int decimal = binaryToDecimal(binary);
    printf("二进制数 %d 在十进制中是 %d\n", binary, decimal);
    return 0;
}

9. 逻辑与条件

9.1 判断完数

#include <stdio.h>

int isPerfect(int num) {
    int sum = 0;
    for (int i = 1; i < num; i++) {
        if (num % i == 0) {
            sum += i;
        }
    }
    return sum == num;
}

int main() {
    int num;
    printf("请输入一个正整数: ");
    scanf("%d", &num);
    if (isPerfect(num)) {
        printf("%d 是完数\n", num);
    } else {
        printf("%d 不是完数\n", num);
    }
    return 0;
}

10. 结构体和联合体

10.1 结构体示例 - 学生信息

#include <stdio.h>

typedef struct {
    char name[50];
    int age;
    float gpa;
} Student;

int main() {
    Student s1;
    strcpy(s1.name, "张三");
    s1.age = 20;
    s1.gpa = 3.5;
    printf("学生姓名: %s, 年龄: %d, GPA: %.2f\n", s1.name, s1.age, s1.gpa);
    return 0;
}

10.2 联合体示例 - 节省内存

#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    printf("data.i: %d\n", data.i);

    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    strcpy(data.str, "Hello");
    printf("data.str: %s\n", data.str);
    return 0;
}

11. 指针

11.1 指针基础

#include <stdio.h>

int main() {
    int x = 10;
    int *p = &x; // p 指向 x 的地址
    printf("x 的值: %d\n", x);
    printf("p 指向的值: %d\n", *p);
    *p = 20; // 通过指针修改 x 的值
    printf("修改后 x 的值: %d\n", x);
    return 0;
}

11.2 指针数组和数组指针

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr[5]; // 指针数组,可以存储5个int类型指针

    for (int i = 0; i < 5; i++) {
        ptr[i] = &arr[i]; // 每个指针指向数组的一个元素
    }

    for (int i = 0; i < 5; i++) {
        printf("arr[%d] 的地址: %p, 值: %d\n", i, ptr[i], *ptr[i]);
    }

    int (*p)[5] = &arr; // 数组指针,指向包含5个int的数组
    printf("整个数组的地址: %p\n", (void *)p);
    printf("数组的第一个元素的值: %d\n", (*p)[0]);
    return 0;
}

12. 文件操作

12.1 读写文件

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w"); // 打开文件以写入
    if (file == NULL) {
        perror("打开文件失败");
        return 1;
    }

    fprintf(file, "Hello, World!\n"); // 写入字符串到文件
    fclose(file); // 关闭文件

    file = fopen("example.txt", "r"); // 重新打开文件以读取
    if (file == NULL) {
        perror("打开文件失败");
        return 1;
    }

    char buffer[100];
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("读取的内容: %s", buffer);
    }

    fclose(file); // 关闭文件
    return 0;
}

13. 动态内存分配

13.1 使用malloc和free
当使用C语言进行编程时,动态内存分配是一个非常重要的概念。这允许我们在运行时根据需要分配和释放内存。以下是一个C语言中使用动态内存分配的经典案例代码,该代码创建了一个整数数组,并使用malloc进行动态内存分配,然后使用free释放内存。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, *arr, i;

    // 获取用户想要创建的数组大小
    printf("请输入数组的大小: ");
    scanf("%d", &n);

    // 使用malloc动态分配内存
    arr = (int *)malloc(n * sizeof(int));

    // 检查内存是否成功分配
    if (arr == NULL) {
        printf("内存分配失败\n");
        exit(1); // 如果失败,退出程序
    }

    // 输入数组元素
    printf("请输入%d个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 打印数组元素
    printf("你输入的数组是:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 使用完内存后,释放它
    free(arr);

    return 0;
}

在这个例子中,我们首先使用malloc函数为整数数组动态分配内存。malloc函数返回一个指向已分配内存的指针,这个指针被存储在arr中。然后,我们使用这个指针来访问和修改数组的元素。当我们不再需要这块内存时,我们使用free函数来释放它,以防止内存泄漏。

注意:在C语言中,当使用malloc为数组分配内存时,你需要手动计算所需的内存大小(通过乘以sizeof(int)),并将结果传递给malloc。此外,由于malloc返回的是void *类型的指针,因此通常需要将其转换为适当的类型(在这个例子中是int *)。

另外,请始终检查malloc是否成功分配了内存(即返回的指针是否为NULL)。如果malloc失败,它将返回NULL,并且尝试访问NULL指针将导致程序崩溃。

相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·零落·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值