201905程序员下午真题

第 1 题

阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
如果n位数(n≥2)是回文数(从左到右读与从右到左读所得结果一致),且前半部分的数字递增(非减)、后半部分的数字将递减(非增),则称该数为拱形回文数。例如, 12235753221就是一个拱形回文数。显然,拱形回文数中不含数字0。
下面的流程图用于判断给定的n位数(各位数字依次存放在数组的各个元素A[i]中, i=1,2, ...,n)是不是拱形回文数。流程图中,变量T动态地存放当前位之前一位的数字。当n是奇数时,还需要特别注意中间一位数字的处理。

【流程图】  


注1: “循环开始”框内给出循环控制变量的初值、终值和增值(默认为1),格式为: 循环控制变量=初值,终值[,增值]
注2: 函数int(x)为取x的整数部分,即不超过x的最大整数。

答案与解析

  • 试题难度:一般
  • 知识点:流程图>流程图
  • 试题答案:

    (1)n-i+1
    (2)T&&A[i]!=0或 T&&A[i]>0


(3)T
(4)n
(5)T或A[n/2]或A[(n-1)/2]

</p>

  • 试题解析:

    1)跟A[i]对称的后半部分元素下标是n-i+1;
    2)T动态地存放当前位之前一位的数字,所以这里A[i]大于前一项T值。且在拱形回文数中,不含数字0,所以再加上一个条件 A[i]!=0


3)比较完后,将A[i]值赋给T,T进行动态地存放当前位之前一位的数字。
4、5)判断元素个数是偶数还是奇数,如果是奇数,则还需要进行判断最中间的元素,所以4空这里填n,5空填的是为奇数个时最中间元素的前一项元素的表示。</p>

第 2 题

阅读以下说明和C代码,回答问题,将解答写入答题纸的对应栏内。
【说明】
函数bubbleSort(int arr[], int n, int (*compare)(int,int))的功能是根据调用时传递的比较函数compare对数组arr的前n个元素进行排序。
【C代码】
#define swap(a, b) { a = a^b; b = a^b; a = a^b;} //交换a与b的值
int less(int x,int y)
{
     return ((x<y) ? 1 : 0);
}
int larger(int x, int y)
{
     return ((x>y) ? 1 : 0);
}

void bubbleSort(int arr[ ], int n, int (*compare)(int,int))
{      int i,j;
       int swapped = 1;
       for( i=0; swapped; i++) {
            swapped = 0;
            for(j=0; j<n-1-i; j++)
                 if ( compare( arr[j+1], arr[j])) {
                        swap( arr[j+1], arr[j]);
                        swapped =1;
                 }
         }
}

【问题】
设有如下数组定义:
int data1[ ] = {4, 2, 6, 3, 1};
int data2[ ] = {4, 2, 6, 3, 1};
int data3[ ] = {4, 2, 6, 3, 1};
请分别给出下面的函数调用执行后,数组data1、data2和data3各自的元素序列。
(1)bubbleSort(data1, 5, less);
(2) bubbleSort(data2, 5, larger);
(3) bubbleSort(data3, 3, larger);

答案与解析

  • 试题难度:一般
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    (1){1,2,3,4,6}
    (2){6,4,3,2,1}
    (3){6,4,2,3,1}

  • 试题解析:

    swap函数是将两元素值进行相互交换。
    less函数是判断x和y的关系,如果x<y,则函数值为真;
    large函数是判断x和y的关系,如果x>y,则函数值为真。
    在bubbleSort函数中,第二个参数表示进行比较元素的个数,第三个参数表示进行排序的方式,如果传入less函数,则是从小到大排序;如果传入large函数,则是从大到小排序。

第 3 题

阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。
【说明】
某市根据每天早上5点测得的雾霾指数(pm2.5值)决定是否对车辆进行限行。规则 如下:
(1)限行时间为周内(即周一到周五),周六周日不限行;
(2)根据车牌号的尾号(最后1位数字)设置限行车辆(车牌号由英文字母和十进制数字构成,长度为6位,至少包含1位数字);
(3)雾霾指数低于200时,不限行;
(4)雾霾指数在区间[200,400)时,周内每天限行两个尾号的汽车:周一限行1和6,周二限行2和7,周三限行3和8,周四限行4和9,周五限行5和0,即尾号除以5的 余数相同者在同一天限行;
(5)雾霾指数大于等于400时,周内每天限行五个尾号的汽车:周一、周三和周五限行1,3,5,7,9,周二和周四限行0,2,4,6,8,即尾号除以2的余数相同者在同一天限行;
下面程序运行时,输入雾霾指数、星期(数字1表示星期一,数字2表示星期二,……, 数字7表示星期日)和车牌号,输出该车牌号是否限行的信息。

【C代码】
#include <stdio.h>
#define PM25_L1 200
#define PM25_L2 400
typedef enum {YES,NO} MARKTAG;
int isDigit(char ch)
{//判断ch是否为十进制数字字符,是则返回1,否则返回0
      return (ch>='0' && ch<='9');
}
void prt_msg(char *msg, MARKTAG flag)
{
      if (flag == YES)
              printf("%s : traffic restrictions\n", msg);
      else
              printf("%s : free\n", msg);
}

int isMatched(int weekday, int t, int d) //判断是否符合限行规则,是则返回1,否则返回0
 { return (weekday%d == t%d); }
void proc(int pm25, int weekday, char *licence)
{
       int i,lastd;
       if (weekday == 6 || weekday == 7 ||      (1)     )
              prt_msg(licence, NO);
       else {
                    for( i=5; i>=0; i-- )
                         if (isDigit(licence[i])) {
                               lastd=      (2)      ; //获取车牌号的尾号
                               break;
                       }
                   if(pm25>= PM25_L2 ) { //限行5个尾号的汽车
                           if (isMatched(     (3)     ))
                                 prt_msg(licence, YES);
                           else
                                 prt_msg(licence, NO);
                      }

                      else { //限行2个尾号的汽车
                                 if (isMatched(      (4)     ))
                                       prt_msg(licence, YES);
                                 else
                                       prt_msg(licence, NO);
                      }
             }
}
int main()
{
      int weekday=0, pm25=0; 
      char licence[7];
      scanf("%d %d %s’’,&pm25, &weekday, licence);
     //输入数据的有效性检测略,下面假设输入数据有效、正确 
      proc(     (5)      );
      return 0;
}

答案与解析

  • 试题难度:一般
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    (1)pm25<200或pm25<PM25_L1
    (2)licence[i]-‘0’
    (3)weekday,lastd,2或lastd,weekday,2
    (4)weekday,lastd,5或lastd,weekday,5
    (5)pm25,weekday,licence或pm25,weekday,&licence[0]

  • 试题解析:

    (1)表示什么时候不限行,按照题意,周六周日不限行,雾霾指数低于200以下也不限行;所以这里填pm25<200或pm25<PM25_L1。
    (2)该处获取车牌号的尾号,从后向前依次查找,只要找到一个数字字符就结束,并将这个数字字符转化为数字赋值给lastd,所以填的是licence[i]-‘0’,这里有同学可能会直接写licence[i],注意字符‘0’的ASCII码对应的是48
    (3)此处填的是当雾霾指数大于等于400时,周内每天限行五个尾号的汽车,算法是尾号除以2的余数相同者在同一天限行,这里是尾号lastd和weekday和2进行分别取余,得到值相同的时候就是要限行,使用函数isMatched,填的是weekday,lastd,2。
    (4)此处填的是当雾霾指数小于400大于等于200时,周内每天限行两个个尾号的汽车,算法是尾号除以5的余数相同者在同一天限行,这里是尾号lastd和weekday和5进行分别取余,得到值相同的时候就是要限行,使用函数isMatched,填的是weekday,lastd,5。
    (5)此处填调用proc函数的实参,查看proc的函数定义部分,实参应该填入pm25,weekday,licence。

第 4 题

阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。
【说明】
下面程序运行时,对输入的表达式进行计算并输出计算结果。设表达式由两个整数和一个运算符(+或-)构成,整数和运算符之间以空格分隔,运算符可以出现在两个整数之前、之间或之后,整数不超过4位,输入的两个整数和运算符都用字符串表示。
例如,输入分别为“25+7”“+25 7”“25 7+”时,输出均为“25+7=32”。

【C代码】
#include<stdio.h>
int str2int(char *s);                                                         //将数字字符串转换为整数
int isOperator(char *str);                                              //判断字符串的开头字符是否为运算符
void cal(char op, char a[ ], charb[ ]);                            //将数字串转化为对应整数后进行op所要求的计算
void solve(char a[ ],char b[ ],char c[ ]);

int main ()
{
        char a[10],b[10], c[10];
        scanf(’’%s%s%s’’,a,b,c);
        //输入数据的有效性检测略,下面假设输入数据有效、正确 
        Solve(a,b,c);
        Return 0;
}
int str2int(char *s)
{
       int val = 0;
       while (*s) {
              val =     (1)    + (*s - '0');                               //将数字字符串转换为十进制整数
                    (2)      ;                                                         //令字符指针指向下一个数字字符
       }
       return val;
}

int isOperator(char *str)
{
       return (*str ==‘+’|| *str ==‘-’);
}
void cal( char op, char a[ ], char b[])
{
        switch(op) {
                case ‘+’:
                      printf(” %s + %s = %d”,a,b,str2int(a)+str2int(b)); 
                      break;
                case ‘-’:
                       printf("%s - %s = %d ” ,a,b,str2int(a)-str2int(b)); 
                       break;
         }
}

void solve(char a[ ],char b[ ],char c[ ])
{//解析输入的3个字符串,输出表达式及计算结果
         if (isOperator(a)) {                       //运算符在两个整数之前
               cal(       (3)     ); 
          }
         else if(isOperator(b)) {                //运算符在两个整数之间
              cal(     (4)       ); 
           }
          else {                                             //运算符在两个整数之后 
               cal(     (5)      );
           }
}


答案与解析

  • 试题难度:一般
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    (1) va1*10或等效形式
    (2)s++或++s或s=s+1或s+=1或等效形式
    (3) a[0],b,c或等效形式
    其中,a[0]可表示为*a,b可替换为&b或&b[0],c可替换为&c或&c[0]
    (4) b[0],a,c或等效形式
    其中,b[0]可表示为*b,a可替换为&a或&a[0],c可替换为&c或&c[0]
    (5) c[0],a,b或等效形式
    其中,c[0]可表示为*c,a可替换为&a或&a[0],b可替换为&b或&b[0]

  • 试题解析:

    1、2空将数字字符串进行全部转化为数字,例如“1234”转化为数字1234,分别用指针s依次取字符,val将数字保留,之前是’1’,val=1;然后s=’2’,val=12,然后s=’3’,val=123,然后s=’4’,val=1234,因此val=val*10+*s-‘0’。每次循环后s向后移动一个。
    3、4、5考查的都是函数调用的问题,首先判断运算符的位置,用isOperator来进行判定,如果字符串a就是运算符,那么操作数就是b和c,调用cal函数进行计算。实参传递的时候,第一个参数要传递字符,后面两个参数传递字符数组或者字符指针,(3)填写的是*a,b,c,依次类推,(4)答案是*b ,a,c,(5)的答案是 *c,a,b。

第 5 题

阅读以下说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】 
  现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡(Card)(信用卡 (CreditCard)和储蓄卡(DebitCard))等多种支付方式(PaymentMethod)对物品(Item)账单(Bill)进行支付。图5-1是某支付系统的简略类图。


【Java代码】 
Import java.util. ArrayList; 
import java.util.List; 
interface PaymentMethod {
      public      (1)      
}
// Cash、DebitCard和Item实现略,Item中getPrice( )获取当前物品对象的价格
abstract class Card       (2)      {
      private final String name, num;
      public Card(String name, String num) {this.name = name; this.num = num; } 
      @Oveiride
      public String toString ( ) {
             return String.format(“%s card[name = %s, num = %s]”,this.getType (), name, num);
       }
      @Override
      public void pay(int cents) {

             System.out.println(“Payed " + cents + “ cents using “ + toString( )); 
             this.executeTransaction(cents);
      }
      protected abstract String getType( );
      protected abstract void executeTransaction(int cents);
}
class CreditCard       (3)      {
      public CreditCard(String name, String num) {     (4)       ; }
      @Override
      protected String getType( ) { return "CREDIT"; }
      @Override
      protected void executeTransaction(int cents) {
            System.out.println(cents + " paid using Credit Card. "’);
      } 
}

class Bill {//包含所有购买商品的账单
      private List<Item> items = new ArrayList<>();
      public void add(Item item) { items.add(item); }
      public intgetTotalPrice( ){/*计算所有 item 的总价格,代码略*/ }
      public void pay(PaymentMethod paymentMethod){//用指定的支付方式完成支付
            (5)       (getTotalPrice( ));
      }
}
public class PaymentSystem { 
      public void pay( ) {
             Bill bill = new Bill( );
             Item item1 = new Item("1234",10); Item item2 = new Item( "5678",40); 
             bill.add(item1); bill.add(item2); //将物品添加到账单中
             bill.pay(new CreditCard("LI SI", "98765432101")); //信用卡支付
      }

      public static void main(String[ ] args) {
                  (6)     = new PaymentSystem( ); 
             payment.pay( );
       }
}

答案与解析

  • 试题难度:一般
  • 知识点:Java程序设计>Java程序设计案例
  • 试题答案:

    (1)void pay(int cents)
    (2)implements PaymentMethod
    (3)extends Card
    (4)super(name,num)
    (5)paymentMethod.pay
    (6)PaymentSystem payment

  • 试题解析:

    PaymentMethod是个接口,里面的方法在实现类当中进行具体实现,实现类是Card和Cash,所以第二空填implements PaymentMethod。在图示中,PaymentMethod中有pay方法,且在实现类中Card也有pay方法,所以第一空填void pay(int cents)。
    第三空填CreditCard类与其他类的关系,可以发现它继承了Card类,所以这里填:extends Card
    第四空CreditCard内有构造方法,并将方法内的参数传递给父类的私有成员,填:super(name,num)
    第五空根据传入的paymentMethod对象,进行调用pay方法,传入getTotalPrice()的值,所以这里填paymentMethod.pay
    利用语句PaymentSystem payment=new PaymentSystem()创建一个PaymentSystem 类的对象,对象名为payment,然后下面开始调用pay方法。

第 6 题

阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡(Card)(信用卡 (CreditCard)和储蓄卡(DebitCard))等多种支付方式(PaymentMethod)对物品(Item) 账单(Bill)进行支付。图6-1是某支付系统的简略类图。


图6-1  类图

【 C++代码 】  
#include <iostream>
#include〈vector〉
#include〈string〉
using namespace std;
class PaymentMethod {
public: virtual void pay(int cents)=0;
};
// Cash、DebitCard和Item实现略,Item中getPrice( )获取当前物品对象的价格 
class Card : public PaymentMethod { 
private: string name, num; 
public:
       Card(string name, string num) {this->name = name; this->num = num; } 
       string toString( ) {
              return this->getType( ) + " card[name = "+ name + ",num = " + num + "]"; )
        }

        void pay(int cents) {
              cout<< "Payed " <<cents << " cents using " <<toString( ) <<end1;
              this->executeTransaction(cents);
         }
protected:
        virtual string getType( )=0; 
        virtual void     (1)      =0:
};
class CreditCard      (2)        {
public:
       CreditCard(stringname, stringnum)      (3)        {
       }
protected:
        string getType( ) { return " CREDIT " ; }
        void executeTransaction(int cents) {
              cout<<cents << " paid using " <<getType( )<< " Card." << end1;
        }
};

class Bill {//包含所有购买商品的账单
private:
         vector< Item*> items; //包含物品的 vector 
public:
         void add(Item* item){ items.push_back(item); }
         int getTotalPrice( ){ /*计算所有item的总价格,代码略*/}
         void pay(PaymentMethod* paymentMethod) {//用指定的支付方式完成支付
              (4)        (getTotalPrice( ));
         }
};
class PaymentSystem{
public:
        void pay( ) {
               Bill* bill = new Bill( );
               Item* item1= new Item"1234",10); Item* item2 = new Item("5678",40); 
               bill->add(item1); bill->add(item2); //将物品添加到账单中

                    (5)        (new CreditCard("LI SI", "98765432101")); //信用卡支付
         }
};
Intmain( ) {
              (6)        = new PaymentSystem( );
         payment->pay( ); 
         return 0;
}

答案与解析

  • 试题难度:一般
  • 知识点:C++程序设计>C++程序设计
  • 试题答案:

    (1)executeTransaction(int cents)
    (2):public Card
    (3):Card(name,num)
    (4)paymentMethod->pay
    (5)bill->pay
    (6)PaymentSystem *payment

  • 试题解析:

    (1)定义虚方法,在子类中实现,包含getType()和executeTransaction(int cents)两个。
    (2)CreditCard继承Card,所以这里填继承,用::public Card。
    (3)CreditCard内有构造方法,并将方法内的参数传递给父类的私有成员,填 :Card(name,num)。
    (4)利用paymentMethod对象调用pay方法,并传入具体价格getTotalPrice,这里填paymentMethod->pay。
    (5)调用bill的pay方法,bill->pay。
    (6)通过PaymentSystem *payment=new PaymentSystem进行创建对象指针。

results matching ""

    No results matching ""