1991程序员水平考试试题——下午试题

发表于:2007-05-26来源:作者:点击数: 标签:
[程序说明] 已知某数的前二项为2和3,其后继项根据当前最后二项的乘积按下列规则生成 (1)若乘积为一位数,则该乘积即为数列的后继项; (2)若乘积为二位数,则该乘积的十位数和个位数依次作为数列的两个后继项。 本程序输出该数列的前n项以及它们的
[程序说明]

已知某数的前二项为2和3,其后继项根据当前最后二项的乘积按下列规则生成

 (1)若乘积为一位数,则该乘积即为数列的后继项;

 (2)若乘积为二位数,则该乘积的十位数和个位数依次作为数列的两个后继项。

 本程序输出该数列的前n项以及它们的和。其中,函数sum(n,pa)返回

数列的前n项之和,并将生成的前n项存放于首指针为pa的数组中。程序中规定

输入的n值必须大于2并且不超过给定的常数值MAXNUM。

  列如:若输入n值为10,则程序输出如下内容:

  sum(10)=44

2 3 6 1 8 8 6 4 2 4

[程序]

#include <stdio.h>

#define MAXNUM 100

int sum(n,pa)

int n,*pa;

{ int count,total,temp;

*pa=2;

____________________ =3;

total=5; count=2;

while (count++<n)

{ temp=*(pa-1)**pa;

if (temp<10)

{ total+=temp;

*(++pa)=temp;

}

else

{

_______________ =temp/10;

total+=*pa;

if (count<n)

{ count++;pa++;


_______________________=temp%10;

total+=*pa;

}

}

}

___________________________;

}

main ()

{ int n,*p,*q,num[MAXNUM];

do {printf("Input N=? (2<N<%d):",MAXNUM+1);

scanf("%d",&n);

} while ( ___________________ );

printf("\nsum(%d)=%d\n",n,sum(n,num));


for (p=num,q= ________________ ;p<q;p++) printf("%4d",*p);

printf("\n");

}

  [程序说明]

  本程序对某电码文(原文)进行加密形成密码文.其加密算法如下:

假定原文为C1C2C3...Cn,加密后形成的密文为S1S2S3...Sn,首先读入

正整数Key(Key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,

如下图所示:

┏━Sn━━S1━┓

Sn-1 S2

┃ ┃

┃ S3

┃ ┃

┗....━━S4━┛

加密时从S1位置起顺时针计数,当数到第Key个字符位置时,将原文中的字符放入

该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起

继续计数,当再次数到第Key个字符位置时,将原文中字符C2放入其中,并从环中

除去该字符位置;依次类推,直至n个原文字符全部放入密文环中.由此产生的S1S2

...Sn即为原文的密文.

例如,当Key=3时,原文: THIS IS AN DECODING SYSTEM 的密文为:

AOTGNHEDI YS D IMIETSNC SS

当Key=4时,该原文的密文为:

SSDTYD HTEGIASISCNM E ION

本程序将电码的原文存放在字符数组old中,加密钥匙存放在整数Key中.函数decode

用于将原文old加密并返回密文字符数组的首指针.其中函数采用一个双向循环链表

CODE来表示密文环.函数strlen用于计算一个字符串中的字符个数(不包括字符串结

尾符'\0').为了简单起见,程序中假设内存容量足以满足动态存贮单元分配的要求.

[程序]

#include <stdio.h>

#include <alloc.h>

#define CR 13

typedef struct node

{ char ch;

struct node *forward; /* Link to next node. */

struct node *backward;/* Link to previous node.*/

} CODE;

main()

{ char _________ ,old[256];

int strlen(),key,num=0;

printf("\nPlease input the telegraph: \n")l

while (num<255&&(old[num++]=getch())!=CR);

old[ ______ ]='\0';

do { printf("\nPlease input Key=?(Key>1):");

scanf("%d",&key);

} while (key<=1);

printf("\nThe decode of telegraph:'%s' is:\n'%s'\n",

old,decode(old,key));

}

char *decode(old,key)

char *old; int key;

{ char *new; int length,count,i;

CODE *loop,*p;

length=strlen(old);

loop=( _______ ) malloc(length*sizeof(CODE));

for (i=1;i<length-1;i++)

{ loop.forward=&loop[i+1];

loop.backward=&loop[i-1];

}

loop[0].backward=&loop[length-1];

loop[0].forward=&loop[1];

loop[length-1].forward=loop;

loop[length-1].backward=&loop[length-2];

for (p=loop,i=0;i<length;i++)

{ for (count=1;count<key;count++)

p= _____ ;

p->ch=*old++;

p->backward->forward= _________ ;

p->forward->backward= _________ ;

p=p->forward;

}

new=(char *)malloc((length+1)*sizeof(char));

for (i=0;i<length;i++) new=loop.ch;

new[length]='\0';

return (new);

}

int strlen(s)

char *s;

{ int len=0;

while ( ________ !='\0') len++;

return( len);

}


[程序说明]

本程序将一个给定汉字的点阵逆时针旋转90度,并输出旋转前后的点阵数据及字形.

附图是汉字"转"字的16*16点阵字形,用数字'0'表示空白位置,用数字'1'表示非空

白位置,"转"字的第一行机即可表示成如下的{0,1}序列:

0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0

如果把它看作一个字的16个BIT,"转"字的第一行可以用16进制数的1040来表示.同

理,"转"字的第二行可以表示为1040,第三行可以表示为1048,...等等.依次类推,用

16个双字节整型数即可存放一个汉字点阵字形."转"字的点阵数据及字形如附图的

左半部分所示.将一个汉字逆时针旋转90度,就是把该汉字点阵的最右列作为旋转后

点阵的第一行,次右列作为旋转后点阵的第二行,...,来形成一个旋转后的点阵字形.

附图的右半部分就是将"转"字旋转90度后的点阵数据和字形.

程序中,数组old中存放着"转"字的点阵数据.函数turnleft将该点阵数据逆时针旋

转90度,旋转后的点阵数据存放在数组new中.函数display将旋转前后的点阵数据加

以编辑,用字符'.'表示值为0的Bit,用字符'X'表示值为1的Bit,从而将旋转前后的点

阵按行输出其16进制数据及字形,如同附图所表示的那样.


[附图]

1040 ...X.....X...... 0000 ................

1040 ...X.....X...... 0200 ......X.........

1048 ...X.....X..X... 1640 ...X.XX..X......

FDFC XXXXXX.XXXXXXX.. 32E0 ..XX..X.XXX.....

2040 ..X......X...... 1259 ...X..X..X.XX..X

2844 ..X.X....X...X.. 1246 ...X..X..X...XX.

4BFE .X..X.XXXXXXXXX. FE44 XXXXXXX..X...X..

7C80 .XXXXX..X....... 13C8 ...X..XXXX..X...

0888 ....X...X...X... 1240 ...X..X..X......

09FC ....X..XXXXXXX.. 0200 ......X.........

1C08 ...XXX......X... 1120 ...X...X..X.....

E810 XX.X.......X.... 17FF ...X.XXXXXXXXXXX

4890 .X..X...X..X.... F120 XXXX...X..X.....

0860 ....X....XX..... 1D10 ...XXX.X...X....

0820 ....X.....X..... 1318 ...X..XX...XX...

0810 ....X......X.... 1010 ...X.......X....


[程序]

#define <stdio.h>

#define EMPTY '.'

#define NONEMPTY 'X'

#define LEFT 0

#define RIGHT 1

main ()

{ static unsigned old[16]=

{0x1040,0x1040,0x1048,0xFDFC,0x2040,0x2844,

0x4BFE,0x7C80,0x0888,0x09FC,0x1C08,0xE810,

0x4890,0x0860,0x0820,0x0810

};

unsigned new[16];

trunleft(old,new);

display(old,new);

}

turnleft(old,new)

unsigned old[],new[];

{ int row,k;

for (row=0;row<16;row++)

for (k=0,______ ;k<16;k++)

new[row]|=((old[k]>> _______ ) &1) << _______ ;

}

display(old,new)

unsigned *old,*new;

{

char out[2][17],letter[2];

int row,col;

letter[0]=EMPTY;

letter[1]=NONEMPTY;

out[LEFT][16]=out[RIGHT][16]=______;

for (row=0;row<16;row++,old++,new++)

{ for (col=0;col<16;++col)

{ out[LEFT][col]=letter[ ( __________) &1];

out[RIGHT][col]=letter[ (__________) &1];

}

printf("\n %4x %s ",*old,&out[LEFT][0]);

printf(" %4x %s",*new,&out[RIGHT][0]);

}

}

new[16]=______;

for (row=0;row<16;row++,old++,new++)

{

for (col=0;col<16;++col)

{ out[LEFT][col]=letter[ ( __________) &1];

out[RIGHT][col]=letter[ (__________) &1];

}

printf("\n %4x %s ",*old,&out[LEFT][0]);

printf(" %4x %s",*new,&out[RIGHT][0]);

}

}

原文转自:http://www.ltesting.net