看前须知
第一次上机题汇总
填空题
-
下面程序段的运行结果是
char ch[ ] = “600”;
int a, s = 0;
for (a = 0; ch[a] >= ’0’ && ch[a] <= ’9’; a++)
s = 10 * s + ch[a] - ’0’;
printf("%d", s);【 正确答案: 600】 解析:以上程序实际上就是实现atoi的函数(把字符串转换为整数),理解之后很容易得到答案。
-
写出下述程序的输出结果
#include <stdio.h>
int func(int n)
{
if(n<=1)
return 1;
else
return (2+n*func(n-1));
}int main()
{
int x = 4;
printf("%d\n",func(x));return 0;
}【 正确答案: 58】 解析:简单递归,可以当成数学题来写,慢慢算,不难得到答案
-
给出下述程序的执行结果
#include <stdio.h>
long fib(int x)
{
switch(x)
{
case 0: return 0;
case 1:
case 2: return 1;
}
return (fib(x-1)+fib(x-2));
}
int main()
{
int x=6;
printf("%d\n",fib(x));return 0;
}【 正确答案: 8】 解析:简单递归,跟上题一样,可以当成数学题来写,慢慢算,不难得到答案
-
下面的函数invert的功能是将一个字符串的内容颠倒过来。请将函数补充完整。(所有答案填写在此空内,答案间以空格隔开)
void invert (char str [] )
{
int i,j,填空1______;
for(i=0,j=strlen(str)填空2_______;i<j;i++,j–)
{
k=str[i];
str[i]=str[j];
str[j]=k;
}
}【 正确答案: k -1】 解析:以上程序实现的是一个反转字符串的函数,故首先要确定字符串的首和尾,所以j=strlen(str)-1。由于函数下面出现k,所以在函数开头要定义k。
-
下列程序是否正确,如果正确给出输出结果,如果不正确,答案处填写“不正确”。
#include <stdio.h>
void func(char *q)
{
char a[]=“hello”;
q=a;
}
main()
{
char *p;
func§;
printf("%s\n",p);
}【 正确答案: 不正确】 解析:由于数组a是在函数内定义的,只可作用于函数内部,一旦回到主函数,数组a也随之无法访问。函数func的作用是让指针p指向a,使其可以访问a,但是由于这是浅层拷贝(浅层拷贝就是仅仅把指针向数组,深层拷贝则是用malloc给p申请空间,然后strcpy,或者memcpy拷贝所有内容),a无法访问后p也无效,故错误。
-
函数index(char s[],char t[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则返回-1。请将函数补充完整。
int index(char s[],char t[])
{
int i,j,k;
for(i=0;s[i]!=’\0’;i++)
{
for(j=i,k=0;填空1______&&s[j]= =t[k];j++,k++)
;
if(填空2_______)
return i;
}
return -1;
}【 正确答案: t[k]!='\0' t[k]= ='\0' 或 s[j]!='\0' t[k]= ='\0' 或 t[k]!=0 t[k]= =0 或 s[j]!=0 t[k]= =0 或 k<strlen(t) k= =strlen(t) 或 s[j]!='\0'&&t[k]!='\0' t[k]= ='\0' 或 t[k]!='\0' k= =strlen(t) 或 s[j]!='\0' k= =strlen(t) 或 s[j]!='\0'&&t[k]!='\0' k= =strlen(t) 或 t[k]!=0 k= =strlen(t) 或 s[j]!=0 k==strlen(t) 或 k<strlen(t) t[k]= ='\0' 或 k<strlen(t) t[k]= =0】(所有答案填写在此空内,答案间以空格隔开) 解析:填空1中的for循环是在完成匹配的目的,所以匹配得以进行的两个条件分别是匹配串t没有到末尾,以及s和t的匹配位置相同。填空2则是判断是否匹配成功,如果匹配串t匹配到末尾,则表示匹配成功。
-
函数squeez(char s[],char c)的功能是删除字符串s中所出现的与变量c相同的字符。
void squeez(char s[],char c)
{
int i,j;
for(i=j=0;填空1______;i++)
if(s[i]!=c)
填空2______;
s[j]=’\0’;
}【 正确答案: s[i]!='\0' s[j++]=s[i] 或 i<strlen(s) s[j++]=s[i]】(所有答案填写在此空内,答案间以空格隔开) 解析:这个函数实现的很妙,真的很妙。首先我们知道整个函数的操作都是在s上进行的,而且j<=i的(当没有相同字符的时候两者相等),所以是s[j]='\0'这部操作就是把s[j]作为s的结尾,由于要遍历整个s,所以填空1就是s[i]!='\0',由于当不与字符c相同时要实时更新s的结尾,所以s[j++]=s[i]。
-
下面的函数itoh(n,s)完成将无符号十进制整数转换成十六进制表示,并存入字符串数组s中。程序中用到的函数reverse(char s[])是一个将字符串置逆的函数。
void reverse(char s[])
{
int temp,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j–)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}void itoh(unsigned n,char s[])
{
int h,i=0;
do{
h=n%16;
s[i++]=(h<=9)?h+‘0’:h+‘A’_____;
}while((n/=16)!=0);
____;
reverse(s);
}【 正确答案: -10 s[i]='\0' 或 -10 s[i]=0】(所有答案填写在此空内,答案间以空格隔开) 解析:填空1就是把十六进制转化为十进制的字符形式,不难得到答案。填空2就是让s有结尾,不然之后的反转会出现问题。
-
下面程序的功能是将字符串 s 中的内容按逆序输出,但不改变串中的内容,
请选择填空(答案请填写所选择的两个字母,中间用空格格开,如A A的形式):
#include <stdio.h>
void inverp(char *a)
{
if ( __________ )
return;
inverp(a+1);
printf("%c", ___________ );
}
int main()
{
char s[10] = “hello!”;
inverp(s);return 0;
}Selection 1 :
(A) *a != ‘\0’
(B) *a != NULL
© *a == ‘\0’
(D) ! a * == 0Selection 2 :
(A) * (a-1)
(B) *a
© * (a+1)
(D) * (–a)【 正确答案: c b】 解析:填空1就是判断反转的字符串是否为空,注意是解引用,所欲必须是与'\0'有关的,所以选C。填空2注意是递归,由于是一个一个反转的,所以每进行一层递归,都要准备输出该位置的字母,最后递归回来,就可以完成反转的目的。
下面程序的功能是将已按升序排好的两个字符串a和b中的字符按升序并归到字符串c中。请选择填空将程序补充完整:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]=“acegikm”;
char b[]=“bdfhjlnpq”;
char c[80],*p;
int i=0,j=0,k=0;
while(a[i]!=’\0’&&b[j]!=’\0’)
{
if(a[i]<b[j]){}
else{}
}
c[k]=’\0’;
if(_______)p=b+j;
else p=a+i;
strcat(c,p);
puts©;
return 0;
}
填空1:
(A)c[k++]=a[i++];
(B)c[k++]=a[j++];
©c[k++]=b[i++];
(D)c[k++]=b[j++];
填空2:
(A)c[k++]=a[i++];
(B)c[k++]=a[j++];
©c[k++]=b[i++];
(D)c[k++]=b[j++];
填空3:
(A)a[i]= =’\0’
(B)a[j]= =’\0’
©b[i]= =’\0’
(D)b[j]= =’\0’
【正确答案: A D A】(所有答案填写在此空内,答案间以空格隔开)
解析:填空1和填空2就是在归并,注意a与i相关,b与j相关。填空3就是当a或b中有一个已经归并完了,把未归并完的追加就可以了。
选择题
-
下面程序段的运行结果是
char a[7]=“abcdef”,b[4]=“ABC”;
strcpy(a,b);
printf("%c",a[1]);
(A) a
(B) A
© b
(D) B【正确答案: d】 解析:就是拷贝再输出。
-
以下给字符数组str定义和赋值正确的是
(A)char str[10]; str = “China”;
(B)char str[] = “China”;
©char str[10]; strcpy (str, “abcdefghijklmn”);
(D)char str[10] = “abcdefghigklmn”;【正确答案: B】 解析:A.C语言不允许字符串直接用=进行拷贝 B.没有问题 C.数组开小了,会越界。 D.C语言不允许这么操作。
-
下面程序段的运行结果是
char c[]="\t\v\\0will\n";
printf("%d",strlen©);
(A)14
(B)3
©9
(D)字符串有非法字符,输出值不确定【正确答案: B】 解析:c中包含三个元素,\t \v \ 三个。
-
下述对C语言字符数组的描述中错误的是
(A) 字符数组可以存放字符串
(B) 字符数组的字符串可以整体输入,输出
© 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
(D) 不可以用关系运算符对字符数组中的字符串进行比较【正确答案: c】 解析:C语言不允许,可以用strcpy或memcpy
-
下面能正确进行字符串赋值,并且能确保字符串以’\0’结尾的操作是
(A) char s[5] = {“ABCDE”};
(B) char s[5] = {’A’, ’B’, ’C’, ’D’, ’E’};
© char *s; s = “ABCDE”;
(D) char *s; scanf("%s", s);【正确答案: c】 解析:A.如果数组s的容量大于5,那么A是对的,但是现在正好没有位置存放'\0'。 B.没有'\0'。 D.典型错误,没有给s申请空间,无法对s进行读入赋值。
-
有下面的程序段:
char a[3], b[] = “China”;
a = b;
printf("%s", a);
则(A) 运行后将输出China
(B) 运行后将输出Ch
© 运行后将输出Chi
(D) 编译出错【正确答案: d】 解析:数组越界。
-
阅读程序,选择程序的运行结果:
#include <stdio.h>
int try(int );
int main()
{
int x;
x = try(5);
printf("%d\n",x);
return 0;
}
int try(int n)
{
if(n>0)
return ( n*try(n-2));
else
return (1);
}
A.15
B.120
C.1
D.前面的答案均不正确【正确答案: A】 解析:简单递归。
-
下面程序的功能是将字符串s中所有的字符’c’删除。请选择填空。
#include<stdio.h>
main()
{
char s[80];
int i,j;
gets(s);
for(i=j=0;s[i]!=’\0’;i++)
if(s[i]!=’c’)
s[j]=’\0’;
puts(s);
}(A)s[j++]=s[i];
(B)s[++j]=s[i];
©s[j]=s[i];j++
(D)s[j]=s[i]【正确答案: A】 解析:填空题第七题一样。
-
若有说明: char *language[] = {“FORTRAN”, “BASIC”, “PASCAL”, “JAVA”, “C”};则以下不正确的叙述是
(A) *(language+2) 表示字符串"PASCAL"的首地址
(B) *language[2]的值是字母P
© language是一个字符型指针数组,它包含5个元素,每个元素都是一个指向字符串的指针
(D) language包含5个相同长度的数组【正确答案: d】 解析:答案不难选出来,但是注意AB的区别,language[2]=*(language+2)
-
设n是描述问题规模的非负整数,下列程序片段的时间复杂度是
x=2;
while(x<n/2)
x=2*x;
A.0(1og2n)
B.0(n)
C.0(nlog2n)
D.0(n2)
【正确答案: A】 解析:解方程 2^x^ = n。