C语言从零开始学习指南 - 完整实战教程

发布于:2025-06-30 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. C语言简介与环境搭建

1.1 什么是C语言?

C语言是由Dennis Ritchie在1972年开发的一种通用编程语言。它具有以下特点:

  • 高效性:编译后执行效率高
  • 可移植性:可在多种平台上运行
  • 灵活性:提供底层控制能力
  • 广泛应用:操作系统、嵌入式系统、游戏开发等

1.2 开发环境搭建

Windows环境(推荐使用Dev-C++或Code::Blocks)

方法一:使用Dev-C++

  1. 下载Dev-C++:https://sourceforge.net/projects/orwelldevcpp/
  2. 安装后即可开始编程

方法二:使用Code::Blocks

  1. 下载Code::Blocks:http://www.codeblocks.org/
  2. 选择带MinGW的版本安装

方法三:使用Visual Studio Code

  1. 安装VS Code
  2. 安装C/C++扩展
  3. 安装MinGW编译器
验证安装

创建一个测试文件 hello.c

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

编译运行:

gcc hello.c -o hello
./hello

2. 第一个C程序

2.1 程序结构分析

#include <stdio.h>    // 包含标准输入输出库

int main() {          // 主函数,程序入口
    printf("Hello, World!\n");  // 输出语句
    return 0;         // 返回0表示程序正常结束
}

2.2 关键概念解释

  • #include:预处理指令,包含头文件
  • main():主函数,程序从这里开始执行
  • printf():输出函数
  • return:返回语句

2.3 实操练习

练习1:输出个人信息

#include <stdio.h>

int main() {
    printf("姓名:张三\n");
    printf("年龄:25\n");
    printf("职业:程序员\n");
    return 0;
}

练习2:计算简单数学题

#include <stdio.h>

int main() {
    int a = 10;
    int b = 5;
    int sum = a + b;
    
    printf("%d + %d = %d\n", a, b, sum);
    return 0;
}

3. 基本语法与数据类型

3.1 基本数据类型

数据类型 大小 取值范围 示例
char 1字节 -128 到 127 ‘A’, ‘1’
int 4字节 -2^31 到 2^31-1 100, -50
float 4字节 3.4E-38 到 3.4E+38 3.14, -2.5
double 8字节 1.7E-308 到 1.7E+308 3.14159

3.2 变量声明与初始化

#include <stdio.h>

int main() {
    // 变量声明
    int age;
    char name[20];
    float height;
    
    // 变量初始化
    age = 25;
    strcpy(name, "张三");
    height = 175.5;
    
    // 输出变量值
    printf("姓名:%s\n", name);
    printf("年龄:%d\n", age);
    printf("身高:%.1f cm\n", height);
    
    return 0;
}

3.3 实操练习

练习3:数据类型转换

#include <stdio.h>

int main() {
    int a = 10;
    float b = 3.5;
    double c = 2.7;
    
    // 隐式转换
    float result1 = a + b;
    double result2 = b + c;
    
    // 显式转换
    int result3 = (int)(b + c);
    
    printf("a + b = %.2f\n", result1);
    printf("b + c = %.2f\n", result2);
    printf("(int)(b + c) = %d\n", result3);
    
    return 0;
}

4. 变量与常量

4.1 变量命名规则

  • 只能包含字母、数字、下划线
  • 必须以字母或下划线开头
  • 区分大小写
  • 不能使用关键字

4.2 常量定义

#include <stdio.h>

#define PI 3.14159          // 宏定义常量
#define MAX_SIZE 100

int main() {
    const int MIN_AGE = 18;  // const常量
    
    printf("PI = %.5f\n", PI);
    printf("最大尺寸:%d\n", MAX_SIZE);
    printf("最小年龄:%d\n", MIN_AGE);
    
    return 0;
}

4.3 作用域与生命周期

#include <stdio.h>

int globalVar = 100;  // 全局变量

int main() {
    int localVar = 50;  // 局部变量
    
    {
        int blockVar = 25;  // 块级变量
        printf("块级变量:%d\n", blockVar);
    }
    
    printf("全局变量:%d\n", globalVar);
    printf("局部变量:%d\n", localVar);
    
    return 0;
}

5. 运算符与表达式

5.1 算术运算符

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    
    printf("a = %d, b = %d\n", a, b);
    printf("加法:%d + %d = %d\n", a, b, a + b);
    printf("减法:%d - %d = %d\n", a, b, a - b);
    printf("乘法:%d * %d = %d\n", a, b, a * b);
    printf("除法:%d / %d = %d\n", a, b, a / b);
    printf("取余:%d %% %d = %d\n", a, b, a % b);
    
    return 0;
}

5.2 关系运算符

#include <stdio.h>

int main() {
    int a = 10, b = 5;
    
    printf("a = %d, b = %d\n", a, b);
    printf("a > b: %d\n", a > b);
    printf("a < b: %d\n", a < b);
    printf("a == b: %d\n", a == b);
    printf("a != b: %d\n", a != b);
    printf("a >= b: %d\n", a >= b);
    printf("a <= b: %d\n", a <= b);
    
    return 0;
}

5.3 逻辑运算符

#include <stdio.h>

int main() {
    int a = 1, b = 0;
    
    printf("a = %d, b = %d\n", a, b);
    printf("a && b: %d\n", a && b);  // 逻辑与
    printf("a || b: %d\n", a || b);  // 逻辑或
    printf("!a: %d\n", !a);          // 逻辑非
    
    return 0;
}

5.4 实操练习

练习4:计算器程序

#include <stdio.h>

int main() {
    double num1, num2;
    char operator;
    
    printf("简单计算器\n");
    printf("请输入第一个数:");
    scanf("%lf", &num1);
    
    printf("请输入运算符(+、-、*、/):");
    scanf(" %c", &operator);
    
    printf("请输入第二个数:");
    scanf("%lf", &num2);
    
    switch(operator) {
        case '+':
            printf("%.2f + %.2f = %.2f\n", num1, num2, num1 + num2);
            break;
        case '-':
            printf("%.2f - %.2f = %.2f\n", num1, num2, num1 - num2);
            break;
        case '*':
            printf("%.2f * %.2f = %.2f\n", num1, num2, num1 * num2);
            break;
        case '/':
            if(num2 != 0)
                printf("%.2f / %.2f = %.2f\n", num1, num2, num1 / num2);
            else
                printf("错误:除数不能为零!\n");
            break;
        default:
            printf("无效的运算符!\n");
    }
    
    return 0;
}

6. 控制流程

6.1 if-else语句

#include <stdio.h>

int main() {
    int score;
    
    printf("请输入成绩:");
    scanf("%d", &score);
    
    if(score >= 90) {
        printf("优秀\n");
    } else if(score >= 80) {
        printf("良好\n");
    } else if(score >= 70) {
        printf("中等\n");
    } else if(score >= 60) {
        printf("及格\n");
    } else {
        printf("不及格\n");
    }
    
    return 0;
}

6.2 switch语句

#include <stdio.h>

int main() {
    int day;
    
    printf("请输入星期几(1-7):");
    scanf("%d", &day);
    
    switch(day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
        case 7:
            printf("周末\n");
            break;
        default:
            printf("无效输入\n");
    }
    
    return 0;
}

6.3 循环语句

for循环
#include <stdio.h>

int main() {
    int i, sum = 0;
    
    // 计算1到100的和
    for(i = 1; i <= 100; i++) {
        sum += i;
    }
    
    printf("1到100的和:%d\n", sum);
    
    // 打印乘法表
    for(i = 1; i <= 9; i++) {
        printf("%d * %d = %d\n", 9, i, 9 * i);
    }
    
    return 0;
}
while循环
#include <stdio.h>

int main() {
    int n, i = 1, factorial = 1;
    
    printf("请输入一个正整数:");
    scanf("%d", &n);
    
    while(i <= n) {
        factorial *= i;
        i++;
    }
    
    printf("%d的阶乘:%d\n", n, factorial);
    
    return 0;
}
do-while循环
#include <stdio.h>

int main() {
    int num, sum = 0;
    
    do {
        printf("请输入一个数(输入0结束):");
        scanf("%d", &num);
        sum += num;
    } while(num != 0);
    
    printf("总和:%d\n", sum);
    
    return 0;
}

6.4 实操练习

练习5:猜数字游戏

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

int main() {
    int target, guess, attempts = 0;
    
    // 生成随机数
    srand(time(NULL));
    target = rand() % 100 + 1;
    
    printf("猜数字游戏(1-100)\n");
    
    do {
        printf("请输入你的猜测:");
        scanf("%d", &guess);
        attempts++;
        
        if(guess > target) {
            printf("太大了!\n");
        } else if(guess < target) {
            printf("太小了!\n");
        } else {
            printf("恭喜!你猜对了!\n");
            printf("总共猜了%d次\n", attempts);
        }
    } while(guess != target);
    
    return 0;
}

7. 函数

7.1 函数定义与调用

#include <stdio.h>

// 函数声明
int add(int a, int b);
void printStar(int n);

int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    
    printStar(5);
    
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

void printStar(int n) {
    int i;
    for(i = 0; i < n; i++) {
        printf("*");
    }
    printf("\n");
}

7.2 函数参数传递

#include <stdio.h>

// 值传递
void swapByValue(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    printf("值传递函数内:a = %d, b = %d\n", a, b);
}

// 指针传递
void swapByPointer(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
    printf("指针传递函数内:a = %d, b = %d\n", *a, *b);
}

int main() {
    int x = 10, y = 20;
    
    printf("交换前:x = %d, y = %d\n", x, y);
    
    swapByValue(x, y);
    printf("值传递后:x = %d, y = %d\n", x, y);
    
    swapByPointer(&x, &y);
    printf("指针传递后:x = %d, y = %d\n", x, y);
    
    return 0;
}

7.3 递归函数

#include <stdio.h>

// 递归计算阶乘
int factorial(int n) {
    if(n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

// 递归计算斐波那契数列
int fibonacci(int n) {
    if(n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    int n = 5;
    
    printf("%d的阶乘:%d\n", n, factorial(n));
    
    printf("斐波那契数列前%d项:", n);
    for(int i = 0; i < n; i++) {
        printf("%d ", fibonacci(i));
    }
    printf("\n");
    
    return 0;
}

8. 数组

8.1 一维数组

#include <stdio.h>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    int i;
    
    // 遍历数组
    printf("数组元素:");
    for(i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
    
    // 计算数组元素和
    int sum = 0;
    for(i = 0; i < 5; i++) {
        sum += numbers[i];
    }
    printf("数组元素和:%d\n", sum);
    
    // 查找最大值
    int max = numbers[0];
    for(i = 1; i < 5; i++) {
        if(numbers[i] > max) {
            max = numbers[i];
        }
    }
    printf("最大值:%d\n", max);
    
    return 0;
}

8.2 二维数组

#include <stdio.h>

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int i, j;
    
    // 打印矩阵
    printf("矩阵:\n");
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 计算对角线元素和
    int diagonalSum = 0;
    for(i = 0; i < 3; i++) {
        diagonalSum += matrix[i][i];
    }
    printf("对角线元素和:%d\n", diagonalSum);
    
    return 0;
}

8.3 数组作为函数参数

#include <stdio.h>

// 打印数组
void printArray(int arr[], int size) {
    int i;
    for(i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 冒泡排序
void bubbleSort(int arr[], int size) {
    int i, j, temp;
    for(i = 0; i < size - 1; i++) {
        for(j = 0; j < size - 1 - i; j++) {
            if(arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int numbers[] = {64, 34, 25, 12, 22, 11, 90};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("原始数组:");
    printArray(numbers, size);
    
    bubbleSort(numbers, size);
    
    printf("排序后:");
    printArray(numbers, size);
    
    return 0;
}

9. 指针

9.1 指针基础

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;  // 指针变量
    
    printf("num的值:%d\n", num);
    printf("num的地址:%p\n", &num);
    printf("ptr的值:%p\n", ptr);
    printf("ptr指向的值:%d\n", *ptr);
    
    // 通过指针修改值
    *ptr = 20;
    printf("修改后num的值:%d\n", num);
    
    return 0;
}

9.2 指针与数组

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr;  // 数组名就是指向第一个元素的指针
    
    printf("通过数组下标访问:\n");
    for(int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    printf("通过指针访问:\n");
    for(int i = 0; i < 5; i++) {
        printf("%d ", *(ptr + i));
    }
    printf("\n");
    
    printf("通过指针递增访问:\n");
    for(int i = 0; i < 5; i++) {
        printf("%d ", *ptr++);
    }
    printf("\n");
    
    return 0;
}

9.3 动态内存分配

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

int main() {
    int *ptr;
    int n;
    
    printf("请输入数组大小:");
    scanf("%d", &n);
    
    // 动态分配内存
    ptr = (int *)malloc(n * sizeof(int));
    
    if(ptr == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }
    
    // 输入数组元素
    printf("请输入%d个整数:\n", n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &ptr[i]);
    }
    
    // 输出数组元素
    printf("数组元素:");
    for(int i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");
    
    // 释放内存
    free(ptr);
    
    return 0;
}

10. 结构体

10.1 结构体定义与使用

#include <stdio.h>
#include <string.h>

// 定义结构体
struct Student {
    char name[50];
    int age;
    float score;
};

int main() {
    struct Student student1;
    
    // 初始化结构体
    strcpy(student1.name, "张三");
    student1.age = 20;
    student1.score = 85.5;
    
    // 输出结构体信息
    printf("姓名:%s\n", student1.name);
    printf("年龄:%d\n", student1.age);
    printf("成绩:%.1f\n", student1.score);
    
    return 0;
}

10.2 结构体数组

#include <stdio.h>
#include <string.h>

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

int main() {
    struct Student students[3] = {
        {"张三", 20, 85.5},
        {"李四", 19, 92.0},
        {"王五", 21, 78.5}
    };
    
    // 查找最高分学生
    int maxIndex = 0;
    for(int i = 1; i < 3; i++) {
        if(students[i].score > students[maxIndex].score) {
            maxIndex = i;
        }
    }
    
    printf("最高分学生:\n");
    printf("姓名:%s\n", students[maxIndex].name);
    printf("年龄:%d\n", students[maxIndex].age);
    printf("成绩:%.1f\n", students[maxIndex].score);
    
    return 0;
}

10.3 结构体指针

#include <stdio.h>
#include <string.h>

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

// 通过指针修改结构体
void updateScore(struct Student *student, float newScore) {
    student->score = newScore;
}

int main() {
    struct Student student = {"张三", 20, 85.5};
    struct Student *ptr = &student;
    
    printf("原始成绩:%.1f\n", student.score);
    
    updateScore(&student, 95.0);
    
    printf("更新后成绩:%.1f\n", student.score);
    printf("通过指针访问:%.1f\n", ptr->score);
    
    return 0;
}

11. 文件操作

11.1 文件读写基础

#include <stdio.h>

int main() {
    FILE *file;
    char ch;
    
    // 写入文件
    file = fopen("test.txt", "w");
    if(file == NULL) {
        printf("无法创建文件!\n");
        return 1;
    }
    
    fprintf(file, "Hello, C Programming!\n");
    fprintf(file, "This is a test file.\n");
    fclose(file);
    
    // 读取文件
    file = fopen("test.txt", "r");
    if(file == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }
    
    printf("文件内容:\n");
    while((ch = fgetc(file)) != EOF) {
        printf("%c", ch);
    }
    fclose(file);
    
    return 0;
}

11.2 学生信息管理系统

#include <stdio.h>
#include <string.h>

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

// 添加学生信息
void addStudent() {
    struct Student student;
    FILE *file = fopen("students.txt", "a");
    
    if(file == NULL) {
        printf("无法打开文件!\n");
        return;
    }
    
    printf("请输入学生姓名:");
    scanf("%s", student.name);
    printf("请输入学生年龄:");
    scanf("%d", &student.age);
    printf("请输入学生成绩:");
    scanf("%f", &student.score);
    
    fprintf(file, "%s %d %.2f\n", student.name, student.age, student.score);
    fclose(file);
    
    printf("学生信息已保存!\n");
}

// 显示所有学生信息
void displayStudents() {
    struct Student student;
    FILE *file = fopen("students.txt", "r");
    
    if(file == NULL) {
        printf("文件不存在!\n");
        return;
    }
    
    printf("\n学生信息列表:\n");
    printf("姓名\t年龄\t成绩\n");
    printf("----------------------\n");
    
    while(fscanf(file, "%s %d %f", student.name, &student.age, &student.score) != EOF) {
        printf("%s\t%d\t%.2f\n", student.name, student.age, student.score);
    }
    
    fclose(file);
}

int main() {
    int choice;
    
    do {
        printf("\n学生信息管理系统\n");
        printf("1. 添加学生信息\n");
        printf("2. 显示所有学生\n");
        printf("3. 退出\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        
        switch(choice) {
            case 1:
                addStudent();
                break;
            case 2:
                displayStudents();
                break;
            case 3:
                printf("程序结束!\n");
                break;
            default:
                printf("无效选择!\n");
        }
    } while(choice != 3);
    
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到