导航菜单
首页 >  软考程序员初级下午真题怎么做好  > 软考初级程序员下午题(8)

软考初级程序员下午题(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 #includeint 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空是对刚

相关推荐: