C语言作为一种历史悠久且功能强大的编程语言,在系统编程、嵌入式开发等领域依然占据着重要地位。对于初学者来说,掌握C语言编程需要通过大量的实战练习。本文将从50个实战案例入手,帮助你轻松提升编程技能。
实战案例一:C语言基础语法
- 变量和数据类型
#include <stdio.h>
int main() {
int a = 10;
float b = 3.14;
char c = 'A';
printf("整数:%d\n", a);
printf("浮点数:%f\n", b);
printf("字符:%c\n", c);
return 0;
}
- 运算符和表达式
#include <stdio.h>
int main() {
int a = 5, b = 3;
printf("加法:%d\n", a + b);
printf("减法:%d\n", a - b);
printf("乘法:%d\n", a * b);
printf("除法:%d\n", a / b);
return 0;
}
- 控制语句
#include <stdio.h>
int main() {
int a = 10;
if (a > 5) {
printf("a大于5\n");
} else {
printf("a不大于5\n");
}
for (int i = 0; i < 5; i++) {
printf("循环:%d\n", i);
}
return 0;
}
实战案例二:函数和模块化编程
- 函数定义和调用
#include <stdio.h>
void printHello() {
printf("Hello, World!\n");
}
int main() {
printHello();
return 0;
}
- 递归函数
#include <stdio.h>
int factorial(int n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int num = 5;
printf("5的阶乘:%d\n", factorial(num));
return 0;
}
实战案例三:指针和内存管理
- 指针定义和赋值
#include <stdio.h>
int main() {
int a = 10;
int *ptr = &a;
printf("a的地址:%p\n", (void *)ptr);
printf("a的值:%d\n", *ptr);
return 0;
}
- 动态内存分配
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = 10;
printf("动态分配的内存地址:%p\n", (void *)ptr);
printf("动态分配的内存值:%d\n", *ptr);
free(ptr);
}
return 0;
}
实战案例四:结构体和联合体
- 结构体定义和初始化
#include <stdio.h>
typedef struct {
int id;
char name[20];
} Student;
int main() {
Student stu = {1, "张三"};
printf("学生ID:%d\n", stu.id);
printf("学生姓名:%s\n", stu.name);
return 0;
}
- 联合体定义和初始化
#include <stdio.h>
typedef union {
int id;
char name[20];
} Student;
int main() {
Student stu = {1};
printf("学生ID:%d\n", stu.id);
stu.id = 2;
printf("学生姓名:%s\n", stu.name);
return 0;
}
实战案例五:文件操作
- 打开文件
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
return 0;
}
- 读取文件
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
char ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
return 0;
}
实战案例六:字符串处理
- 字符串定义和初始化
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
return 0;
}
- 字符串连接
#include <stdio.h>
#include <string.h>
int main() {
char str1[40] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2);
printf("str1:%s\n", str1);
return 0;
}
实战案例七:动态数组
- 动态数组定义和初始化
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
printf("arr[%d]:%d\n", i, arr[i]);
}
free(arr);
return 0;
}
- 动态数组扩容
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
int *new_arr = (int *)realloc(arr, 10 * sizeof(int));
if (new_arr == NULL) {
printf("内存扩容失败\n");
free(arr);
return 1;
}
arr = new_arr;
for (int i = 5; i < 10; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < 10; i++) {
printf("arr[%d]:%d\n", i, arr[i]);
}
free(arr);
return 0;
}
实战案例八:链表
- 链表节点定义和创建
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
int main() {
Node *head = createNode(1);
Node *node1 = createNode(2);
Node *node2 = createNode(3);
head->next = node1;
node1->next = node2;
return 0;
}
- 链表插入和删除操作
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void insertNode(Node **head, int data) {
Node *newNode = createNode(data);
newNode->next = *head;
*head = newNode;
}
void deleteNode(Node **head, int data) {
Node *temp = *head, *prev = NULL;
while (temp != NULL && temp->data != data) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
printf("未找到元素\n");
return;
}
if (prev == NULL) {
*head = temp->next;
} else {
prev->next = temp->next;
}
free(temp);
}
int main() {
Node *head = NULL;
insertNode(&head, 1);
insertNode(&head, 2);
insertNode(&head, 3);
for (Node *temp = head; temp != NULL; temp = temp->next) {
printf("%d ", temp->data);
}
printf("\n");
deleteNode(&head, 2);
for (Node *temp = head; temp != NULL; temp = temp->next) {
printf("%d ", temp->data);
}
printf("\n");
return 0;
}
实战案例九:排序算法
- 冒泡排序
#include <stdio.h>
void bubbleSort(int *arr, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {5, 2, 8, 4, 1};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
- 选择排序
#include <stdio.h>
void selectionSort(int *arr, int n) {
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
int main() {
int arr[] = {5, 2, 8, 4, 1};
int n = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
实战案例十:查找算法
- 线性查找
#include <stdio.h>
int linearSearch(int *arr, int n, int x) {
for (int i = 0; i < n; i++) {
if (arr[i] == x) {
return i;
}
}
return -1;
}
int main() {
int arr[] = {5, 2, 8, 4, 1};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 4;
int result = linearSearch(arr, n, x);
if (result == -1) {
printf("未找到元素\n");
} else {
printf("元素位置:%d\n", result);
}
return 0;
}
- 二分查找
#include <stdio.h>
int binarySearch(int *arr, int n, int x) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == x) {
return mid;
} else if (arr[mid] < x) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 3;
int result = binarySearch(arr, n, x);
if (result == -1) {
printf("未找到元素\n");
} else {
printf("元素位置:%d\n", result);
}
return 0;
}
实战案例十一:队列
- 队列定义和初始化
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
void initQueue(Queue *q) {
q->front = 0;
q->rear = 0;
}
int isEmpty(Queue *q) {
return q->front == q->rear;
}
int isFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
void enqueue(Queue *q, int x) {
if (isFull(q)) {
printf("队列已满\n");
return;
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAX_SIZE;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列已空\n");
return -1;
}
int x = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return x;
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
printf("队列元素:%d\n", dequeue(&q));
printf("队列元素:%d\n", dequeue(&q));
printf("队列元素:%d\n", dequeue(&q));
return 0;
}
- 队列应用:广度优先搜索(BFS)
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
void initQueue(Queue *q) {
q->front = 0;
q->rear = 0;
}
int isEmpty(Queue *q) {
return q->front == q->rear;
}
int isFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
void enqueue(Queue *q, int x) {
if (isFull(q)) {
printf("队列已满\n");
return;
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAX_SIZE;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列已空\n");
return -1;
}
int x = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return x;
}
void bfs(int **graph, int n, int start) {
Queue q;
initQueue(&q);
int visited[n];
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
visited[start] = 1;
enqueue(&q, start);
while (!isEmpty(&q)) {
int node = dequeue(&q);
printf("%d ", node);
for (int i = 0; i < n; i++) {
if (graph[node][i] == 1 && !visited[i]) {
visited[i] = 1;
enqueue(&q, i);
}
}
}
}
int main() {
int n = 5;
int **graph = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
graph[i] = (int *)malloc(n * sizeof(int));
for (int j = 0; j < n; j++) {
graph[i][j] = 0;
}
}
graph[0][1] = 1;
graph[1][0] = 1;
graph[0][2] = 1;
graph[2][0] = 1;
graph[1][2] = 1;
graph[2][1] = 1;
bfs(graph, n, 0);
return 0;
}
实战案例十二:栈
- 栈定义和初始化
”`c
#include
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, int x) {
if (isFull(s)) {
printf("栈已满\n");
return;
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈已空\n");
return -1;
}
return s->data[s->top--];
}
int main() {
Stack s;
initStack(&s);
push(&s, 1);
push(&s, 2);
push(&s, 3);
printf("栈元素:%d\n", pop(&s));
printf("栈元素:%d\n", pop(&s));
printf("栈元素:%d\n",
