C语言错题集锦(包括解析)(暂时共26题)

C语言数组错题集锦(包括解析)

填空题:

第1题1-5
对于已正确定义的二维数组a, *(a[i]+j)与a[i][j]的含义相同。 (2分)

答案:T

解析:对于二维数组a来说,a[i]相当与i行0列的地址,即a[i]=&a[i][0],所以a[i]+j=&a[i][j],即*&a[i][j]=a[i][j]。

第2题1-7
数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 (2分)

答案:F

解析:数组名不是一个指针常量。

指针常量——指针类型的常量(int *const p):本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。

扩展:常量指针——指向“常量”的指针(const int *p, int const *p):常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。

第3题1-10
假设有定义如下: int array[10]; 则该语句定义了一个数组array。其中array的类型是整型指针(即: int *)。 (2分)

答案: F

解析:array的类型不是指针而是数组名。

第4题1-12
一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。

类型名 数组名[数组长度];

答案:F

解析:暂时不知道。

选择题:

第5题2-7
假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是__。

A.char s[5]={“ABCDE”}; puts(s);
B.char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; puts(s);
C.char *s; scanf("%s", s); puts(s);
D.char *s; s=“ABCDE”; puts(s);

答案:D

解析:
gets是字符串输出函数,只能输出字符串,所以排除B选项。
A:字符串s定义内存不足,出现乱码,正确的定义为:char s[6]={“ABCDE”};。
C:scanf函数不能用于指针变量的赋值,故C选项错误。
D:D选项为字符串,且符合题意,故选D。

第6题2-14
*二维数组(1-1)
下面的程序段将输出 ▁▁▁▁▁ 。
double a[4][5];
printf("%d\n", sizeof(a));

A.12
B.20
C.96
D.160

答案:D

解析:458=160,4*5为a数组所占空间,而double类型为8个字节,所以a数组所用字节为160字节,故选D选项。

第7题2-17
假定char类型变量占用1个字节,且数组定义如下,则数组tab_str在内存中所占字节数是( )。 (1分)
char tab_str [10][81];

A.810
B.10
C.81
D.0

答案:A

解析:同2-14。

多选题:

第8题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]值都是不确定的。

答案:AB

解析:
A:略
B:用static定义,如果不赋初值,系统会自动赋初值为0。
C:定义了数组fib,并对数组 fib 的前2个元素赋初值为1,系统自动给后面43个元素赋初值为0。实际上int fib[45]前面还有auto,即auto int fib[45],auto可省略。
D:同B选项。

扩展:
局部变量分为自动变量(auto)与静态局部变量(static),自动变量需对前几个元素赋值后,系统才会对后面元素赋值为0,而静态局部变量无需赋值,系统就会自动对后面元素赋值为0。这是整形数组的赋值。
系统对其他类型数组赋的值为:
整形数组:0
字符数组:\0
指针数组:NULL

第9题3-4
选项( )与以下字符数组定义等价。 (1分)
A.static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, ‘\0’};

B.static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’};

C.static char s[6] =“Happy”;

D.static char s[6] ={“Happy”};

E.static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, 0};

解析:A选项s[5]=’\0’与E选项s[5]=0是等价的,不信看这里C语言错题集锦(包括解析)(暂时共26题)_第1张图片
函数题:

第10题6-1
阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include

void Print_Factorial ( const int N );

int main()
{
int N;

scanf("%d", &N);
Print_Factorial(N);
return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:
15
输出样例:
1307674368000

我的代码:
void Print_Factorial ( const int N )
{
int i,add=1;
if(N<0)
{
printf(“Invalid input”);
}
else
{
for(i=1;i<=N;i++)
{
add*=i;
}
printf("%d",add);
}
return 0;
}

第11题6-2
数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a[​0]​​a[​1​​]⋯a​[n−1​​])变换为(a​[n−m​​]⋯a​[n−1]​a[​0]​​a[1​​]⋯a​[n−m−1]​​)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
int ArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例:
#include
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
int a[MAXN], n, m;
int i;

scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

ArrayShift(a, n, m);

for ( i = 0; i < n; i++ ) {
    if (i != 0) printf(" ");
    printf("%d", a[i]);
}
printf("\n");

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4

我的代码:
int ArrayShift( int a[], int n, int m )
{
int i,j,t;
for(i=0;i {
t=a[n-1];
for(j=n-1;j>=1;j–)
{
a[j]=a[j-1];
}
a[0]=t;
}
return 0;
}

第12题6-3
报数
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m( 本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );
其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。
裁判测试程序样例:
#include
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
int out[MAXN], n, m;
int i;

scanf("%d %d", &n, &m);
CountOff( n, m, out ); 
for ( i = 0; i < n; i++ )
    printf("%d ", out[i]);
printf("\n");

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:
11 3
输出样例:
4 10 1 7 5 2 11 9 3 6 8

我的代码:
void CountOff(int n,int m,int out[])
{
int i,j,num=0,count=0;
int a[MAXN];
for(i=0;i {
a[i]=i+1;
}
i=0;
j=0;
while(count {
if(a[i]!=0)
{
num++;
}
if(numm)
{
j++;
out[i]=j;
num=0;
count++;
a[i]=0;
}
i++;
if(i
n)
{
i=0;
}
}
return 0;
}

C语言数组错题集锦(包括解析)

填空题:

第13题1-1
直接访问就是直接利用变量的地址直接进行访问。 (1分)

答案:F

解析:这是间接访问。
间接访问例如:int * a;
a=&x;
直接访问例如:int a;
a=x;

第14题1-16
标准格式输入函数scanf()可以从键盘上接收不同数据类型的数据项。 (1分)

答案:T

解析:例如:
int a;
char b;
scanf("%d %c",&a,&b);

第15题1-25
do-while语句先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。 (1分)

答案:T

解析:略。

选择题:

第16题2-5
以下结构类型可用来构造链表的是()。 (2分)
A.struct aa{ int a;int * b;};
B.struct bb{ int a;bb * b;};
C.struct cc{ int * a;cc b;};
D.struct dd{ int * a;aa b;};

答案:B

解析:暂时不知道。

第17题2-7
在c语言中,不允许有常量的数据类型是( ) (2分)

A.整型
B.结构型
C.字符型
D.字符串

答案:B

解析:略。

第18题2-11
若有说明:int n=2,*p=&n,*q=p;则以下非法的赋值语句是 (2分)

A.p=q;
B.*p=*q;
C.n=*q;
D.p=n;

答案:D

解析:选项D中,p=n显然错误,p为指针变脸,应赋值地址,即p=&n。

多选题:

第19题3-2
设变量已正确定义,以下()是合法的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”);
}

答案:AC

解析:D错误,如图:C语言错题集锦(包括解析)(暂时共26题)_第2张图片
第20题3-3
判断ch是数字字符的C语言表达式是( ) 。 (1分)

A.‘0’ <= ch <= ‘9’

B.ch >= ‘0’ && ch <= ‘9’

C.ch >= ‘1’ && ch <= ‘10’

D.! (ch < ‘0’ || ch > ‘9’)

答案:BD

解析:略。

第21题3-6
关于C语言中的函数,下列说法正确的是 (2分)

A.函数应该以它们调用的顺序来定义。
B.return 语句可以出现在函数的任何地方。
C.函数定义可以在主函数前面也可以在主函数后面。
D.函数总是返回一个整型数据。

答案:BC

解析:B:return 语句可以出现在函数的任何地方(是正确的)。

填空题:

第22题4-1
下面函数用于求出两个整数之和,并通过形参传回两整数相加之和值。请填空。

void add(int x, int y,( ) (4分) z) {
( )= x + y;
}

答案:( int * ) ( *z )

解析:在一个函数中修改另一个函数中的值,只能通过指针来实现。

第23题4-2
下面程序可以逐行输出由language数组元素所指向的5个字符串。请填写程序中相应语句。

#include
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;
}

答案:( **q ) ( language+k )

解析:char **q可以用于指向指针数组 char *language[] 中字符串的首地址,
通过q=language+k来指向第k+1个元素的地址。

函数题:

第24题6-2 找密码
在一个古堡的大门上有5行字符。其中隐藏着打开大门的密码。密码共有4位数字(0到9)。小明发现了一种找密码的方法:最后一行中的字符在第一行字符中出现的总次数是密码的第一个数字,依此类推。输入数据保证每行得到的数字在0到9之间。 请编写一个函数 decode帮助小明找出密码。

函数接口定义:
int decode(char**s);

通过参数s向函数传递5行字符串,函数返回密码值。

裁判测试程序样例:
#include
#include
#define N 100
#define M 5
int decode(char**s);
int main()
{

char *s[M];
int i;
int key;
for(i=0; i

}
/* 您提交的代码将放置在这里 */

输入样例:
1111
222
33
41
2341
输出样例:
4322

我的代码:
int decode(char**s)
{
int pwd = 0;
for (int i = 0; i < 4; i++)
{
int cnt = 0;
for (int j = 0; j < strlen(s[i]); j++)
{
for (int k = 0; k < strlen(s[4]); k++)
{
if (s[i][j] == s[i][k]) cnt++;
{
pwd = pwd * 10 + cnt;
}
}
}
}
return pwd;
}

编程题:

第25题7-1 循环移动
输入两个正整数 n 和 m (1 要求定义并调用函数 mov(x,n,m) 实现上述循环移动的功能,函数形参x的类型是整型指针,形参n和m的类型是int,函数的类型是void。
输出格式:数据之间以空格分隔,最后一个数据集后面没有空格
输入输出示例:括号内为说明

输入样例:
5 3 (n=5,m=3)
1 2 3 4 5 (5个整数)

输出样例:
After move: 3 4 5 1 2

我的代码:
#include
#define MAXN 10

int mov( int * x, int n, int m );

int main()
{
int a[MAXN], n, m;
int i;

scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

mov(a, n, m);

for ( i = 0; i < n; i++ ) {
    if (i != 0) printf(" ");
    printf("%d", a[i]);
}
printf("\n");

return 0;

}

int mov( int * x, int n, int m )
{
int i,j,t;
for(i=0;i {
t=x[n-1];
for(j=n-1;j>=1;j–)
{
x[j]=a[j-1];
}
x[0]=t;
}
return 0;
}

第26题7-2 找最大的字符串
输入5个字符串,输出其中最大的字符串。
输出格式: printf(“Max is: %s\n”, );
输入输出示例:括号内为说明,无需输入输出

输入样例:
peach
pear
melon
orange
berry

输出样例:
Max is: pear

我的代码:
#include
#include
int main()
{
char a[5][100];
char * max;
int i;
for(i=0;i<5;i++)
{
scanf("%s",a[i]);
}
max=a[0];
for(i=1;i<5;i++)
{
if(strcmp(max,a[i])<0)
{
max=a[i];
}
}
printf(“Max is:%s”,max);
return 0;
}

你可能感兴趣的:(C语言错题集锦(包括解析)(暂时共26题))