一、问答题
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]!=O或 T&&A[i]>0
(3)T
(4)n
(5)T或A[n/2]或A[(n-1)/2]
解析:
(1) 根据说明中的描述,要找到与A[i]对称的后半部分元素,其下标应该是n-i+1。因此,第一个空应填写n-i+1。
(2) 在判断是否为拱形回文数时,需要确保当前位之前的数字递增且当前位数字不为零(因为拱形回文数中不含数字0)。因此,第二个空应填写T && A[i]!=0 或 T && A[i]>0。这两个条件确保了T(当前位之前一位的数字)递增并且当前位不为零。
(3) 在比较完当前位与前一位的关系后,需要将当前位的值赋给T,以便进行下一轮的对比。因此,第三个空应填写T。
(4) 在判断是否为拱形回文数时,需要考虑数字的位数(偶数或奇数)。对于偶数位数的数字,直接比较即可;对于奇数位数的数字,需要特别处理中间一位。因此,第四个空应填写n,表示需要判断的数字的总位数。
(5) 对于奇数位数的数字,中间一位的处理需要特别注意。根据流程图中的逻辑,第五个空应填写T(表示中间前一位的数字)或者A[n/2](直接表示中间位)或者A[(n-1)/2](表示中间位的前一位)。这三个选项中的任何一个都可以用来表示中间前一位的数字。
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 bubble Sort(int arr[ ], int n, int (*compare)(int, int)) { int i,j; int swapped= 1; for( i= 0; swapped; 1++) { swapped =0; for(j=0; j<n-I-i; j++) if( compare( arr[j+1, arr[ j ])) { swap( arr[j+1}, arr[ j ]); swapped =1; } } }
【问题1】
设有如下数组定义:
int data1[ ]={4,2.6.3,1};
int data2[ ]={4,2,6.3,1}
int datas3[ ]={4,2,6.3,1}
请分别给出下面的函数调用执行后,数组 data1、data2和 data3 各自的元素序列。
(1)bubble Sort(data1, 5, less);
(2)bubble Sort(data2, 5, larger)
(3)bubble Sort(data3, 3, larger)
参考答案:
(1){1,2,3,4,6}
(2){6,4,3,2,1}
(3){6,4,2,3,1}
解析:
根据提供的说明和C代码,我们知道 bubbleSort
函数根据传递的比较函数 compare
对数组进行排序。函数 less
用于从小到大排序,而函数 larger
用于从大到小排序。数组 data1
和 data2
的定义都包含五个元素,所以可以对它们进行排序。然而,数组 datas3
的定义存在问题,缺少逗号分隔元素,并且只传入三个元素进行排序,因此无法确定排序后的结果。根据这一点和提供的答案,我们可以得出上述结论。
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 is Digit (char ch) {//判断ch 是否为十进制数字字符,是则返回 1,否则返回0 return (ch>= ‘0’&& ch<=’g’); } void prt_msg(char *msg, MARKTAG fiag) { if(flag == YES) printf("%s: traffic restrictions\n’’, msg); else printf("%s: free\n’’, msg); Int is Matched (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 II weekday ==7l l (1) ) Prt _msg(licence, NO); Else{ for(i=5;i>O;=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 (is Matched( (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; }
参考答案:
(1)pm25<200或pm<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)根据题目描述,当雾霾指数低于一定值时不限行车辆,因此此处应判断雾霾指数是否低于特定值(即PM25_L1),即pm25 < PM25_L1或pm25 < 200。所以答案为pm25 < 200或pm25 < PM25_L1。
(2)获取车牌号的尾号需要从车牌号的最后一位数字开始,通过遍历车牌号字符串找到第一个数字字符并获取其对应的整数值。因此此处应该使用字符’0’的ASCII码减去车牌号字符串中当前字符的ASCII码得到尾号。所以答案为licence[i] - ‘0’。这样可以确保正确地将字符转换为对应的整数值。
(3)当雾霾指数大于等于400时,需要按照尾号除以特定值的余数相同的原则限行车辆。此处需要判断车牌号的尾号除以特定值(这里是除以2)的余数是否与星期几的余数相同。因此答案为weekday和lastd分别除以特定值(这里是除以2)得到的余数进行比较。所以答案为weekday, lastd, 2。表示根据weekday和lastd的余数来判断是否限行。
(4)当雾霾指数在区间[200, 400)时,需要根据车牌号的尾号除以特定值的余数相同的原则限行车辆。这里需要判断车牌号的尾号除以特定值(这里是除以5)的余数是否与星期几的余数相同。因此答案为lastd和weekday分别除以特定值(这里是除以5)得到的余数进行比较。所以答案为lastd, weekday, 5。表示根据lastd和weekday的余数来判断是否限行。
(5)在调用proc函数时,需要将雾霾指数、星期几和车牌号作为实参传递给函数。由于车牌号是一个字符串,在C语言中通常通过传递字符串指针或数组来传递字符串。因此答案为pm25, weekday, &licence[0](或者pm25, weekday, licence[]),表示将车牌号字符串的地址传递给函数进行处理。
4、阅读以下说明和代码,填写程序中的空(1)-(5),将解答写入答题细的对应栏内。
【说明】
下面程序运行时,对输入的表达式进行计算并输出计算结果。设表达式由两个整数和一个运算符(+或-)构成,整数和运算符之间以空格分隔,运算符可以出现在两个整数之前、之间或之后,整数不超过4位,输入的两个整教和运算符都用字符串表示
例如,输入分别为 “25+7”、“+257”、“257+”时,输出均为“25+7=32”。
【C 代码】
#include<stdio. h> Int strain (char*s); //将数字字符串转换为整数 Int isOperator(char*str); //判断字符串的开头字符是否为运算符 void cal (char op, char a[ ], charb[ ]); //将数字串转化为对应证书后进行所要求的计算 int main ( ) { char a[ 10] ,b[10 ],c[10]; scanf ("%s%s%s, a, b, c); //输入数据的有效性检测略,下面假设输入数据有效、正确 Solve(a, b, c); Retune ( ) } int strain (char*s); { Int val=0 while(*s) val= (1)+(*s-’0’); ∥将数字字符串转换为十进制整数 (2) //令字符指针指向下一个数字字符 } Return val; } int isoperator(char* str) { return (*str==’+’II*str==’-’): } Void cal ( char op,char a [ ],char b[ ]) { switch(op) { case ‘+’: printf("%s+%s=%d", a, b, straint(a)+straint(b)); break. case ‘-’: printf("%s-%s=%d", a, b, strain(a)-straint(b)); Break; } } void solve(char a[ ], char b[ ], char c [ ]) {//解析输入的3 个字符串,输出表达式及计算结果 if (seperator(a)){ ∥运算符在两个整数之前 ca(( 3 ); } else if(opErator(b)){ ∥运算符在两个整数之间 ca(( 4 ); else { ∥运算符在两个整数之后 ca(( 5 ); } }
参考答案:
(1)val*10
(2)S++
(3)*a,b,c
(4)*b,a,c
(5)*c,a,b
解析:
-
第一空和第二空是关于字符串转整数的处理。在字符串转整数时,我们需要逐个字符处理,将每个字符代表的数值累加到最终的结果中。具体来说,对于字符串中的每个字符,我们需要将其转换为对应的数值,并累加到之前的结果上。例如,对于字符串"123",我们需要先将"1"转换为数值1,然后将"2"转换为数值20(因为需要将之前的结果乘以10),再将"3"转换为数值300(再次乘以10)。因此,第一空应填写 val*10,第二空应填写 s++,以进行指针的向后移动。
-
第三空、第四空和第五空是关于运算符位置的判断及函数调用的。我们需要根据运算符的位置来决定如何调用计算函数。如果运算符在两个整数之前,那么操作数就是整个表达式;如果运算符在两个整数之间,那么操作数就是两个整数;如果运算符在两个整数之后,那么操作数就是第一个整数和整个表达式。因此,我们需要根据运算符的位置来判断应该传递哪些参数给计算函数。第三空应填写 *a, b, c,表示如果运算符在a之前,那么操作数就是整个表达式和两个整数;第四空应填写 *b, a, c,表示如果运算符在b之前或之间,那么操作数就是两个整数和第一个整数;第五空应填写 *c, a, b,表示如果运算符在c之前或之后,那么操作数就是第一个整数和整个表达式或第二个整数。
5、阅读以下说明和Java代码,将应填入( )处的字句写在答题纸的对栏内。
【说明】
现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡( Card)(信用卡( Creditcard)和储蓄卡( Debitcard))等多种支付方式( PaymentMethod)对物品(tem)账单(Bill)进行支付。图 5-1 是某支付系统的略类图。
【Java代码】
import java. util. Array List; import java. util. List; interface PaymentMethod { Public ( 1 ) } ∥cash、 Debitcard和ltem 实现略,ltem中getPrice( )取当前物品对象的价格 abstract class Card (2) { private final String name, num; public Card(string name, String num){this.name= name; this, num = num; } @Overide public String toString ( ) { return String. format(“%s card[name = %s, num =%s}”, this. getType( ), name, num); @override public void pay(int cents) { System. out. printin(“Payed"+ cents+"cents using"+toString( )); this, execute Transaction(cents); } protected abstract String getType( ): protected abstract void execute Transaction(int cents) } class CreditCard ( 3 ) { public CreditCard(String name, String num){ (4) ;} @Override protected String getType( ){ return"CREDIT";} @Override protected void execute Transaction(int cents) { System. out. Println(cents +"paid using Credit Card. "); } } Class Bill {//包含所有购买商品的账单 private List<ltem> 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(Stringl args) { (6) = new Paymentsystem( ); payment pay( ); } }
参考答案:
(1)void pay(int cents)
(2)implements PaymentMethod
(3)extends Card
(4)super(name, num)
(5)paymentMethod.pay
(6)Paymentsystem payment
解析:
(1) 根据说明和代码,PaymentMetod是一个接口,其中包含了一个名为pay的方法,接受一个整数参数cents。因此,应填入的方法声明为void pay(int cents)。
(2) 在Java中,当一个类要实现一个接口,需要使用implements关键字。根据题目描述,这里需要实现PaymentMetod接口,因此应填写implements PaymentMethod。
(3) Card是一个抽象类,而CreditCard是Card的一个子类,表示信用卡支付。在Java中,子类使用extends关键字继承父类。因此,应填写extends Card。
(4) 在子类的构造方法中,通常会调用父类的构造方法,使用super关键字。根据题目描述,CreditCard的构造方法需要调用父类Card的构造方法,并传递name和num参数。因此,应填写super(name, num)。
(5) 在Bill类的pay方法中,需要调用PaymentMetod的pay方法来完成支付。同时,需要传入getTotalPrice()方法的返回值作为支付的金额。因此,应填写paymentMethod.pay(getTotalPrice())。
(6) 在main方法中,需要创建一个Paymentsystem类的对象来进行支付操作。因此,应填写Paymentsystem paymentSystem = new Paymentsystem()。
6、阅读以下说明和C++代码,将应填入( )处的字句写在答题纸的对栏内。
【说明】
现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡( Card)(信用卡( Creditcard)和储蓄卡( Debitcard))等多种支付方式( PaymentMethod)对物品(tem)账单(Bill)进行支付。图 5-1 是某支付系统的略类图。
【C++代码】
#include <iostream> #include (vector) #include(string) using namespace std class PaymentMethod t public: virtual void pay(int cents)=0; }; //class、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->execute Transaction(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*>tems;∥包含物品的 vector Public: void add(Item" item items. push back(item):} int getTotalPrice ( ) { /*计算所有 item 的总价格,代码略”/} old pay( PaymentMethod* paymentMethod) {//用指定的支付方式完成支付 (1) (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(tem2);∥将物品添加到账单中 (2) ( new CreditCard("LI SI","98765432101”);∥信用卡支付 } }; Intmain( ) { (6) =new PaymentSystem( ); payment->pay ( ); return 0; }
参考答案:
(1)execute Transaction(int cents)
(2):public Card
(3): Card(name, num)
(4)paymentMethod->pay
(5)bill->pay
(6)PaymentSystem*payment
解析:
(1)在父类Card中声明了一个虚函数executeTransaction(int cents),用于执行支付操作。根据多态性,子类Creditcard需要实现这个函数。所以此处应填写executeTransaction(int cents)。
(2)根据类继承关系,CreditCard是Card类的子类,因此需要使用public继承。所以此处应填写public Card。
(3)在CreditCard类中,需要调用父类Card的构造函数来初始化name和num成员变量。因此此处应填写Card的构造函数,即Card(name, num)。
(4)在PaymentSystem类的pay方法中,需要使用传入的支付方式对象paymentMethod调用其pay方法来完成支付操作。所以此处应填写paymentMethod->pay。
(5)在Bill类中,有一个pay方法用于完成支付操作。因此此处应填写调用bill对象的pay方法,即bill->pay。
(6)在main函数中,需要创建PaymentSystem类的实例指针来进行支付操作。所以此处应填写PaymentSystem的指针变量名,即PaymentSystem* payment。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!