问答题【说明】
本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:
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)。
问答题【说明】 下面的程序是从命令行输入3个数传递到public static void main(String args[])方法中 (如java IsTriangle 3 4 5),并判断这3个数能否构成三角形的3条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。 注意:请勿改动main()主方法和其他已有的语句内容,仅在横线处填入适当的语句。 public class IsTriangle public static void main( String args[ ]) int a[] =new (1) [args. (2) ]; for(int i=0;i<3; (3) ) a[i]= (4) if( (5) ) System. out. println(a[0] +","+a[1] +","+a[2]"能构成三角形的3条边"); else System. out. println(a[0] +","+a[1] +","+a[2]"不能构成三角形的3条边);
问答题【说明】
实现连通图G的深度优先遍历(从顶点v出发)的非递归过程。
【算法】
第一步:首先访问连通图G的指定起始顶点v;
第二步:从V出发,访问一个与v{{U}} (1) {{/U}}p,再从顶点P出发,访问与p{{U}} (2) {{/U}}顶点q,然后从q出发,重复上述过程,直到找不到存在{{U}} (3) {{/U}}的邻接顶点为止。
第三步:回退到尚有{{U}} (4) {{/U}}顶点,从该顶点出发,重复第二、三步,直到所有被访问过的顶点的邻接点都已被访问为止。
因此,在这个算法中应设一个栈保存被{{U}} (5) {{/U}}的顶点,以便回溯查找被访问过顶点的未被访问过的邻接点。
问答题【程序说明】 函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。 函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。 【程序】 int strlen(char * s) char *t=s; while( * ++); return t-s-1; int commstr(char) *str1,char *str2,int *sublen char*s1, *s2; int count=0,len1 ,len2,k,j,i,p; len1:=strlen(str1) len2 = strlen(str2); if(len1>len2) s1=str1 ;s2=str2; else len2 = len1;s1 = str2;s2 = str1; for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/ for(k=0; (1) <:len2;k++) /*k为子串s2的开始位置*/ for(i=0;s1[ (2) ]!='/0';i++;) /*i为子串s1的开始位置*/ /*s1的子串与s2的子串比较*/ for (p=0;p<j)p++); if ( (4) ) /*如果两子串相同*/ for(p=0);p<j;p++ /*输出子串*/ printf ("%c",s2[k+p]); printf ("/n"); count++;/*计数增1 */ if (count>0) break; *sublen=(count>0)? (5) :0; return count;
问答题【说明】 Fibonacci数列A=1,1,2,2,5,8,…)有如下性质: a0=a1=1 ai=ai-1+ai-2,i>1 对于给定的n,另外有一个由n个元素组成的数列xn,该数列中各元素的值为: xi=ai/ai+1,i=0,1,…,n 现要求对xn中的元素按升序进行排序,然后以分数形式输出排序后的xn。例如n=5时,排序前的xn=1/1,1/2,2/3,3/5,5/8,排序后的xn=1/2,3/5,5/8,2/3,1/1。程序中函数make()首先生成排序前的xn,然后调用函数sort()进行排序,最后输出所求结果。 【程序】 #include <stdio.h> #include <stdlib.h> #include <malloc.h> struct fact long m,n; ; void sort(int n,struct fact *p) int a; long s,t,u,v; struct fact *q,*end; for(end=p+(n-1),a=1;a;end--) for(a=0,q=p;q<end;p++) s=q->m; t=q->n; u=(q+1)->m; v=(q+1)->n; if( (1) ) q->m=u; (2) (3) (q+1)->n=t; a=1; void make(int n) int i; long a,b,c; struct fact *x,*y; x=(struct fact *)malloc(sizeof(struct fact)*n); x->m=1: x->n=1; for(a=1,b=1,i=2;i<=n;i++) (4) a=b; b=c; (x+(i-1))->m=a; (x+(i-1))->n=b; (5) printf("x%d=%1d/%1d",n,x->m,x->n); for(y=x+1;y<x+n;y++) printf(",%1d/%1d",y->m,y->n); printf("/n"); free(x); void main() int n; printf("input n:"); scanf("%d", make(n);
问答题【说明】
下面的程序按照以下规则输出给定名词的复数形式。
a.若名词以“y”结尾,则删除y并添加“ies”;
b.若名词以“s”、“ch”或“sh”结尾,则添加“es”;
c.其他所有情况,直接添加“s”。
【C程序】
#include <stdio.h>
#include <string.h>
char*plural(char *word)
{
int n;
char *pstr;
n=strlen(word); /*求给定单词的长度*/
pstr=(char*)malloc(n+3);/*申请给定单词的复数形式存储空间*/
if (!pstr||n<2)
return NULL;
strcpy(pstr,word); /*复制给定单词*/
if ({{U}} (1) {{/U}})
{
pstr[n-1]='i';pstr[n] ='e';pstr[n+1]='s';{{U}} (2) {{/U}};
}
else
if(pstr[n-1]=='s'| |pstr[n-1]=='h'&&({{U}} (3) {{/U}}))
{
pstr[n]='e';pstr[n+1]='s';pstr[n+2]='/0';
}
else
{ pstr[n]='s';pstr[n+1]='/0';)
{{U}} (4) {{/U}};
}
main()
{ int i; char *ps;
char wc[9][10]=
{"chair","dairy","boss","circus","fly","dog","church","clue","dish");
for(i = 0;i<9; i++) {
ps={{U}} (5) {{/U}};
printf("%s: %s/n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
system("pause");
}
问答题试题一(共15分)阅读以—厂说明和流程图,填补流程图中的空缺(1)~(5)将解答填入答题纸的对应栏内。[说明]本流程图旨在统计一本电子书中各个关键词出现的次数。假设已经对该书从头到尾依次分离出各个关键词(A(i)|i=1,…,n)(n>1)),其中包含了很多重复项,经下面的流程处理后,从中挑选出所有不同的关键词共m个{K(j)|j=1,…,m},而每个关键词K(j)出现的次数为NK(j),j=1,…,m。[流程图]
问答题[说明]本程序实现的功能是判断指定的文本文件中是否包含指定的字符串,并且如果包含则返回其第一次出现的位置(行号、列号)。程序运行界面如下图所示,用户只要通过驱动器列表框、目录列表框选定文件夹,文件列表框会自动列出该文件夹下所有文本文件名称,选中其中某个文件,再输入目标字符串并且单击“查找”按钮,就能看到查找的结果。在开发过程中,驱动器列表框名为Drive1,目录列表框名为Dirl,文件列表框名为File1,目标字符串输入框名为Text1,“查找”按钮名为Command1。[VisualBasic代码]PrivateSubDrivel_Change()Dirl.Path={{U}}(1){{/U}}'更新目录列表框的路径EndSubPrivateSubDirl_Change(){{U}}(2){{/U}}=Dirl.Path'更新文件列表框的路径EndSubPrivateSubCommandl_Click()Dimfso,aAsObjectDimi,jAsIntegerIf{{U}}(3){{/U}}=""Then'判断是否已经选中某个文件MsgBox"请选择一个文件文件!"{{U}}(4){{/U}}'退出事件过程EndIf'创建文件系统对象以及文本流对象Setfso=CreateOhjecl("Scripting.FileSystemOhject")Seta=fso.OpenTextFile(Dirl.Path&"/"&{{U}}(3){{/U}})i=1DoWhile{{U}}(5){{/U}}<>True'逐行读取文件,直至文件末尾strLine=a.ReadLinej=InStr(1,{{U}}(6){{/U}})'返回目标字符串在文件这一行中的位置Ifj>0Then'如果目标字符串在这一行出现,则返回其位置MsgBox"字符串第一次出现的位置是"&"("&i&","&j&"),,"{{U}}(4){{/U}}'退出事件过程EndIfi:i+lLoopMsgBox"字符串在文件中不出现,"EndSub
问答题【说明】 函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。 【函数】 void QuickSort( int A[ ],int s,int t) int i=s,j=t+1,temp; int x=A[s]; do do i ++ ;while (1) ; do j -- ;while(A[j]>x); if(i<j)temp=A[i]; (2) ; (3) ; while(i<j); A[a] =A[j];A[j] =x; if(s<i-1) (4) ; if(j+1<t) (5) ;
问答题【说明】
在下面函数横线处填上适当的字句,使其输出结果为:
构造函数.
构造函数.
1,2
5,6
析构函数
析构函数.
【C++代码】
#include "iostream.h"
class AA
{ public;
AA(int i,int j)
{A=i; B=j;
cout<<"构造函数./n";
}
~AA(){{{U}} (1) {{/U}};}
void print();
private:
int A, B;
};
void AA∷print()
{cout<<A<<","<<B<<endl;}
void main()
{
AA *a1, *a2;
{{U}}(2) {{/U}}=new AA(1, 2);
a2=new AA(5, 6);
{{U}}(3) {{/U}};
a2->print();
{{U}}(4) {{/U}}a1;
{{U}}(5) {{/U}}a2;
}
问答题【说明】本程序对某电码文(原文)进行加密形成密码文,其加密算法如下:假定原文为C1,C2,C3,…,Cn加密后形成的密文为S1,S2,S3,…,Sn,首先读入正整数key(key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,如下图所示:加密时从S1位置起顺时针计数,当数到第key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置:依次类推,直至n个原文字符全部放入密文环中。由此产生的S1S2…Sn即为原文的密文。例如,当Key=3时,原文thisisadecodingsystem的密文为:aotgnhediysdimietsncss当Key=4时,该原文的密文为:ssdtydhtegiasiscnmeion本程序将电码的原文存放在字符数组old中,加密钥匙存放在整数key中。函数decode用于将原文old加密并返回密文字符数组的首指针。其中函数采用一个双向循环链表CODE来表示密文环:函数strlen用于计算一个字符串中的字符个数(不包括字符串结尾符'/O')。为了简单起见,程序中假设内存容量足以满足动态存储单元分配的要求。#include<stdio.h>#include<stdlib.h>typedefstructnode{charch;structnode*forward;/*Linktonextnode.*/structnode*backward;/*Linktopreviousnode.*/}CODE;intstrlen(char*s){intlen=0;while(*s++!='/0')len++;return(len);}char*decode(char*otd,intkey){char*New;intlength,count,i;CODE*loop,*p;length=strlen(old);loop=(CODE*)malloc(length*sizeof(CODE));for(i=1;i<length-1;i++) {loop[i],forward={{U}}(1){{/U}}}loop[0].backward=loop[0],forward=loop[length-1].forward=loop;{{U}}(2){{/U}}for(p=loop,i=0;i<length;i++) {for(count=1;count<key;count++p=p->forward;{{U}}(3){{/U}}p->backward->forward=p->forward;p->forward->backward=p->backward;{{U}}(4){{/U}}}New=(char*)malloc((length+1)*sizeef(char));for(i=0;i<length;i++){{U}}(5){{/U}}New[length]='/0';return(New);}voidmain(){charold[256];intkey,num=0;printf("/nPleaseinputthetelegraph:/n");while(num<255old[(num==255)?num:num-1]='/0';do{printf("/nPleaseinputKey(Key>1):");scanf("%d",}while(key<=1);printf("/nThedecodeoftelegraph:'%s'is:/n'%s'/n",old,decode(old,key));}
