第二章 顺序结构
【考点1】运算符、表达式、语句:在编程中,表达式是由常量、变量以及运算符联合创建出来的代码片段,后接分号便可构成表达式语句。赋值运算符与运算对象(可能是常量、变量或另一个表达式)联合形成赋值表达式,赋值表达式后接分号则可形成赋值语句。
// 运算对象与运算符组成表达式,表达式由分号完结形成语句
int a = 5; // "5"为常量, "a"为变量, "="为赋值运算符, "a=5"构成了一个表达式, "a=5;"则为一个完整的语句
int b = a + 3; // "a"和"b"都是变量, "="和"+"为运算符, "a+3"构成了一个表达式, "b=a+3;"则为一个完整的语句
【考点2】运算符的优先级和结合顺序:运算符包括一元运算符、二元运算符和三元运算符。基本运算符优先级最高,其次由高到低分别是一元运算符、算术运算符、关系运算符、逻辑运算符(除非逻辑否定运算符)、条件运算符、赋值运算符以及逗号运算符。位运算符位于算术运算符和逻辑运算符之间。大多数运算符的结合顺序为从左到右,但一元运算符、条件运算符和赋值运算符的结合顺序为从右向左。
// 演示运算符的优先级和结合顺序
int c = 2 * 3 + 4; // 由于乘法优先于加法,因此首先进行2*3的运算
int d = 4 > 2 ? 1 : 0; // 因使用三元运算符,如果条件4>2满足,则d赋值为1,否则d赋值为0
【考点3】printf函数:printf函数应用于输出,格式为:printf(输出控制, 输出列表)。输出控制是指格式说明和应原样输出的内容,而输出列表则是需要打印的各项数据。
// 使用printf进行输出
printf("The value of a is: %d\n", a); // %d是输出整数的格式说明符
printf("The value of b is: %d\n", b);
【考点4】printf函数中的格式说明:%d用于打印整型数据,%f用于打印单精度浮点数据,%c用于打印字符,其它还有%o、%x、%u、%e以及%s等用以打印八进制无符号整型、十六进制无符号整型、无符号整型、指数形式的浮点数和字符串。在格式字符前添加一个数字符号可以用来控制打印数据的宽度和小数位数。
// 使用不同的格式说明符
float e = 3.1415; // 声明一个浮点数
printf("The value of e is: %f\n", e); // %f是格式说明符,表示输出单精度实数
printf("The value of e in scientific notation is: %e\n", e); // %e是格式说明符,表示以科学计数法输出单精度实数
【考点5】scanf函数:scanf函数用于获取键盘输入的数据,数据项需要带取址符&,键盘输入多个数据时需要在数据之间放置一个分隔符,如空格、制表符或回车,但不能使用逗号。
// 使用scanf获取输入
int g;
printf("Please enter a value for g: ");
scanf("%d", &g); // 使用格式说明符%d读取整数,并用取地址符&来将结果存储到变量g中
printf("The value of g is: %d\n", g);
【考点6】交换两个变量的值:通过使用一个临时的中间变量,我们可以实现两个变量值的交换。
// 实现两个变量值的交换
int h = 1, i = 2, temp;
temp = h; // 使用temp作为临时中间变量来存储h的值
h = i; // 把i的值赋给h
i = temp; // 把原来h的值赋给i
printf("After swapping, h is: %d, i is: %d\n", h, i);
第三章 选择结构
【考点1】关系运算:C语言中,非零值表示为逻辑真,零则被视为逻辑假。关系运算符有六种:>,>=,<,<=,==,!=,其中前四种的优先级高于后两种。当关系表达式为真时,结果为1,为假时结果为0。值得注意的是,a<b<c 是不合法的表达式,我们需要使用(a<b)&&(b<c)来实现这一逻辑。
int a=5, b=3;
if ((a > b) && (b > 0)) { // 如果a>b且b>0,则打印 "Both conditions are true!"
printf("Both conditions are true!\n");
} else {
printf("One or both conditions are false!\n");
}
【考点2】逻辑运算:逻辑运算符有三种:逻辑与(&&),逻辑或(||),逻辑非(!)。这里需要注意逻辑与和逻辑或的短路特性。例如,在表达式a++||b++中,如果a++的结果非零,那么b++将不会执行。
int a=1, b=1;
if (a++ && b++) { // 如果a为非零时,才会进行b++的运算
printf("Both a and b have been incremented.\na=%d, b=%d\n", a, b);
}
【考点3】if语句:if语句可以单独出现,也可以与else语句一同出现。如果有嵌套的if语句,else总是与离它最近的且没有配对的if匹配。
int a=5, b=3;
if (a > b) { // 如果a>b,则打印 "a is greater than b"
printf("a is greater than b\n");
} else {
printf("a is not greater than b\n");
}
【考点4】条件运算:这是唯一的三目运算符,格式如下:表达式1 ? 表达式2 : 表达式3。当表达式1为真(非零)时,整个表达式的值为表达式2的值;当表达式1为假(零)时,整个表达式的值为表达式3的值。
int a=5, b=3;
int max = a>b ? a : b; // 如果a>b,则max=a,否则max=b
printf("The larger number is %d.\n", max);
【考点5】switch语句:详见教材P33页,注意每段case语句的后面需要跟一个break语句。而且,switch语句后的小括号中的表达式不能是实数,case语句后的表达式不能含有变量。
int day = 5;
switch(day) {
case 1: // 如果day等于1
printf("Monday\n");
break; // 结束switch语句
case 2: // 如果day等于2
printf("Tuesday\n");
break; // 结束switch语句
case 3: // 如果day等于3
printf("Wednesday\n");
break; // 结束switch语句
case 4: // 如果day等于4
printf("Thursday\n");
break; // 结束switch语句
case 5: // 如果day等于5
printf("Friday\n");
break; // 结束switch语句
case 6: // 如果day等于6
printf("Saturday\n");
break; // 结束switch语句
case 7: // 如果day等于7
printf("Sunday\n");
break; // 结束switch语句
default: // 如果day不满足以上条件
printf("Invalid input! Please enter a number between 1 and 7.\n");
break; // 结束switch
}
第四章 循环结构
【考点1】三种循环结构
三种循环结构分别为:while,do-while,for,三种结构的格式及执行顺序详见教材第36、39、40页。注意for循环中的小括号中必须是两个分号;循环一定要有结束条件,否则成了死循环;do-while()循环最后的while();后一定要有分号。
//while
int i = 0;
while (i < 5){
printf("%d ", i);
i++;
}
//do-while
do{
printf("%d ", i);
i--;
}while(i > 0);
//for
for (int j = 0; j < 5; j++){
printf("%d ", j);
}
【考点2】break与continue
break是终止所在整个循环,而continue是提前结束本轮循环。break语句可出现在循环结构与switch语句中,continue只出现在循环结构中。
for (int i = 0; i < 10; i++){
if (i == 5){
break; // 如果 i 是 5,则打破循环
}
printf("%d ", i);
}
for (int i = 0; i < 10; i++){
if(i == 5){
continue; // 如果 i 是 5,跳过
}
printf("%d ", i);
}
【考点3】循环的嵌套
就是循环里面还有循环,计算要一层一层分析,一般只考查两层嵌套,循环嵌套通常是处理二维数组。
for (int i = 0; i < 5; i++){
for (int j = 0; j < 5; j++){
printf("%d %d\n", i, j);
}
}
【考点4】循环结构的复习
循环结构是重点,笔试所占分值一般在13分左右,在上机考试中也是必考点,应用性很强。要求学员重点理解并多加练习,领会掌握
第五章 字符型数据 位运算
【考点1】字符常量:字符常量仅包含一个字符,用单引号表示,并可以用ASCII码表示。例如,'a'的ASCII码是97。
char a = 'a'; //字符常量
printf("The ASCII value of 'a' is: %d\n", a);
【考点2】转义字符:以反斜线开头的特殊字符序列,具有特殊含义,如'\n'表示新的一行,'\t'代表一个制表符。在下例中,我们使用了'\n'来换行,'\t'来制表。
printf("Hello,\nWorld!\tWelcome to C programming.\n");
【考点3】字符型数据和整型数据可以相互转换:例如,将字符'A'加上32,我们会得到字符'a'。还可以使用printf格式化输出中的%d和%c来分别打印字符的ASCII码和字符本身。
char A = 'A', a;
a = A + 32;
printf("%d\n%c\n", A, a);
【考点4】位运算符:位运算符用于对二进制位进行操作。异或运算符的规则:相同为0,不同为1。
int x = 5;
int y = x ^ 1; //异或运算
printf("Original number: %d\nAfter XOR operation: %d\n", x, y);
【考点5】putchar与getchar函数:这两个函数是< stdio.h >头文件中的库函数,可以分别用于输出或输入单个字符。在下例中,我们首先用getchar读取一个字符输入,然后用putchar打印出这个字符。
char ch;
printf("Please input a character: \n");
ch = getchar(); //读取输入的字符
printf("The character you inputted is: ");
putchar(ch); //打印字符
printf("\n");
附:考试真题
1、下列叙述中正确的是( )
A.所谓算法就是计算方法
B.程序可以作为算法的一种描述方法
C.算法设计只需考虑得到计算结果
D.算法设计可以忽略算法的运算时间
[答案] B
[考点] 算法(2)
错误的选项 A 是因为算法并不等于程序,更不等于计算方法。B, C 项错误,是因为设计算法时,并不能只考虑数据结构设计或结果可靠性。算法必须考虑所有数据对象的运算和操作,以及算法的执行控制结构。所有这些选项都没有提到这一点,因此选项 D 正确。
2、下列叙述中正确的是()。
A.算法就是程序
B.设计算法时只需要考虑数据结构的设计
C.设计算法时只需要考虑结果的可靠性
D以上三种说法都不对
【答案】D
【考点】算法(2),程序(6)
【解析】A项错误,算法是指解题方案的准确而完整的描述,算法不等于程序,也不等于计算方法,BC两项错误,设计算法时,不仅要考虑对数据对象的运算和操作,还要考虑算法的控制结构。答案选择D选项。
3、下列叙述中正确的是( )。
A.算法就是程序
B.设计算法时只需要考虑数据结构的设计
C.设计算法时只需要考虑结果的可靠性
D.设计算法时需要同时考虑时间复杂度和空间复杂度
【答案】D
【解析】选项 A 和 B 是错误的,因为算法设计不仅需要考虑数据对象以及其操作,而且还需要考虑算法的控制结构。选项 C 是错误的,因为设计算法时,还要考虑各种因素,包括相应的时间复杂度和空间复杂度。选项 D 正确,因为它是唯一提到所有这些考虑因素的选项。
4、算法的有穷性是指()。
A.算法程序的运行时间是有限的
B.算法程序所处理的数据量是有限的
C.算法程序的长度是有限的
D.算法只能被有限的用户使用
[答案] A
[解析] 正确的选项 A 是因为算法的有穷性确保算法在有限时间内完成运行,而不是无限循环。
5、算法应当具有的特性不包括 ()
A.可行性
B.有穷性
C.确定性
D.美观性
[答案] D
[解析] 选项 D错误,因为美观风格并非算法必要的特性。算法应具有其他特性,例如有穷性、确定性、输入项、输出项和可行性。
6、信息隐蔽的概念与下述哪一种概念直接相关()
A.软件结构定义
B.模块独立性
C.模块类型划分
D.模块耦合度
[答案] B
[解析]选项 B 正确,因为信息隐蔽保证模块的独立性,这样,一个模块中的信息无法被其他不需要这些信息的模块访问。
7、下列各选项中,不属于序言性注释的是( )。
A.程序标题
B.程序设计者
C.主要算法
D.数据状态
[答案] D
[解析] 选项 D 正确,因为数据状态并不属于序言性注释的内容。序言性注释应包括程序标题、程序功能、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期以及修改日期等内容。
8、对建立良好的程序设计风格,下面描述正确的是( )。
A.程序应简单、清晰、可读性好
B.符号名的命名只要符合语法
C.充分考虑程序的执行效率
D.程序的注释可有可无
[答案] A
[解析] 选项 A 正确,因为程序设计的目标应是清晰且可读性好的代码,而不是仅仅遵循语法。此外,注释虽然对读者理解代码有帮助,但并不必要,它并不能取代清晰易读的代码。
9、下列叙述中,不符合良好程序设计风格要求的是()。
A.程序的效率第一,清晰第二
B.程序的可读性好
C.程序中要有必要的注释
D.输入数据前要有提示信息
[答案] A
[解析]选项 A 错误,因为优雅的程序设计应该首先考虑可读性和清晰性,而非执行效率。如果执行效率和可读性有冲突,那么应优先保证可读性。
10、结构化程序所要求的基本结构不包括( )
A.顺序结构
B.GOTO跳转
C.选择 (分支) 结构
D重复 (循环)结构
[答案] B
[解析]选项 B 正确。GOTO跳转并不属于结构化程序设计的基本控制结构。实际上,结构化程序设计强烈反对使用GOTO跳转,因为它可能导致程序逻辑复杂和混乱。结构化程序设计的基本结构应包括顺序、选择、和重复(循环)结构,因此 B 选项正确。