上机考试易忘知识汇总
- 一、第一弹
-
- 1.1二次方程根
- [1.2 打印菱形](#1.2 打印菱形)
- [1.3 string.h之sscanf](#1.3 string.h之sscanf)
- [1.4 三个基础排序](#1.4 三个基础排序)
- [1.5 动态分配二维数组malloc](#1.5 动态分配二维数组malloc)
- 1.6 一特定字符(#)结束结束)
- [1.7 字符串的插入](#1.7 字符串的插入)
- 1.8字符串的删除
- 1.9字符串的匹配
- 二、第二弹几个数学知识
- 三、第三弹自定义数据结构
-
- [3.1 定义一个结构体](#3.1 定义一个结构体)
- [3.2 定义一个共用体](#3.2 定义一个共用体)
- [3.3 定义一个枚举](#3.3 定义一个枚举)
- [3.4 链表](#3.4 链表)
- 四、第四弹C语言直接能用的函数
-
- [4.1 文件中的函数](#4.1 文件中的函数)
- C语言上机考试文件常用函数总结📚
- [4.2 C语言string.h常用上机函数总结✨](#4.2 C语言string.h常用上机函数总结✨)
- [4.3 qsort函数](#4.3 qsort函数)
-
- [1. 函数原型](#1. 函数原型)
- [2. 比较函数`compar`的写法](#2. 比较函数
compar
的写法) - [3. 常见使用场景及示例代码](#3. 常见使用场景及示例代码)
- [4. 注意事项](#4. 注意事项)
- [4.4 🎈数学函数](#4.4 🎈数学函数)
-
- [1. 绝对值函数](#1. 绝对值函数)
- [2. 幂函数与指数函数](#2. 幂函数与指数函数)
- [3. 对数函数](#3. 对数函数)
- [4. 开方函数](#4. 开方函数)
- [5. 三角函数](#5. 三角函数)
- [6. 取整函数](#6. 取整函数)

一、第一弹
1.1二次方程根

1.2 打印菱形

重点:通过变化的I来实现控制空格和*的个数
1.3 string.h之sscanf
c
#include <string.h>
sscanf(input, "%d%c%d=%c", &a, &op, &b, &c);
1.4 三个基础排序
c
//简单选择排序
void selectionSort(int arr[], int n) {
int i, j, min_idx, temp;
for (i = 0; i < n - 1; i++) {
min_idx = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
// 直接插入排序函数
void insertionSort(int arr[], int n) {
int i, j, key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将大于key的元素向后移动
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
//冒泡排序
void bubbleSort(int arr[], int n){
int i,j,temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
temp=arr[j],arr[j]=arr[j+1],arr[j+1]=temp;
}
}
}
}
1.5 动态分配二维数组malloc
c
#include <stdio.h>
#include <stdlib.h>
int m, n;
scanf("%d %d", &m, &n);
// 动态分配二维数组的内存
int **matrix = (int **)malloc(m * sizeof(int *));
for (int i = 0; i < m; i++) {
matrix[i] = (int *)malloc(n * sizeof(int));
}
// 释放动态分配的内存
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
1.6 一特定字符(#)结束
c
//以一个'#'结束的字符串
int i = 0;
char ch[101];
while ((ch[i] = getchar()) != '#') {
if (ch[i] >= 'a' && ch[i] <= 'z') {
ch[i] -= 32;
}
if (ch[i] >= 'A' && ch[i] <= 'Z') {
ch[i] += 32;
}
i++;
}
1.7 字符串的插入
注意:
1.注意下标=位置-1
2.先把插入位置及后面元素后移,再插入🎈
c
#include <stdio.h>
#include <string.h>
int pos;
scanf("%d", &pos);
//改为物理索引
pos--;
// 拼接字符串
int len1 = strlen(str1);
int len2 = strlen(str2);
//先把pos后的元素后移
for (int i = len1; i >= pos; i--) {
str1[i + len2] = str1[i];
}
//插入
for (int i = 0; i < len2; i++)
str1[pos + i] = str2[i];
1.8字符串的删除
注意:数组的删除其实就是后面元素覆盖前面元素
c
if (found) { //如果found为1则代表匹配到了子串
//用后面部分覆盖子串
for (int i = start + subLen; i < len; i++) {
str[i - subLen] = str[i];
}
//注意要减少原串的长度
len = len - subLen;
}
1.9字符串的匹配
c
while(start <= len - subLen) {
//比较是否有匹配的字串
int found = 1;
for (int i = 0; i < subLen; i++) {
if (str[start + i] != subStr[i]) {
found = 0;
break;
}
}
if (found) {
//说明匹配到了
}
else
start++;
}
二、第二弹几个数学知识
2.1最大公约数
辗转相除法
c
//保证a比b大
//辗转相除法
int gcd2(int a, int b){
int remainder = a % b;
while(remainder != 0){ //余数不为0时结束
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
//普通搜索方法求最大公约数
int gcd1(int a, int b){
//初始化认为最大公约数就是a,b之中较小的那个
int result = a < b ? a : b;
//暴力往前搜素,第一个符合条件的就是最大公约数
while(result > 0) {
if(a % result == 0 && b % result == 0){
return result;
}
result--;
}
}
//辗转相除法递归
int gcd3(int m, int n){
if(n == 0)
return m;
else
return gcd3(n, m % n);
}
2.2 最小公倍数
记住公式就好了
c
// 利用公式:最小公倍数 = (m * n) / 最大公约数
int lcm = (m * n) / gcd(m, n);
2.3斐波那契
c
//递归斐波那契数列
int fb(int n) {
if(n==1||n==2){
return 1;
}
return fb(n-1)+fb(n-2);
}
2.4n的阶乘
c
int factorial(int n) {
if (n == 0) { //注意0的阶乘是1!
return 1;
} else {
return n * factorial(n - 1);
}
}
三、第三弹自定义数据结构
3.1 定义一个结构体
c
//定义100个学生结构体变量
struct Student {
char name[11];
char gender[11];
int age;
char student_id[11];
}; //别忘了这里的分号!
struct Student students[n];
3.2 定义一个共用体
c
union Data {
int intData;
double doubleData;
char charData;
};
union Data myData;
3.3 定义一个枚举
c
// 定义枚举类型表示不同颜色
enum Color {
RED=1,
GREEN,
BLUE
}; //注意里面是逗号
enum Color selectedColor
3.4 链表

创建头节点:
c
LinkList* createLinkedList(int arr[], int n) {
LinkList *head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
LinkList *cur = head;
for (int i = 0; i < n; i++) { // 遍历数组,创建链表节点并串接起来
LinkList *newNode = (LinkList*)malloc(sizeof(LinkList));
newNode->data = arr[i];
newNode->next = NULL;
cur->next = newNode;
cur = newNode;
}
return head;
}
四、第四弹C语言直接能用的函数
4.1 文件中的函数
c
#include <stdio.h>
int main() {
// 读取刚才创建的文件
FILE* input_1 = fopen("input_1.txt", "r");
if (input_1 == NULL) {
return 0;
}
// 创建文件(拷贝目标)
FILE* output_1 = fopen("output_1.txt", "w");
if (output_1 == NULL) { // 这里原代码判断条件错误,应为output_1,修正后抄写
return 0;
}
// 开始操作
char ch = 0;
while (1) {
// 复制
ch = fgetc(input_1);
if (ch == EOF)
break;
// 粘贴
fputc(ch, output_1);
}
// 关闭文件
fclose(input_1);
fclose(output_1);
return 0;
}
C语言上机考试文件常用函数总结📚
🌟文件打开与关闭
-
fopen()
作用:以指定模式打开文件~
用法:
FILE *fopen(const char *filename, const char *mode)
✨mode常用:"r"(读)、"w"(写,覆盖)、"a"(追加)
返回:成功给文件指针,失败
NULL
! -
fclose()
作用:关闭打开的文件,防数据丢失~
用法:
int fclose(FILE *stream)
返回:成功0,失败非0!
🌟字符读写
-
fgetc()
从文件读一个字符,返回字符,失败/末尾
-1
(EOF
)~用法:
int fgetc(FILE *fp)
-
fputc()
往文件写一个字符,成功返字符,失败
EOF
~用法:
int fputc(int ch, FILE *fp)
🌟字符串读写
-
fgets()
读字符串到数组,最多
num-1
字符,自动加\0
~用法:
char *fgets(char *str, int num, FILE *fp)
-
fputs()
写字符串到文件(不带
\0
),成功非负,失败EOF
~用法:
int fputs(const char *str, FILE *stream)
🌟格式化读写
-
fscanf()
按格式从文件读数据,返回成功读取数~
用法:
int fscanf(FILE *stream, const char *format, ...)
-
fprintf()
按格式写数据到文件,成功返写入字符数,失败负~
用法:
int fprintf(FILE *stream, const char *format, ...)
🌟数据块读写
-
fread()
读数据块,返回实际读的项数~
用法:
size_t fread(void *buffer, size_t size, size_t count, FILE *fp)
-
fwrite()
写数据块,返回实际写的项数~
用法:
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *fp)
🌟文件定位
-
fseek()
移动文件指针,成功0,失败非0~
用法:
int fseek(FILE *fp, long offset, int origin)
(
origin
:SEEK_SET
开头,SEEK_CUR
当前,SEEK_END
末尾) -
rewind()
一键把文件指针复位到开头~
用法:
void rewind(FILE *fp)
-
ftell()
查当前指针位置,距开头字节数,错返
-1L
~用法:
long ftell(FILE *fp)
备考C语言上机考,这些函数多练多记💪
4.2 C语言string.h常用上机函数总结✨
string.h
头文件中的函数那可是相当关键!下面就给大家好好总结一波常用的函数😎
🌟字符串长度计算
strlen()
作用:计算字符串的长度,不包含字符串结束符\0
。
用法:size_t strlen(const char *s)
注意:时间复杂度是 O ( n ) O(n) O(n),需要遍历到\0
才停止。
🌟字符串复制
strcpy()
作用:把一个字符串完整地复制到另一个字符串中。
用法:char *strcpy(char *dest, const char *src)
注意:要保证目标字符串有足够的空间,不然会导致缓冲区溢出。strncpy()
作用:最多复制指定数量的字符到目标字符串。
用法:char *strncpy(char *dest, const char *src, size_t n)
注意:如果源字符串长度小于n
,会用\0
填充,但不会自动添加\0
。
🌟字符串拼接
strcat()
作用:把一个字符串拼接到另一个字符串的末尾。
用法:char *strcat(char *dest, const char *src)
注意:目标字符串必须以\0
结尾,且要有足够空间。strncat()
作用:最多拼接指定数量的字符到目标字符串末尾,会自动添加\0
。
用法:char *strncat(char *dest, const char *src, size_t n)
🌟字符串比较
strcmp()
作用:比较两个字符串的字典序。
用法:int strcmp(const char *s1, const char *s2)
返回值:小于 0 表示s1
小于s2
;等于 0 表示相等;大于 0 表示s1
大于s2
。
注意:区分大小写,按 ASCII 码比较。strncmp()
作用:比较两个字符串的前n
个字符的字典序。
用法:int strncmp(const char *s1, const char *s2, size_t n)
🌟字符查找
strchr()
作用:查找字符在字符串中第一次出现的位置。
用法:char *strchr(const char *s, int c)
返回:找到返回对应地址,没找到返回NULL
。strrchr()
作用:查找字符在字符串中最后一次出现的位置。
用法:char *strrchr(const char *s, int c)
返回:找到返回对应地址,没找到返回NULL
。
举例:
c
#include <stdio.h>
#include <string.h>
int main() {
// 定义一个字符串
char str[] = "Hello, World!";
// 要查找的字符
char ch = 'o';
// 使用 strchr() 函数查找字符
char *result = strchr(str, ch);
if (result != NULL) {
printf("字符 '%c' 首次出现在字符串中的位置是: %ld\n", ch, result - str);
} else {
printf("字符 '%c' 未在字符串中找到。\n", ch);
}
return 0;
}
🌟子串查找
strstr()
作用:在一个字符串中查找另一个子字符串第一次出现的位置。
用法:char *strstr(const char *haystack, const char *needle)
返回:找到返回对应地址,没找到返回NULL
。
c
#include <stdio.h>
#include <string.h>
int main() {
// 定义主字符串
char mainStr[] = "This is a sample string for testing.";
// 定义要查找的子字符串
char subStr[] = "sample";
// 使用 strstr() 函数查找子字符串
char *result = strstr(mainStr, subStr);
if (result != NULL) {
printf("子字符串 \"%s\" 首次出现在主字符串中的位置是: %ld\n", subStr, result - mainStr);
} else {
printf("子字符串 \"%s\" 未在主字符串中找到。\n", subStr);
}
return 0;
}
4.3 qsort函数
`qsort`是C语言标准库中的一个用于对数据进行排序的函数,功能强大且灵活,可以对不同类型的数据(如数组、结构体等)进行排序。以下是它的详细用法:
1. 函数原型
c
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
base
:指向要排序的数组的首元素指针。num
:表示数组中元素的个数。size
:每个元素的大小,以字节为单位,可以使用sizeof
运算符获取。compar
:指向比较函数的指针,该函数用于确定两个元素的顺序,由用户自定义。
2. 比较函数compar
的写法
比较函数compar
的原型为int (*compar)(const void *, const void *)
,它接受两个const void *
类型的参数,分别指向要比较的两个元素,返回值决定了两个元素的顺序:
- 返回值小于0:表示第一个元素应该排在第二个元素之前。
- 返回值等于0:表示两个元素相等,它们的相对位置可以保持不变。
- 返回值大于0:表示第一个元素应该排在第二个元素之后。
3. 常见使用场景及示例代码
(1)对整数数组排序
c
#include <stdio.h>
#include <stdlib.h>
// 比较函数,升序排序
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 2, 8, 1, 9};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
上述代码中,compare
函数将const void *
类型的参数强制转换为int *
类型,然后进行比较,返回值使得qsort
按照升序对整数数组arr
进行排序。
(2)对字符串数组排序
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 比较函数,按字典序升序排序字符串
int compare(const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
int main() {
char *strs[] = {"apple", "banana", "cherry"};
int n = sizeof(strs) / sizeof(strs[0]);
qsort(strs, n, sizeof(char *), compare);
for (int i = 0; i < n; i++) {
printf("%s ", strs[i]);
}
return 0;
}
这里因为要排序的是字符串数组,即指针数组,所以在compare
函数中,先将const void *
类型的参数转换为char **
类型,再使用strcmp
函数来比较两个字符串,实现按字典序升序排序。
(3)对结构体数组排序
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
typedef struct {
int id;
char name[20];
} Student;
// 比较函数,按id升序排序
int compare(const void *a, const void *b) {
return ((Student *)a)->id - ((Student *)b)->id;
}
int main() {
Student students[] = { {3, "Tom"}, {1, "Alice"}, {2, "Bob"} };
int n = sizeof(students) / sizeof(students[0]);
qsort(students, n, sizeof(Student), compare);
for (int i = 0; i < n; i++) {
printf("id: %d, name: %s\n", students[i].id, students[i].name);
}
return 0;
}
此例中,定义了Student
结构体,在compare
函数里将参数转换为Student *
类型,通过比较结构体中的id
成员来确定元素顺序,使qsort
对结构体数组按id
升序排序。
4. 注意事项
- 使用
qsort
函数需要包含头文件stdlib.h
。 - 比较函数必须保证具有一致性,即对于任意的
a
、b
和c
,若compare(a, b)
返回值和compare(b, c)
返回值确定了相应顺序关系,那么compare(a, c)
的返回值也要符合这种传递性。 - 由于
qsort
的参数base
和比较函数中的参数都是void *
类型,使用时需要进行适当的类型转换。
4.4 🎈数学函数
在C语言中,数学函数由标准库math.h
提供,使用时需包含头文件#include <math.h>
,编译时通常要加上参数-lm
(表示链接至数学函数库) 。以下是一些常见的数学函数:
1. 绝对值函数
abs
:原型为int abs(int x)
,用于计算整数x
的绝对值,例如abs(-5)
返回5
。labs
:原型为long labs(long x)
,用于计算长整数x
的绝对值,如labs(-10L)
返回10L
。fabs
:原型为double fabs(double x)
,用于计算实数(浮点数)x
的绝对值,比如fabs(-3.14)
返回3.14
。
2. 幂函数与指数函数
pow
:原型是double pow(double x, double y)
,用于计算x
的y
次方,如pow(2, 3)
返回8.0
。exp
:原型为double exp(double x)
,用于计算自然常数e
的x
次方,例如exp(1)
返回e
的近似值。
3. 对数函数
log
:原型是double log(double x)
,用于计算x
的自然对数(以e
为底),要求x > 0
,如log(exp(2))
返回2.0
。log10
:原型为double log10(double x)
,用于计算x
以10
为底的对数,同样要求x > 0
,例如log10(100)
返回2.0
。
4. 开方函数
sqrt
:原型是double sqrt(double x)
,用于计算x
的平方根,要求x >= 0
,如sqrt(9)
返回3.0
。
5. 三角函数
sin
:原型为double sin(double x)
,计算x
的正弦值,其中x
的单位是弧度,例如sin(0)
返回0.0
。cos
:原型是double cos(double x)
,计算x
的余弦值,x
为弧度制,如cos(0)
返回1.0
。tan
:原型为double tan(double x)
,计算x
的正切值,x
以弧度为单位 ,比如tan(0)
返回0.0
。asin
:原型是double asin(double x)
,计算x
的反正弦函数值,x
的值需在(-1, 1)
之间,返回值在(-π/2, π/2)
之间。acos
:原型为double acos(double x)
,计算x
的反余弦函数值,x
取值范围是(-1, 1)
,返回值在(0, π)
之间。atan
:原型是double atan(double x)
,计算x
的反正切函数值,返回值在(-π/2, π/2)
之间。atan2
:原型为double atan2(double y, double x)
,计算y/x
的反正切函数值,返回值在(-π, π)
之间。
6. 取整函数
ceil
:原型为double ceil(double x)
,返回不小于x
的最小整数,结果类型为double
,如ceil(3.1)
返回4.0
。floor
:原型是double floor(double x)
,返回不大于x
的最大整数,结果类型为double
,例如floor(3.9)
返回3.0
。
、