BUAA(2021春)第一次上机选择+填空(含解析)

48 篇文章 154 订阅

看前须知

要点介绍和简要声明.

第一次上机题汇总

扩展字符A——strchr的灵活使用.

表达式求值.

小数形式与科学计数法转换(简)——分类讨论一定要有逻辑.

超长正整数的减法(高精度减法)+其他三种高精度运算.

全排列数的生成——DFS(深度优先遍历)+回溯 秒杀本题.

填空题

  1. 下面程序段的运行结果是
    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的函数(把字符串转换为整数),理解之后很容易得到答案。
    
  2. 写出下述程序的输出结果

    #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】 
     解析:简单递归,可以当成数学题来写,慢慢算,不难得到答案
    
  3. 给出下述程序的执行结果
    #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】 
     解析:简单递归,跟上题一样,可以当成数学题来写,慢慢算,不难得到答案
    
  4. 下面的函数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。
    
  5. 下列程序是否正确,如果正确给出输出结果,如果不正确,答案处填写“不正确”。
    #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也无效,故错误。
    
  6. 函数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匹配到末尾,则表示匹配成功。
    
  7. 函数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]。
    
  8. 下面的函数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有结尾,不然之后的反转会出现问题。
    
  9. 下面程序的功能是将字符串 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 * == 0

    Selection 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中有一个已经归并完了,把未归并完的追加就可以了。

选择题

  1. 下面程序段的运行结果是
    char a[7]=“abcdef”,b[4]=“ABC”;
    strcpy(a,b);
    printf("%c",a[1]);
    (A) a
    (B) A
    © b
    (D) B

     【正确答案: d】
     解析:就是拷贝再输出。
    
  2. 以下给字符数组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语言不允许这么操作。
    
  3. 下面程序段的运行结果是
    char c[]="\t\v\\0will\n";
    printf("%d",strlen©);
    (A)14
    (B)3
    ©9
    (D)字符串有非法字符,输出值不确定

     【正确答案: B】
     解析:c中包含三个元素,\t   \v   \   三个。
    
  4. 下述对C语言字符数组的描述中错误的是
    (A) 字符数组可以存放字符串
    (B) 字符数组的字符串可以整体输入,输出
    © 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
    (D) 不可以用关系运算符对字符数组中的字符串进行比较

     【正确答案: c】    
     解析:C语言不允许,可以用strcpy或memcpy
    
  5. 下面能正确进行字符串赋值,并且能确保字符串以’\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进行读入赋值。
    
  6. 有下面的程序段:
    char a[3], b[] = “China”;
    a = b;
    printf("%s", a);

    (A) 运行后将输出China
    (B) 运行后将输出Ch
    © 运行后将输出Chi
    (D) 编译出错

     【正确答案: d】 
     解析:数组越界。
    
  7. 阅读程序,选择程序的运行结果:
    #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】
     解析:简单递归。
    
  8. 下面程序的功能是将字符串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】
     解析:填空题第七题一样。
    
  9. 若有说明: 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)
    
  10. 设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。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值