1、模拟时间:90分钟
2、单选题15题(每题3分),编程题5题(共55分)
3、每题在交卷前都可以修改,交卷后将无法修改
4、模拟练习题均为往届真题,仅做赛前练习使用,编程题由系统自动评判
1.已定义x为字符型变量,则下列选项中正确的是
A. x = ‘101’
B. x = “101”
C. x = 101
D. x = “c”
2.下列运算符中,属于双目运算符的是
A. !
B. +
C. ++
D. ?:
3.从键盘输入两个整型数据,则下列输入语句中正确的是
A. scanf("%d%d",&m,&n);
B. scanf("%d%d",m,n);
C. scanf(" %f%f",&m,&n);
D. input m,n;
4.语句while(!a)中的条件!a等价于
A. a==0
B. a!=1
C. a!=0
D. ~a
5.若有数组int a[10]={1,3,5,2,4,6,7,3,8,6},i=2则a[a[i]]元素的数值是
A. 3
B. 4
C. 5
D. 6
6.字符串"I love you"在C语言中占()个字节
A. 8
B. 10
C. 11
D. 12
7.在32位系统中,定义以下结构体类型
struct p {
char name[20];
long int n;
short int number[4];
}a;
则a占用的字节大小是
A. 28
B. 30
C. 32
D. 46
8.有如下函数调用语句
fun1(math1,math2+ math3,(math4,math5));
则该函数调用语句中,实参的个数是
A. 3
B. 4
C. 5
D. 有语法错误
9.若有int * const p;则下列说法正确的是
A. p指向的变量数值不能更改
B. p保存的地址不能更改
C. p保存的地址和指向的变量数值都不能更改
D. p保存的地址和指向的变量数值都可以更改
10.有以下程序段:
int a[10] = {1,2,3,4,5,6,7,8,9};
int *p = a;
则以下表达式值为8的是
A. p+8
B. *p+=7
C. *(p+8)
D. *(p+7)
11.下列不是C语言标准库中文件操作的函数选项是
A. fopen
B. fread
C. fgets
D. fabs
12.若有以下说明和定义语句,则变量vh在内存中所占的字节数是
nion hh {char ch[6];float a; float b;};
struct xx {double w;union hh u;float v[5] ;}vh;
A. 44
B. 34
C. 32
D. 36
13.判定一个顺序栈S(最多容纳MAXSIZE个元素)为空的条件是
A. s->top == -1
B. s->top == 0
C. s->top == MAXSIZE
D. s->top == MAXSIZE+1
14.具有256个叶结点的二叉树中有()个度为2的结点
A. 127
B. 196
C. 255
D. 511
15.下列选项中错误的是
A. unsigned和void在C中都是保留字
B. 树形结构中元素之间存在一对多的关系
C. C语言程序的基本组成单位是函数
D. 在C语言程序中,注释说明只能位于一条语句的后面
16A.有一组均由字符A ~ Z和a ~ z组成的字符串,其中要求将字符串中各字符按如下要求进行转换:
A<->z、B<->y、C<->x、… 、X<->c、Y<->b、Z<->a
输入说明: 输入1行,待处理的字符串(长度<=10000)
输出说明: 输出1行,为输出转换之后的字符串
输入样例:
Algorithm
Hello
输出样例:
zOTLIRGSN
sVOOL
分析:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char s[10000];
int i;
gets(s);
for (i = 0;i < strlen(s);++i)
{
s[i] = 187 - s[i];
}
printf("%s\n",s);
return 0;
}
17A.输入正整数A、B、C(0<=A,B,C<=10000),若用’+’、’-’、’*’、’/’、’%'之一组成等式(即A@B=C,@是上述运算符之一,),则输出“YES”,否则输出“NO”
输入说明: 第1行:一个正整数N(1<=N<=1000),表示有N组数据,
第2-N+1行:非零整数A、B、C
输出说明: 输出1行,为输出转换之后的字符串
输入样例:
5
2 3 6
3 5 1
5 3 1
1 4 1
6 2 7
输出样例:
YES
NO
NO
YES
NO
样例说明:
输入样例中2*3=6,1%4=1
分析:
#include<stdio.h>
int main(){
int n;
int num[1000][3];
scanf("%d",&n);
for(int i=0;i<n;i++){//输入
scanf("%d %d %d",&num[i][0],&num[i][1],&num[i][2]);
}
for(int i=0;i<n;i++){
int flag=0;//逻辑标志初始化,当不能组成等式时,标志才不会发生改变
if(num[i][0]+num[i][1]==num[i][2]){
flag=1;
}
if(num[i][0]-num[i][1]==num[i][2]){
flag=1;
}
if(num[i][0]*num[i][1]==num[i][2]){
flag=1;
}
if(num[i][1]!=0){//除数不能为0
if(double(num[i][0])/num[i][1]==num[i][2]){
flag=1;
}
if(num[i][0]%num[i][1]==num[i][2]){
flag=1;
}
}
if(flag==0){//标志相应
printf("NO\n");
}else{//flag==1表示前面的条件其中之一满足了
printf("YES\n");
}
}
return 0;
}
18A. 若有一个正整数A1A2…An==A1^1 + A2^2 + … + An^n,则称这个数是特殊数
输入说明: 输入1行,一个正整数N(N<1e8)
输出说明: 一行:从小到大输出0-N之间的所有特殊数,每个数之间用一个空格间隔
输入样例:
3
输出样例:
0 1 2 3
分析:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int N, n, A;
int i, j;
char s[100];
int b, sum = 0;
scanf("%d",&N);
for (i = 0;i <= N;++i)
{
sprintf(s, "%d", i);
n = strlen(s);
A = i;
sum = 0;
do
{
b = A%10;
A /= 10;
sum += pow((double)b,(double)n);
n--;
} while (A != 0);
if(sum == i)
{
printf("%d ",i);
}
}
printf("\n");
return 0;
}
19A. 给定一个字符串s,先要对字符串第i个到第j个字符中查找是否存在字符ch,若存在,则删除其中第一个字符ch,若不存在,则在第j个字符后插入字符ch
输入说明: 第一行输入字符串s(长度len<1000)。
第二行输入正整数N和字符ch,N表示其后有N次操作(N<100)。
从第三行开始,其后N行每行有两个正整数i和j(1<=i<=j<=len)
输出说明: 输出N次操作之后的字符串
输入样例:
abcdefg
2 d
1 3
2 6
输出样例:
abcdefg
样例说明:
abcdefg-->abcddefg-->abcdefg
分析:
#include "stdio.h"
int get_lenth(char a[]){//获取数组长度的函数
int i;
for(i=0;a[i]!=0;i++){
}
return i;
}
void insert(char a[],int j,char ch){//插入操作
int lenth=get_lenth(a);
for(int i=lenth;i>j;i--){
a[i]=a[i-1];
}
a[j]=ch;
}
int main(){
char str[1000]={0};//初始化为全零
scanf("%s",str);
char ch;
int n;
scanf("%d %c",&n,&ch);
for(int p=0;p<n;p++){
int lenth=get_lenth(str);
int i,j,flag=0;
scanf("%d %d",&i,&j);
for(int x=i-1;x<j;x++){
if(str[x]==ch){
for(int h=x;h<lenth;h++){//删除运算
str[h]=str[h+1];
}
str[lenth-1]=0;
flag=1;
break;
}
}
if(flag==0){
insert(str,j,ch);//插入运算
}
}
for(int i=0;str[i]!=0;i++){//结果查看
printf("%c",str[i]);
}
return 0;
}