问答题试题七(15分,每空3分)阅读以下应用说明及VisualBasic部分程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]设一个简单的“通讯录”存储在一个ACCESS类型的数据库表中,包括姓名、电话和email三个字段。下面的应用程序实现对“通讯录”数据库表中的记录进行增加、删除及修改处理,其运行界面如下:(1)数据控件(data1)与“通讯录”数据库表相连接,用户可通过“??”和“??”按钮指定表中的当前记录。(2)文本框Txt_name、Txt_phone和Txt_email分别与数据库表中的“姓名”、“电话”和“email”字段绑定,用于显示当前记录的内容。(3)应用程序启动时,“确定”按钮(Cmd_ok)和“取消”按钮(Cmd_cancel)不可操作,文本框中显示表中的第一条记录,这时文本框处于不可操作状态。(4)单击“增加”按钮(Cmd_add)或“修改”按钮(Cmd_modify)后,方可以编辑记录内容,同时“增加”、“删除”、“修改”和“退出”按钮变为不可操作状态。“增加”和“修改”操作需通过“确定”和“取消”按钮确认。(5)单击“删除”按钮(Cmd_del)后,弹出对话框,再单击“确定”按钮,当前记录被删除。[程序代码]PrivateSubenableop(isEnabledAsBoolean)Txt_name.Enabled=isEnabled:Txt_phone.Enabled=isEnabledTxt_email.Enabled=isEnabledCmd_ok.Enabled=isEnabled:Cmd_cancel.Enabled=isEnabledCmd_add.Enabled=NotisEnabled:Cmd_del.Enabled=NotisEnabledCmd_end.Enabled=NotisEnabled:Cmd_modify.Enabled=NotisEnabledEndSubPrivateSubForm_Load()Callenableop(False)Data1.RefreshIfData1.Recordset.RecordCount=0ThenCmd_del.Enabled=False:Cmd_modify.Enabled=(1)EndIfEndSubPrivateSubCmd_add_Click()'单击“增加”按钮的代码Callenableop((2))Data1.Recordset.AddNew'在数据库表中添加一个新记录Txt_name.(3)EndSubPrivateSubCmd_del_Click()'单击“删除”按钮的代码OnErrorGoToerror3ans=MsgBox("确定删除吗?",vbYesNo+vbInformation,"操作提示!")If(ans=vbYes)ThenData1.Recordset.(4)Data1.Recordset.MoveNextIfData1.Recordset.EOFThenData1.RefreshEndIfExitSuberror3:MsgBoxErr.Description,vbOKOnly,"错误提示!"EndSubPrivateSubCmd_ok_Click()'单击“确定”按钮的代码OnErrorGoToerror1Data1.Recordset.(5)Callenableop(False)ExitSuberror1:MsgBoxErr.Description,vbOKOnly,"错误提示!"Data1.UpdateControlsCallenableop(False)EndSub’“修改”和“取消”按钮的程序代码(略)
问答题【说明】 本程序根据输入的月份数,输出它是哪个季节。 【代码】 import java.io.*; public class season public static void main(String[] args) String strln=""; (1) in=new InputStreamReader(System.in); BufferedReader buffln=new BufferedReader(in); System.out.print("Please enter a month(1-12):"); try strln=buffln.readLine();//从命令行读入数据 catch( (2) ) System.out.println(e.toStdng()); int month= (3) (strln);//将字符串转换成整数型 int season=0; if(month<12 //计算季节的公式 (4) (season) case 1: System.out.println("the season is Springl"); break; case 2: System.out.println("the season is Summer!"); case 3: System.out.println("the season is Fall!"); case 4: System.out.println("the season is Winter!"); break; (5) ; System.out.println("this is not correct month!");
问答题[说明]某小型家电超市开发了下面的程序,用以实现商品提货信息的汇总和输出功能。程序的运行界面如下图所示:程序界面包含两个控件数组,分别是提货商品复选框控件数组Check1以及提货数量文本框控件数组Text1(相同下标的复选框和文本框相对应),提货清单的显示由List控件实现,按钮“打印清单”和“清除”分别名为Command1和Command2。[VisualBasic代码]’提货商品复选框的单击事件响应代码PrivateSubCheck1_Click(IndexAsInteger)IfCheck1(Index).Value=1Then(1).SetFocusEndSub’按钮“打印清单”的单击事件响应代码PrivateSubCommand1_Click()Dimi,n,priceAsInteger,sumAsLong,titleAsStringsum=0Fori=OTo4SelectCaseiCase0:title="电视机":price=3580Case1:title="微波炉":price=660Case2:title="电冰箱":price=1850Case3:title="DVD":price=2880Case4:title="空调":price=2500EndSelectIf(2)=1AndTextl(i).Text<>""Then(3)title&Text1(i).Text&"台"n=n+Val(Textl(i))sum=(4)EndIfNextiIfsum<>0Then(3)"共:"&n&"台,"&"合计金额:"&sum&"元。"EndIfEndSub’按钮“清除”的单击事件响应代码PrivateSubCommand2_Click()(5)EndSub
问答题【说明】 魔方阵,又叫幻方,在我国古代称为“纵横图”。由1…N2共N2个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。 奇数阶魔方阵的生成方法如下: (1)第一个位置在第一行正中。 (2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。 (3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为: 8 1 6 3 5 7 4 9 2 了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m, n。其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了 MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。 【程序】 #include <stdio.h> #define MAX 15 void main() { int n; int m=1; int i,j; int a[MAX][MAX]; printf("Please input the rank of matrix:"); scanf("%d", i=0; {{U}} (1) {{/U}} while({{U}} (2) {{/U}}) a[i][j]=m; m++; i--; j++; if((m-1)%n==0 } if(j>(n-1)) //超出上界 {{U}} (4) {{/U}} if(j>(n-1)) {{U}} (5) {{/U}} } for(i=0;i<n;i++) //输出魔方阵 for(j=0;j<n;j++) { if(a[i][j]/10==0) printf("%d ",a[i][j]); //对程序无影响,只是使输出的数每一列对齐 else printf("%d ",a[i][j]); if(j==(n-1)) printf("/n"); } }
问答题阅读下列说明和C++代码,填充代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
某学校在学生毕业时要求对其成绩进行综合评定,学生的综合成绩(GPA)由其课程加权平均成绩(Wg)与附加分(Ag)构成,即GPA=Wg+Ag。
设一个学生共修了n门课程,则其加权平均成绩(Wg)定义如下:
其中,gradei、Ci分别表示该学生第i门课程的百分制成绩及学分。
学生可以通过参加社会活动或学科竞赛获得附加分(Ag)。学生参加社会活动所得的活动分(Apoints)是直接给出的,而竞赛分(Awards)则由下式计算(一个学生最多可参加m项学科竞赛):
其中,li和Si分别表示学生所参加学科竞赛的级别和成绩。
对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为0计算。
下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类Student描述,包括学号(stuNo)、姓名(name)、课程成绩学分(grades)和综合成绩(GPA)等,参加社会活动的学生由类ActStudent描述,其活动分由Apoints表示,参加学科竞赛的学生由类CmpStudent描述,其各项竞赛的成绩信息由awards表示。
【C++代码】
#include
#include
using namespace std;
const int n=5; /*课程数*/
const int m=2; /*竞赛项目数*/
class Student{
protected:
int stuNo;string name;
double GPA; /*综合成绩*/
int(*grades)[2]; /*各门课程成绩和学分*/
public:
Student(const int stuNo,const string&name,int grades[][2]){
this->stuNo=stuNo;this->name=name;this->grades=grades;
}
Virtual~Student(){}
int getstuNo(){/*实现略*/}
string getName(){/*实现略*/}
____(1)____;
double computeWg(){
int totalGrades=0,totalCredits=0:
for(int i=0;i<N;i++){
totalGrades+=grades[i][0]*grades[i][1];totalGredits+=grades[i][1];
}
return GPA=(double)totalGrades/totalCredits;
}
};
class ActStudent;public Student{
int Apoints;
public;
ActStudent(const int stuNo,const string&name,int gs[][2],int Apoints)
:____(2)____{
this->Apoints=Apoints:
}
double getGPA(){return GPA=____(3)____;}
};
class CmpStudent:public Student{
private:
int(*awards)[2];
public:
cmpstudent(const int stuNo,const string&name,int gs[][2],int awards[][2])
:____(4)____{ this->award=award;}
double getGPA()f
int Awards=0;
for(int i=0;i<M;i++){
Awards+=awards[i][0]*awards[i][1]:
}
Return GPA=____(5)____;
}
};
int main()
{ //以计算3个学生的综合成绩为例进行测试
int g1[][2]={{80,3},{90,2},{95,3},{85,4},{86,3}},
g2[][2]={{60,3},{60,2),{60,3},{60,4},{65,3}},
g3[][2]={{80,3},(90,2},{70,3},{65,4},{75,3}}; //课程成绩
int c3[][2]={{2,3},{3,3)}; //竞赛成绩
Student*student[3]={
new ActStudent(101,”John”,g1,3), //3为活动分
new ActStudent(102,”Zhang”,g2,0),
new ActStudent(103,”Li”,g3,c3),
};
//输出每个学生的综合成绩
for(int i=0;i<3;i++)
cout<<____(6)____<<end1;
delete*student;
return 0;
}
问答题【说明】 本程序的功能是生成螺旋方阵,用户可以输入该方阵的行列数,然后就生成对应的螺旋方阵。例如:当n=5时,对应的螺旋方阵如下: 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 【C++代码】 #include"stdio.h" #include"iostream,h" int array[11][11]; int temp; int ROW; void godown(int temp<=ROW;temp++) if(array[temp][a]==0) array[temp][a]= (1) ; a++; void goright(int temp<=ROW;temp++) if(array[b][temp]==0) array[b][temp]=m++; b--; void goup(int temp>0;temp-) if(array[temp][c]==0) array[temp][c]=m++; c--; void goleft(int temp>0;temp--) if(array[d][temp]==0) array[d][temp]=m++; (2) ; void main() int a,b,c,d,max,m; cin>>ROW; cout>>end1; for(a=1;a<=ROW;a++) for(b=1;b<=ROW;b++) (3) ; m=1; a=d=1; b=c=ROW; max= (4) ; whiie(m<=max) godown(m,a); (5) (m,b); goup(m,c); goleft(m,d): for(a=1;a<=ROW;a++) for(b=1;b<=ROW;b++) printf("%3d ",array[a][b]); cout<<end1;
问答题【说明】某绘图系统存在Point、Line和Square3种图元,它们具有Shape接口,图元的类图关系如图5-12所示。现要将Circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由Shape派生而来,它提供的接口不被系统直接使用。【Java代码7-1】既使用了XCircle又遵循了Shape规定的接口,即避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。【Java代码7-2】根据用户指定的参数生成特定的图元实例,并对它进行显示操作。该绘图系统定义的接口与XCircle提供的显示接口及其功能如表5-14所示。{{B}}表5-14绘图系统定义的接口与XCircle显示接口功能表{{/B}}ShapeXCircle功 能Display()_DisplayIt()显示图元【Java代码7-1】classCircle{{U}}(1){{/U}}{private{{U}}(2){{/U}}pxc;publiCCircle(){pxc=new{{U}}(3){{/U}};}publicvoiddispiay(){pxc.{{U}}(4){{/U}};}}【Java代码7-2】publicclassFactory{public{{U}}(5){{/U}}getShapeInstance(inttype)(//生成特定类实例Switch(type){case0:returnnewPoint();case1:returnnewRectangle();case2:returnnewLine)();case3:returnnewCircle();default:returnnull;}}};publiCclassApp{publicstaticvoidmain(Stringargv[]){if(argv.length!=1){System.out.println("errorparameters!");Return;}inttype=(newInteger(argv[0])).intValue();Factoryfactory=newFactory();Shaps;s=factory.{{U}}(6){{/U}}if(s==null){System.out.println("Errorgetinstance!");Return;}s.display();return;}}
问答题【说明】 本程序用古典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 指出在多大的范围内寻找素数*/ for(i=2; i<=range; i++) (1) ; factor=2; while (factor<=range) if( (2) ) /* 筛中最小数是素数 */ printf("%d/t", factor); k=factor; while (k<=range) /*移走素数的倍数 */ (3) ; k= (4) ; (5) ;
问答题[说明] 类Queue表示队列,类中的方法如表4-12所示。 {{B}}表4-12 类Queue中方法说明表{{/B}}
方法
说明
IsEmpty()
判断队列是否为空,如果队列不为空,返回true;否则,返回false
Enqueue(object NewNode)
入队操作
Dequeue()
出队操作。如果队列为空,则抛出异常 类Node表示队列中的元素;类EmptyQueueException给出了队列中的异常处理操作。 [Java代码] public class testmain { //主类 public static viod main (string args[]) { Queue q= new Queue; q.enqueue("first!"); q.enqueue("second!"); q.enqueue("third!"); {{U}} (1) {{/U}} { while(true) system.out.println(q.dequeue()); } catch({{U}} (2) {{/U}}) { } } public class Queue { //队列 node m_firstnode; public Queue(){m_firstnode=null;} public boolean isempty() { if (m_firstnode= =null) return true; else return false; } public viod enqueue(object newnode) { //入队操作 node next = m_firstnode; if (next = = null) m_firstnode=new node(newnode); else { while(next.getnext() !=null) next=next.getnext(); next.setnext(new node(newnode)); } } public object dequeue() {{U}}(3) {{/U}} { //出队操作 object node; if (is empty()) {{U}} (4) {{/U}} else { node =m_firstnode.getobject(); m_firstnode=m_firstnode.getnext(); return node; } } } public class node{ //队列中的元素 object m_data; node m_next; public node(object data) {m_data=data; m_next=null;} public node(object data,node next) {m_data=data; m_next=next;} public void setobject(object data) {m_data=data; } public object getobject(object data) {return m_data; } public void setnext(node next) {m_next=next; } public node getnext() {return m_next; } } public class emptyqueueexception extends {{U}}(5) {{/U}} { //异常处理类 public emptyqueueexception() { system. out. println ( "队列已空!" ); } }
问答题[说明]我国现行使用的公民身份证号码有两种,分别遵循两个国家标准:〖GB11643-1989〗和〖GB11643-1999〗。〖CB11643-1989〗中规定的是15位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。〖GB11643-1999〗中规定的是18位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其中,校验码C由本体码按如下过程求得:(1)计算校验码和S=a18W18+a17W17+…+a2w2,其中i表示18位身份证号,码每一位的序号,从右至左,最左侧为18,最右侧为1;ai表示身份证号码第i位上的号码;wi表示第i位上的权值,其值为2i-1模11的结果;(2)计算校验码值R,其值为校验和模11的结果;(3)根据下面对应关系找出校验码C:R012345678910C10X98765432由上述计算过程可以看出,18位身份证号码中可能包含非数字的字母X(代表数字10)。下面的应用程序基于这一算法实现了身份证号码的升位查询:在开发过程中,显示新旧两种身份证号码的文本框(TextBox)分别名为Text1和Text2,“号码升位”按钮(CommandButton)名为Command1。代码中使用到的字符串函数及功能说明如下:(1)Len(s):获取字符串s的长度;(2)Left(s,1):返回字符串s左端长度为1的子串;(3)Right(s,1):返回字符串s右端长度为1的子串;(4)Mid(s,p,1):返回字符串s从第P个字符开始长度为1的子串。[VisualBasic代码]’计算18位身份证号码PrivateSubCommandl_Click()DimcodeAsStringDimSAsIntegercode=Textl.Text'提取15位身份证号码IfLen(code)<>15ThenMsgBox"ID号码长度不正确,请检查!"(1)EndIfcode=Left(code,6)+"19"+(2)(code,9)'年份升位S=0Fori=18To2Step-1'计算校验码和S=S+Clnf((3))*(2^(i-1)Mod11)Nexti(4)'计算校验码值SelectCaseS'确定校验码Case0:code=code+"1"Case1:code=code+"0"Case2:code=code+"X"CaseElse:code=code+CStr((5))EndSelectText2.Text=code'显示18位身份证号码EndSub
问答题【说明】
本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:
typedef struct {char fname [256] /*原始文件名*/
long length; /*原始文件长度(字节数)*/
long offset; /*原始文件在合并文件中的位置(偏移量)*/
}FileInfo;
在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:
FileInfo EndFlag={"Combined File",0,_offset};
其中_offset是第一个原始文件的控制信息在合并文件中的位置(偏移量)。
启动本程序的命令行的格式是:
程序名 合并文件名 [原始文件名]
如果不指定原始文件名,默认恢复合并文件中的所有原始文件。
程序中涉及的部分文件操作的库函数简要说明如下:
int fread(void * buffer,int size,int count,FILE * fbin):从二进制文件流fbin中读取 count块长度为size字节的数据块到buffer指向的存储区。返回值为实际读取的数据块数。
int fwrite(void * buffer,int size,int count,FILE * fbin):各参数和返回值的意义与fread相同,但对文件进行写操作。
int fseek(FILE * fbin,long offset,int position):将文件流fbin的读/写位置以position为基准移动offset字节。position的值可以是SEEK_SET(文件头),SEEK_CUR(当前位置), SEEK_END(文件尾);offset为正,表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。
long ftell(FILE * fbin):返回文件流fbin的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。
【程序】
#include <stdio. h>
#include <string. h>
typedef struct { char fname[256];long lengt;long offset;
} Filelnfo;
void copyfile( FILE*fin, FILE * fout,int fsize)
{ char buf[1024];int siz=1024;
while(fsize !=0){ /*每次复制siz个字节,直至复制完fsize个字节*/
if(siz >fsize){{U}} (1) {{/U}};
fread(buf,1,siz,fin); fwrite(buf,1,siz,fout);
fsize={{U}} (2) {{/U}};}
}
int dofile(FILE * fin,Filelnfo * inp)
{ long offset;
FILE * fout;
if (( fout = fopen ( inp - > fname ,"wb" ))==NULL) {
printf("创建文件错误: %s/n" , inp -> fname);
return 1;
}
offset= {{U}}(3) {{/U}}; /*保留合并文件读/写位置*/
fseek({{U}} (4) {{/U}}); /*定位于被恢复文件首*/
copyfile ( fin, fout, inp - > length);
fclose(fout);
printf("/n ---文件名: %/n 文件长: %ld. /n",inp -> fname, inp -> length);
{{U}}(5) {{/U}}; /*恢复合并文件读/写位置*/
return 0;
}
int main( int argc, char * argv[ ])
{ Filelnfo finfo;
char fname[256] ;FILE * fcmbn;
if(argc <2) { printf("输入合并文件名:" ) ;scanf("%s" ,fname);
else strcpy(fname,argv[1]);
if((fcmbn = fopen(fname,"rb" )) == NULL) {
printf("文件打开错误: %s/n" ,fname);return 1;
}
fseek(fcmbn, -sizeof(Filelnfo),SEEK_END); /*定位于合并文件末尾的标志信息*/
fread(
if(finfo. length!=0||strcmp(finfo. fnane," CombinedFile" )){
printf("指定的文件不是合法的合并文件/n");
fclose (fcmbn); return 2;
}
fseek(fcmbn,finfo. offset,SEEK_SET); /*定位于首个原始文件的控制信息*/
for(;;){ /*恢复一个(argc>2)或全部(argc=2)原始文件*/
fread (
if(finfo, length ==0) break;
if (argc> 2
if (dofile ( fcmbn,
}
fcolse(fcmbn);return 0;
}
问答题[说明]函数intToplogical(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中,图G表示一个具有n个顶点的AOE-网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下。typedefstructGnode/*邻接表的表节点类型*/intadjvex;/*邻接顶点编号*/intweight;/*弧上的权值*/structGonde*nextare;/*指示下一个弧的节点*/Gnode;typedefstructAdjlist/*邻接表的头节点类型*/charvdata;/*顶点的数据信息*/structGnode*Firstadj;/*指向邻接表的第一个表节点*/Adjlist;typedefstructLinkedWDigraph/*图的类型*/structAdjlisthead;/*指向图中第一个顶点的邻接表的头节点*/LinkedWDigraph;例如,某AOE-网如图4-14所示,其邻接表存储结构如图4-15所示。图4-14某AOE-网图4-15邻接表存储结构图[函数]intToplogical(LinkedWDigraphG)Gnode*p;intj,w,top=0;intStack,*ve,*indegree;ve=(int*)mallloc(G.n+1)*sizeof(int));indegree=(int*)malloc((G.n+1)*sizeof(int));/*存储网中个顶点的入度*/Stack=(int*)malloc((G.n+1)*sizeof(int));/*存储入度为0的顶点的编号*/if(!ve||!indegree||!Stack)exit(0);for(j=1;j<=G.n;j++)ve[j]=0;indegree[j]=0;/*for*/for(j=1;j<=G.n;j++)/*求网中各顶点的入度*/p=G.head[j].Firstadj;while(p)(1);p=p->nextarc;/*while*//*for*/for(j=1;j<=G.n;j++)/*求网中入度为0的顶点并保存其编号*/if(!indegree[j])Stack[++top]=j;while(top>O)w=(2);printf("%c",G.head[w].vdata);p=G.head[w].Firstadj;while(p)(3);if(!indegree[p->adjvex])Stack[++top]=p->adjvex;if((4))Ve[p->adjvex]=ve[w]+p->weight;P=p->nextarc;/*while*//*while*/return(5);/*Toplogical*/
问答题从下列3道试题(试题5至试题7)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。阅读以下应用说明及VisualBasic程序代码,根据要求回答问题1至问题3。【说明】在VisualBasic程序中,设计一个“个人所得税计算器”,其应用程序的运行窗口如图6-16所示。窗口中的3个文本框和两个按钮的名称分别为Txt_salary、Txt_base、TxL_tax、Cmd_compute和Cmd_quit。“个人所得税计算器”程序运行时,文本框Txt_base中存放的是免税金额基数(应扣除的基本费用)。当用户在文本框Txt_salary中输入月收入(工资或薪金)并单击【计算】按钮(Cmd_compute后,Txt_tax框中就显示计算所得的应纳税额。文本框Txt_base和Txt_tax在运行时不接受用户输入,Txt_base的内容以灰色显示。个人工资(或薪金)所得税是按照超额累进的税率来征收的,其计算方法如下:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算。目前的免税金额基数为1600元,税率如表6-15所示。{{B}}表6-15个人所得税税率表(工资、薪金所得适用){{/B}}{{B}}级 数{{/B}}{{B}}全月应纳税所得额{{/B}}{{B}}税率(%){{/B}} 1 不超过500元的 5 2 超过500元至2000元的部分 10 3 超过2000元至5000元的部分 15 4 超过5000元至20000元的部分 20 5 超过20000元至40000元的部分 25 6 超过40000元至60000元的部分 30 7 超过60000元至80000元的部分 35 8 超过80000元至100000元的部分 40 9 超过100000元的部分 45(注:本表所称全月应纳税所得额是指依照本法第六条的规定,以每月收入额减除费用1600元后的余额或者减除附加减除费用后的余额)设某个人的全月应纳税所得额为M(元),用下面的公式计算其应缴纳的个人所得税额S(元):若0<M≤500,则S=M×5%;若500<M≤2000,则S=500×5%+(M-500)×10%;若2000<M≤5000,则S=500×5%+1500×10%+(M-2000)×15%;若5000<M≤20000,则S=500×5%+1500×10%+3000×15%+(M-5000)×20%;假设某程序员2008年5月份工资总额为4700元,减去1600元后,应纳税所得额为3100元,其应缴纳的个人所得税额为500×5%+1500×10%+1100×15%=340元。在开发过程中,需要编写的程序代码如下。【VisualBask程序】OptionBase0PrivateSubCmdcompute-Click()Dimpaylevel,taxPratepaylevel=Array(0,500,2000,5000,20000,40000,60000,80000,100000,1000001taxPrate=Array(5,10,15,20,25,30,35,40,45)M={{U}}(1){{/U}}S=0If(M>0)ThenForj=1To9If{{U}}(2){{/U}}Thens=s+(paylevel(j)-paylevel(j-1))*taxPrate(j-1)/100Else{{U}}(3){{/U}}ExitForEndifNextjEndif{{U}}(4){{/U}}=Str$(S)EndSubPrivateSubCmd_quit_Click()EndEndSubPrivateSubForm_Load()Txt_tax.Text=""Txt_salary.Text=""Txt_base.Text=1600Txt_tax.Locked=TrueTxt_base.Enabled={{U}}(5){{/U}}EndSub
问答题【说明】 源程序文件vectorClass.cpp,其中定义了用于表示向量的类vector,但类vector的定义并不完整。请按要求完成下列操作,将类vector的定义补充完整,并给出输出结果。 1.补充类vector的构造函数,该函数有参数x和y,它们都是int型的数据,默认值都为 0。请使用参数列表的形式分别将类的数据成员a和b分别初始化为参数x和y的值。 2.完成类vector的成员函数input(int x,int y)的定义,将int型的参数x和y分别赋值给数据成员b和a。 3.完成类vector的友元函数friend double Multiply(vector int b; public: vector( (1) ): (2) void input(int x, int y) (3) void output( ) cout<<'('<<a<<','<<b<<")" <<endl; friend double Multiply(vector ; double Multiply(vector (4) return c; void main( ) vector x(10,20),y; double d; y. input(2,3) d=Multiply(x,y); cout<<d<<endl; 程序输出结果是: (5) 。
问答题[说明] 本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宜布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9:重复上述步骤,再取走最小数3,宣布它为素数,井取走3的倍数,于是留下5、7。反复重复上述步骤,直至筛中为空时,工作结束,求得2至 10中的全部素数。 程序中用数组sieve表示筛子,数组元素sieve[i]的值为1时,表示数i在筛子中,值为-1时表示数i已被取走。[程序] #include < stdio, h >#define MAX 22500main( ) unsigned int i , range , factor , k; int sieve[MAX]; prinff( "please input the 'range:" ); scanf(" %d" , /* range 指出在多大的范围内寻找素数* / for(i=2 ;i (1) ; /*筛子初始化*/ factor = 2 ; while (factor < = range) if( (2) = = 1)l /*筛子中最小数是素数*/ pfinff( "% d/t" ,factor); k = factor; while (k < =range) /* 取走素数的倍数*/ (3) ; k= (4) ; factor + +;
问答题阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。【说明】平面上一个封闭区域内稳定的温度函数式一个调和函数,如果区域边界上各点的温度是已知的(非常数),那么就可以用数值方法近似地计算出区域内各点的温度(非负数)。假设封闭区域是矩形,可将整个矩形用许多横竖线切分成比较细小的网格,并以最简单的方式建立坐标系统,从而可以将问题描述为:已知调和函数u(i,j)在矩形{0≤i≤m;0≤j≤n)四边上的值,求函数u在矩形内部各个网格点{i=1,…,m=1;j=1…,n=1}上的近似值。根据调和函数的特点可以推导出近似算式:该矩形内任一网格点上的函数值等于其上下左右四个相邻网格点上函数值的算术平均值。这样,我们就可以用迭代法来进行数值计算了。首先将该矩形内各网格点上的函数值设置为一个常数,例如u(0,0);然后通过该迭代式计算矩形内个网格点上的新值。这样反复进行迭代计算,若某次迭代后所有的新值与原值之差别都小于预定的要求(例如0.01),则结束求解过程。【流程图】
问答题试题一阅读下列说明、流程图和算法,将应填入(n)处的字句写在答题纸的对应栏内。[流程图说明]下面的流程图用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:[流程图][算法说明]将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数intp(intA[],intlow,inthigh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],intL,intH)的功能是实现数组A中元素的递增排序。[算法]voidsort(intA[],intL,intH){if(L
问答题[说明] 设学生某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图读取该文件,统计出全部成绩中的最高分max和最低分min。
问答题
问答题【算法说明】 为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为X轴,垂直向下方向设为Y轴。 设某种显示器的像素为128×128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127, 0≤y≤127。 现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,“1”表示该像素“亮”,“0”表示该像素“暗”。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下: MAP(0),MAP(1),…,MAP(7) MAP(8),MAP(9),…,MAP(15) MAP(1016),MAP(1017),…,MAP(1023) 下述算法可根据用户要求,将指定坐标(x,y)上的像素置为“亮”或“暗”。 在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个元素BIT(K)(K=0,…,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整数,即BIT(K)的值为215-k。 【算法】 第1步 根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素 MAP(V)。这一步的具体实现过程如下: 1.将x送变量X,将y送变量Y; 2.将Y左移 (1) 位,仍存入变量Y; 3.将X右移 (2) 位,并存入变量S; 4.计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。 第2步 算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:将变量X与二进制数 (3) 进行逻辑乘运算,并存入变量K。 第3步 根据用户要求将数组元素MAP(V)左起第K位设置为“1”或“0”。这一步的具体实现过程如下: 1.为把指定像素置“亮”,应将MAP(V)与BIT(K)进行逻辑 (4) 运算,并存入MAP(V)。 2.为把指定像素置“暗”,应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑 (5) 运算,并存入MAP(V)。