首页

软考 - 初级_程序员

类型:
选择方向:
选择考试:
题型:
为你找到 191 个题目。

()(共15分)     
  阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
  下面的程序用Dole Rob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止:
  a.  在第一行的正中插入1;
  b.  新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置;
  c.  若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。
  例如,3阶魔方阵如下所示:
    8   1   6
    3   5   7
    4   9   2
 

【C程序】 

()(共15分)
  阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
  下面的程序按照以下规则输出给定名词的复数形式:
  a. 若名词以“y”结尾,则删除y并添加“ies”;
  b. 若名词以“s”、“ch”或“sh”结尾,则添加“es”;
  c. 其他所有情况,直接添加“s”。
 

【C程序】

()(共15分)
  阅读以下说明和流程图,填补流程图中的空缺(1)~(9),将解答填入答题纸的对应栏内。
【说明】
  假设数组 A 中的各元素 A(1),A(2) ,…,A(M)已经按从小到大排序(M≥1);数组 B 中的各元素 B(1),B(2),…,B(N)也已经按从小到大排序(N≥1)。执行下面的流程图后,可以将数组A与数组B中所有的元素全都存入数组C中,且按从小到大排序(注意:序列中相同的数全部保留并不计排列顺序)。例如,设数组A中有元素:2,5,6,7,9;数组B中有元素:2,3,4,7;则数组C中将有元素:2,2,3,4,5,6,7,7,9。
 

【流程图】

()
  阅读以下说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】 
  java.util库中提供了Vector模板类,可作为动态数组使用,并可容纳任意数据类型。
  该类的部分方法说明如下表所示:
  方法名         含义
  add(k)          向 vector 对象的尾部添加一个元素 k
  removeElementAt(i)   删除序号为 i 的元素(vector 元素序号从 0 开始)
  isEmpty()        判断 vector 对象是否含有元素
  size()          返回 vector 对象中所包含的元素个数

【Java 代码】     
 import   (1) ;
 public class JavaMain {
   static private final int   (2)  = 6;
   public static void    main(String[] args){
     Vector theVector = new Vector< (3) >();
     // 初始化theVector,将theVector的元素设置为0至5
     for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++)
   theVector.add( (4) );
 
     showVector(theVector);    // 依次输出theVector中的元素
      theVector.removeElementAt(3);   
  showVector(theVector);
   }
   public static void showVector(Vector theVector){
      if (theVector.isEmpty())  {
     System.out.println("theVector is empty.");
    return;
      }
     for (int loop = 0; loop < theVector.size(); loop++) {
    System.out.print(theVector.get(loop));
    System.out.print(", ");
      }
      System.out.println();
    }
  }
  该程序运行后的输出结果为: (5) 

()
  阅读以下说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】 
  C++标准模板库中提供了vector模板类,可作为动态数组使用,并可容纳任意数据类型,其所属的命名空间为std。vector模板类的部分方法说明如下表所示:


 

【C++代码】 
 #include
 #include
 using namespace  (1) ;
 typedef vector< (2) > INTVECTOR;
 const int ARRAY_SIZE = 6;
 void ShowVector(INTVECTOR &theVector);
 int main(){
   INTVECTOR theVector;
   // 初始化theVector,将theVector的元素依次设置为0至5
   for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++)
   theVector.push_back( (3) );
  ShowVector(theVector);    // 依次输出theVector中的元素
   theVector.erase(theVector.begin() + 3);  
  ShowVector(theVector);
 }
  void ShowVector(INTVECTOR &theVector) {
    if (theVector.empty())  {
       cout << "theVector is empty." << endl;    return;
    }
   INTVECTOR::iterator (4) ;
   for(theIterator = theVector.begin(); theIterator != theVector.end(); theIterator++){
        cout << *theIterator; 
  if (theIterator != theVector.end()-1)    cout << ", ";
   }
     cout << endl;
 }
  该程序运行后的输出结果为:(5)   

阅读以下应用说明、属性设置以及Visual  Basic 程序代码,将解答写在答题纸的对应栏内。
【应用说明】 
  本应用运行时,由用户输入一个正整数n后自动产生n个正整数,然后按照用户的指定要求对该组数进行处理。该应用的运行界面如下图所示:


  1. 窗体中有两个文本框(txtSrc,txtObj)、两个标签(lblSrc,lblObj)、三个命令按钮(cmdGendat,cmdProc,cmdQuit)和一个弹出式菜单(procMenu,初始时不可见)。 
  2.文本框txtSrc(由标签lblSrc提示)用于显示产生的数据,文本框txtObj(由标签lblObj提示)用于显示处理结果,要求每行显示一个整数。
  3. 程序启动时,命令按钮cmdProc(运算要求)不可用。点击命令按钮cmdGendat(产生数据)后,提示用户输入一个n的值并生成n个正整数存入数组元素a(1)~a(n),然后将数据逐行显示在txtSrc中,并设置命令按钮cmdProc可用。
  4. 点击命令按钮cmdProc(运算要求)后弹出菜单。选择菜单项并单击后,进行相应处理并将结果显示在txtObj中,同时将lblObj的标题改为该菜单项表示的处理命令。
  弹出式菜单“运算要求”的结构如下表所示:
 


  一个整数序列的中位数指对该序列进行非递减(增)排列后最中间位置上的元素。若序列长度为偶数,则取中间两个元素的平均值为其中位数。
 

【属性设置】  
  为实现单击命令按钮 cmdProc 后弹出“运算要求”菜单(procMenu),设计时需将procMenu的 (1) 属性设置成false。
  供(1)选择的属性:  Default    Enabled    ScaleMode    Style    Visible 从下列3道试题(试题五至试题七)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。   
【Visual Basic 程序代码】
  Dim a() As Integer, n As Integer
  Private Sub Form_Load()
      txtSrC.Text = "": txtObj.Text = "":   (2)  = False
  End Sub
  Private Sub cmdGendat_Click()    ’生成正整数序列并存入数组a
      On Error GoTo Error_handler
      n = InputBox$("请输入数组元素个数:", "输入序列长度")
          If (n < 1) Then
      MsgBox "输入数据错误!", vbOKOnly, "提示:"
      GoTo Error_handler:
   End If
       ReDim a(n) As Integer  
   s = ""
        For i = 1 To n    ’将生成的正整数存入a(1)~a(n)中
      a(i) = Int(Rnd * 10000) :  s = s & Str$(a(i)) & vbCrLf
       Next
       txtSrC.Text = s
        (3)  ’设置运算要求命令按钮可用
   Error_handler:
  End Sub
 
  Private Sub cmdProc_Click()
      PopupMenu procMenu
  End Sub
 
  Private Sub MidNum_Click()  ’求中位数
   lblObj.Caption = MidNum.Caption & ":"
   For i = 1    To    round((n + 1)/2)    ’用选择排序法对数组a进行部分排序
      a(0) = a(i):k = i ’ a(0)用作临时变量,暂存第i次选出的最小元素
     For j = i + 1    To    n  
     If a(j) < a(0) Then
       a(0) = a(j): k = (4)  
         End If
     Next
      If k <> i Then
       a(k) = a(i): a(i) = a(0)
      End If
    Next
     If    n / 2 - n \ 2 > 0 Then  ’n为奇数时,取中间一个数
        txtObj.Text = Str$(a( (5) ))
     Else  ’n为偶数时,取中间两个数的平均值
        txtObj.Text = Str$(Int((a(n \ 2) + a(n \ 2 + 1)) / 2))
     End If
  End Sub
 ’其他代码略 

()
  阅读以下说明和C 函数代码,回答问题并将解答写在答题纸的对应栏内。
【说明】
  著名的菲波那契数列定义式为
  f1 = 1 f2 = 1 fn = fn-1 + fn-2 (n = 3,4,…)
  因此,从第 1 项开始的该数列为 1,1,2,3,5,8,13,21,…。函数 fib1 和 fib2 分别用递归方式和迭代方式求解菲波那契数列的第 n项(调用 fib1、fib2 时可确保参数n获得一个正整数)。
【C 函数代码】
 

【问题1】(6 分)
  函数fib1和fib2存在错误,只需分别修改其中的一行代码即可改正错误。
  (1)函数fib1不能通过编译,请写出fib1中错误所在行修改正确后的完整代码;
  (2)函数fib2在n≤2时不能获得正确结果,请写出fib2中错误所在行修改正确的完整代码。
【问题2】(3 分)
  将函数fib1和fib2改正后进行测试,发现前46项都正确,而第47项的值是一个负数,请说明原因。
【问题3】(6 分)
  函数fib1、fib2求得菲波那契数列第n项(n>40)的速度并不相同,请指出速度慢的函数名,并简要说明原因。

()
 阅读以下说明和C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
    已知某二叉树的非叶子结点都有两个孩子结点,现将该二叉树存储在结构数组 Ht中。结点结构及数组Ht的定义如下:
 

  #define MAXLEAFNUM 30

  struct node{

  char ch; /*当前结点表示的字符,对于非叶子结点,此域不用*/

  char *pstr; /*当前结点的编码指针,非叶子结点不用*/

  int parent; /*当前结点的父结点,为0时表示无父结点*/

  int lchild,rchild;

  /*当前结点的左、右孩子结点,为0时表示无对应的孩子结点*/

  };

  struct node Ht[2 * MAXLEAFNUM]; /*数组元素Ht[0]不用*/

  该二叉树的n个叶子结点存储在下标为1~n的Ht数组元素中。例如,某二叉树如图3-1所示,其存储结构如图3-2所示,其中,与叶子结点a对应的数组元素下标为1,a 的父结点存储在 Ht[5],表示为 Ht[1].parent=5。Ht[7].parent=0 表示 7 号结点是树根,Ht[7].lchild=3、Ht[7].rchild=6 分别表示 7 号结点的左孩子是 3号结点、右孩子是 6 号结点。
  

  如果用“0”或“1”分别标识二叉树的左分支和右分支(如图 3-1 所示),从根结点开始到叶子结点为止,按所经过分支的次序将相应标识依次排列,可得到一个 0、1序列,称之为对应叶子结点的编码。例如,图3-1中a、b、c、d的编码分别是100、101、0、11。
  函数LeafCode(Ht[],n)的功能是:求解存储在Ht中的二叉树中所有叶子结点(n个)的编码,叶子结点存储在Ht[1]~Ht[n]中,求出的编码存储区由对应的数组元素pstr域指示。
  函数LeafCode从叶子到根逆向求叶子结点的编码。例如,对图3-1中叶子结点a求编码的过程如图3-3所示。

typedef enum Status {ERROR, OK} Status;
 

 

【函数】  
    Status LeafCode(struct node Ht[], int n)

  {

  int pc, pf; /*pc用于指出树中的结点,pf则指出pc所对应结点的父结点*/

  int i,start;
  char tstr[31] = {‘\0’}; /*临时存储给定叶子结点的编码,从高下标开始存入*/
  for(i=1;(1) ; i++) { /*对所有叶子结点求编码,i表示叶结点在HT数组中的下标*/
  start = 29;
  pc = i; pf = Ht[i].parent;
  while (pf != (2) ) { /*没有到达树根时,继续求编码*/
  if ( (3) .lchild == pc ) /*pc所表示的结点是其父结点的左孩子*/
   tstr[--start] = ‘0’;
  else
  tstr[--start] = ‘1’;
  pc = (4) ; pf = Ht[pf].parent; /*pc和pf分别向根方向回退一层*/
  }/* end of while */
  Ht[i].pstr = (char *) malloc(31-start);
  if (!Ht[i].pstr) return ERROR;
  strcpy(Ht[i].pstr, (5) );
  }/* end of for */
  return OK;
  }/* end of LeafCode */

()
   阅读以下说明和C 程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】 
  下面C 程序代码的功能是:对于输入的一个正整数n(100≤n<1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150还不是回文数,再将1150与其反序数511相加,得到的1661是回文数。
  函数int isPalm(long m)的功能是:将正整数m的各位数字取出存入数组中,然后判断其是否为回文数。若m是回文数则返回1,否则返回0。
 

【C 程序代码】 
 #include
 #include   
 int isPalm(long m)
 {  /*判断m是否为回文数*/
      int i = 0, k = 0;
  char str[32];
 while (m > 0) {   /*从个位数开始逐个取出m的各位数字并存入字符数组str*/
     str[k++] = (1)  + ’0’;
     m = m / 10;
      }
      for(i = 0; i < k/2; i++)    /*判断str中的k个数字字符序列是否是回文*/
  if ( str[i] != str[ (2) ] ) return 0;
       return 1;
  }
  int main( )
 {  
  long n, a, t;
  printf("input a positive integer:");   scanf("%ld",&n);
  if (n < 100 || n > =1000)   return -1 ;
       while( (3) ) {  /*n不是回文数时执行循环*/
    printf("%ld -> ", n);
    for(a = 0, t = n; t > 0; ) {   /*计算n的反序数并存入a*/
       a = (4) *10 + t % 10;    t = t / 10;
     } /*end of for*/
       n = (5) ;    /*与反序数求和*/
   } /*end of while*/
      printf("%ld\n",n);  
  system("pause");  return 0;
 }   

()
    阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。
【说明】 
    下面流程图的功能是:在已知字符串A 中查找特定字符串B,如果存在,则输出B串首字符在 A 串中的位置,否则输出-1。设串 A 由 n 个字符 A(0)、A(1)、…、A(n-1)组成,串B由m个字符B(0)、B(1)、…、B(m-1)组成,其中n≥m>0。在串A中查找串B的基本算法如下:从串A 的首字符A(0)开始,取子串A(0)A(1)…A(m-1)与串B比较;若不同,则再取子串A(1)A(2)…A(m)与串B 比较,依次类推。
    例如,字符串“CABBRFFD”中存在字符子串“BRF”(输出3),不存在字符子串“RFD”(输出-1)。
    在流程图中,i用于访问串A中的字符(i=0,1,…,n-1),j用于访问串B 中的字符(j=0,1,…,m-1)。在比较 A(i)A(i+1)…A(i+m-1)与 B(0)B(1)…B(m-1)时,需要对A(i)与B(0)、A(i+1)与B(1)、…、A(i+j)与B(j)、…逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,依此类推。
 

【流程图】
 

上一页

第 6 页