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。
    
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供关于具体学校或课程的第四次上机内容。但是,我可以为您提供一些关于数据结构的基本知识和常见的上机题目类型。 数据结构是计算机科学中非常重要的一门课程,它研究如何组织和存储数据以及如何有效地操作和管理数据。第四次上机可能涉及以下内容之一: 1. 树和图的应用:树和图是常见的数据结构,可以用于解决各种实际问题,比如搜索、排序、最短路径等。在上机中,您可能需要实现树或图的基本操作,如插入、删除、遍历等。 2. 排序算法:排序是数据结构中的一个重要问题,常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。您可能需要实现其中一个排序算法,并对给定的数据进行排序。 3. 查找算法:查找是另一个常见的问题,常见的查找算法有线性查找、二分查找、哈希查找等。您可能需要实现其中一个查找算法,并根据给定的条件查找特定的数据。 4. 动态规划:动态规划是一种解决最优化问题的方法,它将问题分解为子问题,并通过保存子问题的解来避免重复计算。您可能需要使用动态规划来解决给定的问题,并实现相应的算法。 以上只是一些可能的内容,具体的上机要求可能会根据课程教学大纲和教师的要求而有所不同。如果您有具体的问题或需要更详细的帮助,请提供更多信息,我将尽力回答您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值