在C语言的世界里,每一个难题都是对编程技巧的一次考验。本文将带你走进C语言的编程世界,通过30个实用实例,让你快速上手实战技巧,破解编程难题。
实例1:变量定义与初始化
在C语言中,正确地定义和初始化变量是编程的基础。以下是一个变量定义和初始化的例子:
#include <stdio.h>
int main() {
int a = 10; // 定义并初始化整型变量a
float b = 3.14f; // 定义并初始化浮点型变量b
char c = 'A'; // 定义并初始化字符型变量c
return 0;
}
实例2:数据类型转换
在C语言中,数据类型转换是常见的操作。以下是一个数据类型转换的例子:
#include <stdio.h>
int main() {
int a = 10;
float b = (float)a; // 将整型变量a转换为浮点型变量b
printf("a = %d, b = %f\n", a, b);
return 0;
}
实例3:运算符优先级
在C语言中,运算符的优先级决定了表达式的计算顺序。以下是一个运算符优先级的例子:
#include <stdio.h>
int main() {
int a = 10, b = 5;
int c = a + b * 2; // 先乘后加
printf("c = %d\n", c);
return 0;
}
实例4:控制语句
C语言中的控制语句用于控制程序的执行流程。以下是一个if语句的例子:
#include <stdio.h>
int main() {
int a = 10;
if (a > 5) {
printf("a大于5\n");
}
return 0;
}
实例5:循环语句
C语言中的循环语句用于重复执行一段代码。以下是一个for循环的例子:
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("i = %d\n", i);
}
return 0;
}
实例6:函数定义与调用
C语言中的函数是组织代码的重要方式。以下是一个函数定义和调用的例子:
#include <stdio.h>
// 函数声明
void printHello();
int main() {
printHello(); // 调用函数
return 0;
}
// 函数定义
void printHello() {
printf("Hello, world!\n");
}
实例7:指针与数组
指针和数组是C语言中非常重要的概念。以下是一个指针和数组的例子:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 指针指向数组首地址
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, *(ptr + i));
}
return 0;
}
实例8:结构体
结构体是C语言中用于组织相关数据的类型。以下是一个结构体的例子:
#include <stdio.h>
// 结构体定义
typedef struct {
int id;
char name[50];
} Student;
int main() {
Student stu = {1, "张三"};
printf("id = %d, name = %s\n", stu.id, stu.name);
return 0;
}
实例9:枚举类型
枚举类型是C语言中用于定义一组命名的整型常量的类型。以下是一个枚举类型的例子:
#include <stdio.h>
// 枚举类型定义
typedef enum {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
} Weekday;
int main() {
Weekday today = FRIDAY;
printf("今天星期%d\n", today);
return 0;
}
实例10:位运算
位运算是C语言中用于操作二进制位的一种运算。以下是一个位运算的例子:
#include <stdio.h>
int main() {
int a = 5; // 二进制:101
int b = 3; // 二进制:011
int c = a & b; // 与运算
printf("a & b = %d\n", c); // 输出:1
return 0;
}
实例11:文件操作
文件操作是C语言中用于处理文件的一种操作。以下是一个文件操作的例子:
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "w"); // 打开文件
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
fprintf(fp, "Hello, world!\n"); // 写入文件
fclose(fp); // 关闭文件
return 0;
}
实例12:动态内存分配
动态内存分配是C语言中用于在运行时分配内存的一种操作。以下是一个动态内存分配的例子:
#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;
}
free(arr); // 释放内存
return 0;
}
实例13:字符串处理
字符串处理是C语言中用于操作字符串的一种操作。以下是一个字符串处理的例子:
#include <stdio.h>
#include <string.h>
int main() {
char str1[100] = "Hello, world!";
char str2[100] = "Hello";
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
strcpy(str1, str2); // 复制字符串
printf("str1 = %s\n", str1);
return 0;
}
实例14:标准库函数
C语言中提供了丰富的标准库函数,方便开发者进行编程。以下是一个标准库函数的例子:
#include <stdio.h>
#include <math.h>
int main() {
double a = 3.14;
printf("sqrt(a) = %f\n", sqrt(a)); // 计算a的平方根
return 0;
}
实例15:结构体数组
结构体数组是C语言中用于存储结构体数据的一种方式。以下是一个结构体数组的例子:
#include <stdio.h>
// 结构体定义
typedef struct {
int id;
char name[50];
} Student;
int main() {
Student stu[3] = {
{1, "张三"},
{2, "李四"},
{3, "王五"}
};
for (int i = 0; i < 3; i++) {
printf("stu[%d].id = %d, stu[%d].name = %s\n", i, stu[i].id, i, stu[i].name);
}
return 0;
}
实例16:链表
链表是C语言中用于动态存储数据的一种数据结构。以下是一个链表的例子:
#include <stdio.h>
#include <stdlib.h>
// 链表节点定义
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建链表节点
Node *createNode(int data) {
Node *node = (Node *)malloc(sizeof(Node));
if (node == NULL) {
return NULL;
}
node->data = data;
node->next = NULL;
return node;
}
// 插入节点
void insertNode(Node **head, int data) {
Node *newNode = createNode(data);
if (newNode == NULL) {
return;
}
newNode->next = *head;
*head = newNode;
}
// 打印链表
void printList(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 释放链表
void freeList(Node *head) {
Node *temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
int main() {
Node *head = NULL;
insertNode(&head, 1);
insertNode(&head, 2);
insertNode(&head, 3);
printList(head);
freeList(head);
return 0;
}
实例17:递归函数
递归函数是C语言中用于解决递归问题的一种函数。以下是一个递归函数的例子:
#include <stdio.h>
// 递归函数计算阶乘
int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int n = 5;
printf("factorial(%d) = %d\n", n, factorial(n));
return 0;
}
实例18:排序算法
排序算法是C语言中用于对数据进行排序的一种算法。以下是一个冒泡排序的例子:
#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, 3, 1};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
实例19:字符串匹配算法
字符串匹配算法是C语言中用于在字符串中查找子字符串的一种算法。以下是一个KMP算法的例子:
#include <stdio.h>
// KMP算法预处理子串
void computeLPSArray(char *pat, int M, int *lps) {
int len = 0;
lps[0] = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
}
// KMP算法
void KMPSearch(char *txt, char *pat) {
int M = strlen(pat);
int N = strlen(txt);
// 创建lps数组
int lps[M];
computeLPSArray(pat, M, lps);
int i = 0; // txt的索引
int j = 0; // pat的索引
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
printf("在索引 %d 处找到模式\n", i - j);
j = lps[j - 1];
} else if (i < N && pat[j] != txt[i]) {
if (j != 0) {
j = lps[j - 1];
} else {
i = i + 1;
}
}
}
}
int main() {
char txt[] = "ABABDABACDABABCABAB";
char pat[] = "ABABCABAB";
KMPSearch(txt, pat);
return 0;
}
实例20:动态规划
动态规划是C语言中用于解决优化问题的一种算法。以下是一个最长公共子序列的例子:
#include <stdio.h>
// 动态规划计算最长公共子序列长度
int LCSLength(char *X, char *Y, int m, int n) {
int L[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (X[i - 1] == Y[j - 1]) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = (L[i - 1][j] > L[i][j - 1]) ? L[i - 1][j] : L[i][j - 1];
}
}
}
return L[m][n];
}
int main() {
char X[] = "AGGTAB";
char Y[] = "GXTXAYB";
int m = strlen(X);
int n = strlen(Y);
printf("最长公共子序列长度:%d\n", LCSLength(X, Y, m, n));
return 0;
}
实例21:图算法
图算法是C语言中用于处理图数据的一种算法。以下是一个图的深度优先搜索的例子:
#include <stdio.h>
#define MAX_VERTICES 10
// 图的邻接矩阵表示
int adjMatrix[MAX_VERTICES][MAX_VERTICES];
// 添加边
void addEdge(int start, int end) {
adjMatrix[start][end] = 1;
adjMatrix[end][start] = 1;
}
// 深度优先搜索
void DFS(int vertex) {
int visited[MAX_VERTICES];
for (int i = 0; i < MAX_VERTICES; i++) {
visited[i] = 0;
}
DFSUtil(vertex, visited);
}
// 深度优先搜索的递归函数
void DFSUtil(int vertex, int visited[]) {
visited[vertex] = 1;
printf("%d ", vertex);
for (int i = 0; i < MAX_VERTICES; i++) {
if (adjMatrix[vertex][i] && !visited[i]) {
DFSUtil(i, visited);
}
}
}
int main() {
int vertices = 4;
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
adjMatrix[i][j] = 0;
}
}
addEdge(0, 1);
addEdge(0, 2);
addEdge(1, 2);
addEdge(2, 0);
addEdge(2, 3);
addEdge(3, 3);
printf("深度优先搜索:");
DFS(0);
printf("\n");
return 0;
}
实例22:动态规划与图算法结合
动态规划与图算法结合可以解决一些复杂的问题。以下是一个最小生成树的例子:
#include <stdio.h>
#define MAX_VERTICES 10
// 最小生成树中边的结构体
typedef struct {
int u, v, w;
} Edge;
// 比较函数,用于排序
int compare(const void *a, const void *b) {
Edge *a1 = (Edge *)a;
Edge *a2 = (Edge *)b;
return a1->w - a2->w;
}
// 克鲁斯卡尔算法
void KruskalMST(int vertices, Edge edges[], int numEdges) {
int parent[MAX_VERTICES];
int rank[MAX_VERTICES];
for (int i = 0; i < vertices; i++) {
parent[i] = i;
rank[i] = 0;
}
qsort(edges, numEdges, sizeof(Edge), compare);
int i = 0; // 边的索引
int e = 0; // 已选择的边数
int minCost = 0;
while (e < vertices - 1) {
Edge nextEdge = edges[i++];
int x = findSet(parent, nextEdge.u);
int y = findSet(parent, nextEdge.v);
if (x != y) {
parent[x] = y;
e++;
minCost += nextEdge.w;
}
}
printf("最小生成树的总权值:%d\n", minCost);
}
// 查找集合
int findSet(int parent[], int i) {
if (parent[i] == i) {
return i;
}
return findSet(parent, parent[i]);
}
int main() {
int vertices = 4;
Edge edges[] = {
{0, 1, 10},
{0, 2, 6},
{0, 3, 5},
{1, 3, 15},
{2, 3, 4}
};
int numEdges = sizeof(edges) / sizeof(edges[0]);
KruskalMST(vertices, edges, numEdges);
return 0;
}
实例23:动态规划与字符串处理结合
动态规划与字符串处理结合可以解决一些字符串问题。以下是一个最长公共子序列的例子:
”`c
#include
// 动态规划计算最长公共子序列长度 int LCSLength(char *X, char *Y, int m, int n) {
int L[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0;
