国家二级C语言机试(编译预处理和指针)模拟试卷8

国家二级C语言机试(编译预处理和指针)模拟试卷8 (总分:52.00,做题时间:90分钟) 一、 选择题(总题数:26,分数:52.00) 1.以下叙述中正确的是 (分数:2.00) A.在C语言中,预处理命令行都以”#”开头 √ B.预处理命令行必须位于C源程序的起始位置 C.#include必须放在C程序的开头 D.C语言的预处理不能实现宏定义和条件编译的功能 解析:解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。#include命令行表示程序中要引用C标准函数库中的标准输入输出函数。 2.有以下程序,程序运行后的输出结果是 #define PT 3.5; #define S(x)PT*x*x; main(){int a=1,b=2; printf("%4.1 f\n",S(a+b));} (分数:2.00) A.31.5 B.7.5 C.程序有错无输出结果 √ D.14.0 解析:解析:本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话S(a+b)=PT*a+b*a+b=3.5*1+2*1+2=7.5。 3.以下关于宏的叙述中正确的是 (分数:2.00) A.宏定义必须位于源程序中所有语句之前 B.宏名必须用大写字母表示 C.宏调用比函数调用耗费时间 D.宏替换没有数据类型限制 √ 解析:解析:本题考查宏替换的规则。宏替换分为简单的字符替换和带参数的宏替换两类。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。 4.有以下程序,程序运行后的输出结果是 #include #define S(x)4*(x)*x+1 void main() {int k=5,j=2; printf("%d\n",S(k+j)); } (分数:2.00) A.197 B.143 √ C.33 D.28 解析:解析:这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏S(x),当在主函数中用参数k+i调用宏S时,根据宏替换的原则,则S(k+j)=S(5+2)=4*7*5+2+1=143。 5.设有宏定义: #define IsDIV(k,n)((k%n==1)?1:0)且变量m已正确定义并赋值,则宏调用: IsDIV(m,5)&&IsDIV(m,7)为真时所要表达的是 (分数:2.00) A.判断m是否能被5和7整除 B.判断m被5或者7整除是否余1 C.判断m被5和7整除是否都余1 √ D.判断m是否能被5或者7整除 解析:解析:本题考查宏定义和三目运算符。三目运算符的格式为:test? 语句1:语句2 其中,test可以是任何Boolean表达式。语句1,当test是true时执行该语句,可以是复合语句;语句2,当test是false时执行该语句,可以是复合语句。isDIV(k,n)要表达的是当k除n的余数是1时表达式的值为1,否则为0,所以题中要表达的是m被5和7整除是否都余1。 6.有以下程序,程序运行后的输出结果是 #include #define SUB(a)(a)-(a) main(){ int a=2,b=3,c=5,d; d=SUB(a+b)*c: printf("%d\n",d);} (分数:2.00) A..12 B.0 C.10 D..20 √ 解析:解析:本题主要考查的是宏替换,在程序中执行d=sub(a+b)*c这条语句时,首先要进行宏替换,依据宏SUB(a)的定义可知,上面这条语句替换为d=(a+b)-(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即d=5-5*5=-20。 7.有以下程序,程序运行后的输出结果是 #include #define fix)x*x*x main(){ int a=3,s,t; s=f(a+1); t=f((a+1)); printf("%d,%d\n",s,t);} (分数:2.00) A.10,10 B.10,64 √ C.64,10 D.64,64 解析:解析:根据题目中宏f(x)的定义,运算过程应为:s=f(a+1)=a+1*a+1*a+1=a+a+a+1=10,因此最后s的结果为10,而t=f((a+1)=(a+1)*(a+1)*(a+1)=4*4*4=64的结果为64。 8.有下列程序,程序的运行结果是 #include #define N 5 #define M N+1 #define fix)(x*M) main() {int i1,i2; il=ff2); i2=f(1+1); printf("%d%d\n",i1,i2);} (分数:2.00) A.12 7 B.12 12 C.11 11 D.11 7 √ 解析:解析:在本题中,定义了3个宏定义语句,分别是:#define N 5、#define M N+5和#define f(x)(x*M),所以根据C语言的宏替换规则,我们可知,f(2)=2*N+1=2*5+1=11,f(1+1)=1+1*N+1=1+1*5+1=7。 9.以下叙述中错误的是 (分数:2.00) A.预处理命令行的最后不能以分号表示结束 B.C程序对预处理命令行的处理是在程序执行的过程中进行的 √ C.#define MAX是合法的宏定义命令行 D.在程序中凡是以“#”开始的语句行都是预处理命令行 解析:解析:预处理命令行是以“#”开始的语句,预处理命令行的最后不能以分号表示结束,预处理命令行。其中宏定义的字符替换的定义格式为:#define标识符字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。 10.若程序中有宏定义行: #define N 100则以下叙述中正确的是 (分数:2.00) A.宏定义行中定义了标识符N的值为整数100 B.上述宏定义行实现将100赋给标示符N C.在运行时用100替换标识符N D.在编译程序对C源程序进行预处理时用100替换标识符N √ 解析:解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”。其含义是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由#define定义的宏就是编译预处理命令。C程序在进行编译之前,都要先对程序中所有出现的“宏名”,都用宏定义中的替换文本进行替换。 11.若有以下程序,则程序的输出结果是 #define S(x)x*x #define T(x)S(x)*S(x) main(){int k=5,j=2; printf("%d,%d\n",S(kI+j),T(k+j));} (分数:2.00) A.17,37 √ B.49,2401 C.17,289 D.49,289 解析:解析:本题考查了宏替换,宏替换就是简单的字符替换,不会进行语法错误检查也不会进行运算。“S(k+j)”宏展开以后为“k+j*k+j”,值为17,“T(k+j)”宏展开以后为“k+j*k+j*k+j*k+j”,值为37。 12.有以下程序,程序运行后的输出结果是 #include<stdio.h> #define N 2 #define M N+1 #define NUM(M+1)*M/2 main(){printf("%d\n",NUM);} (分数:2.00) A.4 B.8 √ C.9 D.6 解析:解析:宏展开以后NUM为(2+1+1)*2+1/2,计算以后值为8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。 13.有以下程序,程序运行后的输出结果是 #include #define SUB(X,Y)(X+1)*Y main(){int a=3,b=4; printf("%d\n", SUB(a++,b++));} (分数:2.00) A.20 B.12 C.16 √ D.25 解析:解析:宏展开的结果(a+++1)*b++,后缀自加表达式参加运算,先用a和b的初值得到表达式的值,进行计算,然后a和b在自加。因此计算结果为16。 14.下面选项中关于编译预处理的叙述正确的是 (分数:2.00) A.凡是以≠}号开头的行,都被称为编译预处理命令行 √ B.预处理命令行必须使用分号结尾 C.预处理命令行不能出现在程序的最后一行 D.预处理命令行的作用域是到最近的函数结束处 解析:解析:在C语言中,凡是以“#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以“#”号开始,每行的末尾不能用“;”号结束,以区别于C语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。 15.有以下程序,程序的输出结果是 #include<stdio.h> #define SQR(X)X*X main(){ int a=10,k=2,m:1; a|=SQR(k+m)/SQR(k+m); printf("%d\n",a);} (分数:2.00) A.0 B.1 √ C.9 D.10 解析:解析:SQR(k+m)宏展开以后为k+m*k+m,值为5,表达式a/=SQR(k+m)/SQR(k+m)为a=a/(5+5),表达式值为1。 16.以下叙述中正确的是 (分数:2.00)

合集下载

国家二级C语言机试(操作题)模拟试卷845(题后含答案及解析)

国家二级C语言机试(操作题)模拟试卷845(题后含答案及解析)

国家二级C语言机试(操作题)模拟试卷845(题后含答案及解析) 全部题型 2. 程序填空题 3. 程序修改题 4. 程序设计题程序填空题1.函数fun的功能是:逆置数组元素中的值。

例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、1。

形参n给出数组中数据的个数。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!#include<stdio.h >void fun(int a[],int n){ int i,t,/**********found**********/for(i=0;i<___1___;i++) { t=a[i];/**********found**********/a[i]=a[n-1-___2___];/**********found**********/___3___=t;}}main( ){int b[9]={1,2,3,4,5,6,7,8,9),i;printf(“\nThe original data:\n”);for(i=0;i<9;i++) printf(“%4d”,b[i]);printf(“\n”);fun(b,9);printf(“\nThe data after invert:\n”);for(i=0;i<9;i++) printf(“%4d”,b[i]);printf(“\n”);}正确答案:(1)n/2(2)i(3)a[n-i-1]解析:函数fun的功能是将数组中的元素倒置。

第一空:由审题分析可知,总共交换n/2次,故循环的终止条件为i等于n/2,故第一空处应为“n/2”。

第二空:a[0]和a[n-1]交换,a[1]和a[n-2]交换…,因此,a[i]和a[n-i-1]交换,故第二空处应为“i”。

国家二级C++机试(运算符重载、模板和C++流)模拟试卷8(题后含答案及解析)

国家二级C++机试(运算符重载、模板和C++流)模拟试卷8(题后含答案及解析)

国家二级C++机试(运算符重载、模板和C++流)模拟试卷8(题后含答案及解析)题型有:1. 选择题选择题1.有如下程序:#include<iostrearn>using namespace std;int main( ) { cout.fill(‘*’);cout.width(6);cout.fill(‘#’);cout <<123<<endl;return 0;} 执行后的输出结果是( )。

A.###123B.123###C.***123D.123***正确答案:A解析:此题考查的是I/O格式化输出。

函数width(int n)设置输入输出宽度,当实际数据宽度小于制定的宽度时,多余的位置用填充字符填满;当实际数据宽度大于设置的宽度时,仍按实际宽度输出;函数fill(char c)用来设置填充字符。

知识模块:C++流2.下面关于C++流的叙述中,正确的是( )。

A.cin是一个输入流对象B.可以用ifstream定义一个输出流对象C.执行语句序列char*y=“PQMN’’;cout<<,y;将输出字符串”PQMN”的地址D.执行语句序列char x[80];cin.getline(x,80);时,若键入Happy new year 则x中的字符串是”Happy’’正确答案:A解析:此题考查的是C++流的概念和I/O的格式化。

cin是类的对象,亦即输入流对象;ifstream是输入文件流类,不能定义一个输出流对象:C选项中最后输出的是字符串“PQMN”:D选项中x中字符串应该是“Happy new year”。

知识模块:C++流3.有如下程序:#include<iostream>#include<iomanip>using namespace std;int main( ) { cout.fill(‘*’);cout<<left <<setw(4)<<123<<<’’OK’’<<endl;return 0;} 执行这个程序的输出结果是( )。

国家二级C语言(编译预处理和指针)机试模拟试卷13(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷13(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷13(题后含答案及解析)题型有:1. 选择题选择题1.以下语句中存在语法错误的是A.char ss[][20]={“right?”};B.char*ss[6];ss[1]=“right?”;C.char*ss[]={“right?”};D.char ss[6][20];ss[1]=“right?”;正确答案:A解析:选项A)中定义了二维数组ss,可以用于存储字符串,但是字符串的存储不能通过赋值,仅可以初始化或者输入得到,而选项C)和A)不同,选项C)为指针数组,对于指针变量可以保存常量字符串的地址。

知识模块:函数和数组2.下面是有关C语言字符数组的描述,其中错误的是A.不可以用赋值语句给字符数组名赋字符串B.可以用输入语句把字符串整体输入给字符数组C.字符数组中的内容不一定是字符串D.字符数组只能存放字符串正确答案:D解析:本题考查字符数组。

选项A)、B)和C)都是正确的,字符数组存放其他数据。

知识模块:函数和数组3.以下选项中有语法错误的是A.char str[3][10];str[1]=“guest”;B.char str[][10]={“guest”};C.char*str[3];str[1]=“guest”;D.char*str[]={“guest”};正确答案:A解析:本题考查字符数组的定义和使用。

选项A)定义了一个二维字符数组,第二句是直接给字符数组赋值错误,C语言中不能直接给字符数组赋值;选项B)、C)和D)都是正确的。

知识模块:函数和数组4.下列叙述中正确的是A.两个连续的单引号(“)是合法的字符常量B.可以对字符串进行关系运算C.两个连续的双引号(““)是合法的字符串常量D.空字符串不占用内存,其内存空间大小是0正确答案:C解析:两个连续的双引号:”“,是一个字符串常量,称为“空串”。

知识模块:函数和数组5.以下选项中,能正确进行字符串赋值的是A.char s[5]={‘A’,’B’,’C’,’D’,’E’};B.char*s=“ABCDE”;C.char s[4][5]={“ABCDE”};D.char*s;gets(s);正确答案:B解析:对于选项A)字符串中无法存放字符串结束标志’\0’,选项C)每行仅仅存放5个字符,同样的不能存放字符串结束标志,选项D)中指针变量s没有实际的内存空间,无法存放输入的字符串。

国家二级C语言(编译预处理和指针)机试模拟试卷16(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷16(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷16(题后含答案及解析)题型有:1. 选择题选择题1.有以下程序#include<stdio.h>void fun(int*a,int*b){int*c;c=a:a=b;b=c;}main( ){int x=3,y=5,*p=&x,*q=&y;fun(p,q);printf(“%d,%d,”,*p,*q);fun(&x,&y);printf(“%d,%d\n”,*p,*q);}程序运行后的输出结果是A.3,5,5,3B.3,5,3,5C.5,3,3,5D.5,3,5,3正确答案:B解析:本题考查函数的调用与指针。

p和q分别为指向x和y的指针,函数fun( )的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。

而主函数中,fun(p,q)、fun(&x,&y1)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。

知识模块:编译预处理和指针2.有下列程序:void f(int b[]){int I;for(i=2;i<6;i++)b[i]*=2;}main( ){int a[10]={1,2,3,4,5,6,7,8,9,10},i;f(a);for(i=0;i<10,i++)printf(“%d,”,a[i]);}程序运行后的输出结果是A.1,2,3,4,5,6,7,8,9,10,B.1,2,3,4,10,12,14,16,9,10,C.1,2,6,8,10,12,7,8,9,10,D.1,2,6,8,10,12,14,16,9,10,正确答案:C解析:函数void f(int b[])的功能是对数组b[]中第2个到第5个元素的值逐个扩大2倍。

所以在main( )函数中,f(a)语句的作用是对数组a[10]中从a[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。

国家二级C语言(编译预处理和指针)机试模拟试卷11(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷11(题后含答案及解析)

国家二级C语言(编译预处理和指针)机试模拟试卷11(题后含答案及解析)题型有:1. 选择题选择题1.设有定义:int x=0, *p; 紧接着的赋值语句正确的是A.*p=NULL;B.p=NULL;C.p=x;D.*p=x;正确答案:A解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如果不赋给它地址,系统会随机给它分配一个地址。

知识模块:编译预处理和指针2.以下叙述中错误的是A.函数可以返回地址值B.改变函数形参的值,不会改变对应实参的值C.当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULLD.可以给指针变量赋一个整数作为地址值正确答案:D解析:指针变量的值只能是存储单元地址,而不能是一个整数,选项D的描述是错误,为待选答案。

函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio.h中,NULL被定义为void型的指针。

知识模块:编译预处理和指针3.设已有定义:float x; 则以下对指针变量p进行定义且赋初值的语句中正确的是A.int *p=(float)x;B.float *p=&x;C.float p=&x;D.float *p=1024;正确答案:B解析:定义指针变量的一般形式为:类型名*指针变量名1,*指针变量名2,……;。

对一个指针变量赋值要通过求地址运算符(&)获得变量的地址值,然后把此地址值赋给指针变量。

因而在选项A的表达式中,赋值号的左边表示定义了指针变量p,而右边表示求变量x的地址值。

知识模块:编译预处理和指针4.有以下程序main( ) { int m=1,n=2,*p=&m,*q=&n,*r; r=p; p=q; q=r; printf(“%d,%d,%d,%d\n”,m,n,*p,*q); }程序运行后的输出结果是A.1,2,1,2B.1,2,2,1C.2,1,2,1D.2,1,1,2正确答案:B解析:在主函数定义了3个整数指针变量p,q,r,并且使p指向m,q指向n,再执行r=p;p=q;q=r;这三条语句,使q指向m,p指向n,再输出变量m,n,*p,*q 时,它们值分别为1,2,2,1。

[计算机类试卷]国家二级C语言机试(操作题)模拟试卷338.doc

[计算机类试卷]国家二级C语言机试(操作题)模拟试卷338.doc

[计算机类试卷]国家二级C语言机试(操作题)模拟试卷338一、程序填空题1 给定程序中,函数fun的功能是:将NxN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。

例如,若N=3,有下列矩阵:1 2 3交换后为:3 2 l4 5 6 4 5 67 8 9 9 8 7请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!#include <stdio.h>#define N 4void fun (int ____1____, int n){ int i,s;}main ( ){ int t [] IN]={21,12,13,24,25,16,47,38,29,11,32,54,42, 21,33,10 },i,j ;printf ("\nThe original array:\n") ;{ for(j=0; j<N; j++) printf("%dprintf ("\n") ;}fun (t,N) ;printf("\nThe result is:\n");{ for(j=0; j<N; j++) printf("%dprintf ( " \n") ;}}二、程序修改题2 由N个有序整数组成的数列己放在一维数组中,给定程序MODI1.C中函数fun的功能是:利用折半查找算法查找整数m在数组中的位置。

若找到,返回其下标值;反之,返回—1。

折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high( low<high),然后把m与中间位置(mid)中元素的值进行比较。

如果m的值大于中间位置元素中的值,则下一次的查找范围落在中间位置之后的元素中;反之,下一次的查找范围落在中间位置之前的元素中。

[计算机类试卷]国家二级C语言机试(操作题)模拟试卷336.doc

[计算机类试卷]国家二级C语言机试(操作题)模拟试卷336一、程序填空题1 给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到文件myfile4.txt中,用.1作为字符串输入结束的标志。

然后将文件的内容读出显示在屏幕上。

文件的读写分别由自定义函数ReadText和WriteText实现。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!#include <stdio.h>#include <string.h>#include <stdlib.h>void WriteText (FILE *) ;void ReadText (FILE *) ;main (){FILE *fp;if ((fp=fopen ( "myfile4 .txt","w"))==NULL){ printf(" open fail! !\n");exit (0) ; }WriteText (fp) ;fclose ( fp) ;if ((fp=fopen ( "myfile4 .txt",{printf (" open fail ! ! \n") ; exit (0) ; }ReadText ( fp) :fclose ( fp) ;}void WriteText(FILE ____1____){ char strl81l;printf("\nEnter string with —1to end :\n");gets (str) ;while (strcmp (str,"—1") ! =0) {fputs (____2____,fw) ;fputs ("\n",fw) ;gets (str) ;}}voicl ReadText (FILE *fr){ char str [81] ;printf("\nRead file and outputto screen :\n") ;fgets (str,81,fr) ;while ( ! feof (fr)) {printf("%s",____3____ );fgets (str,81,fr) ;}}二、程序修改题2 给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中。

国家二级C语言机试(操作题)模拟试卷566(题后含答案及解析)

国家二级C语言机试(操作题)模拟试卷566(题后含答案及解析) 全部题型 2. 程序填空题 3. 程序修改题 4. 程序设计题程序填空题1.下列给定程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则不做任何处理。

例如,若s所指字符串为“baacda”,c中的字符为a,执行后s所指字符串为“baaaacdaa”。

请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。

注意:部分源程序给出如下。

不得增行或删行,也不得更改程序的结构! 试题程序:#include<stdio.h>void fun(char*s,char C){ int i,j,n;/*********found*********/for(i=0;s[i]!=【1】;i++) if(s[i]==C) {/*********found*********/n=【2】;while(s[i+1+n]!=‘\0’) n++;for(j=i+n+1;j>i;j一一) s[j+1]=s[j];/*********found*********/s[j+1]=【3】;i=i+1;}}main( )( char S[80]=“baacda”,c;printf(“knThe string:%skn”,s);printf(“knInput a character:”);Scanf(“%c”,&c);fun(s,c);printf(“\nThe result is:%s \n”,s);}正确答案:(1)’\0’(2)0 (3)c解析:填空1:for语句循环条件是判断是否到达字符串结尾,即当前字符是否为’\0’。

填空2:while语句用以确定字符串的长度,所以变量n赋初值为0。

填空3:题目要求如果找到与参数c相同的字符,就在后面插入一个相同的字符,且找到后应该给数组元素赋值,本题目给出参数为c。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档