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

雪梅零落 2024-06-29 09:05:02 阅读 74

文章目录

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

相关链接

Visual Studio Code下载地址Sublime Text下载地址「C系列」C 简介「C系列」C 基本语法「C系列」C 数据类型「C系列」C 变量及常见问题梳理「C系列」C 常量「C系列」C 存储类「C系列」C 运算符「C系列」C 判断/循环「C系列」C 函数「C系列」C 作用域规则「C系列」C 数组「C系列」C enum(枚举)「C系列」C 指针及其应用案例



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。