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

embedded/2024/10/21 5:57:47/

文章目录

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

相关链接

  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 指针及其应用案例

http://www.ppmy.cn/embedded/54032.html

相关文章

初识 GPT-4 和 ChatGPT

文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界&#xff1a;在这个世界里&#xff0c;你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验&#xff1f;你可以创造出什么样的应用程序&#xff1f;这正是…

SQL面试题练习 —— 求连续段的起始位置和结束位置

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;拼多多。 1 题目 有一张表t_id记录了id&#xff0c;id不重复&#xff0c;但是会存在间断&#xff0c;求出连续段的起始位置和结束位置。 样例数据 ----- | id | ----- | 1 | | 2 | | 3 | | 5 | | 6 | | 8 | | …

IPSEC VPN

IPSEC VPN IPSEC是为IP网络提供安全性的协议和服务的集合,是一种协议簇&#xff0c;一个基于网络层&#xff0c;应用密码学的安全信息协议组。一开始TCP/IP 没有考虑到信息的安全传输。IPSEC协议簇诞生的意义就是保证TCP/IP的安全传输。 伪头部校验&#xff1a;TCP再校验的时…

React 18

React Redux Router路由 TS 1 React 组件化开发方式、性能优秀&#xff08;vnode、fiber&#xff09;、丰富生态、跨平台支持&#xff08;React native支持ios、安卓&#xff09; 1.1 下载React项目 利用npx create-react-app react-basic下载项目&#xff0c;下载好项目…

深度学习之生成对抗网络StyleGAN3

StyleGAN3 是由 NVIDIA 团队提出的第三代生成对抗网络(GAN),在前代 StyleGAN 和 StyleGAN2 的基础上进行了改进,以实现更高质量的图像生成。StyleGAN3 的主要改进在于解决了 StyleGAN2 中存在的伪影(artifacts)问题,并且提升了生成图像的一致性和稳定性。 StyleGAN3 的…

GPT-5对普通人有何影响

这篇文章对ChatGPT的使用方法和提问技巧进行了讨论&#xff0c;重点强调了背景信息和具体提问的重要性。文章清晰地传达了如何提高ChatGPT回答的质量&#xff0c;以及个人在使用ChatGPT时的体会和建议。然而&#xff0c;文章在逻辑组织和表达方面还有一些可以改进的地方&#x…

举例说明计算机视觉(CV)技术的优势和挑战

计算机视觉&#xff08;CV&#xff09;技术是指让计算机系统能够理解和解释图像和视频数据的能力。它具有许多优势&#xff0c;但也面临一些挑战。 优势&#xff1a; 1. 高效性&#xff1a;CV技术可以快速地处理大量的图像和视频数据&#xff0c;使计算机能够在短时间内分析和…

ChatGPT的原理可以通俗易懂地介绍

ChatGPT的原理可以通俗易懂地介绍如下&#xff1a; 基础架构&#xff1a; ChatGPT基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;尤其是GPT-3的架构进行构建。GPT模型是一种基于Transformer架构的预训练语言模型&#xff0c;特别…