第二十届全国青少年信息学奥林匹克竞赛初赛
提高组C语言试题
一、单项选择题(每题1.5分,共22.5分)。
1.以下哪个是面向对象的高级语言().
A.汇编语言B.C++C.FORTRAND.Basic
2.1TB代表的字节数量是().
A.2的10次方B.2的20次方C.2的30次方D.2的40次方
3.二进制数00100100和00010101的和是().
A.00101000B.001010100C.01000101D.00111001
4.TCP协议属于哪一层协议().
A.应用层B.传输层C.网络层D.数据链路层
5.下列几个32位IP地址中,书写错误的是().
A.162.105.128.27B.192.168.0.1C.256.256.129.1D.10.0.0.1
6.在无向图中,所有定点的度数之和是边数的()倍.
A.0.5B.1C.2D.4
7.对长度位n的有序单链表,若检索每个元素的概率相等,则顺序检索到表中任一元素的平均检索长度为().
A.n/2B.(n+1)/2C.(n-1)/2D.n/4
8.编译器的主要功能是().
A.将一种高级语言翻译成另一种高级语言
B.将源程序翻译成指令
C.将低级语言翻译成高级语言
D.将源程序重新组合
9.二进制数111.101所对应的十进制数是().
A.5.625B.5.5C.6.125D.7.625
10.若有变量inta,floatx,y,且a=7,x=2.5,y=4.7,则表达式x+a%3*(int)(x+y)%2/4的值大
约是().
A.2.500000B.2.750000C.3.500000D.0.000000
11.有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中的三个续
结点。
structnode{datanextdatanextdatanextintdata;
structnode*next;↑p↑q↑r}*p,*q,*r;
现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误的是
().
A.q->next=r->next;p->next=r;r->next=q;
B.p->next=r;q->next=r->next;r->next=q;
C.q->next=r->next;r->next=q;p->next=r;
D.r->next=q;q->next=r->next;p->next=r;
12.同时查找2n个数中的最大值和最小值,最少比较次数为().
A.3(n-2)/2B.4n-2C.3n-2D.2n-2
13.设G是有6个结点的完全图,要得到一颗生成树,需要从G中删去()条边.
A.6B.9C.10D.15
14.以下时间复杂度不是O(n2)的排序方法是().
A.插入排序B.归并排序C.冒泡排序D.选择排序
15.以下程序实现了找第二小元素的算法。输入时n个不等的数构成的数组S,输出S中第
二小的数SecondMin。在最坏的情况下,该算法需要做()次比较。
if(S[1]<S[2]){
FirstMin=S[1];
SecondMin=S[2];
}else{
FirstMin=S[2];
SecondMin=S[1];
}
for(i=3;i<=n;i++)
if(S[1]<SecondMin)
if(S[1]<FirstMin){
SecondMin=FirstMin;
FirstMin=S[1];
}else{
SecondMin=S[1];
}
A.2nB.n-1C.2n-3D.2n-2
二、不定项选择题(每题1.5分,共7.5分)。
1.若逻辑变量A、C为真,B、D为假,以下逻辑运算表达式真的有().
A.(B∨C∨D)∨D∧AB.((-A∧B)∨C)∧B
C.(A∧B)∨(C∧D∨-A)D.A∧(D∨-C)∧B
2.下列()软件属于操作系统软件。
A.MicrosoftWord
B.WindowsXP
C.Android
D.MacOSX
E.Oracle
3.在NOI比赛中,对于程序设计题,选手提交的答案不得包含下列哪些内容(
A.试图访问网络
B.打开或创建题目规定的输入/输出文件之外的其他文件
C.运行其他程序
D.改变文件系统的访问权限
E.读写文件系统的管理信息
4.以下哪些结构可以用来存储图().
A.邻接矩阵B.栈C.邻接表D.二叉树
5.下列各无符号十进制整数中,能用八位二进制表示的数有().
A.296B.133C.256D.199).
三、问题求解。
1.有数字1,1,2,4,8,8所组成的不同的四位数的个数是_____.
2.如图所示,图中每条边上的数字表示该边的长度,则从A到E的最短距离是
_____.
四、阅读程序写结果(共4题,每题8分,共32分)。
1.#include<stdio.h>
intmain(){
inta,b,I,tot,c1,c2;
scanf(“%d%d”,&a,&d);
tot=0;
for(i=a;i<=b;i++)
{
c1=i/10;
c2=i%10;
if((c1+c2)%3==0)
tot++;
}
Printf(“%d\n",tot);
Return0;
}
输入:731
输出:_________
2.#include<stdio.h>
Intfun(intn,intminNum,int
{inttot,i;
if(n==0)
retuen1;
tot=0;maxNum)
for(i=minNum;i<=maxNum;i++)tot+=fun(n-1,i=1,maxNum);returntot;
}
intmian()
{intn,m;
Scanf(“%d%d”,&n,&m);
printf(“%d\n”,fum(m,1,n));return0;
}
输入:63
输出:________
3.#include<stdio.h>
#include<string.h>
constintSIZE=100;
constintLENGTH=25;
//strcmp(a,b)<0:a的字典序小于b//strcmp(a,b)=1:a和b一样
//strcmp(a,b)>0:a的字典序大于bintmain()
chardict[SIZE][LENGTH+1];intrank[SIZE];
intind[SIZE];
inti,j,n,tmp;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{rank[i]=i
ind[i]=i;
scanf(“%s”,dict[i]);
}
for(i=1;i<n;i++)
for(j=1;j<=n-i;j++)
if(strcmp(dict[ind[j]],dict[ind[j+1]])>0){tmp=ind[j];
ind[j]=ind[j+1];
ind[j+1]=tmp;
}
for(i=1;i<=n;i++)rank[ind[i]]=i;for(i=1:i<=n;i++)ptintf(%d”,rank[i]);printf(“\n”);
return0;
}
输入:
7
aaa
aba
bbb
aaa
aaa
ccc
aa
输出:______
4.#niclude<stdio.h>
constintSIZE=100;intalive[SIZE];intn;
intnext(intnum){do{
num++;
if(num>n)
num=1;
}while(alive[num]==0);returnnum;
}
intmain()
{intm,i,j,num;
scanf(“%d%d”,&n,&m);
for(i=1;i<=n;i++)
alive[i]=1;
num=1;
for(i=1;i<=n;j++)
{for(j+1;j<=m;j++)
num=next(num);
printf(“%d”,num);
alive[num]=0;
if(i<n)
num=next(num);
}printf(\n);
return0;
}
输入:113
输出:_________
五、完善程序
1.(双栈模拟数组)只使用两个栈结构stack1和stack2,模拟对数组的随机读取。作为栈结构,stack1和stack2只能访问栈顶(最后一个有效元素)。栈顶指针top1和top2均指向栈顶元素的下一个位置。
输入第一行包含的两个整数,分别是数组长度n和访问次数m,中间用单个空格隔开。第二行包含n个整数,一次歌出数组各项(数组下标从0到a-1)。第三行包含m个整数,需要访问的数组下标。对于每次访问,输出对应的数组元素。
#include<stdio.h>
consrintSIZE=100;
intstack1[SIZE],stack2[SIZE];
inttop1,top2;
intn,m,i,j;
voidclearStack(){intI;
for(i=top1;i<SIZE;i++)stack[i]=0;
for(i=top2;i<SIZE;i++)stack[i]=0;
}
intmain()
scanf(%d,%d”,&n,&m);for(i=0i<n;i++)
scanf(“%d”,&stack1[i]);top1=_____(1)______;top2=_______(2)____;for(j=0j<m;j++){
scanf(“%d”,&i);while(i<top1-1){
top1--;;
top2++;
}
while(i>top1-1){
top2--;;
top1++;
}
clearstack();
printf(“%d\n”,stack1[}
return0;
}]);
2.(最大矩阵和)给出M行N列的整数矩阵,就最大的子矩阵和(子矩阵不能为空)。
输入第一行包含两个整数M和N,即矩阵的行数和列数。之后M行,每行N个整数,描述整个矩阵。程序最终输出最大的子矩阵和。(第一空2分,其余3分,共14分)#include<stdio.h>
constintSIZE=100;
intmatrix[SIZE+1][SIZE+1];
introwsum[SIZE+1][SIZE+1];//rowsum[i][j]记录第i行前j个数的和
intm,n,i,j,first,last,area,ans;
intmain(){
scanf(“%d%d”,&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf(“%d”,&matrix[i][j]);
ans=matrixfor(i=1;i<=m;i++);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
rowsum[i][j]=;
for(first=1;first<=n;first++)
for(last=first;last<=n;last++){;
for(i=1;i<=m;i++){
area+=if(area>ans)
ans=area;
if(area<0)
area=0;
}
}
printf(“%d\n”,ans);
return0;
}
二、问题求解(共2题,每题4分,共计8分;每题全部答对得4分)
1.________102___________2.________15____________
三、阅读程序写结果(共4题,每题8分,共计32分)
1._________8__________
3.___2563471____2.__________20__________4._3691510411827_
四、完善程序(共2题,每题10分,共计20分)
1.(1)________________________n__________________________(2分)
(2)_________________________0___________________________(2分)
(3)_______________stack2[top2]=stack1[top1]____________(2分)
(4)______________stack1[top1]=stack2[top2]_____________(2分)
(5)________________________top1-1______________________(2分)
2.(1)________________________[1][1]______________________(2分)
(2)_____________________rowsum[i][0]=0___________________(2分)
(3)_____________rowsum[i][j-1]+matrix[i][j]__________(2分)
(4)_________________________area=0_______________________(2分)
(5)___________rowsum[i][last]-rowsum[i][first-1]________(2分)
www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。