案例分析题试题三
阅读下列说明和 C 函数, 填补 C 函数中的空缺, 将解答填入答案纸的对应栏目内
问答题阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。{{B}}[{{/B}}说明{{B}}]{{/B}}求连续函数f(x)的根(方程f(x)=0的解)的最简单方法是二分法。为此,首先需要在若干点上检查函数值的符号,如果发现f(a)与f(b)符号相反(a<b),则在区间(a,b)中必然存在f(x)的根。因为当x从a变到b时,连续函数的值将从正变到负(或从负变到正),必然要经过0。区间(a,b)就是根的初始范围。取该区间的中点m,如果f(m)=0,则根就是m。如果f(a)与f(m)符号相反,则根一定在区间(a,m)中;如果f(m)与f(b)符号相反,则根一定在区间(m,b)中。因此,根的范围缩小了一半。依此类推,将区间一半一半地分下去,当区间的长度很小(达到根的精度要求,例如0.001)时,或者当区间中点处的函数值几乎接近于0(即绝对值小于预先规定的微小量,例如0.001)时,近似计算就可以结束了。以下流程图描述了用二分法近似计算区间(a,b)中f(x)的根的过程。{{B}}[{{/B}}流程图{{B}}]{{/B}}
问答题[Vsual Basic 程序代码]
Private Sub CmdSelect_Cliek()
For i = O To List2.ListCount - 1
If Listl.Text = List2.List(i) Then Exit Sub '不要重复选择
Next i
List2.Addltem{{U}} (1) {{/U}} '在List2中增添List1中所选的项
End Sub
Private Sub CrndSelAll_Click()
List2.Clear '先删除List2中的已有项
For i = 0 To {{U}}(2) {{/U}} '对List1中所有各项做循环处理
List2.Addltem {{U}}(3) {{/U}} '将该项增添到 List2中
Next i
End Sub
Private Sub CmdDelete_Cliek()
If List2.Listlndex >= O Then '如果List2中有选中的项,
List2.Removeltem {{U}} (4) {{/U}} '则删除所选的项
End If
End Sub
Private Sub CmdDelAll_Cliek()
{{U}}(5) {{/U}}
End Sub
问答题阅读以下说明和C函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。[说明1]函数f(doubleeps)的功能是:利用公式计算并返回π的近似值。[C函数1]doublef(doubleeps){doublen=1.0,s=1.0,term=1.0,pi=0.0;while(fabs(term)>=eps){pi=pi+term;n=______;s=______;term=s/n;}returnpi*4;}[说明2]函数fun(char*str)的功能是:自左至右顺序取出非空字符串str中的数字字符,形成一个十进制整数(最多8位)。例如,若str中的字符串为“iyt?67kpf3g8d5.j4ia2e3p12”,则函数返回值为67385423。[C函数2]longfun(char*str){inti=0;longnum:0;char*p=str;while(i<8++i;}______;}returnnum;}
问答题【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件word_xml.out中。 该C程序采用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立。然后中序遍历该二叉树,将遍历经过的二叉树上节点的内容输出。 程序中的外部函数 int getword(FILE *fpt,char *word) 从与fpt所对应的文件中读取单词置入word,并返回1;若已无单词可读,即到文件尾部时,则函数返回0。【C程序】#include <stdio.h>#include <malloc.h>#include <ctype.h>#include <string.h>#define INF "TEXT_01.INI"#define OUTF "WORD_XML.OUT"typedef struct treenode char *word; int count; struct treenode *left, *right; BNODE;int getword(FILE *fpt,char *word);void binary tree(BNODE **t,char *word) BNODE *ptr, *p; int cmpres; p = NULL; (1) ; while (ptr) /*寻找插入位置*/ cmpres = strcmp(word, (2) ); /* 保存当前比较结果*/ if (!cmpres) (3) return; else (4) ; ptr = cmpres > 0 ? ptr->right : ptr->left; ptr = (BNODE *)malloc(sizeof(BNODE)); ptr->right = ptr->left = NULL; ptr->word = (char *)malloc(strlen(word)+1); strcpy(ptr->word,word); ptr->count = 1; if (p == NULL) (5) ; else if (cmpres > 0) p->right = ptr; else p->left = ptr; void midorder(FILE *fpt, BNODE *t) if ( (6) ) return; midorder(fpt , t->left); fprintf(fpt , " %s %d/n " , t->word , t->count); midorder(fpt , t->right); void main() FILE *fpt; char word[40]; BNODE *root = NULL; if ((fpt = fopen(INF , "r")) == NULL) printf("Can't open file %s/n",INF); return; while (getword(fpt,word) == 1) binary_tree( (7) ); fclose(fpt); fopen(OUTF,"w"); midorder(fpt, root); fclose(fpt);
问答题【说明】
设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度 freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【函数】
void Locate( int
while(p!=frist
if(p! =first) /*链表中存在x*/
{{{U}} (2) {{/U}};
<结点类型说明>
* current = P; /*从链表中摘下这个结点*/
Current -> prior -> next = current -> next;
Current -> next -> prior = current -> prior;
P = current -> prior; /*寻找重新插入的位置*/
While(p! =first
Current-> next = {{U}}(4) {{/U}}; /*插入在P之后*?
Current -> prior = P;
P -> next -> prior = current;
P->next={{U}} (5) {{/U}};
}
else printf("Sorry. Not find! /n"); /*没找到*/
}
问答题[说明]
本程序使用类来管理员工的通讯地址信息。已知程序的输出为:
输出记录:5
姓名:王丽华
街道地址:中华路15号
市:襄樊市
省;湖北省
邮政编码:430070
[C++程序]
#include < iostream, h >
#include < string, h >
class employee.
{ protected:
char name[10];
char street[ 20 ];
char city[10];
char{{U}} (1) {{/U}}[10];
char post[7];
int no;
{{U}} (2) {{/U}}:
{{U}}(3) {{/U}}(char [] ,char [] ,char [] ,char [] ,char [] ,int);
void changename ( char n [] ) { strcpy ( name, n); }
void changestreet( char s[] ) { strcpy(street,s) ;}
void changecity ( char c [] ) { strcpy ( city, c ); }
void changeprov( char p [] ) { strcpy(prov,p); }
void changeno(int nnm) {{{U}} (4) {{/U}};}
void display( );
};
employee::{{U}} (3) {{/U}}(char n[] ,char s[] ,char c[] ,char p1[] ,char p2[] ,int nam)
{ strcpy(name,n);
strcpy ( street, s);
strcpy ( city, c);
strcpy ( prov, p1 );
strcpy ( post, p2 );
no = nam; }
void employee:: display( ) { cont< <"输出记录: "< <no< <endl;
cout< < "姓名: "< < name < < endl;
coot < < "街道地址: "< < street < < endl;
cout < < "市: "< < city < < endl;
cout< <"省: "< <prov < <endl;
cout < <"邮政编码: "< < post < < endl;
}
void main( ) { employee cmp("王华" ,"中华路15号" ,"武汉市","湖北省","430070", 1 );
emp. changename( "五丽华" );
emp. changecity ( "襄樊市" );
emp. changeno(5);
{{U}}(5) {{/U}};
问答题[说明]给定一个十进制整数A,将其转换为R进制数的方法是:将A的整数部分逐次除以R,直到商等于0为止,将所得的余数由低位到高位排列在一起,就得到了对应R的进制数。以A=11,R=2为例,11÷2=5…1,5÷2=2…1,2÷2=1…0,1÷2=0…1中各式的余数依次为:1,1,0,1,于是与A对应的二进制数为1011。下面的流程图实现了将十进制数2597转换为八进制数的功能,其中:(1)循环1执行除法运算并将余数依次记录在数组a中(假定数组长度足够长),如a[1],a[2],……,a[k];(2)循环2则用于将这些余数按逆序输出,即a[k],a[k-1],……,a[1];(3)图中i,j分别是循环1和循环2中的循环变量;(4)图中q用于记录每次除法所得的商值。[流程图]
问答题【程序2.1说明】 求所有满足如下条件的三位数:它除以11得的商等于它各位数字的平方和。例如 550,除以11商为50,50=52+52+02。 【程序2.1】 void main() int i, j,n,s; for(i=100;i<=999;i++) n=i; j=n/11; s=0; while( (1) ) (2) n/=10; if( (3) ) printf("%d/t",i); 【程序2.2说明】 本程序输入一字符串,将其中的大写字母改变成小写字母。 【程序2.2】 void main() int i=0; char s[120]; scanf("%s",s); while( (4) ) if( (5) ) s[i]=s[i]- 'A'+'a'; i++; printf("%s/n",s);
问答题【说明】
希赛教育集团公司为发展生产向社会公开招聘M个工种的工作人员,每个工种各有不同的编号(1至M)和计划招聘人数。每位应聘者需申报两个工种,并参加公司组织的考试。公司将按应聘者的成绩从高分至低分的顺序进行排队录取。公司的录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去5分后,重新排队,并按其第二志愿考虑录取。
程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都做了录取处理。
程序中,类型STU包含有应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组rz[]的每个元素对应一个工种,包含有计划招聘人数和已录取的人数。
【程序】
#include<stdio.h>
#include<malloc.h>
#define M 20
#define PEMARK 5
typedef struct stu{
int no, total, z[2], sortm, zi;
struct stu *next;
}STU;
struct rzmode{
int Imt, count;
STU *next;
}rz[M];
STU *head=NULL, *over=NULL;
int all
FILE *fp;
char dataf[]="pp07.dat";
print(STU *p){
for(;p!=NULL;p=p->next)
printf("%d(%d)/t",p->no,p->total);
}
insert(STU **p, STU *u){
STU *v, *q;
for(q=*p;q!=NULL;v=q,{{U}} (1) {{/U}})
if(q->sortm<u->sortm)break;
if(q==*p){{U}} (2) {{/U}};
else{{U}} (3) {{/U}};
U->next=q;
}
main(){
int zn, i, no, total, z1, z2;
STU *p, *v, *q;
fp=fopen(dataf, "r");
if(fp==NULL){
printf("Can't open file %s./n",dataf);
exit(0);
}
fscanf(fp, "%d",
for(all=0,i=1;i<=zn;i++){
fscanf(fp,"%d",
rz[i].count=0;rz[i].next=NULL;
all+={{U}} (4) {{/U}};
}
for(;;){
if((fscanf(fp, "%d%d%d%d",
p=(STU*)malloc(sizeof(STU));
p->no=no;
p->total=p->sortm=total;
p->zi=0;p->z[0]=z1;p->z[1]=z2;
{{U}} (5) {{/U}};
}
fclose(fp);
for(;all ){
p=head; head=head->next;
if(rz[p->z[p->zi]].count<{{U}} (6) {{/U}}){
rz[p->z[p->zi]].count++;
insert(
all--;
continue;
}
if(p->zi>=1){
p->next=over;over=p;
continue;
}
p->sortm-=DEMARK;{{U}} (7) {{/U}};
insed(
}
for(i=1;i<=zn;i++){
printf("%d:/n",i);
print(rz[i].next);
printf("/n");
}
printf("over:/n");print(head);
print(over);printf("/n");
}
问答题试题七(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
