PTA-武汉理工大学C理论课学习及答案一
这是一篇武理20级学子写的关于自己学习c理论课的心得之谈。PTA的答案及解析。
第一次在CSDN上写博客(markdown用的不好,排版可能不好看),只是想将这篇文章作为一个学习笔记和实验,分享下。如果有哪里说错了,欢迎指出。
客观题
运算符和表达式
判断
1-1 假设k是整型变量,计算表达式1/k 后结果的数据类型是整型。
T
小数部分会直接被砍掉,可以理解为数学里的取整函数。如
1/3 = 0
1-2 表达式(x == 0)与表达式(!x)等价。
T
结合
if()
函数理解,括号内的判定条件
1-3 表达式 (3<x<5) 的值恒为1。
T
解析:根据C语言运算符顺序,从左向右。
第一步,计算3 < x
结果为 1 或者 0;
再将 1 或 0 与 5 比较。易知结果恒为1;
1-4 字符‘\0’的ASCII码值是0。
T
1-5 C 语言的标识符由字母、数字和其他任意字符组成。
F
百度:C 语言的标识符
1-6 若变量定义为double x;,则x % 2是符合C语言语法的表达式。
F
1-7 若变量定义为int x, y; ,则x + y = 22是符合C语言语法的表达式。
F
1-8 是关系运算符,用于比较两个操作数是否相等;而 = 是赋值运算符,表示对变量赋值。
T
1-9 C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。
T
尤其注意再循环语句中的大括号范围。强烈建议对算法结构不是很清楚的同学再写循环语句时都写大括号,框明范围 。
1-10 C语言中,数字字符’1’的值(ASCII码)就是数字1。
F
在以整形表示的方式下为49;
1-11 C语言中,大写字母’M’的ASCII码值比小写字母 'm’的ASCII码值大。
F
1-12 以下C语言表达式的值为“真”。
'D' - 'A' == 'd' - 'a'
T
1-13 表达式 !x 等价于x != 1。
F
等价于`(x == 0)
1-14 s(s-a)(s-b)(s-c) 是合法的C语言表达式。
F
1-15 表达式 !!6的值是6。
F
值为 1 。C语言运算符顺序
1-16 若表达式sizeof(int)的值为4,则int类型数据可以表示的最大整数为
2
31
−
1
2^{31}-1
231−1
T
4个字节,每字节8位,一共32位。还有一个符号位。
1-17 表达式 (z=0, (x=2)||(z=1),z) 的值是1。
F
值为 0 ;C语言逗号运算符(,)
1-18 与float型数据相比,double型数据的精度高,取值范围大。
T
1-19 语句printf("%.2f",1.0/3);
输出为0.33。
T
选择
2-1 若有:double x,y,a,b; , 与代数式(xy)/(ab)不等价的C语言表达式是( )
A.xy/ab
B.xy/a/b
C.xy/(ab)
D.x/(ab)*y
A
2-2 表达式:(int)((double)7/2)-7%2的值是( )。
A.0
B.2
C.3
D.4
B
2-3 设int x=25,a=1,b=10;,则条件表达式x>2?a+10:b的值是( ) 。
A.1
B.10
C.11
D.25
C
2-4 对于数学表达式 2 x + ( a + b ) ÷ s i n 2 x 2x+(a+b)÷sin^2x 2x+(a+b)÷sin2x,对应的C表达式是( )。
A.2x+(a+b)/sin(x)*sin(x)
B.2*x+(a+b)/sin(x)^2
C.2*x+a+b/(sin(x)*sin(x))
D.2*x+(a+b)/sin(x)/sin(x)
D
2-5 C 语言程序中可以对程序进行注释,注释部分必须用什么符号括起来?
A.{ 和}
B.[和 ]
C.*/ 和 /*
D./* 和 */
D
2-6 逻辑运算符两侧运算对象的数据类型( )。
A.只能是 0 或 1
B.只能是 0 或非 0 正数
C.只能是整型或字符型的数据
D.可以是任何类型的数据
D
2-7 以下标识符中,不合法的是( )。
A.4d
B._8_d
C.Int
D.key
A
解析:标识符不能以数字开头,另外C语言区分大小写,C项 Int 与关键字 int 不同
2-8 若有char w; int x; float y; double z; 则表达式w*x+z-y值的数据类型为( )。
A.float
B.char
C.double
D.int
C
在同一个表达式中,C语言数据类型
double
>float
>int
>char
,即这些数据类型都有时,自动转换为优先级大的数据类型。C语言数据类型转换
2-9 在C语言中,要求运算数必须是整型的运算符是( )。
A.%
B./
C.<
D.!
A
2-10 表达式( )的值是0。
A.3/5
B.3<5
C.3%5
D.3/5.0
A
2-11 已知字母’A’的ASCII码为十进制数65,且ch为字符型变量,则执行语句ch=‘A’+‘7’-‘3’;后,ch的ASCII值为( )。
A.68
B.‘E’
C.‘D’
D.69
D
解析:题目所问是
ch
的ASCII值,对应的是'A'
的值65,加上字符7与字符3的差值4,结果是69。
2-12 如果变量 x、y 已经正确定义,下列哪个选项的语句不能正确将x、y的值进行交换?
A.t=x, x=y; y=t;
B.x=x+y, y=x-y, x=x-y;
C.x=t, t=y, y=x;
D.t=y, y=x, x=t;
C
2-13 若int w=4,x=3,y=2,z=1;,则条件表达w>x?w:y>z?y:z的值是( ) 。
A.4
B.3
C.2
D.1
A
解析:转换有
int p; //将要被赋值的变量
if(w > x){
p = w;
}
else{
if(y > z){
p = y;
}
else{
p = z;
}
}
2-14 设 int a=2, b=0, c=-1;,则表达式 a < b || b < c && b 的值是( )
A.-1
B.0
C.1
D.2
B
解析:从左至右耐心计算
2-15 设:int a=4, b=3, c=2, d=1, m=1, n=3;,执行 ( m=a>b>c) && (n=c>d) 后 n 的值为( )
A.1
B.2
C.3
D.4
C
根据程序运行结果来看
&&
后的语句未能运行
我并不清楚其中的具体原因,出于探究的精神,我增加了变量k;
可以看见 k 值为 0,那么有可能是对于&&
运算符来说当前一个表达式为 0 时就结束不判断后一个表达式了呢?
将程序稍微改一下;
根据图片很容易得到结论,猜想成立。
对于&&
运算符来说,当前一个表达式为 0 时就结束不判断后一个表达式。
2-16
1.选择结构
判断
1-1 在 if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。
T
补充:if语句的三种形式
- if
if(判断条件)
{为真时执行语句1;语句2;…}//单条语句可以不用花括弧
- if-else
if(判断条件)
{同上}//单条语句可以不用花括弧
else
{同上}//同上
- if-else if
if(判断条件)
{同上}
else if (条件1){}
else if (条件2){}
…
else (条件n){}
1-2 在switch语句中,每一个的case常量表达式的值可以相同。
F
解析:switch相当于是跳转。类比函数,一个自变量x只能对应一个y。case中的语句相当于是完成跳转的条件,若case(盒子)出现相同值则会出现同时两个盒子中的东西都放出。
实际上,在vscode中会直接报错。(转载) switch语句的具体用法 (转载)
1-3 case语句后如没有break,顺序向下执行。
T
1-4 执行以下程序段后,y的值为-1。
x = 4;
if (x < 0){
y = -1;
}else if (x = 0){
y = 0;
}else{
y = 1;}
F
解析:最后的值是y=1
1-5 在switch语句中,不一定使用break语句。
T
解析:不使用break只会使程序不会跳出,参见switch语句的具体用法
1-6 省略else的if语句的一般形式如下,若表达式的值为“真”,则执行语句1;否则,就什么也不做。
if (表达式)
语句1
T
1-7 如果变量已经正确定义,则执行以下程序段后,x的值不变。
x = 4;
if (x < 0){
y = -1;
}else if (x = 0){
y = 0;
}else{
y = 1;}
F
解析:结果是x=0在第4行代码中已给x赋值
1-8 在switch语句中,必须使用default。
F
解析:不用default只会使得额外的值不能被显出(没有任何反应)
1-9 设变量已正确定义,以下是合法的switch语句。
switch(choice){
case choice == 1: price = 3.0; break;
case choice == 2: price = 2.5; break;
case choice == 3: price = 4.0; break;
case choice == 4: price = 3.5; break;
default: price = 0.0; break;
}
F
解析:case中的变量值只能是整数常量值,不能有多余的符号。
选择
2-1 如果要表示a 等于 0 时执行 if ( )后的语句,则在if后一对括号中的表达式不能写为( )
C解析(转载)
2-2 当a=5,b=8,c=6,d=4,x=0 时,执行完下面一段程序后x的值是( )
if(a<b)
if(c<d) x=1;
else if(a<c)
if(b<d) x=2;
else x=3;
else x=6;
else x=7;
用缩进整理一下:
if(a<b)
if(c<d)
x=1;
else if(a<c)
if(b<d)
x=2;
else x=3;
else x=6;
else x=7;
C
解析:得到x=3
2-3 对下面的程序,以下正确的判断是( )
A
解析:第六行分句后else无if匹配。C语言if else语句详解
2-4 在嵌套使用if语句时,C语言规定else总是( )
B
解析:与上题相同
2-5 在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是()
int main(void)
{ int a,b,s,t;
scanf("%d,%d",&a,&b);
s = 1; t = 1;
if(a > 0) s = s + 1;
if(a > b) t = s + t;
else if(a == b) t = 5;
else t = 2 * s;
printf("t=%d\n",t);
return 0;}
C
解析:逆推可得
2-6 能正确表示逻辑关系"a≥10 或 a≤0"的C语言表达式是()
D
运算符 | 说明 | 结合性 | 举例 |
---|---|---|---|
&& | 与运算,双目,对应数学中的“且” | 左结合 | 1&&0、(9>3)&&(b>a) |
|| | 或运算,双目,对应数学中的“或” | 左结合 | 1||0、(9>3)||(b>a) |
! | 非运算,单目,对应数学中的“非” | 右结合 | !a、!(2<5) |
2-7 下列条件语句中,功能与其他语句不同的是
D 解析:前三个的语义是若变量a为真(这里可以结合bool类型理解;1即使真,0是假),输出x;反之输出y。
2-8 若a、b、c1、c2、x、y均是整型变量,以下正确的switch语句是
D
解析:A.switch后多了个;;
B.标签重复,break未作为单独语句使用;
C.case标签后必须是常量
2-9 有定义语句“int a=1,b=2,c=3,x;”,则以下各程序段执行后,x的值不为3的是
C
解析:特别注意B项,当在if中的条件成立后后面的else和else if语句都不执行
2-10 语句if(x=0) y=1; else y=2;与( )等价。
B
解析:题中语句是把x赋值为0再判断,这个if永远不会成立
2-11 设变量已正确定义,以下( )与其它switch语句不等价。
C
解析:题中只提已定义,当出现case之外的情况时,C项变量会被赋予随机值。
2-12 设变量已正确定义,以下( )与其它switch语句不等价。
D
2-13 已知int x=10,y=20,z=30;以下语句:if(x<y) z=x; x=y; y=z;执行后x,y,z的值是( )。
C
2-14 将以下if-else语句补充完整,正确的选项是( )。
if(x >= y){
printf("max = %d\n", x);
____________
printf("max = %d\n", y);}
C 原因见补充
2.循环结构
判断
1-1 在多层循环中, 一个break语句只向外跳一层。
T
1-2 for语句的一般形式如下,其中的表达式1只执行一次。
for (表达式1; 表达式2; 表达式3)
循环体语句
T
1-3 循环体如包括有一个以上的语句,则必须用一对大括号{}括起来,组成复合语句,复合语句在语法上被认为是一条语句。
T
1-4 以下程序段的功能是计算20的阶乘。
int i;
double product;
product = 0;
for (i = 1; i <= 20; i++){
product = product * i;
}
F
解析:变量product最初被赋予的是0,最终结果为0。
1-5若变量已正确定义,以下while循环结束时,i的值为11。
i = 1;
while (i <= 10){
printf("%d\n", i);
}
F
1-6 若变量已正确定义,执行以下while语句将陷入死循环。
i = 1;
while (i <= 10);
i++;
T
解析:当i大于10时跳出循环。但当while()后有分号,不能进入i++
补充:a++与++a的区别
a++与++a单独使用时两者无区别,当参与赋值运算时。
在便于理解的要求上我们不妨把上述式子转化一下
b = a++ 即 {c = a,a=a+1,b = c;}
b = ++a 即 {a = a+1,b = a;}
比较上式可以发现在运算a++中实际上先创建了一个副本来储存这个值。深层次原因可以参照C语言中a++与++a的区别
1-7 若变量已正确定义,执行以下程序段,输入负数时,循环结束。
total = 0;
scanf ("%d", &score);
while(score >= 0){
total = total + score;
scanf ("%d", &score);
}
F
解析:个人认为这是个文字游戏,输入负数时不能进入循环,故没有循环结束的说法。(真是无聊。。。)
1-8 do - while语句的一般形式如下,其中的循环体语句至少执行一次。
T
1-9 while语句和do - while语句的一般形式分别如下,其主要区别是:while 语句先判断循环条件,只有条件满足才进入循环,如果一开始条件就不满足,则循环一次都不执行。而do - while语句先执行循环体,后判断循环条件,所以无论循环条件的值如何,至少会执行一次循环体。
T
1-10 以下两个程序段等价,其功能是计算 s=1+2+…+10。
/* 程序段A*/
s = 0;
i = 1;
while(i <= 10){
s = s + i;
i++;
}
/* 程序段B */
s = 0;
i = 1;
while(1){
if(i > 10){
break;}
s = s + i;
i++;
}
F
解析:简要的说吧,break只能跳出一层循环
1-11 在循环中使用break语句或者continue语句,其作用是相同的。
F
C语言break和continue的区别
1-12 执行以下while语句,将出现死循环。
s = 0;
i = 1;
while(1){
if(i > 10){
continue;
}
s = s + i;
i++;}
T
解析:当i大于10后会在if语句中不断循环
1-13 在嵌套循环(多层循环)中, 每一层循环都应该使用自己的循环变量,以免互相干扰。
F
个人认为视实际情况而定
选择
2-1 执行while语句时,要想执行循环体的语句,则括号中表达式要满足的条件是?( )
C
解析:计算机内部运行二进制,只有0与1,而while执行判断式非0时的语句,如 ‘5’,在二进制表示为101,故执行;另,负数也可执行,负数实际是可以理解为一个带符号位的正整数(在int范围内),其在二进制中的表达也不为0,故执行while中的语句。
2-2 下列程序段执行后s的值为( )。
D
解析:a++与++a的区别
与上题相似,主要靠循环判断的问题当while中的语句为0时结束循环当if中的语句为 “0” 时执行else,反之执行if。
2-3 设有程序段
int m=0;
while (m=1)
m=0;
则下面描述中正确的是( )。
B(无限循环)
解析:赋值语句表达式为1,为真,在while中的表达式判断恒为真,循环体一直执行,是死循环。
2-4 以下描述中错误的是( ) 。
A.在do-while循环中,是先执行循环体,再进行判断
B.do-while的循环体可以是复合语句
C.do-while的循环体执行次数不可能为0
D.do-while由do开始,用while结束,在while(表达式)后面不能写分号
D
语法规范,= =
2-5 下面程序的功能是在输入的一批正数中求最大者,输入0结束循环。则在下划线处应填写的语句是()。
C
2-6 若程序执行时的输入数据是3564<回车>,则下述程序的输出结果是( ) 。
D
解析:getchar()详细用法
解这题要先看看ASCII码表,数字的ASCII码是连续的、cs是整形、switch-case 后没有break程序向下执行。
了解以上这几点后这题的答案就很容易得出了。
2-7 若变量已正确定义,要求程序段完成求n!的计算,不能 完成此操作的程序段是哪一个?( )
A.
for(i=1,p=1;i<=n;i++)
p*=i;
B.
for(i=1;i<=n;i++)
{ p=1; p*=i; }
C.
i=1;
p=1;
while(i<=n)
{ p*=i; i++; }
D.
i=1;
p=1;
do{
p*=i; i++;
} while(i<=n);
B
解析:B项中每一次循环都对 p 赋初始值 1。故不能达到计算 n!的效果。
2-8 若int i,j;
,则for(i=j=0; i<10||j<8; i+=2,j++)
控制的循环体的执行次数是( )8
A
2-9 以下程序段的循环次数是( )
A
2-10 语句for (表达式1; ; 表达式3)等价于?( )
A.for ( 表达式1; !0 ; 表达式3 )
B.for ( 表达式1; 0 ; 表达式3 )
C.for ( 表达式1; 表达式1; 表达式3 )
D.for ( 表达式1; 表达式3; 表达式3 )
A
解析:先上图
空了中间的表达式后,判断恒真,是死循环
2-11 以下不会构成死循环的语句或语句组是( )
A.n=0; do {++n;} while(n=1);
B.n=5; while(n>0);{n- -;}
C.n=0; while(n){n++;}
D.for(n=0,i=1; i<5;n++) n+=i;
D
解析:A、在做一次++n后,while给n再赋值为1;而赋值语句为真;故为死循环。
B、while后有分号,判断n>0后未能执行到n- -;而是一直判断;
C、不会进循环
2-12 下面程序段执行后,n的值是( )。
D(5)
解析:提示当i不为2的倍数时n只加一次(只运行一次n++)if(i%2) continue;会使跳过do——while中的n++。
2-13 有整型变量a和b,若运行以下程序段时从键盘输入:16,10<回车>,循环结束时变量a、b的值分别为( )。
C( 2 2 )
解析:可以先写成这样在草稿本上用列表的方法来计算,当a==b时退出。实际上这个算法稍加改进就可以得到更相减损术,不过在求最大公约数方面也还是没有辗转相除法高效就是了=.=。
2-14 下面的这个循环的循环次数是( )。
for(int i=0,j=10; i=j=10; i++,j--)
B(无限次)
中间一句错了。中间一句为赋值后再赋值,由于赋值是一个从右向左的计算故最终结果是
j = 10
,i = 1
。判断恒成立,死循环。
2-15 假设变量s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0),则与以下程序段功能等价的赋值语句是()。
s = a;
for(b = 1; b <= c; b++)
s = s + 1;
B(s = a + c;)
解析:代码为将b分解为一个一个的 1 与a相加。
2-16 循环 for(i=0, j=5; ++i!=–j; ) printf(“%d %d”, i, j); 将执行_____。
D (无限次)
当循环执行三次后将判断 2 与 3 否相等;此后++i将与- -j相差越来越大,是死循环。
2-17 语句for (表达式1; ; 表达式3)等价于?( )
B 同2-10
2-18 下列程序段的功能是
#include <stdio.h>
int main (void)
{
int i, s = 0;
for (i = 1; i < 10; i += 2)
s += i + 1;
printf("%d\n", s);
return 0;
}
D(自然数1~10中的偶数之和)
2-19 以下程序段( )的功能是计算n的阶乘,假设计算结果不超过双精度范围。
A、int i, n;double product;scanf("%d", &n);product = 0;for (i = 1; i <= n; i++){ product = product * i; }
B、int i, n, product;scanf("%d", &n);product = 1;for (i = 1; i <= n; i++){ product = product * i; }
C、int i, n; double product; scanf("%d", &n); for (i = 1; i <= n; i++){ product = product * i; }
D
A、product初始化错误
B、product定义未满足双精度
C、product为初始化,一般编译器初始化为 0
2-20 以下( )循环并非重复5次?
C、int i;for (i=0; i<=5; i++) {}
C
2-21 下列叙述中正确的是()。
A.break 语句只能用于 switch 语句体中
B.continue语句的作用是使程序的执行流程跳出包含它的所有循环
C.break 语句只能用在循环体内和 switch 语句体内
D.在循环体内使用 break语句和 continue 语句的作用相同
C
2-22 运行以下程序后,如果从键盘上输入65 14<回车>,则输出结果为()。
int main(void)
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n);
while (m != n)
{ while (m > n) m = m - n;
while (n > m) n = n - m;
}
printf("m=%d\n",m);
return 0;
}
C(m=1)
同2-13
2-23 若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是
for (i = 5; i; i--)
for (j = 0; j < 4; j++) {...}
A(20)
解析:内层循环次数×内层循环次数
这篇有点长了分到另一篇去。
3.数组与指针等
更多推荐
所有评论(0)