案例一:计算阶乘
主题句
理解阶乘的概念,并学会使用循环和递归方法计算阶乘。
#include <stdio.h>
// 递归计算阶乘
long long factorial_recursive(int n) {
if (n == 0)
return 1;
return n * factorial_recursive(n - 1);
}
// 循环计算阶乘
long long factorial_iterative(int n) {
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int number = 5;
printf("递归方法计算%d的阶乘: %lld\n", number, factorial_recursive(number));
printf("循环方法计算%d的阶乘: %lld\n", number, factorial_iterative(number));
return 0;
}
案例二:冒泡排序
主题句
掌握冒泡排序算法,并学会如何实现排序功能。
#include <stdio.h>
void bubble_sort(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[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
printf("排序后的数组: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
案例三:字符串反转
主题句
学习如何反转一个字符串,并掌握指针的使用。
#include <stdio.h>
#include <string.h>
void reverse_string(char* str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char str[] = "Hello, World!";
printf("原始字符串: %s\n", str);
reverse_string(str);
printf("反转后的字符串: %s\n", str);
return 0;
}
案例四:二分查找
主题句
了解二分查找算法,并学会在有序数组中查找元素。
#include <stdio.h>
int binary_search(int arr[], int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2;
if (arr[m] == x)
return m;
if (arr[m] < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 10;
int result = binary_search(arr, 0, n - 1, x);
if (result == -1)
printf("元素不在数组中\n");
else
printf("元素在索引 %d\n", result);
return 0;
}
案例五:递归查找最大值
主题句
通过递归方法查找数组中的最大值,加深对递归的理解。
#include <stdio.h>
int find_max(int arr[], int n) {
if (n == 1)
return arr[0];
return (arr[n - 1] > find_max(arr, n - 1)) ? arr[n - 1] : find_max(arr, n - 1);
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("数组中的最大值: %d\n", find_max(arr, n));
return 0;
}
案例六:链表反转
主题句
了解链表结构,并学会反转一个单链表。
#include <stdio.h>
#include <stdlib.h>
// 创建一个新节点
struct Node {
int data;
struct Node* next;
};
// 反转链表
struct Node* reverse(struct Node* head) {
struct Node* prev = NULL;
struct Node* current = head;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
head = prev;
return head;
}
int main() {
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
head->next = (struct Node*)malloc(sizeof(struct Node));
head->next->data = 2;
head->next->next = (struct Node*)malloc(sizeof(struct Node));
head->next->next->data = 3;
printf("反转前的链表: ");
struct Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
head = reverse(head);
printf("反转后的链表: ");
temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
return 0;
}
案例七:快速排序
主题句
理解快速排序算法,并学会如何实现快速排序。
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
案例八:矩阵乘法
主题句
学习如何计算两个矩阵的乘积,并了解矩阵的基本操作。
#include <stdio.h>
void multiply(int a[][3], int b[][3], int result[][3]) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
result[i][j] = 0;
for (int k = 0; k < 3; k++)
result[i][j] += a[i][k] * b[k][j];
}
}
void printMatrix(int mat[][3]) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
printf("%d ", mat[i][j]);
printf("\n");
}
int main() {
int a[3][3] = {{1, 1, 1}, {2, 2, 2}, {3, 3, 3}};
int b[3][3] = {{1, 1, 1}, {2, 2, 2}, {3, 3, 3}};
int result[3][3];
multiply(a, b, result);
printf("矩阵乘积: \n");
printMatrix(result);
return 0;
}
案例九:斐波那契数列
主题句
理解斐波那契数列的生成原理,并学会使用循环和递归方法计算斐波那契数列。
#include <stdio.h>
// 递归方法
int fibonacci_recursive(int n) {
if (n <= 1)
return n;
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
}
// 循环方法
int fibonacci_iterative(int n) {
if (n <= 1)
return n;
int a = 0, b = 1, c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
int main() {
int n = 10;
printf("递归方法计算斐波那契数列的第%d项: %d\n", n, fibonacci_recursive(n));
printf("循环方法计算斐波那契数列的第%d项: %d\n", n, fibonacci_iterative(n));
return 0;
}
案例十:哈希表
主题句
了解哈希表的基本原理,并学会如何实现一个简单的哈希表。
#include <stdio.h>
#include <stdlib.h>
#define TABLE_SIZE 10
typedef struct Node {
int key;
int value;
struct Node* next;
} Node;
Node* hash_table[TABLE_SIZE];
// 哈希函数
unsigned int hash(int key) {
return key % TABLE_SIZE;
}
// 插入函数
void insert(int key, int value) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->key = key;
new_node->value = value;
new_node->next = NULL;
unsigned int index = hash(key);
new_node->next = hash_table[index];
hash_table[index] = new_node;
}
// 查找函数
int find(int key) {
unsigned int index = hash(key);
Node* temp = hash_table[index];
while (temp != NULL) {
if (temp->key == key)
return temp->value;
temp = temp->next;
}
return -1;
}
int main() {
insert(1, 10);
insert(2, 20);
insert(3, 30);
printf("查找键值1的值: %d\n", find(1));
printf("查找键值2的值: %d\n", find(2));
printf("查找键值3的值: %d\n", find(3));
printf("查找键值4的值: %d\n", find(4)); // 不存在
return 0;
}
案例十一:动态内存分配
主题句
了解动态内存分配的概念,并学会如何使用malloc和free函数。
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
exit(0);
}
for (int i = 0; i < 10; i++)
ptr[i] = i;
printf("动态分配的数组: ");
for (int i = 0; i < 10; i++)
printf("%d ", ptr[i]);
printf("\n");
free(ptr);
return 0;
}
案例十二:文件操作
主题句
学习如何进行文件读写操作,并了解文件的基本概念。
#include <stdio.h>
int main() {
FILE* file = fopen("example.txt", "w");
if (file == NULL) {
printf("文件打开失败\n");
exit(0);
}
fprintf(file, "Hello, World!\n");
fclose(file);
file = fopen("example.txt", "r");
if (file == NULL) {
printf("文件打开失败\n");
exit(0);
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), file)) {
printf("%s", buffer);
}
fclose(file);
return 0;
}
案例十三:结构体
主题句
了解结构体的概念,并学会如何定义和使用结构体。
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
void print_point(Point p) {
printf("Point: (%d, %d)\n", p.x, p.y);
}
int main() {
Point p1 = {1, 2};
Point p2 = {3, 4};
print_point(p1);
print_point(p2);
return 0;
}
案例十四:指针和数组
主题句
掌握指针和数组的关系,并学会如何使用指针操作数组。
#include <stdio.h>
void print_array(int* arr, int size) {
for (int i = 0; i < size; i++)
printf("%d ", *(arr + i));
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
print_array(arr, size);
return 0;
}
案例十五:函数指针
主题句
了解函数指针的概念,并学会如何使用函数指针。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*func_ptr)(int, int) = add;
printf("函数指针调用: %d\n", func_ptr(3, 4));
return 0;
}
案例十六:结构体指针
主题句
了解结构体指针的概念,并学会如何使用结构体指针。
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
void print_point(const Point* p) {
printf("Point: (%d, %d)\n", p->x, p->y);
}
int main() {
Point p = {1, 2};
print_point(&p);
return 0;
}
案例十七:位操作
主题句
了解位操作的概念,并学会如何使用位操作。
#include <stdio.h>
int main() {
int a = 5; // 0101
int b = 3; // 0011
printf("a & b: %d\n", a & b); // 0001
printf("a | b: %d\n", a | b); // 0111
printf("a ^ b: %d\n", a ^ b); // 0110
printf("a << 1: %d\n", a << 1); // 1010
printf("a >> 1: %d\n", a >> 1); // 0101
return 0;
}
案例十八:文件系统操作
主题句
了解文件系统的基本概念,并学会如何进行文件系统操作。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
// 创建文件
FILE* file = fopen("example.txt", "w");
if (file == NULL) {
printf("文件创建失败\n");
exit(1);
}
fprintf(file, "Hello, World!\n");
fclose(file);
// 检查文件是否存在
struct stat st;
if (stat("example.txt", &st) == -1) {
printf("文件不存在\n");
} else {
printf("文件存在\n");
}
// 删除文件
remove("example.txt");
return 0;
}
案例十九:进程和线程
主题句
了解进程和线程的概念,并学会如何创建和使用进程和线程。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void child_process() {
printf("这是子进程\n");
}
void main_process() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
child_process();
} else {
// 父进程
printf("这是父进程\n");
wait(NULL);
}
}
int main() {
main_process();
return 0;
}
案例二十:网络编程
主题句
了解网络编程的基本概念,并学会如何使用socket进行网络通信。
”`c
#include
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 强制绑定到端口8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port
