❄ 基本程序结构和设计规范
- 计算机程序的基本概念:由指令组成,实现特定功能的代码集合,是计算机执行任务的依据
- 程序结构、注释、命名规范:
1. 程序结构:清晰分层,逻辑连贯;
2. 注释:单行//、多行/* */,提升代码可读性;
3. 命名规范:由字母/数字/下划线组成,首字符非数字,见名知意,区分大小写 - 三种基本结构流程图:顺序结构、选择结构、循环结构
- C语言程序的核心结构:预处理命令、主函数、执行语句、注释
案例1:C语言程序标准框架
#include <stdio.h>
int main(void)
{
int studentScore = 95;
printf("学生成绩:%d\n", studentScore);
return 0;
}
运行结果:
学生成绩:95
学生成绩: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
圆的半径: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++);
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);
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);
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 是奇数
请输入一个整数: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
良好
请输入成绩: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);
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);
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
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*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("*");
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);
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--; }
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);
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); }
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
数组中的最大值是: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
排序后的数组: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]);
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));
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));
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]);
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};
int arr[5] = {1, 2};
A. 随机值
B. 0
C. -1
D. 空格
解析:数组部分初始化时,未初始化的元素自动初始化为0。
基础题10:以下代码,输出的结果是()
char str[10] = "Hi"; printf("%s", str);
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
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
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)); }
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(); }
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!)
写入成功!
(文件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!
读取完成!
文件内容: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