noip 2009 C模拟题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip 2009 C模拟题相关的知识,希望对你有一定的参考价值。

拜托

全国计算机等级考试考前预测试卷(1)
一级MS Office
(考试时间90分钟,满分100分)
一、选择题(每小题1分,共20分)
(1)第2代电子计算机所采用的电子元件是
A)继电器
B)晶体管
C)电子管
D)集成电路
(2)无符号二进制整数01011010转换成十进制整数是
A)80
B)82
C)90
D)92
(3)十进制数39转换成二进制整数是
A)100011
B)100101
C)100111
D)100011
(4)在微型机中,普遍采用的字符编码是
A)BCD码
B)ASCIl码
C)EBCD码
D)补码
(5)已知汉字“家”的区位码是2850,则其国标码是
A)4870D
B)3C52H
C)9CB2H
D)A8D0H
(6)下列说法中,正确的是
A)同一个汉字的输入码的长度随输入方法不同而不同
B)一个汉字的机内码与它的国标码是相同的,且均为2字节
C)不同汉字的机内码的长度是不相同的
D)同一汉字用不同的输入法输入时,其机内码是不相同的
(7)计算机的操作系统是
A)计算机中使用最广的应用软件
B)计算机系统软件的核心
C)微机的专用软件
D)微机的通用软件
(8)操作系统是计算机的软件系统中
A)最常用的应用软件
B)最核心的系统软件
C)最通用的专用软件
D)最流行的通用软件
(9)计算机在工作中尚未进行存盘操作,如果突然断电,则计算机哪部分信息全部丢失,再次通电后也不能完全恢复?
A)ROM与RAM中的信息
B)ILa.M中的信息
C)ROM中的信息
D)硬盘中的信息
(10)对CD.ROM可以进行的操作是
A)读或写
B)只能读不能写
C)只能写不能读
D)能存不能取

2009年9月全国计算机等级考试二级笔试试卷

C语言程序设计

(考试时间90分钟,满分100分)
一、选择题((1)-(10)、(21)-(40)每题2分,(11)-(20)每题1分,共70分)

(1)下列数据结构中,属于非线性结构的是
A)循环队列
B)带链队列
C)二叉树
D)带链栈

(2)下列数据结果中,能够按照“先进后出”原则存取数据的是
A)循环队列
B)栈
C)队列
D)二叉树

(3)对于循环队列,下列叙述中正确的是
A)队头指针是固定不变的
B)队头指针一定大于队尾指针
C)队头指针一定小于队尾指针
D)队头指针可以大于队尾指针,也可以小于队尾指针

(4)算法的空间复杂度是指
A)算法在执行过程中所需要的计算机存储空间
B)算法所处理的数据量
C)算法程序中的语句或指令条数
D)算法在执行过程中所需要的临时工作单元数

(5)软件设计中划分模块的一个准则是
A)低内聚低耦合
B)高内聚低耦合
C)低内聚高耦合
D)高内聚高耦合

(6)下列选项中不属于结构化程序设计原则的是
A)可封装
D)自顶向下
C)模块化
D)逐步求精
(27)有如下程序:
#include <iostream>
using namespace std;
class Toy
public:
Toy(char* _n) strcpy (name,_n); count++;
~Toy() count--;
char* GetName() return name;
static int getCount() return count;
private:
char name[10];
static int count;
;
int Toy::count=0;
int mail()
Toy t1(“Snoopy”),t2(“Mickey”),t3(“Barbie”);
cout<<t1.getCount()<<endl;
return 0;

运行时的输出结果是
A)1
B)2
C)3
D)运行时出错

(28)有如下程序
#include <iostream>
using namespace std;
class A
public:
A(int i):rl(i)
void print() cout<<’e’<<r1<<’-‘;
void print() const cout<<’C’<<rl*rl<<’-‘;
private:
int rl;
;
int main()
A al(2); const A a2(4);
Al.print();a2.print();
Return 0;

运行时的输出结果是
A)运行时出错
B)E2-C16-
C)C4-C16-
D)E2-E4-
(11)已知函数FA调用FB,若要把这两个函数定义在同一个文件中,则
A)FA必须定义在FB之前
B)FB必须定义在FA之前
C)若FA定义在FB之后,则FA的原型必须出现在FB的定义之前
D)若FB定义在FA之后,则FB的原型必须出现在FA的定义之前

(12)有如下两个类定义
class AA;
class BB
AA v1,*v2;
BB v3;
Int *v4;
;
其中有一个成员变量的定义是错误的,这个变量是
A)v1
B)v2
C)v3
D)v4

(13)有如下类定义:
class XX
int xdata;
public:
XX(int n=0) : xdata (n)
;
class YY : public XX
int ydata;
public:
YY(int m=0, int n=0) : XX(m), ydata(n)
;
YY类的对象包含的数据成员的个数是
A)1
B)2
C)3
D)4
(14)下列有关运算符函数的描述中,错误的是
A)运算符函数的名称总是以operator为前缀
B)运算符函数的参数可以是对象
C)运算符函数只能定义为类的成员函数
D)在表达式中使用重载的运算符相当于调用运算符重载函数

(15)下列关于模板形参的描述中,错误的是
A)模板形参表必须在关键字template之后
B)模板形参表必须用括弧( )括起来
C)可以用class修饰模板形参
D)可以用typename修饰模板形参

(16)在下列枚举符号中,用来表示“相对于当前位置”文件定位方式的是
A)ios_base::cur
B)ios_base::beg
C)ios_base::out
D)ios_base::end

(17)下列字符串可以用作C++标识符的是
A)2009var
B)goto
C)test - 2009
D)_123

(18)下列枚举类型的定义中,包含枚举值3的是
A)enum test RED, YELLOW, BLUE, BLACK;
B)enum test RED, YELLOW=4, BLUE, BLACK;
C)enum test RED=-1, YELLOW,BLUE, BLACK;
D)enum test RED, YELLOW=6, BLUE, BLACK;
(19)有如下程序段:
int i=1;
while (1)
i++;
if(i == 10) break;
if(i%2 == 0) cout << ‘*’;

执行这个程序段输出字符*的个数是
A)10
B)3
C)4
D)5

(20)已知数组arr的定义如下:
int arr[5] = 1,2,3,4,5;
下列语句中输出结果不是2的是
A)cout << *arr+1 <<endl;
B)cout << *(arr+1)<<endl;
C)cout << arr[1] <<endl;
D)cout << *arr <<endl;

(21)计算斐波那契数列第n项的函数定义如下:
Int fib(int n)
if (n == 0) return 1;
else if (n == 1) return 2;
else return fib(n-1)+fib(n-2);

若执行函数调用表达式fib(2),函数fib被调用的次数是
A)1
B)2
C)3
D)4
(22)Sample是一个类,执行下面语句后,调用Sample类的构造函数的次数是
Sample a[2], *p = new Sample;
A)0
B)1
C)2
D)3

(23)下列关于虚基类的描述中,错误的是
A)使用虚基类可以消除由多继承产生的二义性
B)构造派生类对象时,虚基类的构造函数只被调用一次
C)声明“class B : virtual public A”说明类B为虚基类
D)建立派生类对象时,首先调用虚基类的构造函数

(24)将运算符重载为类成员函数时,其参数表中没有参数,说明该运算是
A)不合法的运算符
B)一元运算符
C)无操作数的运算符
D)二元运算符

(25)有如下模板声明:
template <typename T1, typename T2> class A;
下列声明中,与上述声明不等价的是
A)template <class T1, class T2> class A;
B)template <class T1, typename T2> class A;
C)template <typename T1, class T2> class A;
D)template <typename T1, T2> class A;

(26)下列关于C++流的描述中,错误的是
A)cout>>’A’表达式可输出字符A
B)eof()函数可以检测是否到达文件尾
C)对磁盘文件进行流操作时,必须包含头文件fstream
D)以ios_base::out模式打开的文件不存在时,将自动建立一个新文件
(29)有如下程序:
#include<iostream>
using namespace std;
class Name
char name[20];
public:
Name()
strcpy(name,””); cout<<’?’;

Name(char *fname))
strcpy(name,fname); cout<’?’;

;
int main()
Name names[3]=Name(“张三”),Name(“李四”);
Return 0;

运行此程序输出符号?的个数是
A)0
B)1
C)2
D)3

(30)有如下程序:
#include<iostream>
using namespace std;
public:
AA() cout<<’1’;
;
class BB: public AA
int k;
public:
BB():k(0) cout<<’2’;
BB(int n):k(n) cout<<’3’;

int main()
BB b(4), c;
return 0;

运行时的输出结果是
A)1312
D)132
C)32
D)1412
(31)有如下程序:
#include<iostream>
using namespace std;
class C1
public:
~C1() cout<<1;
;
Class C2: public c1
public:
~c2() cout<<2;
;
int main()
C2 cb2;
C1 *cb1;
return 0;

运行时的输出结果是
A)121
B)21
C)211
D)12

(32)有如下程序
#include<iostream>
using namespace std;
class Publication //出版物类
char name[30];
public:
Publication(char *name=”未知名称”)
strcpy(this->name,name);

const char * getName()const return name;
virtual const char * getType()const return “未知类型”;
;
class Book: public Publication //书类
public:
Book(char *name): Publication(name)
virtual const char * getType()const return “书“;
;
void showPublication( Publication &p)
cout<<p.getType()<<”:”<<p.getName()<<endl;

int main()
Book book(“精彩人生”);
showPublication(book);
return 0;

运行时的输出结果是
A)未知类型:未知名称
B)未知类型:精彩人生
C)书:未知名称
D)书:精彩人生
(33)下列关于运算符重载的描述中,错误的是
A)::运算符不能重载
B)类型转换运算符只能作为成员函数重载
C)将运算符作为非成员函数重载时必须定义为友元
D)重载[]运算符应完成“下标访问”操作

(34)有如下程序:
#include<iostream>
#include<iomanip>
Using namespace std;
int main()
int s[]=123, 234;
cout<<right<<setfill(‘*’)<<setw(6);
for(int i=0; i<2; i++) cout<<s[i]<<endl;
return 0;

运行时的输出结果是
A)123
234
B)***123
234
C)***123
***234
D)***123
234***

(35)有如下类定义
class A
char *a;
public:
A():a(0)
A(char *aa) //把aa所指字符串拷贝到a所指向的存储空间
a= ;
strcpy(a,aa);
strcpy(a,aa);

~A() delete []a;
;
横线处应填写的表达式是
A)nes char[strlen(aa)+1]
B)char[strlen(aa)+1]
C)char[strlen(aa)]
D)new char[sizeof(aa)-1]
二、填空题(每题2分,共30分)

(1)某二叉树有5个度为2的结点以及3个度为1的结点,则该二叉树中共有 【1】 个结点。

(2)程序流程图中的菱形框表示的是 【2】 。

(3)软件开发过程主要分为需求分析、设计、编码与测试四个阶段,其中 【3】 产生“软件需求规格说明书”。

(4)在数据库技术中,实体集之间的联系可以是一对一或一对多或多对多的,那么“学生”和“可选课程”的联系为 【4】 。

(5)人员基本信息一般包括:身份证号,姓名,性别,年龄等。其中可以作为主关键字的是 【5】 。

(6)若表达式(x+(y-z)*(m/n))+3中的变量均为double型,则表达式值的类型为 【6】 。

(7)有如下循环语句:
For(int i=50; i>20; i-=2) cout<<i<<’,’;
运行时循环体的执行次数是 【7】 。

(8)利用表达式a[i]可以访问int型数组a中下标为i的元素。在执行了语句int *p=a;后,利用指针p也可访问该元素,相应的表达式是 【8】 。

(9)下面是一个递归函数,其功能是使数组中的元素反序排列。请将函数补充完整。
void reverse(int *a, int size)
if(size<2) return;
int k=a[0];
a[0]=a[size-1];
a[size-1]=k;
reverse(a+1, 【9】 );


(10)类Sample的构造函数将形参data赋值给数据成员data。请将类定义补充完整。
class Sample
public:
Sample(int data=0);
Private:
Int data;
;
Sample::Sample(int data)
【10】

(11)有如下类定义:
class Sample
public:
Sample();
~Sample();
Private:
Static int date;
;
将静态数据成员data初始化为0的语句是 【11】 。

(12)“图形”类Shape中定义了纯虚函数CalArea(),“三角形”类Triangle继承了类Shape,请将Triangle类中的CalArea函数补充完整。
class Shape
public:
virtual int CalArea()=0;

class Triangle: public Shape
public:
Triangleint s, int h: side(s),height(h)
【12】 return side*height/2 ;
private:
int side;
int height;
;

(13)有如下程序:
#include <iostream>
using namespace std;
class GrandChild
public:
GrandChild() strcpy (name,”Unknown”);
const char * getName()const return name;
virtual char * getAddress()const=0;
private:
char name[20];
;
class GrandSon : public GrandChild
public:
GrandSonchar *name
Char * getAddress() const return “Shanghai”;
;
int main()
GrandChild *gs=new GrandSon(“Feifei”);
cout<<gs->getName()<<”住在”<<gs->getAddress()<<endl;
delete gs;
return 0;

运行时的输出结果是 【13】 。
(14)如下程序定义了“单词”类word,类中重载了<运算符,用于比较“单词”的大小,返回相应的逻辑值。程序的输出结果为:After Sorting: Happy Welcome,请将程序补充完整。
#include <iostream>
#include <string>
using namespace std;
class Word
public:
Word(string s) : str(s)
string getStr() return str;
【14】 const return (str<w.str);
friend ostream& operator << (ostream& output, const Word &w)
output<<w.str; return output;
private:
string str;
;
Int main()
Word w1(“Happy”),w2(“Welcome”);
Cout<<”After sorting: “;
if(w1<w2) cout<<w1<<’ ’<<w2;
else cout<<w2<<’ ‘<<w1;
return 0;


(15)请将下列模板类Data补充完整。
template <typename T>
class Data
public:
void put (T v) val=v;
【15】 get() //返回数据成员val的值,返回类型不加转换
return val;
private:
T val;
;
2009年9月全国计算机等级考试二级C++笔试参考答案

一、选择题

(1) (2) (3) (4) (5)
(6) (7) (8) (9) (10)
(11) D (12) C (13) B (14) C (15) B
(16) A (17) D (18) A (19) C (20) D
(21) B (22) D (23) C (24) B (25) D
(26) A (27) C (28) B (29) D (30) A
(31) B (32) D (33) C (34) B (35) A

二、填空题

(6)double
(7)15
(8)*(p+i)
(9)size-1
(10)this->data=data;
(11)int Sample::data = 0;
(12)int CalArea(size,height)
(13)Unknown住在Shanghai
(14)bool operator < (Word w)
(15)T

* 本答案仅供参考
参考技术A 我给你真正的答案!加分!(刚出炉的)
一、单项选择题:(每题1.5分)
DBAAB
DCBCD
CCBDD
BDACB
二、问题求解:(共2题,每空5分,共计10分)
1.70
2.5
三、阅读程序写结果(共4题,每题8分,共计32分)
4
416
782
NPOI
四.完善程序 (前8空,每空3分,后2空,每空2分,共28分)
1.
① 0
② tmp+a[i]==ans 或者 a[i]+tmp==ans 或者ans==a[i]+tmp等
③ <0
④ i
⑤ tmp+=a[i] 或者 tmp=tmp+a[i]
2.
① 0
② hash[i][j]++ 或者 hash[i][j]= hash[i][j]+1 或者 ++hash[i][j]
③ work(x,y,tot+1)
④ hash[i][j]-- 或者 hash[i][j]= hash[i][j]-1 或者--hash[i][j]
⑤ work(0,0,0)
PASCAL语言:
1.
① 0
② tmp+a[i]=ans或者 a[i]+tmp=ans 或者ans=a[i]+tmp等
③ <0
④ i
⑤ inc(tmp, a[i])或者tmp := tmp+a[i]
2.
① 0
② inc(hash[i, j])或者 hash[i][j]:= hash[i][j]+1
③ work(x,y,tot+1)
④ dec(hash[i, j]) 或者 hash[i][j]:= hash[i][j]-1
⑤ work(0,0,0)

Noip模拟By yxj

1.random
Description
给定4个参数A0,N,c,p,你需要按下式构造A1~AN:
A[i]=(A[i-1]2+c)mod p
之后,你需要求出A1~AN中,第K大的数值。
Input
一行五个正整数A0,N,c,p,K。
Output
一行一个整数,描述答案。
Sample Input
123 10 435 3451 5
Sample Output
2936
Range
测试点 范围
1~3 K<=N<=105
4~10 K<=N<=5*106

直接stl
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define N 5000010

LL n,c,p,k;

LL a[N];

bool cmp(const int & a,const int & b)
{
return a>b;
}

int main()
{
freopen("random.in","r",stdin);freopen("random.out","w",stdout);
scanf("%lld%lld%lld%lld%lld",&a[0],&n,&c,&p,&k);
for (LL i=1;i<=n;i++)
a[i]=((a[i-1]*a[i-1])%p+c%p)%p;
nth_element(a+1,a+k,a+n+1,cmp);
printf("%I64d",a[k]);
return 0;
}

 

 

2.sequence

 

Description

 

给一个长度为n的序列a,以及q个询问。每次询问给出两个参数l,r,你需要输出子 序列al~ar的最大连续字段和。

 

Input

 

第一行两个正整数n,q。

 

接下来一行n个整数,描述序列a。

 

接下来q行,每行两个参数l,r,描述一个询问。

 

Output

 

对于每个询问,输出一行一个整数,描述答案。

 

Sample Input

 

4 3

 

1 -2 3 2

 

1 4

 

1 2

 

2 2

 

Sample Output

 

5

 

1

 

0

 

Range

 

测试点 范围

 

1~3 N,Q<=1000

 

4~7 N,Q<=105

 

8~10 N<=105,Q<=106

 

线段树维护。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
#define maxn 100010
#define IN inline
#define RE register

 

using namespace std;
typedef long long llg;

 

int n,m,zhi[maxn*3],now=maxn*3-2,ll,rr,D;
int sumv[maxn*3],le[maxn*3],ri[maxn*3];

 

IN int getint(){
int w=0,q=0;
char c=getchar();
while((c<‘0‘||c>‘9‘)&&c!=‘-‘) c=getchar();
if(c==‘-‘) q=1,c=getchar();
while(c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar();
return q?-w:w;
}

 

IN void update(int u,int lc,int lv){
sumv[u]=sumv[lc]+sumv[lv];
le[u]=max(le[lc],sumv[lc]+le[lv]);
ri[u]=max(ri[lv],sumv[lv]+ri[lc]);
zhi[u]=max(zhi[lc],zhi[lv]);
zhi[u]=max(zhi[u],ri[lc]+le[lv]);
}

 

IN void build(int u,int l,int r){
int lc=u<<1,lv=u<<1|1,mid=l+r>>1;
if(l==r){
sumv[u]=getint();
if(sumv[u]>0) zhi[u]=le[u]=ri[u]=sumv[u];
return;
}
build(lc,l,mid);
build(lv,mid+1,r);
update(u,lc,lv);
}

 

IN void query(int u,int l,int r){
int lc=u<<1,lv=u<<1|1,mid=l+r>>1;
if(l>=ll && r<=rr){
if(!D){
zhi[now]=zhi[u];sumv[now]=sumv[u];
le[now]=le[u];ri[now]=ri[u];D++;
}
else{
now^=1;
update(now,now^1,u);
}
return;
}
if(ll<=mid) query(lc,l,mid);
if(rr>mid) query(lv,mid+1,r);
}

 

int main(){
File("sequence");
n=getint();m=getint();
build(1,1,n);
while(m--){
ll=getint();rr=getint();
D=0;query(1,1,n);
printf("%d\n",zhi[now]);
}
}

 

3.tree

Description

给一棵n个节点的无根树,求路径长度=K的简单路径数。

Input

第一行两个正整数n,K。

接下来n-1行,每行两个正整数x,y,描述一条边(x,y)。

Output

一行一个整数,描述答案。

Sample Input

4 2

1 2

2 3

2 4

Sample Output

3

Range

测试点 范围

1~3 2<=K<=N<=1000

4~10 2<=K<=N<=105

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
#define maxn 100010

using namespace std;
typedef long long llg;

int head[maxn],next[maxn<<1],to[maxn<<1],tt,n,ans,D;
int a[maxn],c1[maxn],c2[maxn],siz[maxn],val[maxn];
bool w[maxn];

void link(){
int x,y;
scanf("%d%d",&x,&y);
to[++tt]=y;next[tt]=head[x];head[x]=tt;
to[++tt]=x;next[tt]=head[y];head[y]=tt;
}

void dfs1(int u,int fa){
siz[u]=1;a[++tt]=u;val[u]=0;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(v!=fa && !w[v]){
dfs1(v,u);siz[u]+=siz[v];
val[u]=max(val[u],siz[v]);
}
}

void dfs2(int u,int fa,int now){
c1[now]++;if(now>=D) return;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(v!=fa && !w[v]) dfs2(v,u,now+1);
}

void solve(int u){
int x=u;tt=0;
dfs1(u,0);
for(int i=2;i<=tt;i++){
val[a[i]]=max(val[a[i]],siz[u]-siz[a[i]]);
if(val[a[i]]<val[x]) x=a[i];
}
w[x]=1;
for(int i=head[x],v;v=to[i],i;i=next[i])
if(!w[v]){
dfs2(v,0,1);ans+=c1[D];
for(int j=1;c1[j];j++) ans+=c2[D-j]*c1[j];
for(int j=1;c1[j];j++) c2[j]+=c1[j],c1[j]=0;
}
for(int i=1;c2[i];i++) c2[i]=0;
for(int i=head[x],v;v=to[i],i;i=next[i])
if(!w[v]) solve(v);
}

int main(){
File("tree");
scanf("%d%d",&n,&D);
for(int i=1;i<n;i++) link();
solve(1);
printf("%d",ans);
}

 

以上是关于noip 2009 C模拟题的主要内容,如果未能解决你的问题,请参考以下文章

NOIP模拟5

8.19noip模拟题

8.20noip模拟题

noip2010初赛模拟题

2014-11-2 NOIP模拟赛1

noip模拟题《戏》game