程序设计基础期末复习手册

程序设计基础期末复习手册

Sun Dec 07 2025
2067 words · 16 minutes
C语言 No categories assigned

C语言期末考试速查手册

一、输入输出技巧

1. 多种输入方式

// 1. 基础输入
int n;
scanf("%d", &n);
// 2. 字符串输入(无空格)
char str[20];
scanf("%s", str); // 遇到空格停止
// 3. 字符串输入(含空格)
char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去掉换行符
// 4. 读取整行直到换行符
char line[100];
scanf("%[^\n]", line); // 读取直到换行符
getchar(); // 吃掉换行符

2. 格式化输出

// 控制宽度和对齐
printf("%-10s %5d\n", "Name", 100); // 左对齐,宽度10
printf("%10s %5d\n", "Name", 100); // 右对齐,宽度10
printf("%.2f\n", 3.14159); // 保留2位小数
printf("%05d\n", 42); // 补零到5位:00042

二、字符串处理

1. 常用函数

#include <string.h>
// 长度
int len = strlen(str);
// 复制
strcpy(dest, src); // 不安全,可能溢出
strncpy(dest, src, n); // 安全,最多复制n个字符
// 连接
strcat(dest, src); // 不安全
strncat(dest, src, n); // 安全
// 比较
int cmp = strcmp(s1, s2); // 相等返回0,s1>s2返回正数
int cmp = strncmp(s1, s2, n); // 比较前n个字符
// 查找
char *p = strchr(str, 'a'); // 查找字符第一次出现
char *p = strrchr(str, 'a'); // 查找字符最后一次出现
char *p = strstr(str, "abc"); // 查找子串

2. 字符串分割

// 方法1:strtok
char str[] = "apple,banana,orange";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
// 方法2:sscanf
char data[] = "John 25 85.5";
char name[20];
int age;
float score;
sscanf(data, "%s %d %f", name, &age, &score);

3. 字符串转换

#include <stdlib.h>
// 字符串转数字
int num = atoi("123"); // ASCII to integer
long lnum = atol("123456"); // ASCII to long
float fnum = atof("3.14"); // ASCII to float
// 更安全的转换
int num = strtol(str, NULL, 10); // 10表示十进制
float fnum = strtof(str, NULL);
// 数字转字符串
char buffer[20];
sprintf(buffer, "%d", 123); // 整数转字符串
sprintf(buffer, "%.2f", 3.14159); // 浮点数转字符串

三、数组操作

1. 一维数组

// 遍历
int arr[10];
for (int i = 0; i < 10; i++) {
arr[i] = i * 2;
}
// 逆序
void reverse(int arr[], int n) {
for (int i = 0; i < n / 2; i++) {
int temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
}
// 查找最大最小值
void find_min_max(int arr[], int n, int *min, int *max) {
*min = *max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < *min) *min = arr[i];
if (arr[i] > *max) *max = arr[i];
}
}

2. 二维数组

// 遍历
int matrix[3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
matrix[i][j] = i * 4 + j;
}
}
// 矩阵转置
void transpose(int src[][N], int dest[][M], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dest[j][i] = src[i][j];
}
}
}

四、结构体与指针

1. 结构体定义与使用

// 定义
typedef struct {
char name[20];
int age;
float score;
} Student;
// 初始化
Student s1 = {"Alice", 20, 85.5};
Student s2;
strcpy(s2.name, "Bob");
s2.age = 21;
s2.score = 90.0;
// 结构体数组
Student class[30];
for (int i = 0; i < 30; i++) {
scanf("%s %d %f", class[i].name, &class[i].age, &class[i].score);
}

2. 指针操作

// 基本指针
int a = 10;
int *p = &a;
printf("%d\n", *p); // 输出10
// 指针与数组
int arr[5] = {1,2,3,4,5};
int *ptr = arr; // ptr指向arr[0]
printf("%d\n", *(ptr+2)); // 输出arr[2]=3
// 结构体指针
Student s;
Student *sp = &s;
sp->age = 20; // 等价于 (*sp).age = 20

五、动态内存管理

#include <stdlib.h>
// 一维数组
int *arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
exit(1);
}
// 使用...
free(arr);
// 二维数组
int **matrix = (int**)malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
matrix[i] = (int*)malloc(cols * sizeof(int));
}
// 使用...
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);

六、常用算法模板

1. 排序算法

// 冒泡排序
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-1-i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
// 选择排序
void selection_sort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
int min_idx = i;
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
int temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
}
// 插入排序
void insertion_sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i-1;
while (j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}

2. 查找算法

// 顺序查找
int linear_search(int arr[], int n, int target) {
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
// 二分查找(要求数组有序)
int binary_search(int arr[], int n, int target) {
int left = 0, right = n-1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}

七、数学计算

1. 常用数学函数

#include <math.h>
// 绝对值
int a = abs(-10); // 整数绝对值
double b = fabs(-3.14); // 浮点数绝对值
// 幂运算
double result = pow(2, 3); // 2³ = 8
double sqrt_val = sqrt(16); // √16 = 4
// 三角函数(参数为弧度)
double sin_val = sin(3.14159/2); // sin(90°) = 1
double cos_val = cos(0); // cos(0°) = 1
// 对数
double log_e = log(2.71828); // 自然对数ln
double log_10 = log10(100); // 以10为底
// 取整
double ceil_val = ceil(3.14); // 向上取整 = 4
double floor_val = floor(3.14); // 向下取整 = 3
double round_val = round(3.5); // 四舍五入 = 4

2. 最大公约数与最小公倍数

// 辗转相除法求最大公约数
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
// 最小公倍数
int lcm(int a, int b) {
return a / gcd(a, b) * b; // 先除后乘防止溢出
}

3. 素数判断

#include <math.h>
int is_prime(int n) {
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) return 0;
}
return 1;
}

八、文件操作

1. 基本文件操作

#include <stdio.h>
// 打开文件
FILE *fp = fopen("data.txt", "r"); // 模式:r(读), w(写), a(追加)
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
// 读写操作
fprintf(fp, "Hello %d\n", 123); // 写入格式化数据
fscanf(fp, "%s %d", str, &num); // 读取格式化数据
fputs("Hello\n", fp); // 写入字符串
fgets(buffer, sizeof(buffer), fp); // 读取一行
char ch = fgetc(fp); // 读取一个字符
fputc('A', fp); // 写入一个字符
// 关闭文件
fclose(fp);

2. 常用文件操作模式

模式描述
”r”只读,文件必须存在
”w”只写,创建新文件/清空原有文件
”a”追加,在文件末尾添加
”r+“读写,文件必须存在
”w+“读写,创建新文件/清空原有文件
”a+“读写,在文件末尾添加

九、实用技巧

1. 清除输入缓冲区

// 清除所有残留字符
void clear_input_buffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
// 使用示例
int n;
scanf("%d", &n);
clear_input_buffer(); // 清除换行符

2. 交换两个数

// 方法1:使用临时变量
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 方法2:不使用临时变量(仅整数)
void swap_xor(int *a, int *b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}

3. 生成随机数

#include <stdlib.h>
#include <time.h>
// 初始化随机种子(只需调用一次)
srand(time(NULL));
// 生成随机数
int random_num = rand(); // 0到RAND_MAX之间
int range_random = rand() % 100; // 0-99
int min_max_random = 10 + rand() % 91; // 10-100

十、常见错误与调试

1. 编译错误

// 错误1:未声明的标识符
printf("%d\n", x); // 如果x未声明
// 错误2:类型不匹配
int *p = 10; // 应该:int *p = &a;
// 错误3:缺少分号
int a = 10 // 缺少分号

2. 运行时错误

// 错误1:数组越界
int arr[5];
arr[5] = 10; // 越界访问
// 错误2:除零错误
int result = 10 / 0;
// 错误3:使用未初始化指针
int *p;
*p = 10; // 野指针
// 错误4:内存泄漏
int *p = malloc(100);
// 忘记free(p);

3. 调试技巧

// 1. 使用printf调试
printf("调试:a=%d, b=%d\n", a, b);
// 2. 条件编译调试
#ifdef DEBUG
printf("调试信息:x=%d\n", x);
#endif
// 编译时:gcc -DDEBUG program.c
// 3. 使用assert
#include <assert.h>
assert(x > 0); // 如果x<=0,程序会终止并报错

Thanks for reading!

程序设计基础期末复习手册

Sun Dec 07 2025
2067 words · 16 minutes
C语言 No categories assigned

© lnscq | CC BY-NC-SA 4.0