计算机能力挑战赛–程序设计C语言–21年真题解析–超详细

链接我放出来 是计算机能力挑战赛官方公众号发的题

https://github.com/kismetfor/ComputerChallengeRace/blob/main/2/C%E8%AF%AD%E8%A8%80.xlsx

选择题

1

C语言中有语句:  char a[]=”\0abc\012345″; 则数组 a所占的内存空间的字节数为( )

\0 a b c \012 3 4 5 \0 九个字符 9字节

‘\0’是八进制的转移字符

C语言中,以反斜杠开头的是转义字符,转义字符后面可以跟8进制数来表示一个字符,其形式为:\nnn,n的个数最多三位,最小一位,按最大匹配进行解释。

2

若char类型占用1个字节,有char ch[]={“Happy\0 2021”};,则数组ch在内存中所占字节数是( )

12字节 H a p p y \0 2 0 2 1 \0 中间还有个空格 

3

C语言中,有语句int a[3][4]={ {1},{1,2},{1,2,3}};则下面描述正确的是()

语句有语法错误。

元素a[0][0] 初始值为1

元素a[1][1] 初始值为1

数组中所有元素初始值为3

 如图,选B

4

有如下程序代码:
void f(double a[20]){
}
其中f函数形参a所占的内存是()字节

a是数组名, 数组名表示地址, 地址是4/8个字节

5

以下对结构体类型Score中成员score赋值的不正确引用是( )
int x;
struct  Score
 {  char name[20];
    int   score;
  }a,*p;
  p = &a;

x=a.score;

x=&a.score;

x=p->score;

x=(*p).score

直接选B 

6

f函数代码如下
void f(char s[]){
 char *p=s;
 char *q=s;
 char t;
 while(*++q);
 q–; 
 while(p<q){
  t=*p;
  *p=*q;
  *q=t;
  p++;
  q–;
 }
}
函数代码的功能是()

将字符数组s升序排序

将字符数组s降序排序

将字符数组s按原有顺序颠倒

将字符数组s的字符打乱

 while(*++q);
 q–; 这段因为\0的ASCLL码值为0,因此等到q指向\0时,跳出while, 再q–, 就是指向字符串中最后一个字符, 此时p指向第一个,q指向最后一个, 进入第二个while, 满足条件交换,当左边指针到右边指针右边或者重合时,停止交换,可以看出是倒序操作

7

以下叙述正确的是()。

在C程序,main函数调用main函数有语法错误

C程序的一行只能写一条语句

‘对一个C程序进行编译就可以生成可执行文件

C程序中的注释可以放在某条语句前面或后面

没有语法错误,但是会死循环

B可以

对于C, 编译是将源代码转换为机器代码的过程,但它并不是生成可执行文件的唯一步骤

  1. 预处理(Preprocessing): 对源代码进行一些预处理操作,如宏替换、头文件包含等。

  2. 编译(Compilation): 将预处理后的代码转换成汇编代码。

  3. 汇编(Assembly): 将汇编代码转换成目标文件,这是机器代码的一种表现形式。

  4. 链接(Linking): 将目标文件与其他必要的目标文件(比如库文件)合并,生成最终的可执行文件。

注释无关程序执行,选D

8

下面选项中,不合法的C语言转义字符的是()。

‘\012’

‘\n’

‘\999’

‘\x30’

\0表示八进制

\x表示十六进制

那么 对于C 9超过了八进制(0-7) 范围选C 

9

关于C程序中float和double类型数据在内存中所占字节数,下列描述正确的是()。

float为2字节

double为4字节

dobule为8字节

由程序员定义其长度

float四字节 double八字节 

10

C程序中以下叙述不正确的是()。

语句char x=’\077′;则变量x包含1个字符

表达式2021+’a’值的数据类型为字符型

表达式sizeof(double)是一个整型表达式

char类型数据在内存中存储形式是ASCII码

A正确 表示一个八进制的数

B超出ASCLL码范围

C返回size_t类型的数据 在C语言中,整型表达式是一种常见的表达式类型,它由整型变量、常量和运算符组成,用于进行整数计算和值的求取。

D 存储的是ASCLL码值

11

C程序中,已有语句int year;int month;int day;
scanf(“%d-%d-%d”,&x,&y,&z); ,要求使用变量year,month,day的值分别为2021,12,19,则正确的数据输入方式是()。

2021 12 19

2021

官方给出的题单丢失数据了….

正确答案是 2021-12-19

12

运行语句int x=2021,y=12,z=19,flag=0;
flag=(x,y,z),变量flag的取值为()。

2021

12

19

0

逗号表达式,从左往右算,最后得到的结果是最右边的

那么就是flag = z = 19

 13

f函数代码如下:
int f(char s[]){
 int t=0;
 char *p=s;
 char ch;
 while(ch=*p++){
  printf(“%c”,ch);
  if(isdigit(ch)>0)
   t=10*t+ch-‘0’;
  else
   break;
 }
 return t;
}
该函数的功能是()

将字符串s转成整型,并返回其转换后的数值

将字符串s中的数字去除

将字符串s中非数字去除

将字符串s中前面的数字转换成数字,遇到非数字停止转换,并返回转换后的值

 while(ch=*p++)遍历每个字符,遇到\0退出循环

printf(“%c”,ch);先打印字符

if(isdigit(ch)>0) 如果是

isdigit(ch) 函数是C标准库中的函数,用于判断字符是否是数字字符。如果 ch 是数字字符,则返回非零值(true),否则返回0(false)。

将t 乘以10,然后加上当前字符 ch 对应的数字值。

假设字符串 s 中是 “123”,初始时 t 是0。在第一次循环时,字符 ‘1’ 被转换为整数1,然后乘以10,得到10,再加上字符 ‘2’ 对应的整数值2,结果是12。接着,再乘以10,得到120,再加上字符 ‘3’ 对应的整数值3,最终结果是123。

这样,函数就将字符串中前面的数字转换成了整数。可以单独输出

否则

一旦遇到非数字

跳出循环

那么就只遍历了字符串中第一个非数字字符前面的所有数字 并将其单独输出

14

已有语句int year=2021,m=60; 下列语句编译提示出错的是()。

if(year%=m);

if(year%=m) printf(“%d”,year);

if(year%m=0)printf(“%d”,year);

if{year%=m!=0}printf(“%d”,year);

第一个直接赋值,为真

B选项 赋值再操作 跟A一样

C选项赋值为0, 一定进入不了, 但是不会出错

D选项  使用大括号而非括号,

15

已有定义int a,b,c;则表达式x=(a = 10,b = 20,b++,a+b)的值为()

逗号表达式 

从左往右计算,得到的值是最右边的

a = 10

b  = 20

b++ b  =21

a+b = 31

那么x = 31

操作题

16

输入两个整数x,y输出x,y中各位数重新组合可能形成的最小的数

输入:输入:只有一组,每组两个长度不超12位的正整数
输出:用x,y中的所有的数字位重新组合能形成最小的数(如果首位是0也要输出)


样例输入:
100 423

样例输出
001234

//
//  main.c
//  16
//
//  Created by rain on 2023/11/23.
//

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int a[24];
int weishu1;
int weishu2;

void shuchihua(void){
    for (int i=0; i<24; i++) {
        a[i] = 11;
    }
}

int weishu(int n){
    int ret = 1;
    while (n /= 10) {
        ret++;
    }
    return ret;
}

void print(void){
    for (int i=0; i<weishu1+weishu2; i++) {
        printf("%d", a[i]);
    }
    printf("\n");
}



int compare(const void* a, const void* b){
    return (*(int*)a - *(int*)b);
}

void test(void){
    int x, y;
    scanf("%d %d", &x, &y);
    weishu1 = weishu(x);
    weishu2 = weishu(y);
    int i = 0;
    
    int n = x;
    for (i=0; i<weishu1; i++) {
        a[i] = n/pow(10, weishu1-1-i);
        n -= a[i]*pow(10, weishu1-1-i);
    }
    
    n = y;
    int j = 0;
    for (; i<weishu1+weishu2; i++) {
        a[i] = n/pow(10, weishu2-1-j);
        n -= a[i]*pow(10, weishu2-1-j);
        j++;
    }
    
    qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), compare);
    print();
}


int main(int argc, const char * argv[]) {
    shuchihua();
    test();
    return 0;
}

17

写个一个程序统计从1到N这N个数中,以下三个条件都满足的数字x个数
1. x是一个素数(如2,3,5,7….)
2. x是一个对称的数 (如1,11,121,都是对称的数)
3. x的所有数字和恰好是7的倍数(如7,16,25,34,43,61,70,115,)

输入:一个整数N(1<=N<=10000)
输出: 满足这三个条件的个数

样例输入:
20
样例输出
1

样例解释:
从1~20中素数有2,3,5,7,11,13,17,19,再结合条件2可以看到对称的数只有
2 3 5 7 11,又因为条件3,所以只有7满足要求,所以输出个数为1

18

输入N个人的语(chinese)数(math)外(english)考试成绩,请输出总分最低的学生和单科最低的学生,相同的成绩也要输出(按照原来的顺序)

输入: 一个整数n表示n个人的考试成绩(1<n<=1000),随后有n行,每行依次是这个学生的姓名,语文成绩,数学成绩,外语成绩(都是整数)
输出: 首先输出语文最低的人(可以并列),然后是数学最低的, 外语最低的,最后输出总分最低的人(可以并列)具体格式参考输出样例

输入样例
5
tom    100  99  98
alice  100 100 100
peter  89   89 100
jerry  60  100 100
cat    60   50  50


输出样例
lower chinese:
jerry(60)
cat(60)

lower math:
cat(50)

lower english:
cat(50)

lower score:
cat(160)

5
tom 100 99 98
alice 100 100 100
peter 89 89 100
jerry 60 100 100
cat 60 50 50
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
	char name[10];
	int chinese;
	int math;
	int english;
	int sum;
} Stu;

int n;
Stu a[100];

void init(void) {
	for (int i = 0; i < 100; i++)
	{
		a[i].chinese = 999;
		a[i].math = 999;
		a[i].english = 999;
		a[i].sum = 999;
	}
}

int compare_chinese(const void* a, const void* b) {
	return ((Stu*)a)->chinese - ((Stu*)b)->chinese;
}

int compare_math(const void* a, const void* b) {
	return ((Stu*)a)->math - ((Stu*)b)->math;
}

int compare_english(const void* a, const void* b) {
	return ((Stu*)a)->english - ((Stu*)b)->english;
}

int compare_sum(const void* a, const void* b) {
	return ((Stu*)a)->sum - ((Stu*)b)->sum;
}

void lower_chinese(void) {
	qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), compare_chinese);
	printf("lower chinese:\n");
	for (int i = 0; i < n; i++)
	{
		if (a[i].chinese == a[0].chinese) {
			printf("%s(%d)\n", a[i].name, a[i].chinese);
		}
	}
}

void lower_math(void) {
	qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), compare_math);
	printf("lower math:\n");
	for (int i = 0; i < n; i++)
	{
		if (a[i].math == a[0].math) {
			printf("%s(%d)\n", a[i].name, a[i].math);
		}
	}
}

void lower_english(void) {
	qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), compare_english);
	printf("lower english:\n");
	for (int i = 0; i < n; i++)
	{
		if (a[i].english == a[0].english) {
			printf("%s(%d)\n", a[i].name, a[i].english);
		}
	}
}


void lower_sum(void) {
	qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), compare_sum);
	printf("lower score:\n");
	for (int i = 0; i < n; i++)
	{
		if (a[i].sum == a[0].sum) {
			printf("%s(%d)\n", a[i].name, a[i].sum);
		}
	}
}

void test(void) {
	init();
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s %d %d %d", a[i].name, &a[i].chinese, &a[i].math, &a[i].english);
		a[i].sum = a[i].chinese + a[i].math + a[i].english;
	}
	lower_chinese();
	lower_math();
	lower_english();
	lower_sum();
}

int main() {
	test();
	return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐