文章目录
- 1. 基本输入输出
- 2. 字符串操作
- 3. 数组与循环
- 4. 函数与递归
- 5. 逻辑与条件
- 6. 数学问题
- 7. 数字与数学
- 8. 数组与字符串
- 9. 逻辑与条件
- 10. 结构体和联合体
- 11. 指针
- 12. 文件操作
- 13. 动态内存分配
- 相关链接
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
指针将导致程序崩溃。