C语言作为一门历史悠久且应用广泛的编程语言,对于初学者来说,理解其基础语法和编程逻辑至关重要。通过实战案例的学习,我们可以更加直观地理解C语言的实际应用,并掌握编程技巧。本文将为您解析30个C语言实战案例,帮助您轻松入门C语言编程。
实战案例一:C语言基础语法
变量声明与赋值
int age = 18; char gender = 'M'; float height = 1.75;在C语言中,声明变量需要指定其类型,然后进行赋值。
输入输出 “`c #include
int main() {
int num;
printf("请输入一个数字:");
scanf("%d", &num);
printf("您输入的数字是:%d\n", num);
return 0;
}
通过`printf`和`scanf`函数实现输入输出操作。
## 实战案例二:控制结构
1. **条件判断**
```c
if (num > 0) {
printf("这是一个正数。\n");
} else if (num < 0) {
printf("这是一个负数。\n");
} else {
printf("这是一个零。\n");
}
使用if-else结构进行条件判断。
- 循环结构
使用for (int i = 1; i <= 5; i++) { printf("i的值:%d\n", i); }for循环实现重复操作。
实战案例三:数组操作
数组声明与初始化
int arr[5] = {1, 2, 3, 4, 5};声明一个整型数组,并初始化其元素。
数组遍历
for (int i = 0; i < 5; i++) { printf("arr[%d]的值:%d\n", i, arr[i]); }遍历数组并打印每个元素的值。
实战案例四:函数定义与调用
函数定义
int add(int a, int b) { return a + b; }定义一个名为
add的函数,用于计算两个整数的和。函数调用
int result = add(3, 4); printf("result的值:%d\n", result);调用
add函数,并将结果赋值给变量result。
实战案例五:指针操作
指针声明与赋值
int *ptr = #声明一个整型指针,并指向变量
num的地址。指针访问
printf("num的值:%d\n", *ptr);通过指针访问变量
num的值。
实战案例六:结构体与联合体
结构体定义
struct Person { char name[50]; int age; float height; };定义一个名为
Person的结构体,包含姓名、年龄和身高。结构体初始化与访问
struct Person p = {"张三", 18, 1.75}; printf("姓名:%s\n", p.name); printf("年龄:%d\n", p.age); printf("身高:%f\n", p.height);
实战案例七:文件操作
文件打开
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);打开文件并逐个字符读取内容。
实战案例八:动态内存分配
动态分配内存
int *arr = (int *)malloc(5 * sizeof(int)); if (arr == NULL) { printf("内存分配失败。\n"); return 1; }释放内存
free(arr);
实战案例九:字符串操作
字符串声明与赋值
char str[50] = "Hello, World!";字符串打印
printf("%s\n", str);
实战案例十:数据结构
- 链表创建 “`c struct Node { int data; struct Node *next; };
struct Node *head = NULL;
2. **链表插入**
```c
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->data = 10;
newNode->next = head;
head = newNode;
实战案例十一:排序算法
- 冒泡排序
int arr[5] = {5, 2, 8, 4, 1}; int temp; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
实战案例十二:递归函数
- 阶乘计算
int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } }
实战案例十三:动态规划
- 最长公共子序列
int lcs(char *X, char *Y, int m, int n) { if (m == 0 || n == 0) { return 0; } if (X[m - 1] == Y[n - 1]) { return 1 + lcs(X, Y, m - 1, n - 1); } else { return max(lcs(X, Y, m - 1, n), lcs(X, Y, m, n - 1)); } }
实战案例十四:网络编程
- TCP客户端
“`c
#include
#include #include #include #include #include
int main() {
int sockfd;
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
read(sockfd, buffer, sizeof(buffer));
printf("%s\n", buffer);
close(sockfd);
return 0;
}
## 实战案例十五:多线程编程
1. **创建线程**
```c
#include <stdio.h>
#include <pthread.h>
void *thread_function(void *arg) {
printf("线程ID:%ld\n", pthread_self());
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_function, NULL);
pthread_join(tid, NULL);
return 0;
}
实战案例十六:图形编程
- 绘制矩形
“`c
#include
void draw_rectangle(int x1, int y1, int x2, int y2) {
rectangle(x1, y1, x2, y2);
}
int main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, NULL);
draw_rectangle(100, 100, 300, 300);
getch();
closegraph();
return 0;
}
## 实战案例十七:音视频处理
1. **音频播放**
```c
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswresample/swresample.h>
int main() {
AVFormatContext *format_ctx = NULL;
AVCodecContext *codec_ctx = NULL;
AVCodec *codec = NULL;
AVPacket packet;
AVFrame *frame = NULL;
SwrContext *swr_ctx = NULL;
avformat_open_input(&format_ctx, "audio.mp3", NULL, NULL);
avformat_find_stream_info(format_ctx, NULL);
codec = avcodec_find_decoder(format_ctx->streams[0]->codecpar->codec_id);
codec_ctx = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codec_ctx, format_ctx->streams[0]->codecpar);
avcodec_open2(codec_ctx, codec, NULL);
swr_ctx = swr_alloc_set_opts(NULL, AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 44100,
codec_ctx->channel_layout, codec_ctx->sample_fmt, codec_ctx->sample_rate,
0, NULL);
swr_init(swr_ctx);
while (av_read_frame(format_ctx, &packet) >= 0) {
if (packet.stream_index == 0) {
avcodec_send_packet(codec_ctx, &packet);
while (avcodec_receive_frame(codec_ctx, frame) == 0) {
swr_convert_frame(swr_ctx, frame, frame);
// Process audio frame
}
}
av_packet_unref(&packet);
}
swr_free(&swr_ctx);
avcodec_close(codec_ctx);
avformat_close_input(&format_ctx);
return 0;
}
实战案例十八:机器学习
- 线性回归
“`c
#include
double predict(double x, double *theta) {
return theta[0] * x + theta[1];
}
int main() {
double x[5] = {1, 2, 3, 4, 5};
double y[5] = {2, 4, 5, 4, 5};
double theta[2] = {0, 0};
// Calculate theta using gradient descent or another optimization algorithm
// ...
double result = predict(6, theta);
printf("预测值:%f\n", result);
return 0;
}
## 实战案例十九:区块链
1. **创建区块链**
```c
#include <stdio.h>
#include <string.h>
struct Block {
int index;
char data[100];
struct Block *next;
};
struct Block *create_block(int index, char *data) {
struct Block *new_block = (struct Block *)malloc(sizeof(struct Block));
new_block->index = index;
strcpy(new_block->data, data);
new_block->next = NULL;
return new_block;
}
int main() {
struct Block *head = create_block(0, "Hello");
head->next = create_block(1, "World");
head->next->next = create_block(2, "Blockchain");
printf("区块链节点数据:\n");
struct Block *current = head;
while (current != NULL) {
printf("Index:%d, Data:%s\n", current->index, current->data);
current = current->next;
}
return 0;
}
实战案例二十:Web开发
- 创建HTTP服务器
“`c
#include
#include #include #include #include
int main() {
int sockfd;
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(sockfd, 10);
int connfd;
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
connfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_len);
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
read(connfd, buffer, sizeof(buffer));
printf("客户端请求:%s\n", buffer);
write(connfd, "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHello World!", 57);
close(connfd);
close(sockfd);
return 0;
}
## 实战案例二十一:数据库操作
1. **连接数据库**
```c
#include <stdio.h>
#include <mysql.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "localhost", "root", "password", "database", 0, NULL, 0)) {
printf("连接数据库失败。\n");
return 1;
}
char query[100];
sprintf(query, "SELECT * FROM users");
res = mysql_query(conn, query);
if (res) {
printf("查询失败。\n");
return 1;
}
while ((row = mysql_fetch_row(res)) != NULL) {
printf("用户名:%s, 密码:%s\n", row[0], row[1]);
}
mysql_free_result(res);
mysql_close(conn);
return 0;
}
实战案例二十二:加密算法
- MD5加密
“`c
#include
#include
int main() {
char data[100];
char md5str[33];
printf("请输入需要加密的字符串:");
scanf("%s", data);
unsigned char *md5 = MD5((unsigned char *)data, strlen(data), NULL);
for (int i = 0; i < 16; i++) {
sprintf(md5str + (i * 2), "%02x", md5[i]);
}
printf("MD5加密结果:%s\n", md5str);
return 0;
}
## 实战案例二十三:人工智能
1. **K近邻算法**
```c
#include <stdio.h>
#include <stdlib.h>
int knn(double x, double y, double **train_data, int train_size, int k) {
int distances[10];
int closest = 0;
double min_dist = 99999999;
for (int i = 0; i < train_size; i++) {
double dist = sqrt(pow(x - train_data[i][0], 2) + pow(y - train_data[i][1], 2));
distances[i] = dist;
}
for (int i = 0; i < k; i++) {
int temp = 0;
for (int j = 0; j < k; j++) {
if (distances[j] < distances[temp]) {
temp = j;
}
}
closest += train_data[temp][2];
}
return closest / k;
}
int main() {
double train_data[10][3] = {{1, 2, 1}, {2, 3, 2}, {3, 4, 2}, {4, 5, 1}, {5, 6, 1}, {6, 7, 2}, {7, 8, 2},
{8, 9, 2}, {9, 10, 2}, {10, 11, 2}};
int result = knn(5.5, 5.5, train_data, 10, 3);
printf("预测结果:%d\n", result);
return 0;
}
实战案例二十四:自然语言处理
- 词频统计
“`c
#include
#include
int main() {
char text[1000];
printf("请输入文本:");
fgets(text, sizeof(text), stdin);
int word_count[256] = {0};
int len = strlen(text);
for (int i = 0; i < len; i++) {
if (text[i] >= 'A' && text[i] <= 'Z') {
text[i] += 32;
}
if (text[i] >= 'a' && text[i] <= 'z') {
word_count[text[i]]++;
}
}
for (int i = 0; i < 256; i++) {
if (word_count[i] > 0) {
printf("字符:%c, 频率:%d\n", i, word_count[i]);
}
}
return 0;
} “`
实战案例二十五:图像处理
- 灰度化
“`c
#include
#include
void grayscale(unsigned char *input, unsigned char *output, int width, int height) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int idx = (y * width + x) * 3;
int r = input[idx];
