链接我放出来 是计算机能力挑战赛官方公众号发的题
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, 编译是将源代码转换为机器代码的过程,但它并不是生成可执行文件的唯一步骤
预处理(Preprocessing): 对源代码进行一些预处理操作,如宏替换、头文件包含等。
编译(Compilation): 将预处理后的代码转换成汇编代码。
汇编(Assembly): 将汇编代码转换成目标文件,这是机器代码的一种表现形式。
链接(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;
}
文章出处登录后可见!