#NOIP2007J1. NOIP 2007 普及组初赛试题

NOIP 2007 普及组初赛试题

(满分:100 分 考试时间:120 分钟)

一、单项选择题(共 20 题,每题 1.5 分,共计 30 分;每题有且仅有一个正确选项)

  1. 在以下各项中,( )不是 CPU 的组成部分

本题共 1.5

  1. 在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。

本题共 1.5

  1. 在下列各项中,只有( )不是计算机存储容量的常用单位。

本题共 1.5

  1. ASCII 码的含义是( )。

本题共 1.5

  1. 一个完整的计算机系统应包括( )。

本题共 1.5

  1. IT 的含义是( )。

本题共 1.5

  1. LAN 的含义是( )。

本题共 1.5

  1. 冗余数据是指可以由其它数据导出的数据。例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致。例如,上面 4 个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是( )。

本题共 1.5

  1. 在下列各软件,不属于 NOIP 竞赛(复赛)推荐使用的语言环境有( )。

编者注:由于试题为 2007年的试题,请根据 2007年的实际情况作答。

本题共 1.5

  1. 以下断电后仍能保存数据的有( )。

本题共 1.5

  1. 在下列关于计算机语言的说法中,正确的有( )。

本题共 1.5

  1. 近 20 年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下列关于递归算法的说法中,正确的是( )。

本题共 1.5

  1. 一个无法靠自身的控制终止的循环成为“死循环”,例如,在 C++ 语言程序中,语句 while(1) printf("*"); 就是一个死循环,运行时它将无休止地打印 * 号。下面关于死循环的说法中,只有( )是正确的。

本题共 1.5

  1. 在 C++ 语言中,表达式 23|2^5 的值是( )

本题共 1.5

  1. 在 C++ 语言中,判断 a 等于 0b 等于 0c 等于 0 的正确的条件表达式是( )。

本题共 1.5

  1. 地面上有标号为 A、B、C 的三根柱,在 A 柱上放有 10个直径相同中间有孔的圆盘,从上到下依次编号为 1,2,3…,将 A 柱上的部分盘子经过 B 柱移入 C 柱,也可以在 B 柱上暂存。如果 B 柱上的操作记录为“进、进、出、进、进、出、出、进、进、出、进、出、出”。那么,在 C 柱上,从下到上的编号为( )。

本题共 1.5

  1. 与十进制数 1770 对应的八进制数是( )。

本题共 1.5

  1. A=B=TrueC=D=False,以下逻辑运算表达式值为假的有( )。

本题共 1.5

  1. (2070)16+(34)8(2070)_{16}+(34)_{8} 的结果是( )。

本题共 1.5

  1. 已知 7 个节点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为节点的编号,以下同),中根遍历是 4 2 6 5 1 7 3,则该二叉树的后根遍历是( )。

本题共 1.5

二、填空题

  1. (子集划分)将 𝑛个数 (1,2,…,𝑛)划分成 𝑟个子集。每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。将不同划分方法的总数记为 𝑆(𝑛,𝑟)。例如,𝑆(4,2)=7,这 7 种不同的划分方法依次为 {(1),(234)},{(2),(134)},{(3),(124)},{(4),(123)},{(12),(34)},{(13),(24)},{(14),(23)}。

当 𝑛=6,𝑟=3 时,𝑆(6,3)=

(提示:先固定一个数,对于其余的 5个数考虑 𝑆(5,3)与 𝑆(5,2),再分这两种情况对原固定的数进行分析。)

本题共 5

  1. (最短路线)某城市的街道是一个很规整的矩形网络(见下图),有 7 条南北向的纵街,5 条东西向的横街。现要从西南角的 A 走到东北角的 B ,最短的走法共有多少种?

本题共 5

  1. 看程序写结果:
#include<stdio.h>
int main()
{
	int i, p[5], a, b, c, x, y = 20;
	for ( i = 0; i <= 4; i++ )
		scanf( "%d", &p[i] );
	a = (p[0] + p[1]) + (p[2] + p[3] + p[4]) / 7;
	b = p[0] + p[1] / ( (p[2] + p[3]) / p[4]);
	c = p[0] * p[1] / p[2];
	x = a + b - p[(p[3] + 3) % 4];
	if ( x > 10 )
		y += (b * 100 - a) / (p[p[4] % 3] * 5);
	else
		y += 20 + (b * 100 - c) / (p[p[4] % 3] * 5);
	printf( "%d,%d\n", x, y );
	return(0);
}
//注:本例中,给定的输入数据可以避免分母为 0 或数组元素下标越界。

输入:6 6 5 5 3

输出:

本题共 8

  1. 看程序写结果:
#include<stdio.h>
void fun( int *a, int *b )
{
	int *k;
	k = a; a = b; b = k;
}


int main()
{
	int a = 3, b = 6, *x = &a, *y = &b;
	fun( x, y );
	printf( "%d,%d ", a, b );
}

输出:

本题共 8

看程序写结果:

#include "math.h"
#include "stdio.h"
int main()
{
	int a1[51] = { 0 };
	int i, j, t, t2, n = 50;
	for ( i = 2; i <= sqrt( n ); i++ )
		if ( a1[i] == 0 )
		{
			t2 = n / i;
			for ( j = 2; j <= t2; j++ )
				a1[i * j] = 1;
		}
	t = 0;
	for ( i = 2; i <= n; i++ )
		if ( a1[i] == 0 )
		{
			printf( "%4d", i ); t++;
			if ( t % 10 == 0 )
				printf( "\n" );
		}
	printf( "\n" );
}
  1. 每行四分

  1. 每行四分

本题共 8

  1. 看程序写结果:
#include "ctype.h"
#include "stdio.h"
void expand( char s1[], char s2[] )
{
	int i, j, a, b, c;
	j = 0;
	for ( i = 0; (c = s1[i]) != '\0'; i++ )
		if ( c == '-' )
		{
			a = s1[i - 1]; b = s1[i + 1];
			if ( isalpha( a ) && isalpha( b ) || isdigit( a ) && isdigit( b ) )
/*函数 isalpha(a) 用于判断字符 a 是否为字母,isdigit(b) 用于判断字符 b 是否为数字,如果是,返回 1,否则返回 0 */
			{
				j--;
				do
					s2[j++] = a++;
				while ( tolower( a ) < tolower( s1[i + 1] ) );
			}
/*函数 tolower(a) 的功能是当字符 a 是大写字母,改为小写,其余情况不变*/
			else s2[j++] = c;
		}else s2[j++] = c;
	s2[j] = '\0';
}


int main()
{
	char s1[100], s2[300];
	printf( "input s1:" );
	gets( s1 );
	expand( s1, s2 );
	printf( "%s\n", s2 );
}

输入:wer2345d-h454-82qqq

输出:

本题共 8

三、完善程序

完善程序1:

(求字符的逆序)下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入 −1终止程序。请将程序补充完整。

#include <iostream.h>
#include <string.h>
int maxline = 200, kz;
int reverse( char s[] )
{
	int i, j, t;
	for ( i = 0, j = strlen( s ) - 1; i < j; 【①】 , 【②】 )
	{
		t = s[i]; s[i] = s[j]; s[j] = t;
	}
	return(0);
}


int main()
{
	char line[100];
	cout << "continue? -1 for end." <<endl;
	cin>>kz;
	while(【③】)
	{
		cin  >>  line;
		【④】;
		cout << line  <<  endl;
		cout << "continue ? -1 for end." << endl;
		cin >> kz;
	}
}
  1. ①填入(答案写法有多种,选一种即可,判题系统判错请忽略):
  2. ②(答案写法有多种,选一种即可,判题系统判错请忽略)填入:
  3. ③填入:
  4. ④填入:

本题共 8

完善程序2:

(棋盘覆盖问题)在一个 2𝑘×2𝑘2_𝑘×2_𝑘个方格组成的棋盘中恰有一个方格与其它方格不同(图中标记为 −1 的方格),称之为特殊方格。现 L 型(占 3 个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是 (4𝑘1)3\frac{(4^𝑘−1)}{3}​。在下表给出的一个覆盖方案中,𝑘=2,相同的 3各数字构成一个纸片。下面给出的程序使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。请将程序补充完整。

2  2  3  3
2 -1  1  3
4  1  1  5
4  4  5  5
#include <iostream.h>
#include <iomanip.h>
int board[65][65], tile; /* tile为纸片编号 */
void chessboard( int tr, int tc, int dr, int dc, int size )
/* dr,dc依次为特殊方格的行、列号 */
{
	int t, s;
	if ( size == 1 )
		① ;
		t = tile++;
	s = size / 2;
	if ( ② )
		chessboard( tr, tc, dr, dc, s );
	else{
		board[tr + s -1][tc + s -1] = t;
		[③];
	}
	if ( dr < tr + s && dc >= tc + s )
		chessboard( tr, tc + s, dr, dc, s );
	else{
		board[tr + s -1][tc + s] = t;
		④;
	}
	if ( dr >= tr + s && dc < tc + s )
		chessboard( tr + s, tc, dr, dc, s );
	else{
		board[tr + s][tc + s -1] = t;
		[⑤];
	}
	if ( dr >= tr + s && dc >= tc + s )
		chessboard( tr + s, tc + s, dr, dc, s );
	else{ board[tr + s][tc + s] = t;
	      [⑥]; }
}


void prtl( int b[][65], int n )
{
	int i, j;
	for ( i =1; i <= n; i++ )
	{
		for ( j =1; j <= n; j++ )
			cout << setw( 3 ) << b[i][j];
		cout << endl;
	}
}


void main()
{
	int size, dr, dc;
	cout << "input size(4/8/16/64):" << endl;
	cin >> size;
	cout << "input the position of special block(x,y):" << endl;
	cin >> dr >> dc;
	board[dr][dc] = -1;
	tile++;
	chessboard( 1, 1, dr, dc, size );
	prtl( board, size );
}
  1. ①填入:
  2. ②填入(答案写法有多种,选一种即可,判题系统判错请忽略):
  3. ③填入:
  4. ④填入:
  5. ⑤填入:
  6. ⑥填入:

本题共 18