试题四
4、阅读以下说明和C语言程序,将应填入______处的字句填写完整。
[说明]
计算n的合数。一个整数n可以有多种划分,使其划分的一列整数之和为n。例如,整数5的划分为:
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1
共有7种划分。这种划分的程序如下。
[程序]
#include<stdio.h>
int n[1000],m,k;
void output_sum()
{
int j;
for(j=0;n[j]!=0;j++)
printf("%d\t",n[j]);
printf("\n");
}
void sum(int i)
{
if(m-n[i]<n[i])
{ m=m-n[i];
______
i++;
n[i+l]=0;
}
else
{
______
m-=n[i];
i++;
}
if(m!=n[i])
syn(i);
else
output sum();
if(n[i]>1)
{
n[i]--;
______
}
else
{
while((n[i]==1)&&(i>0))
{
i--;
______
}
if(i!=0)
{
______
sum(i);
}
}
}
void main()
{
int i;
scanf("%d",&n[0]);
m=k=n[0];
for(i=1;i<=k;i++)
n[i]=0;
while(n[0]!=1)
{
n[0]--;
i=0;
sum(0);
m=k;
}
}
试题五
5、阅读以下说明和C++代码,将应填入______处的字句填写完整。
[说明]
现需要统计某企业员工的月平均工资,即该企业本月发给员工的工资总和除以员工数。假设企业本月发给员工的工资总和为sumSalary,该企业的员工总数为employeeNumber,下面的程序代码计算该企业员工本月的平均工资,其中需要处理employNumber为0的情况。
[C++代码]
#include<iostream>
using namespace std;
class Department{
protected:
float average(float x,int y){
if(y==0)throw ______;
return x/y;
}
public:
void caculate(void){
float sumSalary;
int employeeNumber;
try{
cout<<"请输入当月工资总和与员工数:"<<endl;
cin>>sumSalary>>employeeNumber;
float k=average(sumSalary,employeeNumber);
cout<<"平均工资:"<<k<<endl;
}
______(int e){
if(e==0){
cout<<"请重新输入当月工资总和与员工数:"<<endl;
cin>>sumSalary>>employeeNumber;
float k=average(sumSalary,employeeNumber);
cout<<"平均工资:"<<k<<endl;
}
}
}
};
void main(){
try{
______;
d.caculate();
}
______(int e){
if(e==0)
cout<<"程序未正确计算平均工资!"<<endl;
}
}
[问题1]
程序运行时,若输入的员工工资总和为6000,员工数为5,则屏幕输出为:
请输入当月工资总和与员工数:
6000 5
______
[问题2]
若程序运行时,第一次输入的员工工资总和为6000,员工数为0,第二次输入的员工工资总和为0,员工数为0,则屏幕输出为:
请输入当月工资总和与员工数:
6000 0
______
0 0
______
试题六
6、阅读以下说明和Java代码,将应填入______处的字句填写完整。
[说明]
现需要统计某企业员工的月平均工资,即该企业本月发给员工的工资总和除以员工人数。假设企业本月发给员工的工资总和为sumSalary,该企业的员工总数为employeeNumber,下面的程序代码计算该企业员工本月的平均工资,其中需要处理employNumber为0的情况。
[Java代码]
import java.util.Scanner;
public class JavaMain{
static float average(float x,int y)throws Exception{
if(y==0)throw new Exception(______);
return x/y,
}
static void caculate() throws Exception{
float sumSalary;
int employeeNumber;
Scanner sc=new Scanner(______);
try{
System.out.println("请输入当月工资总和与员工数:");
sumSalary=sc.nextFloat(); //从标准输入获得工资总和
employeeNumber=sc.nextlnt(); //从标准输入获得员工数
float k=average(sumSalary,emptoyeeNumber);
System.out.println("平均工资:"+k);
}
______(Exception e){
if(e.getMessage().equalslgnoreCase("zero")){
System.out.println("请重新输入当月工资总和与员工数:");
sumSalary=sc.nextFloat();
employeeNumber=sc.nextlnt();
float k=average(sumSalary,employeeNumber);
System.out.println("平均工资:"+k);
}
}
}
public static void main(String[] args){
try{
caculate();
}
______(Exception e){
if(e.getMessage().equalslgnoreCase("zero"))
System.out.println("程序未正确计算平均工资!");
}
}
}
[问题1]
程序运行时,若输入的员工工资总和为6000,员工数为5,则屏幕输出为:
请输入当月工资总和与员工数:
6000 5
______
[问题2]
若程序运行时,第一次输入的员工工资总和为6000,员工数为0,第二次输入的员工工资总和为0,员工数为0,则屏幕输出为:
请输入当月工资总和与员工数:
6000 0
______
0 0
______
答案:
试题四答案
4、(1)n[i+1]=m; (2)n[i+1]=n[i]; (3)sum(i); (4)m+=n[i]; (5)n[i]--;
[解析] 本题考查C语言中计算n的合数方法的实现。
题目要求计算n的合数,我们首先来了解一下什么是n的合数。在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递推关系。
(1)q(n,1)=1,n≥1
当最大数n1不大于1时,任何正整数只有一种划分形式,就是全1。
(2)q(n,m)=q(n,n),m≥n
最大加数n1实际上不能大于n。因此,q(1,m)=1。
(3)q(n,n)=1+q(n,n-1)
正整数n的划分由n1=n的划分和n1≤n-1的划分组成。
(4)q(n,m)=q(n,m-1)+q(n-m,m),n>m>1
正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1的划分组成。要想求出所有解,只有递归到最底层即全为1为止。
知道了上述特性,下面我们来看代码。在代码中首先声明一个数组和两个全局变量k,m。结合程序可以看出,其中数组n[i]中存放的是当前划分的最大加数,而m中存放的是当前被划分的数。程序代码中有三个函数,一个主函数、一个output_sum()函数和一个sum()函数,函数output_sum()的功能很简单,就是输出一次划分结果,在sum()函数中被调用。
经过分析不难发现,函数sum()的作用是实现整数的划分。在函数体中,首先是一个条件判断语句,其作用是判断当前被划分的数m是否小于当前最大加数的两倍,如果条件成立,说明数被划分为两个数后,其最大加数大于另一个数,而另一个数应该存放在数组中。此时执行语句m=m-n[i]来求出另一个数,接下来应该是保存这个数到数组中的下个位置,第1空就用来完成这个任务,因此,答案为“n[i+1]=m;”。
第2空所在的位置是条件不成立的情况下运行的语句,条件不成立,说明数被划分为两个数后,其最大加数小于另一个数,数可以有更大的最大加数,因此,将当前的最大加数保存到数组中的下个位置,此空答案为“n[i+1]=n[i];”。
第3空也在一个条件选择语句下面,此条件语句用于判断当前最大加数是否大于1,如果大于1,则需要接着划分,因此要调用函数sum(),其参数是i,所以此空答案为“sum(i);”。
第4空是条件不成立即当前最大加数为1的情况下执行的语句,当最大加数为1时,说明递归到了最底层,此时,递归应该往回走了,这需要还原当前最大划分数m(为这个数的其他划分做准备),因此,这个空的答案为“m+=n[i];”。
第5空是在条件i!=0为真的情况下执行的语句,如果条件为真,说明递归还没有回到最上层,应该求当前被划分数在当前最大加数变小后的其他划分情况,因此,此空答案为“n[i]--;”。
试题五答案
5、(1)0或y (2)catch (3)Department d
(4)catch (5)平均工资:1200.0
(6)请重新输入当月工资总和与员工数:
(7)程序未正确计算平均工资!
[解析] 本题考查C++程序设计语言中结构化异常的错误处理机制。
要正确解答该题目,需要掌握C++中tty...catch...finally与exception的概念与用法。
一般而言,try语句块中编写正常工作的语句,catch语句块中主要编写用于处理异常情况发生时的语句,而finally块中则包含不论是否发生异常都需要执行的语句。
本题中,Department类包含了一个受保护的方法average用于计算参数x除以y的值,在计算的过程中,如果y等于0。则会抛出一个异常,空1处仅仅根据average本身无法判断异常的值与类型。因为Department类的caculate方法调用了average方法,并且在使用的过程中,需要捕获average方法产生的异常,空2处首先需要填写关键字catch,另外因为其捕获的异常类型为整型,因此,空1处应该抛出一个整型值,但在代码的逻辑判读中,判断的是e是否为0的情况,因此空1处应该抛出0或者y值。
main方法中又使用了Department类的caculate方法,在使用变量d之前必须声明和定义,所以空3处应该为Department d。空4处仍然填写catch关键字。
若输入的数据为6000和5,则整个程序能够计算出其平均值为1200,并且输出caculate中的输出语句,结果为“平均工资:1200.0”。若输入的数据为6000和0,则程序中caculate方法中的catch语句会首先捕获到average抛出的异常,要求重新输入数据,并再次调用average方法,由于输入的数据为0和0,所以average会再次抛出异常,这个异常将由。main方法中的catch捕获。
试题六答案
6、 (1)"zero"(不区分大小写) (2)System.in (3)catch
(4)catch (5)平均工资:1200.0
(6)请重新输入当月工资总和与员工数:
(7)程序未正确计算平均工资!
[解析] 本题考查Java程序设计语言中结构化异常的错误处理机制。
要正确解答该题目,需要掌握Java中try...catch...finally与exception的概念与用法。
一般而言,try语句块中编写的是正常工作的语句,catch语句块中主要编写的是用于处理异常情况发生时的语句,而finally块中包含不论是否发生异常都需要执行的语句。
本题中,JavaMain类包含了一个静态的方法average,用于计算参数x除以y的值,在计算的过程中,如果y等于0,则会抛出一个异常,空1处仅仅根据average本身无法判断异常所包含的信息。因为caculate方法调用了average方法,并且在使用的过程中,需要捕获average方法产生的异常,空3处首先需要填写关键字catch,另外因为其捕获异常后判断其值为"zero",因此,空1处应该填写一个字符串"zero"。空2处需要构造一个扫描器对象,该对象需要一个输入流作为参数,因此可以使用System.in。main方法中调用了caculate方法,空4处仍然填写catch关键字。
程序运行的过程中,若输入的数据为6000和5,则整个程序能够计算出其平均值为1200,并且执行caculate中的输出语句,结果为“平均工资:1200.0”。若输入的数据为6000和0,则程序中caculate方法中的catch语句会首先捕获到average抛出的异常,要求重新输入数据,并再次调用average方法,由于输入的数据为0和0,所以average会再次抛出异常,这个异常将由main方法中的catch捕获。