软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷49

0
收藏   分享
  • 卷面总分:130分
  • 试卷类型:模拟考试
  • 测试费用:免费
  • 答案解析:是
  • 练习次数:1052次
  • 作答时间:150分钟
试卷简介
试卷预览
1

阅读以下函数说明和C代码,回答问题

[说明]

 在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式,进行组合将小对象组合成复杂的对象。

 以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图7-1显示了各个类间的关系。

 [图7-1]

以下是C语言实现,能够正确编译通过。

 [C代码]

 typedef void( (1) )(char *title);

 typedef void(*fun2)(char items[] [10], int N);

 typedef char* (*fun3)();

 char buffer[500];

 struct Builder{//构造器

 fun1 makeTitle;

  (2) makeString;

 fun2 makeItems;

 fun3 getResult;

 };

 struct Director{

 struct Builder builder;

 };

 char* construct( (3) director)//构造文件

 {

 char items[2][10] = {"早安", "午安"};

 director->builder.makeTitle("Greeting");

 director->builder.makeString("从早上到白天结束");

 director->builder.makeItems(items, 2);

 director->builder.makeString("到了晚上");

 strcpy(items[0], "晚安");

 strcpy(items[1], "好梦");

 director->builder.makeItems(items, 2);

 return director->builder.getResult();

 }

 void TXTmakeTitle(char* title)

 {

 strcat(buffer, "『");

 Strcat(buffer, title);

 strcat(buffer, "』\n\n");

 }

 void TXTmakeString(char* str)

 {

 strcat(buffer, "■");

 Strcat(buffer, str);

 strcat(buffer, "\n\n");

 }

 void TXTmakeItems(char items[] [10], int N)//将items加入文件中

 {

 for(int i = 0, i< N; i++){

 strcat(buffer, "·");

 strcat(buffer, (4) );

 strcat(buffer, "\n");

 }

 strcat(buffer, "\n");

 }

 char* TXTgetResult()

 {

 return buffer;

 }

 void main()

 {

 Director director;

  (5) = '\0';//清空缓冲区,使目前缓冲区中的内容不影响新生成的文件

 director.builder.makeTitle = TXTmakeTitle;

 director.builder.makeString = TXTmakeTitle;

 director.builder.makeItems = TXTmakeItems;

 director.builder.getResult = TXTgetResult;

 char* result = construct(&director);

 printf("%s\n", result);

 }

1

阅读下列函数说明和C++代码,回答问题

[说明]

 在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式进行组合,将小对象组合成复杂的大对象。

 以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图5-1显示了各个类间的关系。

 [图5-1]

以下是C++语言实现,能够正确编译通过。

 [C++代码]

 class Builder{

 public:

 virtual void makeTitle(string title) = 0;

 virtual void makestring(string str) = 0;

 virtual void makeItems( (1) items) = 0;

 virtual string getResult() = 0;

 };

 class Director{

 private:

  (2) builder;

 public:

 Director(Builder *builder){

 this->builder = builder;

 }

 string construct(){

 vectoritems;

 items.push_back("早安"); items.push_back("午安");

 builder->makeTitle("Greeting");

 builder->makeString("从早上到白天结束");

 builder->makeItems(items);

 builder->makeString("到了晚上");

  (3) ;//清空items向量

 items.push_back("晚安"); items.push_back("好梦");

 builder->makeItems(items);

 return builder->getResult();

 }

 };

 class TextBuilder : public (4) {

 private:

 string buffer;

 public:

 TextBuilder(){

 buffer = " ";

 }

 void makeTitle(string title){

 buffer += "=======================================\n";

 buffer += "『" + title + "』\n";

 buffer += "\n";

 }

 void makeString(string str){

 buffer += "■" + str + "\n";

 buffer += "\n";

 }

 void makeItems(vectoritems){

 vector::iterator it;

 for(it = items.begin(); it != items.end(); it++){

 buffer += "." + *it + "\n";

 }

 buffer += "\n";

 }

 string getResult(){

 buffer += "========================\n";

 return buffer;

 }

 };

 int main()

 {

 Director *director = new Director(new TextBuilder());

 string result = (string)director-) (5) ;

 cout<  return 0;

 }

1

阅读以下说明和Java代码,回答问题

[说明]

 在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式进行组合将小对象组合,成复杂的对象。

 以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图6-1显示了各个类间的关系。

以下是Java语言实现,能够正确编译通过。

 [Java代码]

 //Builder. java文件

 public (1) class Builder {

 public abstract void makeTitle(String title);

 public abstract void makeString(String str);

 public abstract void makeItems(String[] items);

 public abstract Object getResult();

 }

 //Director. java文件

 public class Director{

 private (2) builder;

 public Director(Builder builder){

 this. builder = builder;

 }

 public Object construct(){

 builder.makeTitle("Greeting");

 builder.makeString("从早上到白天结束");

 builder.makeItems(new String[]{"早安", "午安",});

 builder.makeString("到了晚上");

 builder.makeItems(new String[]("晚安", "好梦",});

 return builder.getResult();

 }

 }

 //TextBuilder.java文件

 public class TextBuilder (3) Builder{

 private StringBuffer buffer = new StringBuffer();

 public void makeTitle(String title){

 buffer.append("『" + title + "』"\n\n");

 }

 public void makeString(String str){

 buffer.append('■' + str + "\n\n ");

 }

 public void makeItems(String[] items){

 for(int i = 0; i< (4) ; i++){

 buffer.append('·' + items[i] + "\n");

 }

 buffer.append("\n");

 }

 public Object getResult(){

 return buffer.toString();

 }

 }

 //Main.java文件

 public class Main {

 public static void main(String[] args) {

 Director director = new Director(new TextBuilder());

 String result = (String)director. (5) ;

 System.out.println(result);

1

阅读下列函数说明、图和C代码,回答问题

[说明]

 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:

 m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]

 其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。

 运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。

 [函数]

 int cmp(int *LA, int *LB);

 /*比较长整数LA与LB的绝对值大小*/

 /*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/

 int ADD (int *LA, int *LB, int *LC)

 /*计算长整数LA与LB的和,结果存储于LC中*/

 /*注意:正数与负数的和相当于正数与负数绝对值的差*/

 /*数据有误返回0,正常返回1*/

 {

 if(LA == NULL || LB == NULL || LC == NULL)return 0;

 int *pA, *pB, i, N, carry, flag;

 flag = LA[0] + LB[0];

 switch(flag){ /*根据参与运算的两个数的符号进行不同的操作*/

 case 0:

 case 2:

 Lc[0] = LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/

 pA = LA;

 pB = LB;

  (1) ;

 break;

 case 1: /*LA与LB异号*/

 /*比较两者的绝对值大小,结果符号与较大者相同*/

 flag =  (2) ;

 if(flag >0){ /*LA较大*/

 LC[0] = LA[0];

 pA = LA;

 pB = LB;

 }

 else if(flag< 0)(/*LB较大*/

 LC[0] = LB[0];

 pA = LB;

 pB = LA;

 }

 else{/*LA与LB相等*/

 LC[0] = 0;

 LC[1] = 0;

 return 1;

 }

 flag = -1;

 break;

 default:

 return 0;

 break;

 }/*switch*/

 /*绝对值相加减*/

 /*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减情况*/

  (3) ;

 N = LA[1] >LB[1] ? LA[1] : LB[1];

 for(i = 0; i< N; i++){

 if(i >= pA[1]){/*LA计算完毕*/

 carry += flag * pB[i+2];

 }

 else if(i >= pB[1]){/*LB计算完毕*/

 carry += pA[i+2];

 }

 else{

 carry += pA[i+2] + flag * pB[i+2];

 }

 LC[i+2] = carry % 10;

 carry /= 10;

 if( (4) ){/*需要借位,针对减法*/

 LC[i+2] += 10;

 carry--;

 }

 }/*for*/

 if( (5) ){/*最高进位,针对加法*/

 LC[i+2] = carry;

 i++;

 }

 if(LC[i+1] == 0) i--; /*若最高位为零,针对减法*/

 LC[1] = i;

 return 1;

 };/*ADD*/