NOIP 2007 普及组初赛试题错题总结

这次呢,做得不是很好,暴露出很多问题,有很多需要改进的地方,下面分析一下错题

第 2 题

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

 A. 二叉树
 B. 多叉树
 C. 哈希表
 D. 二维表

正确答案: D

这个题是知识盲区了,二维表不知道是什么东西

在关系数据库中,存放在数据库中的数据的逻辑结构以二维表为主。
数据结构表示为一个二维表,一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。

   二维表一般满足下面7个性质:
(1)二维表中元组个数是有限的——元组个数有限性;
(2)二维表中元组均不相同——元组的唯一性;
(3)二维表中元组的次序可以任意交换——元组的次序无关性;
(4)二维表中元组的分量是不可分割的基本数据项——元组分量的原子性;
(5)二维表中属性名各不相同——属性名唯一性;
(6)二维表中属性与次序无关,可任意交换——属性的次序无关性;
(7)二维表属性的分量具有与该属性相同的值域——分量值域的统一性。  

第 9 题

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

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

 A. gcc
 B. g++
 C. Turbo C
 D. Free Pascal

正确答案: C

这个题的话,语言环境是真没了解过,就不多说了

第 10 题

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

 A. 硬盘
 B. 高速缓存
 C. 显存
 D. RAM

正确答案: A

这个的话其实是能做的,把题目理解错了,确实只有硬盘能在断电后保存数据

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

A.高级语言比汇编语言更高级,是因为它的程序的运行效率更高

 B. 随着 Pascal、C 等高级语言的出现,机器语言和汇编语言已经退出了历史舞台

 C. 高级语言比汇编语言程序更容易从一种计算机上移植到另一种计算机上

 D. C 是一种面向对象的高级计算机语言   

正确答案: C

这个题的话错的不应该,久了没练题了,C没问题的啊,不知道当时在想什么‘’

第 12 题

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

A. 在 1977 年前后形成标准的计算机高级语言 FORTRAN77 禁止在程序使用递归,原因之一是该方法可能会占用更多的内存空间

 B. 和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些

 C. 对于较复杂的问题,用递归方式编程一般比非递归方式更难一些

 D. 对于已经定义好的标准数学函数 sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递归调用

正确答案: A

这个题的话是真没想到啊,看了一下大神的解析,当时选的D,而D中的sin(x)是已经定义好的函数,而sin(sin(x))只是个二层嵌套,哎,又跳坑里了

第 13 题

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

 A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检查
 B. 有些编译系统可以检测出死循环
 C. 死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
 D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也可以检测的

正确答案: A

这个做得时候想错了,选的B,他说的是检测死循环,应该是选A

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

A. 18

B. 1

C. 23

D. 32

正确答案: C

位运算还是不会做,复习一下,|(按位或) —— 左右两边有1,答案就是1(与条件||的判定是一致的)

在 C++ 语言中,判断 aa 等于 00 或 bb 等于 00 或 cc 等于 00 的正确的条件表达式是(  )。

A. !((a!=0)||(b!=0)||(c!=0))

 B. !((a!=0)&&(b!=0)&&(c!=0))

 C. !(a==0&&b==0)||(c!=0)

 D. (a=0)&&(b=0)&&(c=0)

正确答案: B

这个考的时候确实没想到,B去掉最外面的括号,对里面取非,就可以得到(a==0)||(b==0)||(c==0)

第 21 题

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

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

正确答案: 90

这个题,主要是计算错误,没什么说的

第 25 题

看程序写结果:

#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. 每行四分

    正确答案: 2 3 5 7 11 13 17 19 23 29

  2. 每行四分

    正确答案: 31 37 41 43 47

这个的话主要是%4d没看懂是什么,%4d 表示输出4位整型数, 不够4位右对齐。 

第 26 题

看程序写结果:

#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

正确答案: input s1:wer2345defgh45456782qqq

这个题大意了,没有注意input s1:,痛失8分

第 28 题

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

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. 答案: return
  2. 正确答案: (dr<tr+s)&&(dc<tc+s) / dr<tr+s&&dc<tc+s
  3. 正确答案: chessboard(tr,tc,tr+s-1,tc+s-1,s)
  4. 正确答案: chessboard(tr,tc+s,tr+s-1,tc+s,s)
  5. 正确答案: chessboard(tr+s,tc,tr+s,tc+s-1,s)
  6. 正确答案: chessboard(tr+s,tc+s,tr+s,tc+s,s)

这个题就第二空错了,情况没有考虑完,下次注意就行了

总结:

这次暴露的问题也很多,比如位运算不熟悉,逻辑运算符会算错,久了没练题有些会做的做错了,还是要多练题,多看书,继续努力!!!

完结撒花!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hear the Wind Sing.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值