问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言经典练习实例详解

创作时间:
作者:
@小白创作中心

C语言经典练习实例详解

引用
CSDN
1.
https://m.blog.csdn.net/xuaner8786/article/details/140016578

本文精选了多个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;
}

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.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
指针将导致程序崩溃。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号