只发高分:高一计算机奥林匹克竞赛 C语言 准备

我报名了奥林匹克竞赛,我想提前做好准备,我下了一个谭浩强的C语言程序设计和VC6.0,但我从未接触过变成,请问有什么高效的方法提高吗?
如:找到一些很寻常的试题!(重要)
学习建议(次要)
我知道这个想精通不是一时半会就没问题的,我也有耐心,可是现在眼前的问题是我该怎么在短时期内以最高的水平通过竞赛- -||

第十二届全国青少年信息学奥林匹克联赛初赛试题
( 普及组 C++ 语言 二小时完成 )
● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、 单项选择题 (共20题,每题1.5分,共计30分。每题有且仅有一个正确答案.)。
1. 在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是( )。
A. 沃尔夫奖 B. 诺贝尔奖 C. 菲尔兹奖 D. 图灵奖
2. 在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有( )。
A. gcc/g++ B. Turbo Pascal
C. RHIDE D. free pascal
3. 以下断电之后仍能保存数据的有( )。
A. 寄存器 B. ROM C. RAM D. 高速缓存
4.Linux是一种( )。
A. 绘图软件 B. 程序设计语言 C. 操作系统 D. 网络浏览器
5. CPU是( )的简称。
A. 硬盘 B. 中央处理器 C. 高级程序语言 D. 核心寄存器
6. 在计算机中,防火墙的作用是( )。
A. 防止火灾蔓延 B.防止网络攻击
C. 防止计算机死机 D. 防止使用者误删除数据
7. 在下列关于计算机语言的说法中,不正确的是( )。
A. Pascal和C都是编译执行的高级语言
B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
C. C++是历史上的第一个支持面向对象的计算机语言
D. 与汇编语言相比,高级语言程序更容易阅读
8. 在下列关于计算机算法的说法中,不正确的是( )。
A. 一个正确的算法至少要有一个输入
B. 算法的改进,在很大程度上推动了计算机科学与技术的进步
C. 判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性 1
D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法
9. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是( )。
A. 选择排序 B. 冒泡排序 C. 插入排序 D. 基数排序
10.在编程时(使用任一种高级语言,不一定是C++),如果需要从磁盘文件中输入一个很大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上( )。
A. 没有区别 B. 按行读的方式要高一些
C. 按列读的方式要高一些 D. 取决于数组的存储方式。
11.在C++ 中,表达式21^2的值是( )
A. 441 B. 42 C.23 D.24
12.在C++ 中,判断a不等于0且b不等于0的正确的条件表达式是( )
A. !a==0 || !b==0 B. !((a==0)&&(b==0))
C. !(a==0&&b==0) D. a && b
13.某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出,出”。假设车辆入站的顺序为1,2,3,……,则车辆出站的顺序为( )。
A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7
C. 1, 4, 3, 7, 6 D. 1, 4, 3, 7, 2
14.高度为n的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为n-1的满二叉树。在这里,树高等于叶结点的最大深度,根结点的深度为0,如果某个均衡的二叉树共有2381个结点,则该树的树高为( )。
A. 10 B. 11 C. 12 D. 13
15. 与十进制数1770 对应的八进制数是( )。
A. 3350 B. 3351 C. 3352 D. 3540
16.将5个数的序列排序,不论原先的顺序如何,最少都可以通过( )次比较,完成从小到大的排序。
A. 6 B. 7 C. 8 D. 9
17. 设A=B=D=true,C=false,以下逻辑运算表达式值为真的有( )。
A. (A∧B)∨(C∧D) B. ¬¬((A∨B∨D)∧C) 2
C. A∧(B∨C∨D) D. (A∧B∧C)∨¬¬D
18. (2010)16 + (32)8的结果是( )。
A. (8234)10 B. (202B)16
C. (20056)8 D. (100000000110)2
19. 设栈S的初始状态为空,元素a, b, c, d, e 依次入栈,以下出栈序列不可能出现的有( )。
A. a, b, c, e, d B. b, c, a, e, d
C. a, e, c, b, d D. d, c, e, b, a
20. 已知6个结点的二叉树的先根遍历是1 2 3 4 5 6(数字为结点的编号,以下同),后根遍历是3 2 5 6 4 1,则该二叉树的可能的中根遍历是( )
A. 3 2 1 4 6 5 B. 3 2 1 5 4 6
C. 2 1 3 5 4 6 D. 2 3 1 4 6 5
二.问题求解(共2题,每题5分,共计10分)
1.(寻找假币) 现有80枚硬币,其中有一枚是假币,其重量稍轻,所有真币的重量都相同,如果使用不带砝码的天平称重,最少需要称几次,就可以找出假币?你还要指出第1次的称重方法。请写出你的结果:_________________________________________________。
2.(取石子游戏) 现有5堆石子,石子数依次为3,5,7,19,50,甲乙两人轮流从任一堆中任取(每次只能取自一堆,不能不取), 取最后一颗石子的一方获胜。甲先取,问甲有没有获胜策略(即无论乙怎样取,甲只要不失误,都能获胜)?如果有,甲第一步应该在哪一堆里取多少?请写出你的结果:
_________________________________________________。
三.阅读程序写结果(共4题,每题8分,共计32分)
1. #include <iostream.h>
void main()
{int i,u[4],a,b,x,y=10;
for(i=0;i<=3;i++)
cin >>u[i];
a=(u[0]+u[1]+u[2]+u[3])/7;
b=u[0]/((u[1]-u[2])/u[3]);
x=(u[0]+a+2)-u[(u[3]+3)%4];
if(x>10)
y+= (b*100-u[3])/(u[u[0]%3]*5);
3
else
y+=20+(b*100-u[3])/(u[u[0]%3]*5);
cout <<x<<","<<y<<endl;
} // 注:本例中,给定的输入数据可以避免分母为0或下标越界。
输入:9 3 9 4
输出:_______________
2.#include <iostream.h>
void main()
{int i,j,m[]={2,3,5,7,13};
long t;
for (i=0;i<=4;i++)
{t=1;
for(j=1;j<m[i];j++) t*=2;
cout <<(t*2-1)*t<<" ";
}
cout <<endl;
}
输出:____________________
3. #include "iostream.h"
#define N 7
int fun(char s[],char a,int n)
{int j;
j=n;
while(a<s[j] && j>0) j--;
return j;
}
void main()
{char s[N+1];
int k;
for(k=1;k<=N;k++)
s[k]='A'+2*k+1;
cout <<fun(s,'M',N)<<endl;
}
输出:_____________
4. #include <iostream.h>
4
#include <iomanip.h>
void digit(long n,long m)
{if(m>0)
cout <<setw(2)<<n%10;
if(m>1)
digit(n/10,m/10);
cout <<setw(2)<<n%10;
}
void main()
{long x,x2;
cout <<"Input a number:"<<endl;
cin >>x;
x2=1;
while(x2<x) x2*=10;
x2/=10;
digit(x,x2);
cout <<endl;
}
输入:9734526
输出:______________________________
四.完善程序 (前4空,每空2.5分,后6空,每空3分,共28分)
1.(全排列)下面程序的功能是利用递归方法生成从1到n(n<10)的n个数的全部可能的排列(不一定按升序输出)。例如,输入3,则应该输出(每行输出5个排列):
123 132 213 231 321
312
程序:
#include <iostream.h>
#include <iomanip.h>
int n,a[10]; // a[1],a[2],…,a[n]构成n个数的一个排列
long count=0; // 变量count记录不同排列的个数,这里用于控制换行
void perm(int k)
{int j,p,t;
if( ① )
{count++;
for(p=1;p<=n;p++)
cout <<setw(1)<<a[p]; 5
cout <<" ";
if( ② ) cout <<endl;
return;
}
for(j=k;j<=n;j++)
{t=a[k];a[k]=a[j];a[j]=t;
③ ;
t=a[k]; ④ ;
}
}
void main()
{int i;
cout <<"Entry n:"<<endl;
cin >>n;
for(i=1;i<=n;i++) a[i]=i;
⑤ ;
}
2. 由键盘输入一个奇数 P (P<100,000,000),其个位数字不是5,求一个整数 S,使 P×S = 1111...1 ( 在给定的条件下,解 S 必存在)。要求在屏幕上依次输出以下结果:
(1)S 的全部数字。除最后一行外,每行输出 50 位数字。 (2) 乘积的数字位数。
例1:输入p=13,由于13*8547=111111,则应输出(1)8547,(2)6
例2:输入p=147,则输出结果应为(1)755857898715041572184429327286470143613
(2)42,即等式的右端有42个1。
程序:
#include <iostream.h>
#include <iomanip.h>
void main()
{long p,a,b,c,t,n;
while (1)
{ cout <<"输入 p, 最后一位为 1 或 3 或 7 或 9:"<<endl;
cin >>p;
if ((p%2!=0)&&(p%5!=0)) // 如果输入的数符合要求,结束循环
⑥ ;
}
a=0; n=0;
while (a<p)
6
{a=a*10+1; n++; // 变量a存放部分右端项,n为右端项的位数
}
t=0;
do
{b=a/p;
cout <<setw(1)<<b;
t++;
if ( ⑦ )
cout <<endl;
c= ⑧ ; a= ⑨ ; n++;
} while (c>0);
cout<<endl<<"n="<< ⑩ <<endl;
}
7

答案
普及组(C++语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
1. D 2. B 3. B 4. C 5. B 6.B 7. C 8. A 9. D 10. D
11. C 12. D 13. C 14. B 15. C 16. B 17. B 18. A 19. C 20. B
二、问题求解:(每题 5分)
1. 4次 (1分),
第一步:分成3组:27,27,26,将前2组放到天平上(4分)。
2.有获胜策略(1分),,第1次在第5堆中取32颗石子(4分),。
三、阅读程序写结果
1. 10,10 (对1个数给4分,无逗号扣1分)
2. 6 28 496 8128 33550336
(前2个对1个数给1分,后3个对1个数给2分)
3. 5
4. 6 2 5 4 3 7 9 9 7 3 4 5 2 6(数字之间无空格扣2分)
四、完善程序(前4空(①--④),每空2.5分,后6空(⑤--⑩),每空3分)
1.① k==n (或n==k)
② count%5==0
③ perm(k+1)
④ a[k]=a[j];a[j]=t (分号可以用逗号代替)
⑤ perm(1)
2.⑥ break
⑦ t%50==0
⑧ a-p*b (或a-b*p)
⑨ c*10+1 (或10*c+1)
⑩ --n (只写n 给1分)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-10-18
谭浩强的书……
给初学者用用也还是可以的嘛
但是,切忌不可相信他书里面的话。
很多东西都是误导人滴,越早抛弃越好,嗯呵呵

lz可以拿来学最基础的东西,比如说ifthen啊,while啊,函数怎么声明,怎么定义啊,等等这些,反正就是最基础的
然后谭浩强的说的所有的其它废话一律pass就可以了。毕竟还是要一门指导书的么,现在中文的也没多少,英文的对lz来说太高深了。
PS:LZ看看我的话就可以了,这个只是针对怎么使用谭浩强的书而已。其实在c中学的东西,很多都是为抛弃做准备的。
然后lz还需要一本数据结构方面的书——当然如果你们竞赛很简单的话,那可能是不需要的。因为在c语言中也会提到一些数据结构的。
至于试题,难道你们竞赛没有模拟题么?就用那个。把历年的都找出来,可以请你们辅导老师帮忙。
其它类型的试题侧重点不同,你做了对你竞赛意义不大
第2个回答  2008-10-18
把谭浩强书上的题全都做一遍,你就基本有了思路了,就变成一个可以说是会编程的人了。那本书很好啊。

有空的话再找本数据结构研究研究,做些题,会有进一步飞跃和提高,这很重要。

记住,所有的题,我是说所有的!全都要亲手做一遍才算数,否则就等于没学。

开发环境别用vc6了,那个做C语言很不爽,推荐你用Dev C++,很酷的软件,GNU编译器也很标准,我们都用它。
第3个回答  2008-10-17
可以买到一些C语言的基础教材,上面会有一些试题,而且也可以买一些专门的习题,比如“全国高等院校非计算机专业计算级二级等级考试(C语言版)”,里面有很多可观的试题,当然,这些其实都可以在网上下载到。

至少编程,不是三两天就能学会的,尤其是在你完全没有基本的情况下,至少你也得找个老题考你怎么使用编程、调试工具吧?TC全是英文的,没老师就真的比编程还难了。

说到提高,当然要多写程序啦。我不知道奥赛要考到哪种程度,不过,写程序重要,读程序同样重要,某种意义上讲,读比写更重要。如果要快速的提高,就要找到一些你比较感兴趣的源程序,比如写小游戏的,小病毒的,或者别的工具的程序。找一些你感兴趣的,然后慢慢去读,逐步分析每个命令的功能。

读熟了再试着去改。如果你能去改别人的程序了,你也能写得很好了。当然,这个不是三两天能达到的。只是,在读的过程中去学习,会比你毫无目标的学习要高效得多了。

有很多源码,你可以从中挑一些你喜欢的来学。

参考资料:http://www.codepub.com/software/view-software-2701.html

第4个回答  2008-10-18
谭浩强的书别看了,含金量太少,尤其对于奥赛。

上网找些简短的教程,先知道C语言的一些基础。

有些东西一定要刻在脑子里,数据类型,范围,指针,数组的使用,文件读写。

看一些经典算法,比如排序,树什么的。

然后就找以前的奥赛题做吧,上机做。然后对照答案看看自己哪里没考虑正确。
第5个回答  2008-10-18
推荐你美国MBA的实践教学模式,拿奥林匹克竞赛的往年竞赛程序试题上机操作,多加练习,另外往年二级C语言和三级里面的C语言试题也很不错,其实变来变去就那三种程序结构,掌握好基本算法,通过考试肯定没问题。
相似回答