❄ 基本程序结构和设计规范

  • 计算机程序的基本概念:由指令组成,实现特定功能的代码集合,是计算机执行任务的依据
  • 程序结构、注释、命名规范:
      1. 程序结构:清晰分层,逻辑连贯;
      2. 注释:单行//、多行/* */,提升代码可读性;
      3. 命名规范:由字母/数字/下划线组成,首字符非数字,见名知意,区分大小写
  • 三种基本结构流程图:顺序结构、选择结构、循环结构
  • C语言程序的核心结构:预处理命令、主函数、执行语句、注释

案例1:C语言程序标准框架

#include <stdio.h> int main(void) { int studentScore = 95; printf("学生成绩:%d\n", studentScore); return 0; }
运行结果:
学生成绩:95
该程序是C语言最基础的完整框架,包含预处理命令、主函数、执行语句、注释四大核心部分,符合C语言程序结构规范。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:C语言程序的唯一入口是()
A. fun()函数
B. main()函数
C. printf()函数
D. scanf()函数
解析:C语言语法规定,任何C程序的唯一执行入口都是main()函数。
基础题2:C语言中单行注释的符号是()
A. //
B. /* */
C.
D. #
解析://是C语言单行注释符号,/* */是多行注释符号。
基础题3:以下属于C语言预处理命令的是()
A. int main()
B. #include <stdio.h>
C. printf("hello");
D. return 0;
解析:C语言预处理命令以#开头,#include <stdio.h>是引入头文件的预处理命令。
基础题4:C语言语句的结束标志是()
A. 逗号,
B. 分号;
C. 句号。
D. 冒号:
解析:C语言规定,所有执行语句必须以分号;结束。
基础题5:计算机程序的本质是()
A. 一组数字
B. 一组指令的集合
C. 一个文档
D. 一张流程图
解析:计算机程序是为实现特定功能而编写的一组有序指令的集合。
基础题6:C语言中,主函数的返回值类型默认是()
A. int
B. char
C. float
D. void
解析:C语言标准中,主函数的返回值类型必须是int。
基础题7:以下哪种是C语言的多行注释方式()
A. // 注释内容
B. /* 注释内容 */
C. // 注释1 // 注释2
D. # 注释内容
解析:/* */是C语言多行注释。
基础题8:C语言程序中,注释的作用是()
A. 参与程序运行
B. 提升代码可读性
C. 加快程序运行速度
D. 减少代码体积
解析:注释是对代码的解释说明,不参与程序编译和运行,仅用于提升代码的可读性。
基础题9:以下属于C语言三种基本结构的是()
A. 分支结构
B. 跳转结构
C. 赋值结构
D. 输入结构
解析:C语言三种基本程序结构为顺序结构、选择结构(分支结构)、循环结构。
基础题10:C语言中,main函数的结束标志是()
A. {
B. }
C. ;
D. return 0;
解析:C语言中,函数体由{}包裹,}是函数体的结束标志。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 顺序结构程序设计

  • 变量的命名、定义与赋值:
      1. 命名:字母/数字/下划线,首字符非数字,见名知意;
      2. 定义:类型 变量名;
      3. 赋值:变量名 = 值;
  • 输入输出函数:
      1. 格式输入:scanf("格式控制", 地址列表);
      2. 格式输出:printf("格式控制", 输出列表);
      3. 常用格式符:%d-整型,%f-浮点型,%c-字符型
  • 顺序结构特点:语句按先后顺序依次执行,没有分支和循环,最简单最常用的结构
  • 混合运算与类型转换:
      1. 自动类型转换:按类型层次自动提升;
      2. 强制类型转换:(类型名)表达式;
  • 常用数学函数:abs绝对值、pow幂函数、sqrt平方根、floor向下取整、ceil向上取整

案例1:求圆的面积和周长

#include <stdio.h> int main(void) { float radius = 5.0f; float area, perimeter; area = 3.14 * radius * radius; perimeter = 2 * 3.14 * radius; printf("圆的半径:%.2f\n", radius); printf("圆的面积:%.2f\n", area); printf("圆的周长:%.2f\n", perimeter); return 0; }
运行结果:
圆的半径:5.00
圆的面积:78.50
圆的周长:31.40
该程序展示了顺序结构的典型用法:定义变量 → 计算面积和周长 → 输出结果,程序按照书写顺序依次执行,没有分支和循环。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:顺序结构的特点是()
A. 语句按先后顺序依次执行
B. 可以跳转到任意位置
C. 可以重复执行某些语句
D. 可以根据条件选择执行
解析:顺序结构是按代码的书写顺序依次执行,是最简单最基本的程序结构。
基础题2:以下变量定义,正确的是()
A. int 2num = 10;
B. int num2 = 10;
C. int num&2 = 10;
D. int int = 10;
解析:C语言变量名由字母/数字/下划线组成,首字符不能为数字,不能是关键字。
基础题3:printf函数中,输出整型数据的格式符是()
A. %f
B. %d
C. %c
D. %s
解析:%d是整型数据的格式符,%f是浮点型,%c是字符型,%s是字符串型。
基础题4:scanf函数中,输入数据需要使用()
A. 变量名
B. 变量地址
C. 变量值
D. 变量类型
解析:scanf函数需要变量的地址,格式为&变量名。
基础题5:求绝对值的函数是()
A. pow()
B. sqrt()
C. abs()
D. floor()
解析:abs()求绝对值,pow()求幂,sqrt()求平方根,floor()向下取整。
基础题6:以下代码,输出的结果是()
int a = 5; printf("%d", a++);
A. 5
B. 6
C. 0
D. 7
解析:a++是后置自增,先使用a的值输出,再a自增,所以输出5,然后a变为6。
基础题7:强制类型转换的格式是()
A. 类型(表达式)
B. (类型)表达式
C. 表达式(类型)
D. (表达式)类型
解析:C语言强制类型转换的语法是 (类型名)表达式。
基础题8:以下代码,输出的结果是()
int a = 10, b = 3; printf("%d", a / b);
A. 3.33
B. 3
C. 3.00
D. 4
解析:两个整数相除,结果仍为整数,10/3=3,小数部分被截断。
基础题9:sqrt()函数的作用是()
A. 求绝对值
B. 求平方根
C. 求幂
D. 向上取整
解析:sqrt()是求平方根的数学函数。
基础题10:以下代码,输出的结果是()
float f = 3.14; printf("%.1f", f);
A. 3
B. 3.1
C. 3.14
D. 3.140
解析:%.1f表示输出浮点数时保留1位小数,3.14四舍五入后输出3.1。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 选择结构程序设计

  • 关系运算符与表达式:
      1. 关系运算符:>(大于)<(小于)>=(大于等于)<=(小于等于)==(等于)!=(不等于)
      2. 运算结果:关系成立为真(1),关系不成立为假(0)
  • 逻辑运算符与表达式:
      1. 逻辑运算符:&&(逻辑与)||(逻辑或)!(逻辑非)
      2. 运算规则:&&两者都为真才为真,||有一个为真就为真,!真变假、假变真
  • if语句的三种形式:
      1. 单分支:if(表达式) 语句;
      2. 双分支:if(表达式) 语句1; else 语句2;
      3. 多分支:if(表达式1) 语句1; else if(表达式2) 语句2; ... else 语句n;
  • 条件运算符(三目运算符):表达式1 ? 表达式2 : 表达式3;条件为真执行表达式2,否则执行表达式3
  • switch语句:用于多分支选择,常用于等值判断
      语法:switch(表达式) { case 常量1: 语句1; break; ... default: 语句n; }
  • 选择结构的应用场景:根据条件判断选择不同的执行路径

案例1:判断奇偶数

#include <stdio.h> int main(void) { int num; printf("请输入一个整数:"); scanf("%d", &num); if (num % 2 == 0) { printf("%d 是偶数\n", num); } else { printf("%d 是奇数\n", num); } return 0; }
运行示例:
请输入一个整数:7
7 是奇数
该程序使用if-else双分支结构,通过num % 2 == 0判断是否为偶数。如果余数为0则是偶数,否则是奇数。这是选择结构的典型应用。

案例2:成绩等级评定

#include <stdio.h> int main(void) { 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; }
运行示例:
请输入成绩:85
良好
该程序使用if-else if多分支结构,根据成绩的不同范围输出对应的等级。判断顺序从高到低,一旦满足某个条件就执行对应语句并结束判断。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:关系运算符中,表示"等于"的是()
A. =
B. ==
C. ===
D. =
解析:C语言中,==是关系运算符,用于判断相等;=是赋值运算符。
基础题2:逻辑运算符&&(逻辑与)的运算规则是()
A. 两者都为真,结果为真
B. 有一个为真,结果为真
C. 两者都为假,结果为真
D. 真变假,假变真
解析:&&(逻辑与)要求两个条件都为真时,结果才为真,否则为假。
基础题3:以下代码,输出的结果是()
int a = 5, b = 3; printf("%d", a > b);
A. 5
B. 3
C. 1
D. 0
解析:a > b(5 > 3)成立,关系表达式结果为真(1)。
基础题4:if语句中,如果条件表达式为假(0),则执行()
A. if后的语句
B. else后的语句
C. 所有语句
D. 不执行任何语句
解析:if-else双分支结构中,if条件为假时,执行else后的语句。
基础题5:判断一个数是否为偶数的表达式是()
A. num % 2 == 1
B. num % 2 == 0
C. num / 2 == 0
D. num == 2
解析:num % 2 == 0表示num除以2的余数为0,即num是偶数。
基础题6:逻辑运算符||(逻辑或)的运算规则是()
A. 两者都为真,结果为真
B. 有一个为真,结果为真
C. 两者都为假,结果为真
D. 真变假,假变真
解析:||(逻辑或)要求至少有一个条件为真时,结果就为真。
基础题7:三目运算符的语法是()
A. 表达式1 ? 表达式2 : 表达式3
B. 表达式1 : 表达式2 ? 表达式3
C. 表达式1 表达式2 ? 表达式3
D. ? 表达式1 : 表达式2 表达式3
解析:三目运算符的语法是:条件表达式 ? 表达式1 : 表达式2
基础题8:以下代码,输出的结果是()
int a = 1, b = 0; printf("%d", a && b);
A. 1
B. 0
C. true
D. false
解析:a && b = 1 && 0 = 0,逻辑与运算,有一个为假结果就为假。
基础题9:switch语句中,每个case后面可以跟()
A. 变量
B. 常量表达式
C. 表达式
D. 字符串
解析:switch语句的case后面必须跟常量或常量表达式。
基础题10:逻辑非运算符!的作用是()
A. 真变真,假变假
B. 真变假,假变真
C. 真变1,假变0
D. 真变0,假变1
解析:!(逻辑非)是真变假、假变真,取反操作。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 循环结构程序设计

  • while循环(当型循环):
      语法:while(表达式) { 循环体语句; }
      特点:先判断表达式,如果为真则执行循环体,否则退出循环
  • do-while循环(直到型循环):
      语法:do { 循环体语句; } while(表达式);
      特点:先执行一次循环体,再判断表达式,至少执行一次
  • for循环(计数循环):
      语法:for(表达式1; 表达式2; 表达式3) { 循环体语句; }
      特点:表达式1初始化,表达式2判断条件,表达式3更新循环变量
  • break语句:跳出当前所在的循环或switch语句
  • continue语句:结束本次循环,直接进入下一次循环
  • 循环嵌套:在一个循环体内包含另一个完整的循环结构
  • 循环的应用场景:重复执行相同或类似的操作,如遍历数组、累加求和等

案例1:计算1到100的和

#include <stdio.h> int main(void) { int i, sum = 0; // 使用for循环计算1到100的和 for (i = 1; i <= 100; i++) { sum += i; } printf("1到100的和是:%d\n", sum); return 0; }
运行结果:
1到100的和是:5050
该程序使用for循环实现累加求和。i从1开始,每次循环i自增1,直到i>100时退出循环。sum += i等价于sum = sum + i,实现累加。这是循环结构的经典应用。

案例2:九九乘法表

#include <stdio.h> int main(void) { int i, j; // 使用双重循环输出九九乘法表 for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%-2d ", j, i, i * j); } printf("\n"); } return 0; }
运行结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...(共9行)
该程序使用双重循环实现九九乘法表。外层循环控制行数(1-9),内层循环控制每行的列数(1-i)。%-2d表示左对齐,宽度为2,保证输出整齐。循环嵌套是处理二维问题的常用方法。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:while循环的特点是()
A. 先执行循环体,再判断条件
B. 先判断条件,再执行循环体
C. 至少执行一次循环体
D. 不能使用break语句
解析:while循环是当型循环,先判断条件,如果为真则执行循环体。
基础题2:for循环的三个表达式中,执行顺序是()
A. 1→2→3→2→3...
B. 2→1→3→2→3...
C. 1→3→2→1→3...
D. 2→3→1→2→3...
解析:for循环执行顺序:表达式1(初始化)→ 表达式2(判断)→ 循环体 → 表达式3(更新)→ 表达式2...
基础题3:do-while循环的特点是()
A. 先判断条件,再执行循环体
B. 至少执行一次循环体
C. 不会进入死循环
D. 不能使用continue语句
解析:do-while循环是直到型循环,先执行一次循环体,再判断条件,至少执行一次。
基础题4:break语句的作用是()
A. 结束本次循环
B. 跳出当前循环
C. 结束程序
D. 跳出函数
解析:break语句用于跳出当前所在的循环或switch语句。
基础题5:以下代码,循环执行()次
int i; for (i = 1; i <= 5; i++) printf("*");
A. 4
B. 5
C. 6
D. 无限
解析:i从1开始,每次i++,直到i=6时i<=5为假退出循环,循环执行5次。
基础题6:continue语句的作用是()
A. 跳出当前循环
B. 结束本次循环,进入下一次
C. 结束程序
D. 跳出switch
解析:continue语句用于结束本次循环,直接进入下一次循环。
基础题7:以下代码,输出的结果是()
int i; for (i = 0; i < 3; i++) printf("%d", i);
A. 012
B. 0123
C. 123
D. 0 1 2
解析:i从0开始,输出0,i++后i=1,输出1,i++后i=2,输出2,i++后i=3,退出循环。
基础题8:以下代码,循环执行()次
int i = 5; while (i > 0) { i--; }
A. 4
B. 5
C. 6
D. 无限
解析:i从5开始,每次i--,当i=0时i>0为假退出循环,循环执行5次。
基础题9:以下代码,输出的结果是()
int i, sum = 0; for (i = 1; i <= 3; i++) sum += i; printf("%d", sum);
A. 3
B. 6
C. 7
D. 10
解析:sum=0+1=1, sum=1+2=3, sum=3+3=6,输出6。
基础题10:以下代码,输出的结果是()
int i; for (i = 1; i <= 5; i++) { if (i == 3) continue; printf("%d", i); }
A. 12345
B. 1245
C. 345
D. 12
解析:i=3时执行continue,跳过输出3,输出1245。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 数组

  • 数组的概念:数组是具有相同数据类型的有序集合,占用连续的内存空间
  • 一维数组的定义与初始化:
      定义:类型 数组名[长度];
      初始化:int arr[5] = {1, 2, 3, 4, 5};
      部分初始化:int arr[5] = {1, 2}(其余元素为0)
  • 数组元素的引用:通过下标访问,下标从0开始,到长度-1结束
      格式:数组名[下标]
  • 二维数组的定义与初始化:
      定义:类型 数组名[行数][列数];
      初始化:int arr[2][3] = {{1,2,3}, {4,5,6}}
  • 字符数组与字符串:
      字符数组:char str[10] = {'H','e','l','l','o','\0'};
      字符串:char str[10] = "Hello"(自动添加'\0'结束符)
  • 数组的常用操作:遍历、查找、排序、求最大最小值等
  • 数组的内存布局:数组在内存中连续存储,数组名代表数组首地址

案例1:求数组中的最大值

#include <stdio.h> int main(void) { int arr[5] = {10, 20, 30, 40, 50}; int i, max; max = arr[0]; // 假设第一个元素为最大值 for (i = 1; i < 5; i++) { if (arr[i] > max) { max = arr[i]; } } printf("数组中的最大值是:%d\n", max); return 0; }
运行结果:
数组中的最大值是:50
该程序通过遍历数组查找最大值。首先假设第一个元素为最大值,然后逐个比较其他元素,如果发现更大的值就更新max。这是数组遍历和查找的典型应用。

案例2:冒泡排序

#include <stdio.h> int main(void) { int arr[5] = {5, 3, 8, 1, 2}; int i, j, temp; // 冒泡排序(升序) for (i = 0; i < 5 - 1; i++) { for (j = 0; j < 5 - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 交换相邻元素 temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } printf("排序后的数组:"); for (i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
运行结果:
排序后的数组:1 2 3 5 8
该程序实现冒泡排序算法。双重循环遍历数组,比较相邻元素,如果前一个元素大于后一个元素则交换。经过多轮循环后,数组按升序排列。冒泡排序是数组排序的经典算法。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:数组下标从()开始
A. 1
B. 0
C. -1
D. 任意
解析:C语言数组下标从0开始,到长度-1结束。
基础题2:定义一个包含5个元素的整型数组,正确的是()
A. int arr(5);
B. int arr[5];
C. int arr{5};
D. arr[5];
解析:C语言数组定义语法:类型 数组名[长度];
基础题3:以下代码,输出的结果是()
int arr[3] = {1, 2, 3}; printf("%d", arr[1]);
A. 1
B. 2
C. 3
D. 0
解析:arr[1]表示数组的第二个元素,值为2。
基础题4:字符串结束标志是()
A. \n
B. \t
C. \0
D. \\
解析:\0(空字符)是字符串的结束标志。
基础题5:以下代码,输出的结果是()
int arr[3] = {1, 2, 3}; printf("%d", sizeof(arr));
A. 3
B. 6
C. 12
D. 24
解析:sizeof(arr)计算数组占用的字节数,3个int型元素,每个4字节,共12字节。
基础题6:以下代码,输出的结果是()
char str[] = "Hello"; printf("%d", strlen(str));
A. 4
B. 5
C. 6
D. 10
解析:strlen函数计算字符串长度(不含\0),"Hello"长度为5。
基础题7:以下二维数组定义,正确的是()
A. int arr[2,3];
B. int arr[2][3];
C. int arr(2)(3);
D. int arr{2}{3};
解析:C语言二维数组定义语法:类型 数组名[行数][列数];
基础题8:以下代码,输出的结果是()
int arr[2][2] = {{1,2},{3,4}}; printf("%d", arr[1][0]);
A. 1
B. 2
C. 3
D. 4
解析:arr[1][0]表示第2行第1列元素,值为3。
基础题9:以下数组初始化,未初始化的元素值是()
int arr[5] = {1, 2};
A. 随机值
B. 0
C. -1
D. 空格
解析:数组部分初始化时,未初始化的元素自动初始化为0。
基础题10:以下代码,输出的结果是()
char str[10] = "Hi"; printf("%s", str);
A. Hi
B. Hi\0
C. Hi0
D. Hi
解析:%s输出字符串,遇到\0结束,输出"Hi"。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 函数

  • 函数的概念:函数是完成特定功能的独立代码块,实现代码的模块化和复用
  • 函数的定义:
      语法:返回类型 函数名(参数列表) { 函数体; return 返回值; }
      示例:int add(int a, int b) { return a + b; }
  • 函数的声明:
      语法:返回类型 函数名(参数列表);
      作用:告诉编译器函数的存在,一般在main函数之前
  • 函数的调用:函数名(实参列表);
      传参方式:值传递(复制实参的值给形参)
  • 函数的返回值:
      通过return语句返回
      返回类型为void时不需要return语句
  • 函数的分类:
      1. 标准库函数:printf、scanf等
      2. 自定义函数:用户自己定义的函数
  • 局部变量与全局变量:
      局部变量:在函数内定义,仅在该函数内有效
      全局变量:在函数外定义,整个程序都有效
  • 递归函数:函数直接或间接调用自己

案例1:求两个数的最大值

#include <stdio.h> // 函数声明 int max(int a, int b); int main(void) { int x = 10, y = 20, result; // 函数调用 result = max(x, y); printf("%d 和 %d 的最大值是:%d\n", x, y, result); return 0; } // 函数定义 int max(int a, int b) { if (a > b) { return a; } else { return b; } }
运行结果:
10 和 20 的最大值是:20
该程序定义了一个max函数,用于求两个数的最大值。函数的参数是值传递,a和b是形参,接收实参x和y的值。函数返回较大值。这是自定义函数的典型应用,体现了代码的模块化和复用。

案例2:计算阶乘(递归)

#include <stdio.h> // 函数声明 long factorial(int n); int main(void) { int num = 5; long result; result = factorial(num); printf("%d 的阶乘是:%ld\n", num, result); return 0; } // 递归函数:计算阶乘 long factorial(int n) { if (n == 0 || n == 1) { return 1; // 递归终止条件 } else { return n * factorial(n - 1); // 递归调用 } }
运行结果:
5 的阶乘是:120
该程序使用递归函数计算阶乘。递归函数的特点是函数调用自己。递归必须有两个要素:递归终止条件(n==0或1时返回1)和递归调用(n * factorial(n-1))。递归是解决复杂问题的重要方法,但要注意递归深度和效率。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:C语言中,程序执行的入口是()
A. 第一个函数
B. main函数
C. 自定义函数
D. 标准库函数
解析:C语言程序的执行入口是main函数。
基础题2:以下函数定义,正确的是()
A. int add(a, b) { return a + b; }
B. int add(int a, int b) { return a + b; }
C. int add(int a, b) { return a + b; }
D. int add() { return a + b; }
解析:函数定义必须指定每个参数的类型,正确格式:返回类型 函数名(参数列表) { 函数体 }
基础题3:函数的返回值类型为void时,表示()
A. 返回值为0
B. 返回值为空
C. 不返回任何值
D. 返回值为随机
解析:void表示空类型,函数不返回任何值。
基础题4:函数的参数传递方式是()
A. 地址传递
B. 值传递
C. 引用传递
D. 指针传递
解析:C语言函数参数默认采用值传递,将实参的值复制给形参。
基础题5:以下代码,输出的结果是()
int add(int a, int b) { return a + b; } int main() { printf("%d", add(3, 5)); }
A. 3
B. 5
C. 8
D. 0
解析:add(3, 5)返回3+5=8,输出8。
基础题6:局部变量的作用域是()
A. 整个程序
B. 定义它的函数内
C. main函数内
D. 所有函数内
解析:局部变量在函数内定义,作用域仅限于该函数内部。
基础题7:递归函数必须包含()
A. 循环语句
B. 递归终止条件
C. 全局变量
D. 多个返回值
解析:递归函数必须包含递归终止条件,否则会无限递归导致栈溢出。
基础题8:全局变量的定义位置是()
A. main函数内
B. 自定义函数内
C. 所有函数外
D. 预处理命令后
解析:全局变量在所有函数外定义,作用域为整个程序。
基础题9:以下代码,输出的结果是()
void fun() { printf("Hello"); } int main() { fun(); fun(); }
A. Hello
B. HelloHello
C. Hello Hello
D. 错误
解析:fun函数被调用两次,输出两次"Hello",即"HelloHello"。
基础题10:函数声明的作用是()
A. 定义函数
B. 告诉编译器函数的存在
C. 调用函数
D. 返回函数值
解析:函数声明(函数原型)告诉编译器函数的名称、参数类型和返回类型,一般在main函数之前声明。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200


❄ 文件操作

  • 文件的概念:文件是存储在磁盘上的数据集合,用于长期保存数据
  • 文件类型:
      1. 文本文件:以字符形式存储,如.txt
      2. 二进制文件:以二进制形式存储,如.exe、.mp3
  • 文件指针:FILE *指针,用于标识和操作文件
      定义:FILE *fp;
  • 文件打开:fopen函数
      语法:fp = fopen("文件名", "打开方式");
      打开方式:r(只读)、w(只写,覆盖)、a(追加,不覆盖)
      注意:打开失败返回NULL
  • 文件关闭:fclose函数
      语法:fclose(fp);
      作用:释放资源,保存数据
  • 文件的读写操作:
      1. fgetc/fputc:读写单个字符
      2. fgets/fputs:读写字符串
      3. fscanf/fprintf:格式化读写
      4. fread/fwrite:二进制读写
  • 文件位置指针:ftell获取位置,fseek移动位置,rewind回到开头
  • 文件结束检测:feof函数检测是否到达文件末尾

案例1:写入文件

#include <stdio.h> int main(void) { FILE *fp; char str[] = "Hello, World!"; // 以写入方式打开文件 fp = fopen("test.txt", "w"); if (fp == NULL) { printf("文件打开失败!\n"); return 1; } // 写入字符串到文件 fputs(str, fp); // 关闭文件 fclose(fp); printf("写入成功!\n"); return 0; }
运行结果:
写入成功!
(文件test.txt内容:Hello, World!)
该程序演示了文件的写入操作。首先使用fopen以写入方式("w")打开文件,如果文件不存在会创建新文件,如果文件存在会清空内容。使用fputs将字符串写入文件,最后使用fclose关闭文件。文件操作是程序持久化数据的重要手段。

案例2:读取文件

#include <stdio.h> int main(void) { FILE *fp; char ch; // 以只读方式打开文件 fp = fopen("test.txt", "r"); if (fp == NULL) { printf("文件打开失败!\n"); return 1; } printf("文件内容:"); // 逐个字符读取文件内容 while ((ch = fgetc(fp)) != EOF) { printf("%c", ch); } // 关闭文件 fclose(fp); printf("\n读取完成!\n"); return 0; }
运行结果:
文件内容:Hello, World!
读取完成!
该程序演示了文件的读取操作。使用fopen以只读方式("r")打开文件,使用fgetc逐个字符读取,直到遇到EOF(文件结束标志)为止。最后使用fclose关闭文件。文件读取是获取持久化数据的重要操作。
计时:00:00
当前得分:0

基础题测试(每题10分,满分100分)

基础题1:以只读方式打开文件的打开方式是()
A. "r"
B. "w"
C. "a"
D. "rw"
解析:"r"表示以只读方式打开文件。
基础题2:文件指针的类型是()
A. int *
B. char *
C. FILE *
D. void *
解析:FILE *是文件指针类型,用于标识和操作文件。
基础题3:fopen函数打开文件失败时返回()
A. 0
B. 1
C. NULL
D. EOF
解析:fopen函数打开文件失败时返回NULL,成功时返回文件指针。
基础题4:关闭文件的函数是()
A. close()
B. fclose()
C. fclose()
D. closefile()
解析:fclose()用于关闭文件。
基础题5:以追加方式打开文件的打开方式是()
A. "r"
B. "w"
C. "a"
D. "aw"
解析:"a"表示以追加方式打开文件,在文件末尾添加内容。
基础题6:从文件中读取一个字符的函数是()
A. getc()
B. fgetc()
C. getch()
D. getchar()
解析:fgetc()从文件中读取一个字符。
基础题7:向文件写入一个字符串的函数是()
A. puts()
B. fputs()
C. printf()
D. fprintf()
解析:fputs()向文件写入一个字符串。
基础题8:EOF表示()
A. 文件错误
B. 文件结束
C. 文件开始
D. 文件指针
解析:EOF(End Of File)表示文件结束标志。
基础题9:以"w"方式打开文件,如果文件已存在,会()
A. 追加内容
B. 清空文件
C. 报错
D. 不处理
解析:"w"方式打开文件,如果文件存在会清空内容,如果不存在则创建新文件。
基础题10:检测文件是否结束的函数是()
A. feof()
B. ferror()
C. fflush()
D. ftell()
解析:feof()函数检测文件是否结束,返回非零值表示结束。

🔒 进阶测试已锁定

需要基础题测试满分(100分)才能解锁进阶测试

当前得分:0/100

答题结束!

基础题得分:0/100

进阶题得分:0/100

总分:0/200