案例一:C语言基础语法入门

1.1 变量和数据类型

在C语言中,变量是存储数据的容器,数据类型决定了变量的存储方式和取值范围。以下是一些常用的数据类型和变量声明示例:

int age = 25;             // 整数
float salary = 5000.0f;   // 单精度浮点数
char grade = 'A';         // 字符

1.2 运算符和表达式

C语言中的运算符用于对变量进行操作,包括算术运算符、关系运算符、逻辑运算符等。以下是一些示例:

int a = 10, b = 5;
int sum = a + b;         // 算术运算符
int result = a > b;      // 关系运算符
int flag = (a == b) && (b != c); // 逻辑运算符

案例二:控制结构

2.1 条件语句

条件语句用于根据条件判断执行不同的代码块。以下是一个简单的if语句示例:

int score = 85;
if (score >= 60) {
    printf("及格了!\n");
} else {
    printf("没及格。\n");
}

2.2 循环结构

循环结构用于重复执行某段代码。以下是一个for循环和while循环的示例:

// for循环
for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

// while循环
int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;
}

案例三:函数

3.1 函数定义

函数是C语言中实现代码复用的关键。以下是一个简单的函数定义示例:

void printMessage() {
    printf("Hello, World!\n");
}

3.2 函数调用

函数调用是指在程序中调用已定义的函数。以下是一个函数调用的示例:

printMessage(); // 调用printMessage函数

案例四:数组

4.1 数组定义

数组是存储相同类型数据元素的集合。以下是一个一维数组的定义示例:

int numbers[5] = {1, 2, 3, 4, 5};

4.2 数组操作

数组操作包括遍历、查找、排序等。以下是一个遍历数组的示例:

for (int i = 0; i < 5; i++) {
    printf("%d ", numbers[i]);
}

案例五:指针

5.1 指针定义

指针是存储变量地址的变量。以下是一个指针的定义示例:

int *ptr;
int num = 10;
ptr = &num; // 将num的地址赋值给ptr

5.2 指针操作

指针操作包括取值、赋值、解引用等。以下是一个解引用指针的示例:

printf("num的值是:%d\n", *ptr); // 输出num的值

案例六:结构体

6.1 结构体定义

结构体是用于组合不同类型数据的自定义数据类型。以下是一个结构体的定义示例:

struct Student {
    char name[50];
    int age;
    float score;
};

6.2 结构体操作

结构体操作包括创建结构体变量、访问结构体成员等。以下是一个创建结构体变量并访问成员的示例:

struct Student stu;
strcpy(stu.name, "张三");
stu.age = 20;
stu.score = 90.5;
printf("姓名:%s,年龄:%d,成绩:%f\n", stu.name, stu.age, stu.score);

案例七:文件操作

7.1 文件读写

文件操作包括文件的打开、读写、关闭等。以下是一个使用fopen、fprintf、fclose进行文件写入的示例:

FILE *fp;
fp = fopen("data.txt", "w");
fprintf(fp, "Hello, World!\n");
fclose(fp);

7.2 文件读取

以下是一个使用fopen、fscanf、fclose进行文件读取的示例:

FILE *fp;
int num;
fp = fopen("data.txt", "r");
fscanf(fp, "%d", &num);
fclose(fp);
printf("读取到的数字是:%d\n", num);

案例八:动态内存分配

8.1 动态内存分配

动态内存分配用于在程序运行时分配内存。以下是一个使用malloc进行动态内存分配的示例:

int *ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
    printf("内存分配失败!\n");
} else {
    for (int i = 0; i < 5; i++) {
        ptr[i] = i;
    }
    free(ptr);
}

8.2 动态内存释放

动态内存释放用于释放已分配的内存。以下是一个释放动态内存的示例:

free(ptr);

案例九:字符串操作

9.1 字符串定义

字符串是由字符组成的文本数据。以下是一个字符串的定义示例:

char str[100] = "Hello, World!";

9.2 字符串操作

字符串操作包括字符串的拼接、复制、查找等。以下是一个字符串复制的示例:

char *src = "Hello, World!";
char *dest = (char *)malloc(strlen(src) + 1);
strcpy(dest, src);
printf("复制后的字符串:%s\n", dest);
free(dest);

案例十:标准库函数

10.1 标准库函数简介

C语言标准库提供了丰富的函数,用于实现各种功能。以下是一些常用的标准库函数:

  • printf:格式化输出函数
  • scanf:格式化输入函数
  • strlen:计算字符串长度函数
  • strcpy:字符串复制函数
  • strcmp:字符串比较函数

10.2 标准库函数应用

以下是一些标准库函数的应用示例:

printf("请输入一个整数:");
int num;
scanf("%d", &num);
printf("输入的整数是:%d\n", num);

char str[100];
printf("请输入一个字符串:");
scanf("%s", str);
printf("输入的字符串是:%s\n", str);

int len = strlen(str);
printf("字符串长度:%d\n", len);

案例十一:结构体数组

11.1 结构体数组定义

结构体数组是存储相同结构体类型的元素集合。以下是一个结构体数组的定义示例:

struct Student {
    char name[50];
    int age;
    float score;
} stu[3];

11.2 结构体数组操作

结构体数组操作包括遍历、排序等。以下是一个遍历结构体数组的示例:

for (int i = 0; i < 3; i++) {
    printf("姓名:%s,年龄:%d,成绩:%f\n", stu[i].name, stu[i].age, stu[i].score);
}

案例十二:指针数组

12.1 指针数组定义

指针数组是存储指针元素的集合。以下是一个指针数组的定义示例:

int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};

12.2 指针数组操作

指针数组操作包括遍历、排序等。以下是一个遍历指针数组的示例:

for (int i = 0; i < 3; i++) {
    printf("指针数组元素:%d\n", *ptr[i]);
}

案例十三:结构体指针

13.1 结构体指针定义

结构体指针是指向结构体变量的指针。以下是一个结构体指针的定义示例:

struct Student stu;
struct Student *pstu = &stu;

13.2 结构体指针操作

结构体指针操作包括访问结构体成员、修改结构体成员值等。以下是一个访问和修改结构体成员值的示例:

printf("stu的姓名:%s\n", stu.name);
pstu->name = "李四";
printf("修改后的stu的姓名:%s\n", stu.name);

案例十四:函数指针

14.1 函数指针定义

函数指针是指向函数的指针。以下是一个函数指针的定义示例:

int add(int a, int b) {
    return a + b;
}
int (*pfun)(int, int) = add;

14.2 函数指针操作

函数指针操作包括调用函数、传递函数指针等。以下是一个调用函数指针的示例:

int result = pfun(3, 4);
printf("函数指针调用结果:%d\n", result);

案例十五:递归函数

15.1 递归函数定义

递归函数是指函数在执行过程中调用自身。以下是一个计算阶乘的递归函数示例:

int factorial(int n) {
    if (n <= 1)
        return 1;
    return n * factorial(n - 1);
}

15.2 递归函数应用

以下是一个调用递归函数计算阶乘的示例:

int n = 5;
int result = factorial(n);
printf("5的阶乘:%d\n", result);

案例十六:链表

16.1 链表定义

链表是一种非线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。以下是一个单链表的节点定义示例:

struct Node {
    int data;
    struct Node *next;
};

16.2 链表操作

链表操作包括创建链表、遍历链表、插入节点、删除节点等。以下是一个创建单链表的示例:

struct Node *head = NULL;
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->data = 1;
newNode->next = head;
head = newNode;

案例十七:树

17.1 树定义

树是一种非线性数据结构,由节点组成,每个节点包含数据和指向子节点的指针。以下是一棵二叉树的节点定义示例:

struct TreeNode {
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
};

17.2 树操作

树操作包括创建树、遍历树、插入节点、删除节点等。以下是一棵二叉树的创建示例:

struct TreeNode *root = NULL;
root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->data = 1;
root->left = NULL;
root->right = NULL;

案例十八:排序算法

18.1 排序算法简介

排序算法用于将一组数据按照特定顺序排列。以下是一些常用的排序算法:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 快速排序
  • 归并排序

18.2 排序算法应用

以下是一个使用冒泡排序算法对数组进行排序的示例:

int arr[5] = {5, 3, 8, 4, 2};
int i, j, temp;
for (i = 0; i < 4; i++) {
    for (j = 0; j < 4 - i; j++) {
        if (arr[j] > arr[j + 1]) {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

案例十九:查找算法

19.1 查找算法简介

查找算法用于在数据结构中查找特定元素。以下是一些常用的查找算法:

  • 顺序查找
  • 二分查找
  • 散列查找

19.2 查找算法应用

以下是一个使用顺序查找算法在数组中查找特定元素的示例:

int arr[5] = {1, 3, 5, 7, 9};
int key = 5;
int i;
for (i = 0; i < 5; i++) {
    if (arr[i] == key) {
        printf("找到了元素:%d\n", key);
        break;
    }
}
if (i == 5) {
    printf("未找到元素:%d\n", key);
}

案例二十:递归算法

20.1 递归算法简介

递归算法是指函数在执行过程中调用自身。以下是一些常用的递归算法:

  • 斐波那契数列
  • 汉诺塔问题
  • 求最大公约数

20.2 递归算法应用

以下是一个使用递归算法计算斐波那契数列的示例:

int fibonacci(int n) {
    if (n <= 1)
        return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}
int n = 10;
int result = fibonacci(n);
printf("%d的斐波那契数列:%d\n", n, result);

案例二十一:文件加密与解密

21.1 文件加密与解密简介

文件加密与解密是将文件内容转换为不可读形式和再次恢复为可读形式的过程。以下是一些常用的加密和解密算法:

  • 凯撒密码
  • XOR加密
  • AES加密

21.2 文件加密与解密应用

以下是一个使用XOR加密算法对文件进行加密和解密的示例:

#include <stdio.h>
#include <stdlib.h>

void encrypt(char *input, char *output, int key) {
    FILE *fp_in, *fp_out;
    char ch;
    fp_in = fopen(input, "rb");
    fp_out = fopen(output, "wb");
    while ((ch = fgetc(fp_in)) != EOF) {
        ch ^= key;
        fputc(ch, fp_out);
    }
    fclose(fp_in);
    fclose(fp_out);
}

void decrypt(char *input, char *output, int key) {
    FILE *fp_in, *fp_out;
    char ch;
    fp_in = fopen(input, "rb");
    fp_out = fopen(output, "wb");
    while ((ch = fgetc(fp_in)) != EOF) {
        ch ^= key;
        fputc(ch, fp_out);
    }
    fclose(fp_in);
    fclose(fp_out);
}

int main() {
    char input[100], output[100];
    int key;
    printf("请输入文件名:");
    scanf("%s", input);
    printf("请输入密钥:");
    scanf("%d", &key);
    encrypt(input, "encrypted", key);
    decrypt("encrypted", "decrypted", key);
    return 0;
}

案例二十二:网络编程

22.1 网络编程简介

网络编程是指使用计算机网络进行数据传输和处理的过程。以下是一些常用的网络编程技术:

  • TCP/IP协议
  • HTTP协议
  • FTP协议

22.2 网络编程应用

以下是一个使用C语言实现TCP客户端的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    int sockfd;
    struct sockaddr_in servaddr;
    char buffer[1024];
    int n;
    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("192.168.1.100");
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    printf("请输入要发送的消息:");
    scanf("%s", buffer);
    send(sockfd, buffer, strlen(buffer), 0);
    n = read(sockfd, buffer, 1024);
    buffer[n] = '\0';
    printf("从服务器接收到的消息:%s\n", buffer);
    close(sockfd);
    return 0;
}

案例二十三:图形用户界面编程

23.1 图形用户界面编程简介

图形用户界面编程是指使用图形界面与用户进行交互的过程。以下是一些常用的图形用户界面编程技术:

  • Windows API
  • Qt
  • Tkinter

23.2 图形用户界面编程应用

以下是一个使用Tkinter库实现图形用户界面的示例:

import tkinter as tk

def click_button():
    print("按钮被点击了!")

root = tk.Tk()
button = tk.Button(root, text="点击我", command=click_button)
button.pack()
root.mainloop()

案例二十四:多线程编程

24.1 多线程编程简介

多线程编程是指在同一程序中同时执行多个线程的过程。以下是一些常用的多线程编程技术:

  • POSIX线程(pthread)
  • Windows线程(Win32 API)

24.2 多线程编程应用

以下是一个使用pthread库实现多线程的示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *thread_function(void *arg) {
    printf("线程 %ld 正在运行...\n", pthread_self());
    return NULL;
}

int main() {
    pthread_t tid;
    pthread_create(&tid, NULL, thread_function, NULL);
    pthread_join(tid, NULL);
    return 0;
}

案例二十五:网络爬虫

25.1 网络爬虫简介

网络爬虫是指使用程序自动抓取网络数据的工具。以下是一些常用的网络爬虫技术:

  • 爬虫框架(如Scrapy)
  • 网络请求库(如requests)

25.2 网络爬虫应用

以下是一个使用requests库实现网络爬虫的示例: