软考初级程序员下午题(8)

试题一

阅读下列算法说明和代码,将应填入______处的语句填写完整。
[说明]
本程序用古典Eratosthenes筛选法求从2起到指定范围内的素数。如要找出2~10中的素数,开始时筛选2~10中的数,然后取走筛中最小的数2,宣布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9;重复上述步骤,再取走最小数3,宣布它为素数,并取走3的倍数,于是留下5、7。反复重复上述步骤,直到筛中为空时,工作结束,求得2~10中的全部素数。

[代码]
#include <stdio.h>
#define MAX 22500
/*程序中用数组sieve表示筛子,数组元素sieve[i]的值为1时,表示数i在筛子中,值为-1时表示数i已被取走*/
main()
{unsigned int i,range,factor,k;
int sieve[MAX];
printf("please input the range:");
scanf("%d",&range);// range指出在多大的范围内寻找素数
for(i=2;i<=range;i++)
______;
factor=2;
while(factor<=range)
{if(______)//筛中最小数是素数
{printf("%d\t",factor);
k=factor;
while(k<=range)   //移走素数的倍数
{______;
k=______;
}
}
______;
}
}

试题二

阅读以下问题说明、C程序和函数,将解答填写完整。
分析下面的C程序,指出错误代码(或运行异常代码)所在的行号。


```cpp
  [C程序]
  #include<stdio.h>
  #include <srting.h>
  int main()
  { char*p,arrChar[100] = "testing",
  	arrChar = "test";
  	p = "testing";
  	*p = '0';
  	p = arrChar + 1;
  	printf("%d\t%d\d\n",sizeof(arrChar),strlen(arrChar));
printf("%d\t%d\n",sizeof(char*),strlen(p));
return 0;
}
  	

函数inputArr(int a[],int n)的功能是输入一组整数(输入0或输入的整数个数达到n时结束)存入数组a,并返回实际输入的整数个数。函数inputArr可以成功编译。但测试函数调用inputArr后,发现运行结果不正确。
请指出错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。

[C函数]
int inputArr (int a[],int n) {
	int i,k = 0;
	do{
		scanf("%d",a[k]);
		k++;
		if(k = n)
		break;
		}while(a[k] == 0);
	return k;
}

试题三

阅读以下说明和C语言函数,将应填入______处的语句填写完整。
[说明]
设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。

[函数]
int StrCompare(SStrType s,SStrType t)
{
int n=s.length,m=______,i,j,tag;
i=0;j=0;
while(______)
{
if(______)
{
i++;
j++;
}
else if(s.str[i]>t.str[j])
{
tag=1;
return tag;
}
else
{
tag=-1;
return tag;
}
}
if(n==m)
tag=0;
else if(______)
tag=1;
else if(n<m)
tag=-1;
______;
}

试题一答案

(1)sieve[i]=i
(2)sieve[factor]>0
(3)sieve[k]=-1
(4)k+factor
(5)factor++

[解析] 本题考查在C语言中实现素数的选取。
题目要求从指定范围内的数中选取其中的素数,并给出了相关的选取方法。在做题前我们首先需要清楚什么是素数:素数又叫质数,是指除1和自身之外,没有其他约数的正整数。下面我们来分析程序。
第1空在第一层循环体下面,题目要求用数组sieve表示筛子,但在程序中并没有给数组输入值,此空应该是在循环下往数组中存放数值,其存放的位置与数值的大小对应,因此,此空答案为“sieve[i]=i”。
第2空是条件判断语句的条件,从注释中我们可以知道,这个条件判断语句的作用是筛中最小数是素数,是素数的话一定在数组中,元素的值就应该大于0。那么条件应该是判断数组中当前位置的值是否大于0,如果是,则执行判断语句下的语句,即筛选出这个数且这个数是素数。结合题目给出的条件,知道此空答案为“sieve[factor]>0”。
第3空是移走素数的倍数这个循环下面的语句,此循环的作用就是移走当前最小素数的倍数,题目要求在移走了数值以后,数组中相应的值为-1,那么此空的作用应该是将数组中该移走数的相应值变为-1,因此,此空答案为“sieve[k]=-1”。
第4空是紧接着上面一空来的,变量k中存放的是数组当前的下标,而变量。factor中存放的是当前最小的素数。此空所在循环体的作用是移走当前最小素数的倍数,求倍数时,只要在该数的基础上加上该数,那就是两倍,再加一个就是三倍,由此直到最大范围。因此,此空答案应该是“k+factor”。
第5空是while(factot<=range)循环下的最后一条语句,我们从程序中可以看出,factor中存放的是当前的最小素数,同时也是此素数在数组中的下标位置。题目告诉我们在处理完当前素数后,应该去取下一个素数,下标位置往后移动。因此,此空答案为“factor++”。

试题二答案

5,或arrChar=“test”;
7,或*P=‘0’;     3、在这里插入图片描述

[解析] 本题考查C程序编写和调试中常见错误的识别和改正。
问题1分析:在C语言中,指针表示内存单元的地址,指针变量可用于存储指针类型的值,即内存单元的地址值。变量的值在程序运行过程中允许修改,而常量则不允许修改。可以令指针指向一个变量或常量,但若指针指向一个常量,则不允许通过指针修改该常量。
第5行代码有错,即对数组名arrChar的赋值处理是错误的。在C语言中,数组名是表示数组空间首地址的指针常量,程序中不允许对常量赋值。
第7行代码有错,在第6行中,通过。P=“testing"使指针变量指向了一个字符串常量,此后可以再令指针P指向其他字符或字符串,但不能通过指针修改字符串常量的内容。
问题2分析:该函数中出现的错误是编写C程序时的常见错误。scanf是C标准库函数中的格式化输入函数,其原型如下:
Int scanf(char*format,…);
使用时,第一个实参是格式控制串,之后的实参是地址1,地址2,……
在本题中,要求以十进制整数格式输入一个整数并存入a[k],数组元素a[k]实质上一个整型变量,必须用“&”求得a[k]的地址作为实参调用scanf函数,因此,第4行出错,正确代码应为“scanf(”%d",&a[k]);”。
C程序中将相等运算符“”误用为赋值运算符“=”也是常见的一个错误,由于“=”也是合法的运算符并且C语言中用0和非0来表示逻辑假和逻辑真,因此在应产生逻辑值的地方产生了其他数值也可以,因此该错误通常只能用人工检查和排除。第6行的正确代码应为“if(kn)break;”。
在该程序中,结束循环的一个条件是k等于n,另一个条件是输入的整数为0。另外,do-while的循环条件为真(非0)时要继续循环,因此,循环条件应该是判断输入的值不等于0。观察循环体中与数组元素有关的部分,如下所示:
scanf(“%d”,&a[k]);
k++;
也就是说输入为0时存入了a[k],而循环判断条件“a[k]==0”中的a[k]相对于刚存入了0的数组元素来说已经是a[k+1]了,因此正确的条件为“a[k-1]!=0”。

试题三答案

(1)t.length
(2)i<n&&j<m
(3)s.str[i]==t.str[j]
(4)n>m
(5)return tag

[解析] 本题考查用C语言程序实现对串的操作。
题目要求对顺序存储的串s和串t进行比较,且比较结果可能是大于、小于和等于3种情况。对串的操作是考试中容易出错的内容,串是指由任意个字符构成的有限序列。要判断两个串的大小是通过串中元素的比较来实现的。
第1空是对刚声明的变量进行赋初值操作,前面的n中存放了串s的长度,而对于串t的长度在程序中一直没求过,而是用m来表示,那么此空是将串t的长度存放到变量m中。因此,此空答案为“t.length”。
第2空是循环的判断条件,从程序不难看出此循环的作用是实现对串s和串t的比较,在进行比较串时,需要对串中逐个元素进行比较,只要串中还有元素,比较就需继续,而判断串中是否还有元素是通过串的长度来实现的。两个串中元素的长度分别存放在变量n和变量m中,因此,此空答案为“i<n&&j<m”。
第3空是条件判断语句的条件,如果这个条件成立,则两个串中的元素都往后移动一个,再结合下面的程序,不难看出此条件的作用是判断当前两个元素是否相等,如果相等,则执行下面语句。因此,此空答案为“s.str[i]==t.str[j]。
第4空也是条件判断语句的条件,题目要求比较结果可能是大于、小于和等于3种情况,程序中已经考虑了其中小于和等于的情况,那么此空应该是考虑大于的情况,因此,此空答案为“n>m”。
第5空在程序的最后,题目中要求函数能返回运算的结果,而根据程序的内容,我们知道结果存放在变量tag中,因此,此空答案为“return tag”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值