初级程序员下午试题88.docx
《初级程序员下午试题88.docx》由会员分享,可在线阅读,更多相关《初级程序员下午试题88.docx(18页珍藏版)》请在冰豆网上搜索。
![初级程序员下午试题88.docx](https://file1.bdocx.com/fileroot1/2023-2/11/897303f2-e7dd-45ee-a7c8-e090c5a9b0f2/897303f2-e7dd-45ee-a7c8-e090c5a9b0f21.gif)
初级程序员下午试题88
初级程序员下午试题-88
(总分:
120.00,做题时间:
90分钟)
一、试题一(总题数:
1,分数:
15.00)
1.【流程图】
下面的流程图描述了对16位二进制整数求补的算法。
计算过程是:
从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。
然后,对该“1”位左面的更高位(如果有的话),逐位求反,所得的结果就是对原二进制数求补的结果。
例如:
对二进制整数1011100110101000求补的结果是0100011001011000。
设16位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[16]中。
例如,二进制整数1011100110101000存放在数组BIT后,就有BIT1[1]=0,BIT[2]=0,……,BIT[15]=0,BIT[16]=1。
流程图(如图1所示)中
(1)处按“循环变量名:
循环初值,增量,循环终值”格式描述。
若流程图中存在空操作,则用NOP表示。
(分数:
15.00)
填空项1:
__________________ (正确答案:
i:
1,1,16
(2)1->sw(3)0→BIT[i]
(4)NOP,或空操作(5)1->BIT[i])
解析:
[解析]该流程图的功能在说明中已经解释了,要解该题关键要搞清楚流程图中引用的变量sw的含义。
通过阅读流程图的说明和流程图可知,变量sw主要用来定义是否已经找到某一位是“1”:
当sw=0时,说明到目前为止还没有哪一位是“1”,不需要对该位求反;当sw=1时,说明已经有一位是“1”,需要对该位求反。
先来看
(1)空。
(1)空是要写出循环变量名、循环初值、增量和循环终值,该题要从遍历整型数组BIT的所有元素,从BIT[1]开始到BIT[16]结束,再看流程图的第1个判断用的变量是i,这样就可判断循环变量名为i,循环初值为1,增量为1,循环终值为16。
这样
(1)空的答案为“i:
1,1,6”。
在这个循环中,当第i位是1时,即BIT(i)=1,进入左分支。
这时需要判断sw值,若sw=0,需要将sw置为1;“若sw=1,需要对将BIT(i)置为0。
这样
(2)空的答案为“1->sw”;(3)空的答案为“0->BIT[i]”。
同样,当第i位是。
时,即BIT(i)=0,进入右分支。
这时需要判断sw值,若sw=0,将不作任何操作;若sw=1,需要对将BIT(i)置为1。
这样(4)空的答案为“NOP”;(5)空的答案为“1->BIT[i]”。
二、试题二(总题数:
1,分数:
15.00)
2.【说明】
程序8用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税总额,职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或薪金)。
由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于0结束。
假设个人所得税法规定:
个人收入所得,按月计税,以每月收入总额减除免税金额800元后的余额作为该月的月应纳税所得额。
适用税率如表2所示。
表2
级数
月应纳税所得额
适用税率(%)
1
2
3
4
5
6
7
8
9
不超过500元的部分
501元~2000元的部分
2001元~5000元的部分
5001元~2000元的部分
2001元~4000元的部分
4001元~6000元的部分
6001元~8000元的部分
8001元~100000元的部分
超过100000元的部分
5
10
15
20
25
30
35
40
45
上表表明,个人收入所得税是按照超额累进的税率来征收的。
设一个人的月应纳税所得额为K(元),用下面的公式计算其应缴纳的个人所得税额S(元);
若0<K≤500,则S=K×5%;
若500<K≤2000,则S=500×5%+(K-500)×10%;
若2000<K≤5000,则S=500×5%+1500×10%+(K-2000)×15%;
若5000<K≤20000,则S=500×5%+1500×10%+3000×15%+(K-5000)×20%;
...
例如,某人某月收入总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。
【程序】
#include<stdio.h>
#defineMaxNum50
#defineBASE800/*免税金额基数*/
intpaylevel[]=0,500,2000,5000,20000,40000,60000,80000,100000,1000001;
inttaxPrate[]=5,10,15,20,25,30,35,40,45;/*税率表*/
typedefstruct
intld;/*职工的工号*/
longSalary;/*职工的工资*/
Info;
/*查找工号为ld的职工在数组employee中的下标,返回值为0表示没有*/
intfind(intld,Infoemployee[],intm)
intj;
employee[0].Id=Id;
for(j=m;
(1);j--);
returnj;
voidmain(void)
Infoemployee[MaxNum+1];
longWage;
doublesum=0,K,S;
inti,j,N=0,Code;
scanf("%d%Id",&Code,&Wage);
while(Code>0)
i=find(Code,empolyee,N);
if(i>0)employee[i].Salary+=Wage;
else
(2);
employee[N].Id=Code;employee[N].Salary=Wage;
scanf("%d%Id",&Code,&Wage);
for(i=1;i<=N;i++)
K=(3);/*计算月应纳税所得额*/
S=0;/*月应纳税额赋初值*/
if(K>0)
for(j=1;j<=9;j++)
if(4)/*月应纳税所得额超过第j级*/
S=S+(paylevel[j]-paylevel[j-1])*taxPrate[j-1]/100;
elseS=S+(5)*taxPrate[j-1]/100;break;
printf("职工%d应缴纳的个人所得税额:
%10.21f/n",employee[i].Id,S);
sum+=S;
printf("全体职工个人所得税总额:
%10.21f/n",sum);
(分数:
15.00)
填空项1:
__________________ (正确答案:
employee[j].Id!
=Id
(2)++N或N++或N=N+1
(3)employee[i].Salary-BASE
(4)K>paylevel[j](5)K-paylevel[j-1])
解析:
[解析]
(1)find函数的功能是找到了号为Id的职工在数组employee中的下标。
显然,循环进行下去的条件是employee[j].Id!
=Id。
(2)当i=0时,表明该职工的信息是第一次录入,所以应当在数组employee中创建一个新元素,于是此处应填入N++或其他等价表达式。
(3)K表示该月应纳的所得税额,所以应填入employee[i].SalaryBASE。
(4)此处是判断当前职工的工资是否超过第j级,所以应填入K>paylevel[j])。
(5)当前职工的工资不超过第j级,应当计算它与第j-1级的差额的所得税,所以应填入K-paylevel[j-1]。
三、试题三(总题数:
1,分数:
15.00)
3.【说明】
下面的程序功能的功能是以行为单位对字符串按下面的条件进行排序。
排序条件为:
从字符串中间一分为二,右边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。
如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上
例如:
位置:
01234567
源字符串:
hgfeabcd
则处理后字符串:
dcbahgfe
函数ReadDat()实现从文件in.dat中读取数据(每行字符串长度均小于80),函数WriteDat()把结果dat输出到文件out.dat中。
#include<stdio.h>
#include<siring.h>
#include<conio.h>
chardat[20][80];
voidjsSort()
inti,j,k,strl;
charch;
for(i=0;i<20;i++)
strl=strlen(date[i]);
for(j=
(1);j<strl;j++)/*对后半部分的字符串进行排序*/
for(k=j+1;k<strl;k++)
if(
(2))
ch=dat[i][j];
dot[i][j]=dat[i][k];
dat[i][k]=ch;
for(j=0;(3)j++)/*前后两部分进行交换*/
ch=date[i][j];
dote[i][j]=date[i][(strl+1)/2+j];
dat[i][(strl+1)/2+j]=ch;
voidmain()
reodDat();
isSort();
writeDot();
readDat()
FILE*in;
inti=0;
char*p;
(4);
while(i<20&&fgets(dat[i],80,in)!
=NULL)
p=strchr(date[i],"/n");
if(p)*p=0;
i++;
fclose(in);
writeDat()
FILE*out;
inti;
clrscr();
out=fopen("out.dat","W");
for(i=0;i<20;i++)
printf("%s/n",dar[i]);
printf((5));
fclose(out);
(分数:
15.00)
填空项1:
__________________ (正确答案:
(strl+1)/2
(2)dat[i][j]<dat[i][k]
(3)j<strl/2(4)in=fopen("in.dat","r")
(5)out,"%s/n",dat[i])
解析:
[解析]程序的思路是:
先调用函数ReadDat()从文件in.dat中读取20行数据存放到字符中数组dat中,然后调用函数jsSort()对字符串数组dar按照排序规则进行排序,排序后的结果仍按行重新存入字符串数组dat中,最后调用函数WriteDat()把结果dat输出到文件out.dat中。
(1)、
(2)空所在的两重循环是对一行字符串的后半部分按字符的ASCII值降序排序,这是一个简单的冒泡排序。
考虑到如果原字符串长度为奇数,则最中间的字符不参加排序,因此应从第(strl+1)/2个元素开始排序,这就是
(1)空所填的内容。
由于是按字符的ASCII值降序排序,因此当dat[i][j]<dat[i][k]时就要进行数据交换,这就是
(2)空所填的内容。
(3)空所在的循环是进行前后两部分数据交换,因此,结束条件应为strl/2,因此空(3)应填“j<strl/2”。
(4)空所在函数是读取数据函数。
在读取数据前先要以只读方式打开数据文件in.dat,因此空(4)处应填写“in=fopen("in.dat","r")”。
(5)空所在函数是写入排序结果函数。
在(5)空所在行是把dat[i]一行写入到out.dat中,应此(5)空处应填写“out,"%"s/n",dat[i]”。
四、试题四(总题数:
1,分数:
15.00)
4.【说明4.1】
假设两个队列共享一个循环向量空间(如图1-2所示),其类型Queue2定义如下:
typedefstruct
DateTypedata[MaxSize];
intfront[2],rear[2];
Queue2;
对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。
函数.EnQueue(Queue2*Q,inti,DaleTypex)的功能是实现第i个队列的入队操作。
【函数4.1】
intEnQueue(Queue2*Q,inti,DateTypex)
/*若第i个队列不满,则元素x入队列,并返回1;否则,返回0*/
if(i<0‖i>1)return0;
if(Q->rear[i]==Q->front[
(1)]
return0;
Q->data[
(2)]=x;
Q->rear[i]=[(3)];
return1;
【说明4.2】
函数BTreeEqual(BinTreeNode*T1,BinTtneNode*T2)的功能是递归法判断两棵二叉树是否相等,若相等则返回1,否则返回0。
函数中参数T1和T2分别为指向这两棵二叉树根结点的指针。
当两棵树的结构完全相同,并且对应结点的值也相同时,才被认为相等。
已知二叉树中的结点类型BinTreeNode定义为:
structBinTreeNode
chardata;
BinTreeNode*left,*right;
;
其中dau为结点值域,leR和risht分别为指向左、右子女结点的指针域,
【函数4.2】
intBTreeEqual(BinTreeNode*T1,BinTreeNode*T2)
if(Ti==NULL&&T2==NULL)return1/*若两棵树均为空,则相等*/
elseif((4))return0;/*若一棵为空一棵不为空,则不等*/
elseif((5))return1;/*若根结点值相等并且左、右子树*/
/*也相等,则两棵树相等,否则不等*/
elsereturn0;
(分数:
15.00)
填空项1:
__________________ (正确答案:
(i+1)%2(或1-i)
(2)Q->rear[i]
(3)(Q->rear[i]++)%Maxsize
(4)T1==NULL‖T2==NULL(5)T1->data==T2->data&&BTreeEqual(T1->left,T2->left)&&BTreeEqual(T1->right,T2->right))
解析:
[解析]这一题共有两个函数,第一个函数是一个循环共享队列入队的的问题,第二个函数是用递归法判断两棵二叉树是否相等的问题。
先分析第一个函数。
(1)空所在if语句是判断是否能入队,当队列0入队时,如果队列0队尾指针与队列1队头指针相等时,说明队列0无法入队;当队列1入队时,如果队列1队尾指针与队列0队头指针相等时,说明队列1无法入队。
因此
(1)空处应填写“(i+1)%2”或“1-i”。
(2)、(3)空是入队操作,其操作步骤是先将元素x插入队列i队尾所指的位置,再将队尾“加1”。
因此
(2)空处应填写“Q->rear[i]”;由于是一个循环队列,(3)空处应填写“(Q->rear[i]+1)%Maxsize”。
再分析第二个函数。
这一题比较简单,只需将程序注释转换成C语言即可得到答案。
(4)空所处理的是若一棵为空,而一棵不为空则不相等,显然(4)空应填入“TI==NULL‖T2==NULL”。
(5)空处是一个递归调用,处理若根结点值相等并且左、右子树也相等,则两棵树相等,因此(5)空应填入“T1->data==T2->data&&BTreeEqual(T1->left,T2->left)&&BTreeEqual(Tl->right,T2->right)”及其等价形式。
五、试题五(总题数:
1,分数:
15.00)
5.1】
【应用说明5.1】
本应用程序的窗体中有一个下拉式列表框(名称为Combo1)和两个文本框(名称分别为Txt1和Txt2)。
运行时,用户从Combo1的列表中进行选择,程序就会将选中条目的内容以及编号(从0开始)分别在文本框Txt1和Txt2中显示出来。
【程序代码5.1】
PrivateSubCombo1_Click()
Txt1.Text=Combo1.
(1)
Txt2.Text=Combo1.
(2)
EndSub
(注:
可供
(2)处选择的选项:
List,Index,Listlndex,ListCount,Number)
【应用说明5.2】
本应用程序的运行窗口如图2所示。
开发该应用的部分程序代码如下:
【程序代码5.2】
PrivateSubCmbOp_Click()
DimDatalnAsDouble,DataOutasDouble
Dataln=(3)
SelectCase(4)
Case"取整数部分"
DataOut=Int(Dataln)
Case"求平方根"
IfDataln<0Then
MagBox"负数不能开平方!
"
Else
DataOut=Sqr(Dataln)
EndIf
Case"取绝对值"
DataOut=Abs(Dataln)
(5)
TxtOut.Text=str$(DataOut)
EndSub
(分数:
15.00)
填空项1:
__________________ (正确答案:
Text
(2)Listlndex(3)Val(Txtln.Text)或Txtln.Text
(4)CmbOp.Text(5)EndSelect)
解析:
[解析]
(1)组合框的Text属性用于取得文本。
(2)组合框的Listlndex属性用于取得选中的项的编号。
(3)此处的Val(Txtln.Text)或Txtln.Text能够取得用户的输入。
(4)此处以组合框的当前值做为分支依据。
(5)此处是分支语句结束,应当填结束标志。
六、试题六(总题数:
1,分数:
15.00)
6.【说明】
下面程序的功能是显示已定义的一个3行3列的二维数组每行的元素,并求所有元素的和并输出。
请在程序的每条横线处填写一个适当的语句,使程序的功能完整。
publicclassArrayt
(1)static
(2)main(Stringargs[])
intsum=0;
int[][]=t11,12,13,21,22,23,31,32,33;
for(inti=0;(3)i++)
System.out.print("b["+i+"]:
");
for(intj=0;(4)j++)
System.out.print(b[i][j]+"");
(5)
System.out.println();
System.out.println("sum="+sum);
(分数:
15.00)
填空项1:
__________________ (正确答案:
public
(2)void(3)i<3;或等价形式
(4)j<3;或等价形式 (5)sum+=b[i][j];或等价形式)
解析:
[解析]
(1)空为Java主函数的修饰符,是固定写法。
(2)空Java主函数不需要返回值,这也是固定写法。
(3)空数组共有3行,所以循环3次。
(4)空数组共有3列,所以循环3次。
(5)空是将b[i][j]累加到sum中。
七、试题七(总题数:
1,分数:
15.00)
7.【说明】
某学校举办了一场奥运知识竞赛,参加竞赛的选手为200名,1~200为选手编号。
竞赛时间为9:
00~11:
00。
8道竞赛题目依次从“A”~“H”编号,选手可按任意次序答题,每完成一道题目,可立即提交答案。
若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。
选手提交答案的情况及判定结果由专人即时录入,录入数据包括提交答案的时间、选手编号、题目编号(A~H)、是否正确(Y/N)等。
对竞赛情况进行统计和排名的规则如下:
1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间计算如下:
解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时,罚时=提交题目P错误解答的次数×20例如:
表1中14号选手在10:
27提交了题目A的正确解答,因此该选手正确解答该题目所用时间P为87分钟,由于他在09:
37和09:
52两次提交了题目A的错误解答,因此罚时为(2×20)分钟=40分钟,所以14号选手解答题目A的用时=(87+40)分钟:
127分钟。
2.已经提交正确答案的题目再次提交时不再计算。
3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。
4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为。
的选手不参加排名。
本应用程序的运行窗口如图3所示。
窗口中的两个文本框为Txt_time和Txt_player,分别用于录入提交答案的时间和选手编号。
组合列表框Combo1提供题目编号(A~H),录入时从中选择。
检查框Chk_yn用于输入解答是否正确信息。
当单击“确定”按钮(Cmd_comfirm)时,录入的提交信息加入列表框List1中,排名情况在列表框List2输出。
单击“关闭”按钮时退出应用程序。
在开发过程中,需要编写的部分程序代码如下:
【程序】
PrivateTypeinfo
NoAsInteger′选手编号
NumAsInteger′完成题目数量
TimeAsInteger′完成题目的总用时
d(8)AsInteger′d用于记录提交第i个题目错误答案的次数
a(8)AsBoolean′a用于记录第i个题目是否已经提交正确答案
EndType
DimR(201)Asinfo′R[j]用于统计编号为j的选手提交答案的情况
DimMaxlndexAsInteger′Maxlndex记录提交答案的选手中编号最大者
PrivateSubForm_Load()
Fori=1to8
Combo1.Addltemchr(
(1))
Next
Combo1.Text=Combo1.List(0):
txt_time.Text="":
txt_player.Text=""
Fori=1To200
R(i)num=0:
R(i).time=0:
R(i).no=i
Forj=1To8
R(i).d(j)=0:
R(i).a(j)=False
Nextj,i
EndSub
PrivateSubcmd_confirm_Click()
Dimh,m,k,timeAsInteger,c