PTA错题集

PTA错题集C语言

一、结构体

1-14、语句int *p; *p=50;执行时,不会有任何错误。 (1分)
我的答案:T 正确答案:F
*p是一个指针变量,需赋值一个可用的地址之后才可这样赋值。

1-16调用strcmp函数比较字符串大小时,通常较长的字符串会较大。 (1分)
我的答案按:T 正确答案:F
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

1-19在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。 (1分)
我的答案:F 正确答案:T

1-20一个结构类型变量所占的内存空间是其各个成员所占内存空间之和。 (1分)
我的答案:F 正确答案:T
结构体大小必须是结构体占用最大字节数成员的整数倍,这样在处理数组时可以保证每一项都边界对齐结构体的每一个成员起始地址必须是自身类型大小的整数倍

1-25假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num=100; 是正确的。 (1分)
我的答案:T 正确答案:F
应该是p->num

1-28If there is declarationint a[] = {2,4,6,8,10}, p= a; a 's value is the first address of the array, then(p++)'s value is 4. (1分)
我的答案:T 正确答案:F
*(p++)先取p值再++,所以它的值是2

1-30关于C语言指针的运算:指针只有加减操作,没有乘除操作。指针可以加常数、减常数;相同类型的指针可以相减,不可以相加。 (2分)
我的答案:F 正确答案:T
两个类型相同的指针相加毫无意义。比如p1和p2都是类型为int的指针,虽然他们指向的内存中保存了两个int数N1和N2,但是这两个数在内存中可能挨着,也可以能间隔很远,甚至有可能是一个地方。假设p1值也就是N1位置起始值为1234,P2为2345,这个时候如果直接相加得到的数据3589有可能已经超出了内存最大值或者指向某个无意义的内存地址,所以指针相加没有意义可言。正确的应该是N1和N2相加才是合理的算数运算。

2-4对于以下结构定义,++p->str中的++加在____。 (2分)
struct {
int len;
char *str;
} *p;
A、指针str上 B、指针p上 C、str指的内容上 D、以上均不是
我的答案:D
->的优先级高于++,等价于++(p->str),++作用在p的成员变量str上

结构体链表

1-1在单向链表中,头指针中存放的是头结点的内容。 (1分)
我的答案:T 正确答案:F
头指针存放的是一个地址,指向下一个元素,而每一个元素才称为节点。

1-2单向链表中的每个结点都需要动态分配内存空间。 (1分)
我的答案:F 正确答案:T
==链表是动态一些数据,不需要预先分配内存空间,在需要的时候动态申请内存。可以根据需要扩大或者缩小。 ==

2-2设有如下定义的链表,则值为7的表达式是()。 (2分)
struct st{
int n;
struct st *next;
} a[3] = {5, &a[1], 7, &a[2], 9, NULL}, *p = &a;
A,p->n
B,(p->n)++
C,(++p)->n
D,p->next->n
我的答案:C 正确答案:D
p是取a的首地址,p->n是结构体中n的值,(p->n)++是取值再将值加一,C答案见上节2-4题解析
2-3在一个以 h 为头的单向链表中,p 指针指向链尾的条件是()。 (2分)
A,p->next=h
B,p->next=NULL
C,p->next->next=h
D,p->.data=-1
我的答案:B 正确答案:A
p 指针指向链尾那么p即为尾指针,循环链中尾指针下一个指向头指针p->next=h。

2-6下列算法创建n个元素的带头单链表typedef struct lnode
{ int data;
struct lnode next;
}lnode,linklist
void create(linklist &head, int n)
{
linklist p; int i;
head=(linklist)malloc(sizeof(lnode));
/此处选项( )/
for(i=n;i>0;i–)
{
p =(linklist)malloc(sizeof(lnode));
scanf(“%d”,&p->data);
/此处选项( )/
/此处选项( )/
}
}
。 (2分)
A,head->next=null
B,p->next=head->next
C,head->next=p
D,替换为错误项
我的答案:A

2-9在一个单链表head中,若要删除指针p所指结点的后继结点,则执行()。 (2分)
A,p=p->next;free§;
B,p->next=p->next->next;free§;
C,q= p->next q->next=p->next; free(q);
D,q=p->next; p->next=q->next; free(q);
我的答案:B 正确答案:D
b用了free§,也就是指针p的空间被清除了,p指向了一个空地址。

2-10完成下列打印带头单链表的各元素的算法()。
typedef struct List
{
int data;
struct List next;
} Node,Link;
void printlk(Link head)
{
Link p=head->next;
while( (1) )
{
printf(“%d\n”,p->data);
(2)
}
}
(2分)
A,p
B,p=p->next
C,p->next=p->next->next;
D, free§;
我的答案:B

2-15若已建立下面的链表结构,指针p、q分别指向图中所示结点,则不能将q所指结点插入到链表末尾的语句是( )。 (1分)
A,q->next=NULL; p=p->next; p->next=q;
B,p=p->next; q->next=p->next;p->next=q;
C,p=p->next; q->next=p; p->next=q;
D,p=(*p).next; (*q).next=(*p).next; (*p).next=q;
我的答案:A
====

1-7c语言源程序是文本文件,目标文件和可执行文件是二进制文件。 (1分)
我的答案:F 正确答案:T
源代码文件
存放程序代码的文件,即我们编辑代码的文件,称为源代码文件。
语言源程序文件的扩展名为“c"。源代码文件是相对目标文件和可执行文件而言的,一般是用高级语言写出来的

1-8对于缓冲文件系统,在进行文件操作时,系统自动为每一个文件分配一块文件内存缓冲区(内存单元)。 (1分)
我的答案:F 正确答案:T
缓冲文件操作系统:系统会自动的在内存区为每一个正在使用的文件开辟一块缓冲区,从此盘向内存读数据时,则一次将一些数据从磁盘文件送内存缓冲区(充满缓冲区),然后再从缓冲区逐个将数送给接收变量(文件描述符);从内存写数据到磁盘文件时,现将数据塞满缓冲区,在一次性将数据从缓冲区送到磁盘文件。非缓冲文件系统:非缓冲文件系统不会自动地设置缓冲区,需要用户根据自己的需要去设置

1-9文件指针指向文件缓冲区中文件数据的存取位置。 (1分)
我的答案:T 正确答案:F

== 文件指针实际上是指向一个结构体类型的指针,包含有诸如:缓冲区的地址在缓冲区中当前存取的字符的位置、对文件是“读”还是“写”、是否出错、是否已经遇到文件结束标志等信息。结构体类型名为FILE,用来定义文件指针==

2-2如果二进制文件a.dat已经存在,现在要求写入全新数据,应以()方式打开。 (2分)
A,“w”
B,“wb”
C,“w+”
D,“wb+”
我的答案:C
应选B,要求写入全新的数据

2-3定义FILE *fp; 则文件指针fp 指向的是()。(2分)
A,文件在磁盘上的读写位置
B,文件在缓冲区上的读写位置
C,整个磁盘文件
D,文件类型结构体
我的答案:D
应选B,详解见本节1-9

2-5直接使文件指针重新定位到文件读写的首地址的函数是() 。 (2分)
A,ftell()函数
B,fseek()函数
C,rewind()函数
D,ferror()函数
我的答案:B
应选C,fseek函数是改变文件位置标记

2-7按存储介质划分,文件可以分为: (2分)
A,记录文件和流式文件
B,普通文件和设备文件
C,文本文件和二进制文件
D,程序文件和数据文件
我的答案:C
按性质和用途分类:系统文件。用户文件。库文件。 按文件的逻辑结构分为:流式文件。记录式文件。 按信息的保存期限分类:临时文件。永久性文件。档案文件。 按文件的物理结构分类:顺序文件。链接文件。索引文件。HASH文件。索引顺序文件。 按文件的存取方式:顺序存取文件。随机存取文件。 UNIX系统中文件分类:普通文件。目录文件。特殊文件。在管理信息系统中,文件的分类:①按文件的用途分类:主文件、处理文件、工作文件、周转文件(存放、其他文件。②按文件的组织方式分类:顺序文件、索引文件、直接存取文件。

2-14若以“a+”方式打开一个已存在的文件,则以下叙述正确的是( )。 (1分)
A,文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可作添加和读操作
B,文件打开时,原有文件内容不被删除,位置指针移到文件开头,可作重写和读操作
C,文件打开时,原有文件内容被删除,只可作写操作
D,以上各种说法都不正确
我的答案:D
a+:以可读写的方式打开文本文件,其他与a一样;文件若存在则从文件尾部以追加的方式开始写,文件原来存在的内容不会清除(除了文件尾标志EOF),若不存在则根据文件名创建新文件并只写打开;

2-16利用函数fseek可实现的操作是( )。 (1分)
A,改变文件指针fp的值
B,文件的顺序读写
C,文件的随机读写
D,以上答案均正确
我的答案:A
D。【解析】本题考查fseek()函数,其功能是:改变文件的位置指针;辅助实现文件的顺序读写;辅助实现文件的随机读写。

3-4对于以下两个程序段,下列叙述正确的是( )。 (1分)
A,在程序段1和程序段2中,语句y = x + 1;的执行条件皆为满足x<1。
B,在程序段1和程序段2中,语句y = x + 1;的执行条件皆为满足x<2。
C,在程序段1中,语句y = x + 2;的执行条件是满足x>=2。
D,在程序段1中,语句y = x + 2;的执行条件是满足x>=1且x<2。
E,在程序段2中,语句y = x + 2;的执行条件是满足x>=2。
F,在程序段2中,语句y = x + 2;的执行条件是满足x>=1且x<2。/ * 程序段1 */
if (x < 2){
if (x < 1){
y = x + 1;
}
}else{
y = x + 2;
}
/ * 程序段2 */
if (x < 2){
if (x < 1){
y = x + 1;
}else{
y = x + 2;
}
}
我的答案:A,D,E

3-5设变量已正确定义,以下()是合法的C语句。 (1分)
A,if ( n <= 10 );
B,switch ( k )
{
case 1: printf(“one”); break;
case 2: printf(“two”); break;
case 1: printf(“one”); break;
default: printf(“zero”); break;
}
C,switch ( k%2 ) {
default: printf(“zero”); break;
case 1: printf(“one”);
case 1+1: printf(“two”);
}
D,n = 10;
switch ( k ) {
case n%3: printf(“one”);
case n%4: printf(“two”);
default: printf(“zero”);
}

4-1只能向指定文件写入一个字符的函数是 ()
我的答案:fputc()
看错题目,应是getc()

4-2判断文件指针是否已经到了文件尾部的函数是 ()
我的答案;feof( )

指针

1-11结构体成员的类型必须是基本数据类型。 (1分)
我的答案:T 正确答案:F
也可以是自定义类型

1-23变量被定义后 , 它的作用域和寿命就被确定了 , 并且不可改变。 (1分)
我的答案:F 正确答案:T
== 被定义后它的作用或者和寿命就被确定了,但也可随时修改其作用或寿命。寿命被确定了就不能修改==

1-26两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。 (1分)
我的答案:F 正确答案:T

2-2设变量定义为 int a[2]={1,3}, p=&a[0]+1;,则p的值是( )。(2分)
A,2
B,3
C,4
D,&a[0]+1
我的答案:A
int a[2]={1,3},p=&a[0]+1首先执行&a[0]+1,既把a[0]的地址加一个sizeof(int)个字节,也就是a[1]所以p=a[1]=3

2-8若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方式是( )。 (2分)
A,p=max;
B,*p=max;
C,p=max(a,b);
D,*p=max(a,b);
我的答案:C
应选D,对函数进行调用(*p)表示对p的内容所指向的那个地址进行取值,即运行函数

2-11若有说明:int n=2,*p=&n,*q=p;则以下非法的赋值语句是 (2分)
A,p=q;
B,*p=*q;
C,n=*q;
D,p=n;
我的答案:C
应选D,整型数据和指针型数据之间不能进行赋值运算。

3-2答案错误 得分: 0 / 1设变量已正确定义,以下()是合法的C语句。 (1分)
A,if ( n <= 10 );
B,switch ( k ) {
case 1: printf(“one”); break;
case 2: printf(“two”); break;
case 1: printf(“one”); break;
default: printf(“zero”); break;
}
C,switch ( k%2 ) {
default: printf(“zero”); break;
case 1: printf(“one”);
case 1+1: printf(“two”);
}
D,n = 10;
switch ( k ) {
case n%3: printf(“one”);
case n%4: printf(“two”);
default: printf(“zero”);
}

3-3判断ch是数字字符的C语言表达式是( ) 。 (1分)
A,‘0’ <= ch <= ‘9’
B,ch >= ‘0’ && ch <= ‘9’
C,ch >= ‘1’ && ch <= ‘10’
D,! (ch < ‘0’ || ch > ‘9’)
正确答案;B,D,

3-5以下程序段( )的功能是求 s=1+2+…+n−1。 (1分)
A,int n = 10, s = 0;
for ( int i = 1; i < n; i++ ) {
s = s + i;
}
B,int n = 10, s = 0;
for ( int i = 1; i < n; ++i ) {
s = s + i;
}
C,int n = 10, s = 0;
for (int i = n-1; i > 0; ++i ) {
s = s + i;
}
D,int n = 10, s = 0;
for ( int i = 1; i <= n-1; ++i ) {
s = s + i;
}
E,int n = 10, s = 0;
for (int i = n-1; i > 0; i-- ) {
s = s + i;
}
正确答案:A,B,D,E

3-7如果变量定义如下,则正确的语句是( )。 (1分
int k, a[10];
A,a[-1] = -1;
B,a[0] = 23;
C,k = 3; a[k - 2] = a[9] + 1;
D,for(k = 1; k <= 10; k++){
printf(“%d ”, a[k]);
}
E,for(k = 0; k < 10; k++){
scanf(“%d ”, &a[k]);
}
正确答案:A,B,E

4-2下面程序可以逐行输出由language数组元素所指向的5个字符串。请填写程序中相应语句。
#include<stdio.h>
int main(void)
{
char *language[] = {“BASIC”, “FORTRAN”, “PROLOG”, “JAVA”, “C++” } ;
char (2分) ;
int k ;
for(k = 0 ; k < 5 ; k++) {
q= ;
printf("%s\n", *q);
}
return 0;
}

4-3若有定义double p;请写出利用malloc函数使p指向一个双精度型的动态存储单元的完整语句为p=(1分)。
== p=(double
*)malloc(sizeof(double))==

4-7C stores lists of values in(1分).
正确答案array

4-8设有定义语句:int a[ ][3]={{0},{1},{2}}; 则数组元素 a[1][2]的值是
应是0或随机值

数组

1-7数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 (2分)
我的答案:T 正确答案:F
array和&array的值是一样的,都是0012FF34。对array+1,结果不是简单的加法那样,即并不是0012FF35,而是0012FF38;由于array[0]和array一样,都是数组首元素的首地址,+1后的结果相同。然而,&array+1的结果却是0012FF48。另外,分别对array和&array求字节长度发现是一样的

1-12一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。类型名 数组名[数组长度];(1分)
我的答案:T 正确答案:F
类型名是整个数组的类型

2-12有两个字符数组a,b,则以下正确的输入语句是() (1分)
A,gets(a,b);
B,scanf("%s%s",a,b);
C,scanf("%s%s",&a,&b);
D,gets(“a”),gets(“b”);
我的答案:C
应选B,&a取的是首地址,并不能将整个字符串全部输出

2-16如果变量定义如下,则正确的语句是( )。 (1分)int i, j, tab[3][4];
A,tab[0][ ] = 0;
B,tab[ ][3] = 3;
C,tab = 100;
D,for(i = 1; i <= 3; i++){
for(j = 1; i <= 4; j++){
scanf(“%d ”, &a[i][j];
}
}
E,for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
printf("%4d", tab[i][j]);
}
printf("\n");
}
正确答案:E
看错题目,数组下标从0开始

3-2在以下描述中,( )是正确的。 (1分)
A,int a[5] = {1, 2, 3, 4, 5};
定义了数组a,并对数组元素赋初值。此时,a[0]为1,a[1]为2,a[2]为3,a[3]为4,a[4]为5。
B,static int b[10];
定义了静态数组b,且10个数组元素的初值都为0。
c,int fib[45] = {1, 1};
定义了数组fib,并对数组 fib 的前2个元素赋初值,其余元素的值都为0。
D,static int week[7] = {1, 2, 3};
定义了静态数组week,并对数组 week 的前3个元素week[0]~week[2]赋初值,week[3]~week[6]值都是不确定的。
我的答案:A,C 正确答案:A,B
C选项其他元素虽未赋初值,但可能是0也可能是随机数

  • 37
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值