文章目录
1. C语言简介与环境搭建
1.1 什么是C语言?
C语言是由Dennis Ritchie在1972年开发的一种通用编程语言。它具有以下特点:
- 高效性:编译后执行效率高
- 可移植性:可在多种平台上运行
- 灵活性:提供底层控制能力
- 广泛应用:操作系统、嵌入式系统、游戏开发等
1.2 开发环境搭建
Windows环境(推荐使用Dev-C++或Code::Blocks)
方法一:使用Dev-C++
- 下载Dev-C++:https://sourceforge.net/projects/orwelldevcpp/
- 安装后即可开始编程
方法二:使用Code::Blocks
- 下载Code::Blocks:http://www.codeblocks.org/
- 选择带MinGW的版本安装
方法三:使用Visual Studio Code
- 安装VS Code
- 安装C/C++扩展
- 安装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 = # // 指针变量
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;
}