5.语句\;\的输出结果是() ①11 ②10 ③ 9 ④ 8
【解】字符串中的字符可以是一般的普通字符,也可以是由反斜杠字符开头的转义字符。在字符串\中,有三个转义字符,它们是n、1、,所以该字符串的有效字符个数是9。所以正确的回答是③。
6.函数调用\,str2),str3)\的功能是()
①将字符串strl复制到字符串str2中后再连接到字符串str3之后 ②将字符串strl连接到字符串str2中后再复制到字符率str3之后
③将字符串str2复制到字符串strl中后再将字符串str3连接到字符串strl之后 ④将字符串str2连接到字符率strl之后再将字符串strl复制到字符串str3中
【解】函数调用strcat(s1,s2)是将s2字符串复制连接到s1字符串之后,使s1字符串变得更长。函数调用strcpy(s1,s2)是将s2字符串复制到s1,使s1字符串的内容与s2字符串的内容相同。函数调用strcat(strcpy(strl,str2) ,str3) 是先执行strcpy(strl,str2),然后再执行strcat(strl,str3),所以其功能是将字符串str2复制到字符串strl中,然后再将字符串str3复制连接到字符串strl之后。正确的选择是③。
7.设有如下定义,则正确的叙述为() char x[]={\;
char y[]={\,\,\,\,\,\,\;
①数组x和数组y等价②数组x和数组y长度相同
③数组X的长度大于数组y的长度④数组X的长度小于数组y的长度
【解】不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。但用字符初始化时,尽管给出了字符串中的全部字符,还是不会自动有字符率结束字符。但字符串初始化自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多1个字节。所以只有③才是正确的。 4.2 填充题
1.根据变量定义\, a[][3]={1,2,3,4,5,6};\,b[4]=_____,a[1][2]
【解】系统规定,静态变量定义时,若末初始化,系统自动给定二进制代码全0的值。所以
26 / 80
态数组b的元素全为0,当然包括b[4]也为几静态数组a是二维数组,每行有三个元素,在初始化中结出了六个初值,所以数组a有2行。由于数组的元素按行顺序存储,并按行顺序初始化。前三个值是第一行,后三个值是第二行。a[1][2]是第二行的第三列元素,也是 a的最后一个元素,所以其值是6。
2.设有定义语句\,{2},{3}};\则a[l][l]值为_,a[2][1]的值为_。
【解】给二维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对哪些未给出初值的部分元素,系统自动置二进制代码全0的值。由于定义语句只给a[0][0]给定初值l、a[l][0]给定初值2、a[2][0]给定初值3。这样,其它元素都为0值。所以,a[1][1]= 0,a[2][1]= 0。
3.若在程序中用到\函数时,应在程序开头写上包含命令_____,若在程序中用到\函数时,应在程序开头写上包含命令______。
【解】putchar()是系统提供的头文件stdio.h中定义的宏,所以程序要使用它,必须写上包含命令:#include。函数strlen()是系统提供的字符串处理函数之一,字符串处理函数的函数原型说明和它们用到的有关常量、数据结构等,在系统提供的头文件tring.h中定义,所以使用该函数的程序应在程序开头写上包含命令并include。
4.下面程序的功能是输出数组s中最大元素的下标,请填空。 main() {int k, p ;
int s[]={1,-9,7,2,-10,3}; for(p=0, k=p;p<6; p++) if(s[p]>s[k])____________ printf(\,k); }
【解】为要寻找数组中的最大元素的下标,需先预设1个临时最大元素的下标,并顺序逐一考察数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考察了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考察是从首元素开始顺序向后继元素考察。程序中,存储临时最大元素下标的变量是k,变量p控制顺序考察的循环控制变量。当发现当前元素s[p]比临时最大元素s[k]更大时,应该用p更新k。所以在空框处应填入代码\=p;\。
5.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。 # include main()
{int i, j,_____________;
27 / 80
char str[]={\;
for(i=0,j=strlen(str); i 【解】颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量i和j, j是前端元素的下标, j是后端元素的下标, 交换以这两个变量值为下标的元素str和 str[j]。开始时,i的值为 0,j的值为字符率未元素的不标(字符串长度减1)。每次交换后,i增 1,j减1。继续交换的条件是str还位于str[j]的前面,即i { char b[17]={\; int c[64],d,i=0,base=16; long n; printf(\:n\;. scanf(\,&n): do { c=________;i++;n=n/base;} while(n!=0); printf(\:n\; for(--i; i>= 0;--i) {d=c; printf(\,b);} printf(\; 【解】程序中,字符数组b存储十六进制的 16个数字符,整型数组C存储泽出的十六进制数的各位数值.从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n除16 的余.得到它的十六进制的个位数,接着将n除以16。在n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第一个空框处可填代码nose或n。当n的十六进制数的个位、十位、百位等数字依次存放于数组C中后,就从最高位至最低位,参照数组c的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第二个空框处可填入代码[d]。 4.3 程序分析题 1.阅读程序,写出程序运行结果。, main() { static int a[][3]={9,7,5,3,l,2,4,6,8}; int i,j,sl=0,s2=0; 28 / 80 for(i=0; i<3;i++) for(j=0;j<3;j++) { if(i==j) s1=s1+a[j]; if(i+j== 2) s2=s2+a[j]; } printf(\, sl,s2); } 【解】已知数组。共有3行3列席一行依次是9,7,5;每二行是3,1,2;第三行是4,6,8。程序引用数组元素的游标变量是i和j,外循环控制变量i是数组的行下桥,内循环控制变量j是数组的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到S2。将行下标i和列下标j相同的元素累计到sl,sl=a[0][0]+a[l][1]+a[2][2]。将行下标i与列下标j的和为 2的元素累计到 s2,s2=a[0][2]+a[l][l]+a[2][0]。所以sl是18,s2是10。程序输出: 18 10 2.说明下列程序的功能。 main() { int i,j; float a[3][3],b[3][3],x; for(i=0;i<3;i++) for(j=0;j<3 ;j++) { scanf(\; a[j]= x; } for(i=0;i<3;i++) for(j=0;j<3;j++) b[j]=a[j]; for(i=0;i<3;i++) {printf(\; for(j=0;j<3;j++) printf(\,b[j]); } printf(\; } 【解】程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循 29 / 80 环是将数组a转置复制到数组b。程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。 3.写出下列程序的运行结果。 main() {static char a[]={\; int i,j,k; for( i=0;i<5;i++) { printf(\for(j= 0;j for(j=0;j<5 ;j++)printf(\,a[k]); } printf( \; } 【解】程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案: * * * * * * * * * * * * * * * * * * * * * * * * * 4.说明下列程序的功能。 main() { int i,j ; float a[3][3],b[3][3],c[3][3],x; for(i=0;i<3;i++) for(j=0;j<3;j++) { scanf(\,&x); a[j]= x; } for(i=0;i<3;i++) for(j=0;j<3;j++) {scanf(\,&x);b[j]=x; } 30 / 80