2025年第七届全国高校计算机能力挑战赛(C语言) - 模拟练习

该文章已生成可运行项目,

解析仅供参考!!!

单项选择题:

第1题:3.00分(逗号表达式)

下面程序的输出结果是()。

#include<stdio.h>

int f(int n){

 int s=0;

 while(n>0){s+=(n%10)*(n%10),n/=10;}

 return s;

}

int main( ){

    int k=1234567;

    while(k>100)k=f(k);

 printf("%d",k);     

 A:28        B:15         C:17        D:36

(正确答案:C)

分析:第一次进入f函数 s = 1^2 + …… 7^2 = 140        k = 140        140 > 100继续while(k>100)

第二次进入f函数 s = 1^2 + 4^2 + 0 = 17   k = 17   17<100主函数循环结束

第2题:3.00分 (递归)

已知下面函数代码,那么f(5)的值是()。

#include<stdio.h>

int f(int x){

    if(x<=2) return x;

    else    return 2*f(x-1)+f(x-2);

}

 A:16        B:29         C:19        D:36

(正确答案:B)

分析:依次将值代入 算出f(3)和f(4)即可

第3题:3.00分 (转义字符)

下列哪段代码输出的不是“jitiaosai. ”()

 A:
#include<stdio.h>
#include<string.h>
int main(){
    char t[20]="jitiaosai\0";
    printf("%s.",t);
}

 B:
#include<stdio.h>
#include<string.h>
int main(){
    char t[20]="jitiaosai\000000";
    printf("%s.",t);
}

 C:
#include<stdio.h>
#include<string.h>
int main(){
    char t[20]="jitiaosai\0999";
    printf("%s.",t);
}

 D:
#include<stdio.h>
#include<string.h>
int main(){
    char t[20]="jitiaosai\999";
    printf("%s.",t);
}

(正确答案:D)

第4题:3.00分 (转义字符)

以下程序段的输出结果是()

char s[]= "\\101\101101\\";

printf("%d,%d",strlen(s),sizeof(s));

 A:6,7         B:9,10        C:8,9         D:7,8

(正确答案:B)

分析:\\      1      0      1      \101    1     0     1       \\      ('\0')

第5题:3.00分 (循环条件)

以下程序的输出结果是()。

#include<stdio.h>

int main( ){

    int i;

    for(i=1;i<10;i++){

        if(i%2)     { printf("3");continue;}

        else if(i%3){ printf("2");continue;}

        printf("0");

    }

    return 0;

}

 A:323230322        B:323230323         C:323230333         D:323232323

(正确答案:B)

第6题:3.00分 (操作符)

表达式a+++b与下面的哪个表达式等价()

 A:(a++)+(b)

 B:a+(++b)

 C:a+(+(+b))

 D:++a+b

(正确答案:A)

第7题:3.00分 (字符串)

以下程序的输出结果是()。

#include<stdio.h>

#include<string.h>

int main(){

    char jts[50][50],p[50]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    int i;

 for(i=0;i<26;i++){

     strcpy(jts[i],p+i);

     if(i%2+i%3!=0) continue;

     puts(jts[i]);

 }

    return 0;

}

 A:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
HIJKLMNOPQRSTUVWXYZ
OPQRSTUVWXYZ
VWXYZ
Z

 B:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
KLMNOPQRSTUVWXYZ
STUVWXYZ
XYZ
Z

 C:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
GHIJKLMNOPQRSTUVWXYZ
MNOPQRSTUVWXYZ
STUVWXYZ
YZ

 D:
CDEFGHIJKLMNOPQRSTUVWXYZ
IJKLMNOPQRSTUVWXYZ
OPQRSTUVWXYZ
WXYZ
YZ

(正确答案:C)

分析:strcpy函数 puts函数 和 操作符优先级

注意这里的操作符优先级 :    if(i%2+i%3!=0) continue;  

第8题:3.00分 (进制转换)

下面程序的输出结果是()。

int main( ){

    int x=0531;

    do{

        printf("%d",x%10); 

    }while(x/=10);

}

 A:135         B:531         C:345         D:543

(正确答案:D)

分析:0开头表示八进制  0531₈ = 5×8² + 3×8¹ + 1×8⁰ = 320 + 24 + 1 = 345₁₀

第9题:3.00分 (二维数组)

下列定义二维数组的语句,不正确的是()。

 A:
int a[][3]={};

 B:
int a[3][3]={0};

 C:
int a[][3]={0,0};

 D:
int a[2][3]={1},{2};

(正确答案:D)

第10题:3.00分 (字符串)

当输入为"ILOVECHINA?"时(输入不包括双引号),下面程序的执行结果是()。

#include<stdio.h>

int main(){

    char c;int k=0;

    c=getchar();

    while((c=getchar())!='?')

     putchar(++c+k++);

    return 0;

}

 A:MQXIHMPWJ

 B:MQYIHNPVJ

 C:NQYIHNQVJ

 D:MPYIHNQVK

(正确答案:B)

分析:ASCII码表

第11题:3.00分 (指针)

如有定义 int a[100]; 且已知该数组的首地址为62FC90(地址用十六进制表示),那么数组元素 a[5] 的首地址为()

 A:62FCA4

 B:62FC95

 C:62FCB9

 D:62FCA6

(正确答案:A)

第12题:3.00分 (循环条件)

已知有定义“int i,j,k;”,那么执行下面程序段后,k的值是()。

for(k=0,i=20;i;i--){

   if(i%3) continue;

    for(j=0;j<20;j++){

       if(!j%3) continue;

     ++k;

 }

}

 A:84        B:114         C:42         D:24

(正确答案:B)

分析:i的取值为: 3 6 9 12 15 18(0为假所以取不到) ! 的优先级高于 %,所以 !a % b 等价于 (!a) % b                 !0 = 1    1%3为真 continue 其他均为假 ++k 即每次k加19次 19*6 = 114

第13题:3.00分 (字符串)

以下程序的功能是:输入正奇数n,输出由n行由“*”组成的字符图形。

#include<stdio.h>

void f(int n,char c){

int i;

for(i=1;i<=n;i++) putchar(c);

}

int main(){

int n,i;

scanf("%d",&n);

for(i=1;i<=n;i++){

f(i-1,' ');

f(【空白】,'*');

printf("\n");

}

return 0;

}

例如输入7时,输出如下图形。

为使程序正确,题目中的【空白】处,应填入以下哪个代码()。

 A:2*n-i         B:2*n+1-2*i         C:3*n-2*i         D:n+i-1

(正确答案:B)

分析:数出前几行的数量 直接代值到答案 排除即可

第14题:3.00分 (赋值)

已知int x=100,y=200,z=300;以下语句执行后x,y,z的值是()。

#include<stdio.h>

int main(){

int x=100,y=200,z=300;

if(x>y)z=x;x=y;y=z;

printf("x=%d,y=%d,z=%d",x,y,z);

}

 A:x=200,y=300,z=300        

 B:x=100,y=300,z=300

 C:x=100,y=200,z=300

 D:x=100,y=200,z=200

(正确答案:A)

分析:if的作用范围

第15题:3.00分 (操作符)

能正确表示“x属于区间[4,6)或(9,24)”的是()。

 A:(a>=4)&&(a<=6)&&(a>=9)||(a<=24)

 B:(a>=4)&&(a<6)||(a>9)&&(a<24)

 C:(a>=4)&&(a<=6)||(a>9)&&(a<24)

 D:(a>=4)||(a<=6)&&(a>9)||(a<24)

(正确答案:B)

编程题:

第16题:10.00分(进制转换)

题目描述

进制(进位制)是数学里数字系统中的一个概念,是一种记数方式,可以用有限的数字符号表示所有的数值。

可使用数字符号的个数称为基数(或底数),基数为X,即可称X进制。

由于人类的双手共有十根手指的特点,故在人类自发采用的进位制中,最常用的是十进制。十进制使用10个阿拉伯数字0、1、2、3、4、5、6、7、8、9进行记数,逢十进一。除了十进制,生活中觉的其它进制有十二进制(一打是12个)、60进制(1分钟60秒、1小时60分)等。

计算机科学中,硬件中的元器件通常具有两个不同稳定状态。例如,电路中某通路电流的有无,某一节点电压的高低,晶体管的导通和截止等。所以在计算机中的信息和计算通常用二进制方法表示,数据在处理过程中也常常用八进制或十六进制表示。

二进制的基数是2,使用0、1两个数字记数,逢2进1。

八进制的基数是8,使用0、1、2、3、4、5、6、7八个数字记数,逢8进1。

十六进制的基数为16,使用数字0到9以及字母A到F(表示十进制中的10到15)十六个数字记数,逢十六进一。

现在已知在X星球中采用19进制进行记数,使用0-9和A-I(表示十进制中的10到18)十九个数字,逢十九进一。

请你编程实现十进制和十九进制之间的转换。

运行条件

总时限:5000 毫秒
单组时限:1000 毫秒

总内存:320 MB
单组内存:64 MB

输入格式

两个整数X和Y,第一个整数X是十进制的10或19,代表后一个数是X进制整数,一个空格之后是另一个X进制的正整数Y(其中若有字母数字均为大写,整数大小不超过int型数据的表示范围)。

输出格式

如果输入的X是10,请你将Y转换成19进制输出(若涉及字母数字,均为大写);
如果输入的X是19,请你将Y转换成10进制输出。
如果输入的X不是10或19,或者输入的整数Y不是X进制整数(整数中出现非X进制字符),输出:“DATA ERROR!” (符号为英文符号,DATA和ERROR之间有1个空格,全部为大写字母,字符串最后保留英文符号”!”,请按照样例输出,不要加额外字符)。

输入输出样例1:输入输出示例仅供调试,后台判题数据不包含示例

输入样例1:
10 10000
输出样例1:
18D6

输入输出样例2:输入输出示例仅供调试,后台判题数据不包含示例

输入样例2:
15 12345
输出样例2:
DATA ERROR!

//不会这题 由AI生成 
#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* 判断字符 c 在 base 进制下是否合法 */
int valid(char c, int base) {
    if (isdigit(c)) return (c - '0') < base;
    if (base == 19 && c >= 'A' && c <= 'I') return 1;
    return 0;
}

/* 19 进制字符 → 数值 */
int val(char c) {
    if (isdigit(c)) return c - '0';
    return c - 'A' + 10;   // A→10 … I→18
}

/* 数值 → 19 进制字符 */
char toChar(int v) {
    if (v < 10) return v + '0';
    return v - 10 + 'A';   // 10→A … 18→I
}

int main(void) {
    int X;
    char Y[64];          // 题目说不超过 int 范围,够用
    if (scanf("%d %s", &X, Y) != 2) {          // 基本读入失败
        printf("DATA ERROR!\n");
        return 0;
    }

    /* 情况 1:X 本身不合法 */
    if (X != 10 && X != 19) {
        printf("DATA ERROR!\n");
        return 0;
    }

    int len = (int)strlen(Y);

    /* 情况 2:检查 Y 是否当前进制合法 */
    for (int i = 0; i < len; i++)
        if (!valid(Y[i], X)) {
            printf("DATA ERROR!\n");
            return 0;
        }

    /* 主逻辑 */
    if (X == 10) {                  // 10 → 19
        long long num = 0;
        for (int i = 0; i < len; i++)
            num = num * 10 + (Y[i] - '0');

        if (num == 0) {             // 特判 0
            printf("0\n");
            return 0;
        }

        char out[64];
        int cnt = 0;
        while (num) {
            out[cnt++] = toChar(num % 19);
            num /= 19;
        }
        for (int i = cnt - 1; i >= 0; i--)
            putchar(out[i]);
        putchar('\n');
    }
    else {                          // 19 → 10
        long long num = 0;
        for (int i = 0; i < len; i++)
            num = num * 19 + val(Y[i]);
        printf("%lld\n", num);
    }

    return 0;
}

第17题:15.00分(多项式)

运行条件

总时限:5000 毫秒
单组时限:1000 毫秒

总内存:320 MB
单组内存:64 MB

输入格式

输入数据分为3行,第2行是运算符+或-,表示加法和减法运算。
第1行和第3行分别代表一个关于X的多项式。
每个多项式中以两个整数为一组表示多项式中的一项,前一个是该项的系数,后一个是该项的指数,指数均为非负整数,当读入的两个整数都为-1时表示该多项式读入结束。
所有测试数据及运算结果保证系数不超过int型范围,最大指数不超过50,多项式项数不超过100项。

输出格式

计算两个多项式相加或相减的结果,并且在一行中输出运算结果。要求对结果的同类项进行合并,并且按指数降序输出,系数为0的项不输出。
多项式输出的格式请参考输出样例,每一项基本上以“ax^n”的形式输出,a为系数n为指数,x为小写。如果第1项系数为正数,不输出加号;如果第1项系数为负数,系数输出减号;如果非常数项系数是1或-1,则这个1不输出;常数项只输出系数;1次项不输出指数部分的^1。

//仅供参考
int main(void)
{
	int arr1[51] = { 0 }; 
	int arr2[51] = { 0 };
	int result[51] = { 0 };
	
	int coef; //系数
	int	exp;  //指数
	//第一行
	while (1)
	{
		scanf("%d %d", &coef, &exp);
		if (coef == -1 && exp == -1)
		{
			break;
		}
		arr1[exp] += coef;  //指数相同的先相加求和
	}

	//第二行
	char sign = '+';
	scanf(" %c", &sign); //空格会跳过所有空白字符(空格、换行、制表符)。

	//第三行
	while (1)
	{
		scanf("%d %d", &coef, &exp);
		if (coef == -1 && exp == -1)
		{
			break;
		}
		arr2[exp] += coef;  //指数相同的先相加求和
	}

	//合并运算
	for (int i = 0; i <= 50; i++)
	{
		if (sign == '-')
		{
			result[i] = arr1[i] - arr2[i];
		}
		else
		{
			result[i] = arr1[i] + arr2[i];
		}
	}
	
	//打印输出
	int First = 1; //首系数符号判断为 以及结果判断
	for (int i = 50; i >= 0; i--) //从高次到低次打印
	{
		if (result[i] == 0)
		{
			continue;
		}

		coef = result[i]; //将系数和指数重新分离
		exp = i;
		if (First) //判断首系数符号  +号省略 -号打印
		{
			if (coef < 0)
			{
				printf("-");
			}
			First = 0; 
		}
		else
		{
			if (coef > 0)
			{
				printf("+");
			}
			else
			{
				printf("-");
			}
		}

		int cmp_coef = coef > 0 ? coef : -coef; //将负数变为正数 由于前面已经将负数的符号打印了
		if (exp == 0)  
		{
			printf("%d", cmp_coef);
		}
		else if(exp == 1)
		{
			if (cmp_coef != 1)
			{
				printf("%d", cmp_coef);
			}
			printf("x");
		}
		else
		{
			if (cmp_coef != 1)
			{
				printf("%d", cmp_coef);
			}
			printf("x^");
			printf("%d", exp);
		}
	}

	if (First) //result[i]全为0 
	{
		printf("0");
	}
	return 0;
}

第18题:15.00分(牛牛)

题目描述

“牛牛”是一种简单却又非常有意思的棋牌游戏,又称“斗牛”。最早起源于我国广东、广西和湖南三省。牛牛游戏采用一副扑克牌其中的52张(除去大小王)。每位玩家拿到5张牌,根据游戏规则进行排列组合,依次进行大小比较从而决定胜负。

牌型比较:牛牛>牛9>牛8>牛7>牛6>牛5>牛4>牛3>牛2>牛1>无牛。

牌型规则:由于每个地方有不同的玩法,所以这里介绍的牛牛游戏的规则是大概规则。

1.A为1点,J、Q、K都为10点,其他按牌面数字点数计算。

2.任意3张牌之和为10的整数倍数,称为有牛。如果另外2张牌之和也为10的整数倍数,称为“牛牛”,如果另外2张牌之和不是10的倍数,则根据这2张牌之和的个位数称为“牛几”。例如(4,6,Q,9,9)牌型为牛8、(4,6,Q,9,A)牌型为牛牛。

3.任意3张牌之和都不能为10的倍数,则判定该副牌无牛,例如(7,8,A,4。J)。

运行条件

总时限:5000 毫秒
单组时限:1000 毫秒

总内存:320 MB
单组内存:64 MB

输入格式

输入包括多组数据,每组数据在单独一行中包括5张扑克牌,每张扑克牌为2、3、4、5、6、7、8、9、10、J、Q、K、A之一,每两张牌之间没有空格。

输出格式

输出该组牌最大牌型的牌型名称,例如:牛牛输出:DOUBLE BULL,牛8输出BULL 8,无牛输出:NO BULL。

输入输出样例1:输入输出示例仅供调试,后台判题数据不包含示例

输入样例:
AAA10K
AA8210
1069AQ
461099
45Q10A
78A4J
输出样例:
NO BULL
BULL 2
BULL 6
BULL 8
DOUBLE BULL
NO BULL

输入输出样例2:输入输出示例仅供调试,后台判题数据不包含示例

输入样例:
22226
33344

输出样例:
BULL 4
BULL 7

//仅供参考  题目分析: 
//#任意3张牌之和为10的整数倍数,称为有牛
//#5张牌 %10 = 0 牛牛
//#任意3张牌之和都不能为10的倍数,则判定该副牌无牛
//输入字符10 要合在一起   A->1   J/Q/K ->10 

int GetValue(char c)
{
	if (c == 'J'||c == 'Q'||c == 'K')
	{
		return 10;
	}
	else if (c == 'A')
	{
		return 1;
	}
	else
	{
		return (c - '0');
	}
}

int main(void)
{
	char input[20] = {0}; //输入数组 
	while (scanf("%s", input) == 1) //输入5张牌
	{
		int card[5] = { 0 }; //装牌的值
		int len = strlen(input); 
		int p = 0; //位置
		for (int i = 0; i < len && p < 5; i++)  //合并 ‘1’‘0’ -> 10
		{
			if (input[i] == '1' && input[i + 1] == '0')
			{
				card[p++] = 10;
				i ++;
			}
			else
			{
				card[p++] = GetValue(input[i]); //将输入的字符转换为整形 方便后续计算
			}
		}


		int bull_Flag = 0; //是否有牛的标志  置1表示有牛
		int bull_num = 0;  //牛几
		for (int i = 0; i < 5 && !bull_Flag; i++)
		{
			for (int j = i + 1 ; j < 5 && !bull_Flag; j++)
			{
				for (int k = j + 1; k < 5 && !bull_Flag; k++)
				{
					if ((card[i] + card[j] + card[k])%10 == 0)
					{
						bull_Flag = 1; //有牛
						for (int m = 0; m < 5; m++)
						{
							if(m != i && m != j && m != k) //减少相加次数
							bull_num += card[m]; //剩余 2 张和
						}
						bull_num %= 10;
					}
				}
			}
		}

		//输出
		if (!bull_Flag)  //无牛
		{
			printf( "NO BULL\n");
		}
		else if(bull_num == 0) //牛牛
		{
			printf( "DOUBLE BULL\n" );
		}
		else
		{
			printf("BULL %d\n", bull_num );
		}
	}
	return 0;
}

第19题:15.00分(加密|解密)

题目描述

X国的情报部门之间在传递信息时采用替换加密法对所有信息进行加密处理。替换加密法是一种用一个字符替换另一个字符的简单加密方法。具体算法如下:

原始字符:SORAZBGDMFIWEXHYKLCQNTPUJV

替换字符:QNFGIWEVDULPXRAJCYTMSKOZBH

在加密时,将明文a中的每个字符x,都在“原始字符串”中找到字符x的对应位置p,并用“替换字符串”中对应位置的字符代替,这样就得到1次加密的密文b。如果将b做为明文再次加密得到新密文c,则称c为明文a经2次加密的结果,以此类推。

例如:明文“CHINA”经过1次加密后的密文为“TALSG”,经过2次加密后的密文为“KGYQE”,经过3次加密后的密文为“CEJMX”。

在解密时,将密文b中的每个字符y,都在“替换字符串”中找到字符y对应位置p,并用“原始字符串”中对应位置的字符代替,这样就得到1次解密的明文a。如果将a做为密文再次解密得到新明文c,则称c为密文b经2次解密的结果,以此类推。

例如:密文“TALSG”经过1次解密后的明文为“CHINA”,经过2次解密后的明文为“KVZOH”,经过2次解密后的明文为“TDUPV”。

运行条件

总时限:5000 毫秒
单组时限:1000 毫秒

总内存:320 MB
单组内存:64 MB

输入格式

输入在一行中包括三个数据,以空格分隔。
首先是一个字符串str,然后是两个正整数a,b。
字符串str中只包含大写字母,没有其它字符,不超过100个字符;整数a仅为1或2,1表示加密,2表示解密;整数b为加密或解密的次数(b为不超过500的正整数)

输出格式

在一行中输出字符串str经b次加密或解密的结果。

输入输出样例1:输入输出示例仅供调试,后台判题数据不包含示例

输入样例1:
CHINA 1 3
输出样例1:
CEJMX

输入输出样例2:输入输出示例仅供调试,后台判题数据不包含示例

输入样例2:
XKJHMP 2 3
输出样例2:
AKIMNJ

提示信息:一定要仔细查看提示信息

说明:
输入输出样例1的含义是输出“CHINA”经3次加密的结果是“CEJMX”。输入输出样例2的含义是输出“XKJHMP”经3次解密的结果是“AKIMNJ”(字母都为大写字母)

//仅供参考
int main()
{
	char str[64] = {0};
	char orig[] = { "SORAZBGDMFIWEXHYKLCQNTPUJV" }; //原始字符
	char repl[] = { "QNFGIWEVDULPXRAJCYTMSKOZBH" }; //替换字符
	int a = 0;  //a仅为1或2,1表示加密
	int b = 0;  //b为加密或解密的次数
	int p = 0;  //字符x的对应位置
	scanf("%s %d %d", str, &a, &b);
	if (a == 1) //加密
	{
		while (b)
		{
			for (int i = 0; str[i] != '\0'; i++)
			{
				for (int j = 0; orig[j] != '\0'; j++)
				{
					if (str[i] == orig[j])
					{
						p = j; //将找到的值先赋给p
					}
				}
				str[i] = repl[p];  //替换
			}
			b--;
		}

	}
	else if (a == 2)	//解密
	{
		while (b)
		{
			for (int i = 0; str[i] != '\0'; i++)
			{
				for (int j = 0; repl[j] != '\0'; j++)
				{
					if (str[i] == repl[j])
					{
						p = j;
					}
				}
				str[i] = orig[p];
			}
			b--;
		}
	}
	else
	{
		printf("err");
	}
	printf("%s", str);
	return 0;
}

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值