C语言期末第七弹
Posted 苏师19大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言期末第七弹相关的知识,希望对你有一定的参考价值。
选择题
1
软件测试的目的是
A.评估软件可靠性
C.改正程序中的错误
B.发现并改正程序中的错误
D.发现程序中的错误
点击空白处查看答案
参考答案:D
【解析】软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心,而不是为了演示软件的正确功能。不是为了评估软件或改正错误。
2
面向对象方法中,继承是指
A.一组对象所具有的相似性质
C.各对象之间的共同性质
B.一个对象具有另一个对象的性质
D.类之间共享属性和操作的机制
点击空白处查看答案
参考答案:D
【解析】继承是面向对象的方法的一个主要特征,是使用已有的类的定义作为基础建立新类的定义技术。广义的说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和操作的机制。
3
数据库设计中反映用户对数据要求的模式是
A.内模式
C.外模式
B.概念模式
D.设计模式
点击空白处查看答案
参考答案:C
【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述,所以选择C)。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法。
4
以下选项中可用作C程序合法实数的是
A.3.0e0.2
C.E9
B. .1e0
D.9.12E
点击空白处查看答案
参考答案:B
【解析】A选项中E后面的指数必须为整数。C语言规定,E之前必须要有数字,所以C选项错误。E后面必须要有数字,且必须为整数,所以D选项错误。
5
以下选项中不能作为C语言合法常量的是
A.0.1e+6
C."\a"
B.'cd'
D.'\011'
点击空白处查看答案
参考答案:B
【解析】要想表示字符串常量应该用双引号表示,即"cd",单引号 用于表示字符常量,所以B选项中的表示方法错误。
6
有以下程序
#include <stdio.h>
main()
{ int k=5,n=0;
do
{ switch(k)
{ case 1: case 3: n+=1; k--; break;
default: n=0; k--;
case 2: case 4: n+=2; k--; break;
}
printf("%d",n);
}while(k>0 && n<5);
}程序运行后的输出结果是
A.02356
C.235
B.0235
D.2356
点击空白处查看答案
参考答案:C
【解析】k的值为5,逐个对case语句进行匹配,均不匹配,执行default下的语句n=0;k- -;在执行case2:后面的空语句,与case4:后面的n+=2;k--;执行break语句跳出switch判断,打印n的值,即2。经过第一次循环后,k的值为3,然后进行k>0 && n<5条件判断为真,第二次执行循环体,执行case3:后面的n+=1;k- -;再执行break语句跳出循环,此时打印n的值3,此时k的值为2。第三次执行循环体k的值为2,满足条件,执行case2:case4:后面的语句n+=2,k--,跳出循环体。打印n的值5。此时n不小于5了条件k>0 && n<5不成立了,所以结束循环。整个程序的打印结果为235。
7
以下程序段完全正确的是
A.int *p;
scanf("%d", &p);
C.int k, *p=&k;
scanf("%d", p);
B.int *p;
scanf("%d", p);
D.int k, *p; *p=&k;
scanf("%d", p);
点击空白处查看答案
参考答案:C
8
若有定义语句:
char *s1="OK", *s2="ok";
以下选项中,能够输出"OK"的语句是
A.if (strcmp(s1,s2)!=0) puts(s2);
C.if (strcmp(s1,s2)==1) puts(s1);
B.if (strcmp(s1,s2)!=0) puts(s1);
D.if (strcmp(s1,s2)==0) puts(s1);
点击空白处查看答案
参考答案:B
【解析】strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII码值大小),以第一个不相同的字符的大小作为比较结果。因为'OK'<'ok',所以strcmp(s1,s2)为负值,只有B选项正确。
9
有以下程序
#include <stdio.h>
int fun(int x[],int n)
{
static int sum=0, i;
for(i=0;i<n;i++) sum+=x[i];
return sum;
}
main()
{
int a[]={1,2,3,4,5}, b[]={6,7,8,9}, s=0;
s=fun(a,5)+fun(b,4);
printf("%d\n",s);
}
程序执行后的输出结果是
A.55
C.45
B.50
D.60
点击空白处查看答案
参考答案:D
【解析】内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数据,再次调用该函数时,以前调用时的数值仍然保留着。fun(a,5)的值是15,再次调用后sum=15,所以fun(b,4)=45,s=45+15=60。因此D选项正确。
10
有以下结构体说明、变量定义和赋值语句
struct STD
{ char name[10];
int age;
char sex;
} s[5],*ps;
ps=&s[0];
则以下scanf函数调用语句有错误的是
A.
scanf("%s",s[0].name);
C.
scanf("%c",&(ps->sex));
B.
scanf("%d",&s[0].age);
D.
scanf("%d",ps->age);
点击空白处查看答案
参考答案:D
【解析】本题考查结构体的相关知识,题目中需要输入一个变量,scanf要求参数为指针,而D选项中ps->age为一个变量,不是指针,所以错误。
11
若有以下语句
typedef struct S
{ int g; char h; } T;
以下叙述中正确的是
A.可用S定义结构体变量
C.S是struct 类型
的变量
B.可用T定义结构体变量
D.T是struct S类型
的变量
点击空白处查看答案
参考答案:B
【解析】本题考查typedef重新声明一种结构体类型,那么T为结构体类型,而不是结构体变量,所以B选项正确。
12
有以下程序
#include <stdio.h>
#include <string.h>
struct A
{
int a;
char b[10];
double c;
};
struct A f(struct A t);
main()
{
struct A a={1001,"ZhangDa",1098.0};
a=f(a);
printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
struct A f(struct A t)
{
t.a=1002;
strcpy(t.b,"ChangRong");
t.c=1202.0;
return t;
}程序运行后的输出结果是
A.1002,ZhangDa,
1202.0
C.1001,ChangRong,
1098.0
B.1002,ChangRong,
1202.0
D.1001,ZhangDa,
1098.0
点击空白处查看答案
参考答案:B
【解析】本题考查结构体变量的引用以及作为函数参数,题目虽然看似复杂,其实比较容易,f函数的参数是结构体变量,然后对参数重新赋值并返回,所以该题目的答案为B选项。
13
有以下程序
#include <stdio.h>
main()
{
int a=1, b=2, c=3, x;
x = (a^b)&c;
printf("%d\n",x);
}程序的运行结果是
A.3
C.2
B.1
D.0
点击空白处查看答案
参考答案:A
【解析】本题考查位运算符以及相关运算,^为按位或,&为按位与,那么a^b为3,再与c按位与仍然为3,所以答案为A选项。
14
有以下程序
#include <stdio.h>
main()
{
FILE *fp;
int k, n, a[6]={1,2,3,4,5,6};
fp = fopen("d2.dat", "w");
fprintf(fp, "%d%d%d\n", a[0],a[1],a[2]);
fprintf(fp, "%d%d%d\n", a[3],a[4],a[5]);
fclose(fp);
fp = fopen("d2.dat", "r");
fscanf(fp, "%d%d", &k, &n);
printf("%d %d\n", k, n);
fclose(fp);
}
程序运行后的输出结果是
A.1 2
C.123 4
B.1 4
D.123 456
点击空白处查看答案
参考答案:D
【解析】fprintf()函数向文件输出,将输出的内容输出到硬盘上的文件或是相当于文件的设备上执行两次fprintf后文件中有123 456,所以D选项正确。
15
下列关于数据库设计的叙述中,正确的是
A.在需求分析阶段建立数据字典
C.在逻辑设计阶段建立数据字典
B.在概念设计阶段建立数据字典
D.在物理设计阶段建立数据字典
点击空白处查看答案
参考答案:A
【解析】数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。
16
以下叙述中错误的是
A.算法正确的程序可以有零个输入
C.算法正确的程序可以有零个输出
B.算法正确的程序最终一定会结束
D.算法正确的程序对于相同的输入一定有相同的结果
点击空白处查看答案
参考答案:C
【解析】算法的特征:①有穷性。一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成。②确定性。算法中的每一步都有确切的含义。③可行性。算法中的操作能够用已经实现的基本运算执行有限次来实现。④输入:一个算法有零个或者多个输入,零个输入就是算法本身确定了初始条件。⑤输出:一个算法有一个或者多个输出,以反映出数据加工的结果。所以C选项错误。
17
若变量均已正确定义并赋值,以下合法的C语言赋值语句是
A.x=y==5;
C.x+n=i;
B.x=n%2.5;
D.x=5=4+1;
点击空白处查看答案
参考答案:A
【解析】B选项中运算符"%"的前后必须为整数,C选项中不能将变量赋给表达式x+n,D选项中不能将表达式4+1赋给常量5。
18
有以下程序
#include <stdio.h>
main()
{ int i;
for(i=1; i<=40; i++)
{ if(i++%5==0)
if(++i%8==0) printf("%d ",i);
}
printf("\n");
}
执行后的输出结果是
A.5
C.32
B.24
D.40
点击空白处查看答案
参考答案:C
【解析】本题的含义是在1-40的整数的范围中,只有当i的值能被5整除,且i+2的值能被8整除时,打印i的值,满足这个条件的只有32,选择C选项。
19
下列选项中,能正确定义数组的语句是
A.int num[0...2008];
C.int N=2008;
int num[N];
B.int num[];
D.#define N 2008
int num[N];
点击空白处查看答案
参考答案:D
【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。A选项错误,C语言中数组没有此类型的定义方法;B选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数;C选项错误,N为变量,不能用来定义数组大小。因此D选项正确。
20
有以下程序
#include <stdio.h>
void fun (char *c)
{
while(*c)
{
if( *c >= 'a' && *c <= 'z')
*c =*c - ('a' - 'A');
c++;
}
}
main()
{
char s[81];
gets(s);
fun(s);
puts(s);
}
当执行程序时从键盘上输入Hello Beijing<回车>,则程序的输出结果是
A.hello beijing
C.HELLO BEIJING
B.Hello Beijing
D.hELLO Beijing
点击空白处查看答案
参考答案:C
【解析】主程序读取整个字符串存于s中,调用fun函数,字符指针c指向数组s。函数fun的功能是把指针c所指向的字符数组中的所有小写字符转换为大写。gets函数可以把空格作为字符串的一部分输入,以回车作为输入结束。如果*c为小写字符,则*c=*c-32(转大写)。因此C选项正确。
21
有以下程序
#include <stdio.h>
main()
{
char s[]={"012xy"};
int i,n=0;
for(i=0;s[i]!=0;i++)
if(s[i]>='a'&&s[i]<='z')
n++;
printf("%d\n",n);
}
程序运行后的输出结果是
A.0
C.3
B.2
D.5
点击空白处查看答案
参考答案:B
【解析】程序首先给字符数组s[ ]赋值为"012xy",for循环语句的功能是遍历字符串,通过if条件语句对字符串中的小写字母计数,在符串中小写字母为2个,即n=2。因此B选项正确。
22
有以下程序
#include <stdio.h>
int fun(int n)
{
if(n==1)
return 1;
else
return(n+fun(n-1));
}
main()
{
int x;
scanf("%d",&x);
x=fun(x);
printf("%d\n",x);
}
执行程序时,给变量x输入10,程序的输出结果是
A.55
C.65
B.54
D.45
点击空白处查看答案
参考答案:A
【解析】该程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+…+8+9+10=55。因此A选项正确。
23
下列叙述中正确的是
A.循环队列是队列的一种链式存储结构
C.循环队列是非线性结构
B.循环队列是队列的一种顺序存储结构
D.循环队列是一种逻辑结构
点击空白处查看答案
参考答案:B
【解析】在实际应用中,队列的顺序存储结构一般采用循环队列的形式。
24
下列关于线性链表的叙述中,正确的是
A.各数据结点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致
C.进行插入与删除时,不需要移动表中的元素
B.各数据结点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续
D.以上说法均不正确
点击空白处查看答案
参考答案:C
【解析】一般来说,在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。
25
在下列模式中,能够给出数据库物理存储结构与物理存取方法的是
A.外模式
C.概念模式
B.内模式
D.逻辑模式
点击空白处查看答案
参考答案:B
【解析】数据库系统的三级模式是概念模式、外模式和内模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图。外模式也称子模式或用户模式,它是用户的数据视图,给出了每个用户的局部数据描述。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,所以选择B)。
26
下面描述中,不属于软件危机表现的是
A.软件过程不规范
C.软件质量难以控制
B.软件开发生产率低
D.软件成本不断提高
点击空白处查看答案
参考答案:A
【解析】软件危机主要表现在:软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件不可维护或维护程度非常低;软件的成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用需求的增长。所以选择A)。
27
以下关于C语言数据类型使用的叙述中错误的是
A.若要处理如"人员信息"等含有不同类型的相关数据,应自定义结构体类型
C.若只处理"真"和"假"两种逻辑值,应使用逻辑类型
B.若要保存带有多位小数的数据,可使用双精度类型
D.整数类型表示的自然数是准确无误差的
点击空白处查看答案
参考答案:C
【解析】C语言中没有逻辑类型,所以C错误。若要保存带有多位小数的数据,可以用单精度类型也可以用双精度类型。处理包含不同类型的相关数据可以定义为结构体类型。整数类型可以无误差的表示自然数。
28
有如下程序段:
int x=12;
double y=3.141593;
printf("%d%8.6f", x, y);
其输出结果是
A.123.141593
C.12, 3.141593
B.12 3.141593
D.123.1415930
点击空白处查看答案
参考答案:A
【解析】printf函数中格式字符"%8.6"的含义是:变量y的输出宽度为8(包括小数点),小数点后面保留6位小数,且右对齐。所以选择A。
29
设有以下函数:
void fun(int n,char *s)
{ …… }
则下面对函数指针的定义和赋值均正确的是
A.void (*pf)(int,char); pf=&fun;
C.void *pf();
*pf=fun;
B.void *pf();
pf=fun;
D.void (*pf)(int, char*); pf=fun;
点击空白处查看答案
参考答案:D
30
若要求定义具有10个int型元素的一维数组a,则以下定义语句中错误的是
A.#define n 5
int a [2*n];
C.int n=10,a[n];
B.#define N 10
int a[N];
D.int a[5+5];
点击空白处查看答案
参考答案:B
【解析】一维数组的定义方式为:类型说明符 数组名 [常量表达式];注意定义数组时,元素个数不能是变量。因此应该选B选项。
31
有以下程序
#include <stdio.h>
main()
{
int i, t[][3]={9,8,7,6,5,4,3,2,1};
for(i=0;i<3;i++)
printf("%d ",t[2-i][i]);
}
程序执行后的输出结果是
A.3 5 7
C.3 6 9
B.7 5 3
D.7 5 1
点击空白处查看答案
参考答案:A
【解析】二维数组t[][3]实际上指t[3][3]= {{9,8,7},{6,5,4},{3,2,1}},通过循环语句for语句可以得到i=0,t[2][0]=3、i=1,t[1][1]=5、i=2,t[0][2]=7、i=3时循环结束即t[2][0]=3、t[1][1]=5、t[0][2]=7。因此A选项正确。
32
有以下程序
#include <stdio.h>
main()
{
int a[4][4]={ {1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}}, i, k, t;
for (i=0; i<3; i++)
for (k=i+1; k<4; k++)
if (a[i][i] < a[k][k])
{ t=a[i][i]; a[i][i]=a[k][k]; a[k][k]=t;}
for (i=0; i<4; i++)
printf("%d,", a[0][i]);
}
程序运行后的输出结果是
A.1,1,2,6,
C.6,4,3,2,
B.6,2,1,1,
D.2,3,4,6,
点击空白处查看答案
参考答案:C
【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]、…、a[3][2]、a[3][3]的值为1、4、…、6、1。通过for嵌套循环语句和if条件语句,对二维数组对角线元素进行由大到小的排序操作,程序最后通过for语句输出二维数组第1行的4个元素。因此C选项正确。
33
若有以下定义和语句
#include <stdio.h>
char s1[10]= "abcd!", *s2="\n123\\";
printf("%d %d\n", strlen(s1), strlen(s2));
则输出结果是
A.10 7
C.5 5
B.10 5
D.5 8
点击空白处查看答案
参考答案:C
【解析】strlen函数返回字符串的长度,求字符串长度时,遇到结束标志'\0'为止,但是长度不包括结束标识。字符数组s1的后5个元素没有赋值,都为'\0',即"abcd!"后为'\0'。所以strlen(s1)的值为5。字符指针s2所指向的字符串中,\n为转义字符换行符,表示1个字符,\\也为转义字符,代表\,也是1个字符,其后为字符串结束标识'\0';所以strlen(s2)的值也为5。因此C选项正确。
34
下列叙述中正确的是
A.在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
C.在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
B.在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
D.以上说法均不正确
点击空白处查看答案
参考答案:C
【解析】栈是先进后出的数据结构,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作,所以选择C)。
35
以下关于C语言的叙述中正确的是
A.C语言的数值常量中夹带空格不影响常量值的正确表示
C.在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致
B.C语言中的变量可以在使用之前的任何位置进行定义
D.C语言中的注释不可以夹在变量名或关键字的中间
点击空白处查看答案
参考答案:D
【解析】C语言的数值常量中不能夹带空格,所以A错误。C语言中的变量都必须先定义再使用,对变量的定义通常放在函数体内的前部,但也可以放在函数外部或复合语句的开头,不能随便放置,所以B错误。在C语言中运算符两侧的运算数据类型可以不一致,且结果与精度较高的保持一致,所以C错误。
36
以下不合法的字符常量是
A.'\\'
C.'\018'
B.'\"'
D.'\xcc'
点击空白处查看答案
参考答案:C
【解析】转义字符中,八进制的表示形式为\ddd,但是八进制中不能包含数字8,所以C选项不合法。
37
有以下程序
#include <stdio.h>
main()
{ int a=1, b=2;
for( ;a<8;a++) {b+=a; a+=2;}
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是
A.9,18
C.7,11
B.8,11
D.10,14
点击空白处查看答案
参考答案:D
【解析】第一次循环a的值为1,满足条件,执行b+=a,与a+=2,则b的值变为3,a的值变为3。执行a++,a的值为4,满足条件进入第二次循环,执行完循环体后b的值为7,a的值为6。执行a++,a的值为7,满足条件进入第三次循环,执行完循环体后b的值为14,a的值为9。执行a++,a的值变为10。所以选择D选项。
38
以下能正确定义字符串的语句是
A.char str="\x43";
C.char str='';
B.char str[]="\0";
D.char str[]={'\064'};
点击空白处查看答案
参考答案:B
【解析】C语言中,字符串是用一对双引号括起来的字符序列,并用字符型数组来存放,故C选项和D选项不属于字符串,A选项定义的是一个字符变量str,却用来存放字符串,显然也不正确,因此B选项正确。
39
有以下程序
#include <stdio.h>
void fun( char *a, char *b )
{ while( *a=='*' ) a++;
while( *b=*a ){ b++;a++; }
}
main()
{ char *s="*****a*b****" , t[80];
fun(s,t); puts(t);
}
程序的运行结果是
A.ab
C.*****a*b
B.a*b
D.a*b****
点击空白处查看答案
参考答案:D
【解析】在函数fun(char *a,char *b)中,while(*a=='*')a++的功能是:如果*a的内容为'*',则a指针向后移动,直到遇到非'*'字符为止,退出循环进入下一个while循环,在while(*b=*a){b++;a++;}中,把字符数组a中的字符逐个赋给字符数组b。所以在主函数中,执行fun(s,t)语句后,字符数组t中的内容为"a*b****"。因此D选项正确。
40
下列函数的功能是
void fun(char *a,char *b)
{
while((*b=*a)!='\0')
{ a++; b++;} }
A.将a所指字符串赋给b所指空间
C.将a所指字符串和b所指字符串进行比较
B.使指针b指向a所指字符串
D.检查a和b所指字符串中是否有'\0'
点击空白处查看答案
参考答案:A
【解析】While循环条件为:(*b=*a)!='\0',执行时先把指针a所指向的字符赋给指针b所在内存单元,如果该字符不是结束标识"\0",执行循环体a++;b++;,指针a、b分别指向下一个字符单元。再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在内存单元,直到遇到结束标识为止。因此A选项正确。
程序设计
01
功能:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。x的值由主函数从键盘读入,要求不大
于100。
说明:所谓"同构数"是指这样的数,这个数出现在它的平方数的右边。
例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数。
#include "stdio.h"
int fun(int x)
{
/*********Begin**********/
/********** End **********/
}
int main()
{
int x,y;
printf("\nPlease enter a integer numbers:");
scanf("%d",&x);
if(x>100)
{
printf("data error!\n");
exit(0);
}
y=fun(x);
if(y)
printf("%d YES\n",x);
else
printf("%d NO\n",x);
}
点击空白处查看答案
【参考代码】
int k;
k=x*x;
if((k%10==x)||(k%100==x))
return 1;
else return 0;
程序改错
01
下列给定程,序中函数fum的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为87653142时,t中的数为7531。
#include <stdio.h>
void fun (long s, long *t)
{ int d;
long sl=1;
/************found************/
t = 0;
while ( s > 0)
{ d = s%10;
/************found************/
if (d%2== 0)
{ *t = d * sl + *t;
sl *= 10;
}
s /= 10;
}
}
main()
{ long s, t;
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);}
点击空白处查看答案
【参考答案】
(1)*t=0(2)if(d%2!=0)或if(d%2==1)
程序填空
01
题目:本程序的功能是输入一段数字后,将输出的数字颠倒输出(回文)。请填空。
#include "stdio.h"
int main()
{
int numb,rdigit;
/***********FILL***********/
scanf("%d",_____);
while(numb!=0)
{
/***********FILL***********/
rdigit= ;
printf("%d",rdigit);
/***********FILL***********/
_____;
}
printf("\n");}
点击空白处查看答案
【空 1 】
【参考答案】
&numb
【空 2 】
【参考答案】
numb%10
【空 3 】
【参考答案】
numb/=10numb=numb/10
以上是关于C语言期末第七弹的主要内容,如果未能解决你的问题,请参考以下文章