考试题型与时间安排

考试时间:
3月29日至31日(上半年3月)
9月20日至22日(下半年9月)

二级C语言考试总时长为120分钟,满分100分,及格分数为60分。考试题型包括单选题、操作题、应用题和综合应用题,分布如下:

选择题: 40道,每题1分,共40分

基本操作题: 3道,每题5分,共15分

简单应用题: 2道,分别为10分和15分,共25分

综合应用题: 1道,20分

总的来说,操作题占了相对较大的比重,一般来说只要有两题没做出来,就很难合格了,不过c语言的操作题很简单,基本上都是满分?
个人觉得,唯一困难的地方是不要害怕复杂的格式

推荐题库c.code2ji.cn

没什么特别的理由,能在手机上写操作题,还有比这更重要的吗?
在这里插入图片描述

考试时间如下:

上半年考试: 3月21日至25日

下半年考试: 9月21日至23日


C语言二级考试核心知识点

1. C语言基础语法

数据类型

基本数据类型:

  1. char: 字符型,1字节,范围 -128 到 127
  2. int: 整型,4字节,范围约 -21亿 到 21亿
  3. float: 单精度浮点型,4字节,6-7位有效数字
  4. double: 双精度浮点型,8字节,15-16位有效数字

修饰符:

  • unsigned: 无符号
  • signed: 有符号(默认)
  • short: 短整型
  • long: 长整型

变量声明和初始化

#include <stdio.h>

int main() {
    // 基本变量声明
    int age = 25;
    float height = 175.5;
    char grade = 'A';
    double salary = 8500.50;
    
    // 数组声明
    int scores[5] = {85, 92, 78, 96, 88};
    char name[20] = "张三";
    
    return 0;
}

2. 控制结构

条件语句

// if-else语句
int score = 85;
if (score >= 90) {
    printf("优秀\n");
} else if (score >= 80) {
    printf("良好\n");
} else if (score >= 60) {
    printf("及格\n");
} else {
    printf("不及格\n");
}

// switch语句
char grade = 'B';
switch (grade) {
    case 'A':
        printf("优秀\n");
        break;
    case 'B':
        printf("良好\n");
        break;
    case 'C':
        printf("及格\n");
        break;
    default:
        printf("不及格\n");
}

循环语句

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

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

// do-while循环
int num;
do {
    printf("请输入一个正数: ");
    scanf("%d", &num);
} while (num <= 0);

3. 函数

函数定义和调用

#include <stdio.h>

// 函数声明
int add(int a, int b);
void printArray(int arr[], int size);
int factorial(int n);

int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    
    int numbers[] = {1, 2, 3, 4, 5};
    printArray(numbers, 5);
    
    int fact = factorial(5);
    printf("5! = %d\n", fact);
    
    return 0;
}

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

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

// 递归函数
int factorial(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

4. 数组和字符串

一维数组

#include <stdio.h>

int main() {
    int scores[5] = {85, 92, 78, 96, 88};
    
    // 计算平均分
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += scores[i];
    }
    double average = (double)sum / 5;
    printf("平均分: %.2f\n", average);
    
    // 查找最大值
    int max = scores[0];
    for (int i = 1; i < 5; i++) {
        if (scores[i] > max) {
            max = scores[i];
        }
    }
    printf("最高分: %d\n", max);
    
    return 0;
}

字符串处理

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

int main() {
    char str1[50] = "Hello";
    char str2[50] = "World";
    char str3[100];
    
    // 字符串连接
    strcpy(str3, str1);
    strcat(str3, " ");
    strcat(str3, str2);
    printf("连接结果: %s\n", str3);
    
    // 字符串长度
    int len = strlen(str3);
    printf("字符串长度: %d\n", len);
    
    // 字符串比较
    if (strcmp(str1, str2) == 0) {
        printf("字符串相等\n");
    } else {
        printf("字符串不相等\n");
    }
    
    return 0;
}

5. 指针

基本指针操作

#include <stdio.h>

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

数组和指针

#include <stdio.h>

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);  // 等价于 *(arr + i)
    }
    printf("\n");
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printArray(numbers, size);  // 数组名就是指针
    
    return 0;
}

6. 文件操作

文件读写

#include <stdio.h>

int main() {
    FILE *file;
    char content[100];
    
    // 写入文件
    file = fopen("data.txt", "w");
    if (file != NULL) {
        fprintf(file, "Hello, File!\n");
        fprintf(file, "第二行内容\n");
        fclose(file);
        printf("文件写入成功\n");
    }
    
    // 读取文件
    file = fopen("data.txt", "r");
    if (file != NULL) {
        while (fgets(content, sizeof(content), file) != NULL) {
            printf("读取内容: %s", content);
        }
        fclose(file);
    } else {
        printf("文件打开失败\n");
    }
    
    return 0;
}

文件操作函数

// 文件操作常用函数:
fopen(filename, mode)     // 打开文件
fclose(file)              // 关闭文件
fgets(str, size, file)    // 读取一行
fputs(str, file)          // 写入字符串
fprintf(file, format, ...) // 格式化写入
fscanf(file, format, ...)  // 格式化读取
feof(file)                // 检查是否到达文件末尾

7. 结构体

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

// 定义学生结构体
struct Student {
    int id;
    char name[20];
    float score;
};

int main() {
    // 创建结构体变量
    struct Student student1;
    student1.id = 1001;
    strcpy(student1.name, "张三");
    student1.score = 85.5;
    
    // 结构体数组
    struct Student students[3] = {
        {1001, "张三", 85.5},
        {1002, "李四", 92.0},
        {1003, "王五", 78.5}
    };
    
    // 输出学生信息
    for (int i = 0; i < 3; i++) {
        printf("学号: %d, 姓名: %s, 成绩: %.1f\n", 
               students[i].id, students[i].name, students[i].score);
    }
    
    return 0;
}

8. 动态内存分配

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

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

🔥 真题实战:去除偶数生成新数 题目来源:c.code2ji.cn

在这里插入图片描述

这道题考查数字的位操作和指针传递:

题目要求: 从输入的正整数中提取所有奇数位,组成新整数

#include <stdio.h>

void fun(unsigned long *n) {
    unsigned long x = 0, i;    
    int t;
    i = 1;
    while(*n) {
        t = *n % 10;           // 取个位数字
        if(t % 2 != 0) {       // 判断是否为奇数
            x = x + t * i;     // 构建新数字
            i = i * 10;        // 位权递增
        }
        *n = *n / 10;          // 去掉个位
    }
    *n = x;                    // 将结果存回原变量
}

int main(void) {
    unsigned long n = -1;
    // 输入验证循环
    while(n > 99999999 || n < 0) {
        printf("Please input(0<n<100000000): "); 
        scanf("%ld", &n); 
    }
    fun(&n);                   // 传递地址
    printf("\nThe result is: %ld\n", n);
    return 0;
}

知识点解析:

  1. 指针传递fun(&n) 传递变量地址,*n 解引用访问值
  2. 数字分解n % 10 取个位,n / 10 去掉个位
  3. 奇偶判断t % 2 != 0 判断是否为奇数
  4. 数字构建:用位权i重新组合数字
  5. 输入验证:while循环确保输入在有效范围内

记忆技巧:

  • 指针:&取地址,*取值
  • 数字操作:%10取个位,/10去个位
  • 位权概念:个位权重1,十位权重10,百位权重100…

指针和数字处理常见考点:

  • 数字的位操作和分解
  • 指针传递和解引用
  • 条件判断和循环控制
  • 数字构造和组合

🔥 真题实战:实型数四舍五入 题目来源:c.code2ji.cn

在这里插入图片描述

这道题综合考查函数定义和文件操作:

题目要求: 实现浮点数四舍五入并进行文件批处理

#include <stdio.h>

// 四舍五入函数实现
float fun(float h) {
    // 核心算法:乘100,加0.5,取整,再除100
    return (int)(h * 100 + 0.5) / 100.0;
}

void NONO(void);   // 函数声明

int main(void) {
    float a;
    printf("Enter  a:  ");
    if (scanf("%f", &a) != 1) return 0;  // 输入检查

    printf("The original data is :   %f\n\n", a);
    printf("The result :  %f\n", fun(a));

    NONO();  // 调用文件处理函数
    return 0;
}

// 文件批处理函数
void NONO(void) {
    int i;
    float a;
    FILE *rf = fopen("in.txt", "r");     // 打开输入文件
    FILE *wf = fopen("out.txt", "w");    // 打开输出文件

    if (!rf || !wf) {                    // 检查文件是否成功打开
        printf("文件打开失败!\n");
        return;
    }

    // 读取并处理20个数字
    for (i = 0; i < 20 && fscanf(rf, "%f", &a) == 1; i++) {
        fprintf(wf, "%f\n", fun(a));     // 处理后写入文件
    }

    fclose(rf);  // 关闭文件
    fclose(wf);
}

知识点解析:

  1. 四舍五入算法(int)(h * 100 + 0.5) / 100.0
    • 乘100:将小数点后两位移到整数部分
    • 加0.5:实现四舍五入
    • 取整:去掉多余小数
    • 除100.0:恢复原来的小数位置
  2. 文件操作fopen() 打开,fscanf()/fprintf() 读写,fclose() 关闭
  3. 错误检查:检查文件是否成功打开,检查输入是否成功
  4. 函数分离:主函数处理交互,NONO函数处理文件批量操作

记忆技巧:

  • 四舍五入:×100 → +0.5 → 取整 → ÷100
  • 文件操作:打开 → 读写 → 关闭
  • 错误检查:每个操作都要检查返回值

函数和文件常见考点:

  • 函数的定义、声明和调用
  • 文件的打开、读写、关闭操作
  • 数学算法的实现(四舍五入等)
  • 批量数据处理和错误检查

结语:

一个非常简明扼要的笔记,没java那篇写得好,不过全网关于c语言二级考试的笔记全网少得可怜,所以还是分享出来,差不多也就这些内容,内容真心少得可怜,愿意的话基本上两天能学到通过的水平…一般刷个30多题就能去参加考试了,选择题可能花的时间还要更多一点呢

考试时候c语言的编辑器属于能用但不多的那种,代码执行后会自动关闭,导致看不到结果,我在调试的时候会在代码执行完毕后加一行输入,这样就会在最后停住,能看看结果,不知道有没有更好的方法,抛砖引玉吧(不管怎么样比java的编译器还是好很多的)

c语言算是java、c、python老三样中难度最低的,如果你能过python,那么这一门基本不会有问题,大部分都是基础语法,也没有库或者gui的使用,相对来说非常基础?如果你这学期要学c语言,可以报了,不会超出你们期末考试的考试范围,一起搞定。

个人推荐b站随便看个c语言语法的速成课,额外找个视频看看文件读写的语法,3小时搞定,然后就开始刷题,刷个两天去考试。我计划着会做个两小时通关视频,到时候如果出了请务必捧场(´∀ ˋ)

推荐的题库:c.code2ji.cn

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐