汉字点阵左转90度程序(TurnLeft90.java)说明:
这个实例程序是根据1991年计算机软件考试程序员级的C语言考题改写而来,基本保持了原试题的精华和风格。很遗憾,我把原题给弄丢了。如有网友遇见,敬请贴出来。
出题者可能怕泄露程序设计思路,在题目说明时遮遮掩掩,实际只告知了程序输出结果(如下图)和程序的功能:汉字点阵左转90度。这个试题应当是软考开考以来历年程序设计题(所有级别)中最难的。程序用一个数组(数据类型:C语言中的unsigned;Java语言没有unsigned,用short)表示一个汉字的点阵,比特位(bit)为1或0,0表示空白。考题原共设置了6个填空,其中一个填空(用整数是否非零,进行条件判断)仅与C语言特点有关,改写成java程序后剩下5个填空。
这个程序主要用于观摩学习,算法原理我尚未分析出来,我怀疑是否与图像处理中的仿射变换类似。
程序的测试效果示意图:
上图是程序执行结果。本例程的精华在于turnLeft()方法和display()方法:
turnLeft()方法仅仅使用了for循环嵌套,循环体中仅用一句代码就实现了汉字点阵向左旋转90度,确实高明至极;
display()方法显示汉字点阵也类似,太高明了,简直巧夺天工。
**试题代码说明:**下面代码中的【】表示程序的空缺部分,需要答题者填充完成。(由软考试题改变而成)从C语言改变为Java语言。
**代码说明:**下面代码中的【】表示程序的空缺部分,需要答题者填充完成。
public class TurnLeft90 { //汉字点阵左转90度,示例程序 begin
short[] source = { 0X1040,0X1040,0X1048,(short)0XFDFC,0X2040,
0X2844,0X4BFE,0X7C80,0X0888,0X09FC,
0X1C08,(short)0XE810,0X4890,0X0860,0X0820,0X0810 };
short[] target = new short[16];
public void prnCharArray(char[] str) {
for (char c : str) System.out.print(c);
}
public void turnLeft() { //左转90度
int k;
for (int row = 0; row < source.length; row++) {
for ( k = 0, 【 】 ; k < 16; k++)
target[row] |= ( (source[k]>>【 】&1)<<【 】 );
}
}
public void display() { //打印显示方法
char[][] out = { new char[16],new char[16] };
char[] letter = {'○','●'}; //{'.','*'}; // {'○','●'};
int iLeft = 0, iRight = 1;
for (int row = 0; row < source.length; row++) {
for (int col = 0; col < 16; col++) {
out[iLeft][col] = letter[ 【 】&1];
out[iRight][col] = letter[ 【 】&1];
}
System.out.printf("\n%6x\t", source[row]);
prnCharArray(out[iLeft]);
System.out.printf("%6x\t", target[row]);
prnCharArray(out[iRight]);
}
}
public static void main(String[] args) {
TurnLeft90 word = new TurnLeft90();
word.turnLeft();
word.display();
}
}
下面是完整的程序源代码(含答案):
/***位运算试题:汉字点阵左转90度***/
/***
* @author QiuGen
* @description 汉字点阵左转90度例程TurnLeft90
* 实现功能:汉字点阵左转90度(由软考试题改变而成)
* @date 2024/5/20
* ***/
public class TurnLeft90 {
short[] source = { 0X1040,0X1040,0X1048,(short)0XFDFC,0X2040,
0X2844,0X4BFE,0X7C80,0X0888,0X09FC,
0X1C08,(short)0XE810,0X4890,0X0860,0X0820,0X0810 };
short[] target = new short[16];
public void prnCharArray(char[] str) {
for (char c : str) System.out.print(c);
}
public void turnLeft() { //左转90度
int k;
for (int row = 0; row < source.length; row++) {
for ( k = 0, target[row]=0 ; k < 16; k++)
target[row] |= ( (source[k]>>row&1)<<15-k );
}
}
public void display() { //打印显示方法
char[][] out = { new char[16],new char[16] };
char[] letter = {'○','●'}; //{'.','*'}; // {'○','●'};
int iLeft = 0, iRight = 1;
for (int row = 0; row < source.length; row++) {
for (int col = 0; col < 16; col++) {
out[iLeft][col] = letter[(source[row]>>(15-col))&1];
out[iRight][col] = letter[(target[row]>>(15-col))&1];
}
System.out.printf("\n%6x\t", source[row]);
prnCharArray(out[iLeft]);
System.out.printf("%6x\t", target[row]);
prnCharArray(out[iRight]);
}
}
public static void main(String[] args) {
TurnLeft90 word = new TurnLeft90();
word.turnLeft();
word.display();
}
}
测试实际效果图(显示有点变形):