填空题【说明】
设计一个日期类Date包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。
在Date类中设计如下重载运算符函数:
Date operator + (int days) : 返回某日期加上天数得到的日期。
Date operator - (int days) : 返回某日期减去天数得到的日期。
int operator - (Date
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年class Date
{
int year, month, day //年,月,日
int leap(int); //判断是否闰年
int dton(Date month = m; day = d;}
void setday(intd){day = d;}
void setmonth(int m) {month = m;}
void setyear(int y) {year =y;}
int getday() {return day;}
int getmonth() {return month:}
int getyear() {return yea;}
Date operator + (int days) //+运算符重载函数
{
static Date date;
int number =
________
date = ntod(number)
return date
}
Date operator - (int days) //-运算符重载函数
{
staffs Date date;
int number=
________
;
number - = days;
date = ntod(number)
return date;
}
int operator - (Date
return days;
}
void disp()
{
cout<<year<<"."<<month<<". "<<day<<endl;
}
};
int Date: :leap( int year)
if(
________
) //是闰年
return 1; //不是闰年
else
return0:
}
int Date:: dton( Date
for(y=1;y<=d. year;y++)
if(
________
)days+ =366; //闰年时加366天
else days + = 365; //非闰年时加365天
for(m =0;m<d. month-1;m++)
if( (6) )
days += day_tab[1] [m];
else
days +=day_tab[0] [m];
days + = d. day;
return days;
}
Date Date::ntod(intn) //将从元0年0月0日的天数转换成日期
{
int y=1,m = 1,d,rest = n,lp;
while
____
{ if(leap(y))
if(rest<= 366) break;
else rest - = 366;
else //非闰年
if(rest = 365 ) break;
else rest-=365;
y++;
}
y--;
Ip = leap(y);
while
____
{
if(lp) //闰年
if(rest>day_tab[1] [m - 1]) rest -= day_tab[1] [m-1];
else break;
else //非闰
if(rest>day_tab[0] [m -1]) rest -= day_tab[0] [m-1];
else break;
m++;
}
d = rest;
return Date(y;m,d);
}
void main()
{
Date now(2003,10,1) ,then(2005,6,5);
cout<<" now:";now. disp();
cout<<" then:";then. disp();
cout<<"相差天数:"<<(then-now)<<endl;
Date dl = now + 1000,d2 = now - 1000;
cout<<"now + 1000:" ;d1. disp();
cout<<" now - 1000:" :d2. disp();
}
填空题下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)?
填空题阅读以下说明和C程序,填充程序中的空缺。
[说明]
埃拉托斯特尼筛法求不超过自然数N的所有素数的做法是:先把N个自然数按次序排列起来,1不是素数,也不是合数,要划去;2是素数,取出2(输出),然后将2的倍数都划去;剩下的数中最小者为3,3是素数,取出3(输出),再把3的倍数都划去;剩下的数中最小者为5,5是素数(输出),再把5的倍数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,每次从序列中取出的最小数构成的序列就是不超过N的全部质数。
下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素sieve[i](u>0)的下标i对应自然数i,sieve[i]的值为1/0分别表示i在/不在序列中,也就是将i划去(去掉)时,就将sieve[i]设置为0。
[C程序]
#include <stdio.h>
#define N 10000
int main()
{
char sieve[N+1]=(0);
int i=0,k;
/*初始时2~N都放入sieve数组*/
for(i=2;______;i++)
sieve[i]=1;
for(k=2;;){
/*找出剩下的数中最小者并用K表示*/
for(;k<N+1&&sieve[k]==0;______);
if(______)break;
print("%d/t",k); /*输出素数*/
/*从Sieve中去掉k及其倍数*/
for(i=k;i<N+1;i=______)
______;
}
return 0;
}/*end of main*/
填空题[说明] 函数count months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。 该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。 规定两个相邻年份的同月同日之间的问隔为1年。例如,2007.5.30—2008.5.30的间隔为1年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.2.29—2009.2.28的间隔为1年。 规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29—2007.2.28的间隔为1个月,同理,2007.1.30—2007.2.28、2007.1.31—2007.2.28的间隔都是1个月。 计算起止日期间隔不足一年的完整月份数时,分两种情况: (1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.31—2008.9.20,通过月号算出月份数为6。修正时,通过调用函数makevalid将2008.9.31改为2008.9.30,与终止日期2008.9.20比较后,将月份数修正为5。 (2)起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.25—2009.3.31,先计算2008.7.25—2008.12.25的月份数为5,再算出2008.12.25—2009.3.25的月份数为3,因此2008.7.25—2009.3.31之间的完整月份数为8。 日期数据类型定义如下: typedef struct int year; int month; int day; /*日期的年号(4位)、月和日号*/ DATE; 程序中使用的函数cmp_date( )、isLeapYear( )和makevalid( )说明如表11-8所示。 表11-8 函数说明 函数名 参数 返回值 说明 cmp_date DATE start DATE end -1:start<end 0:start=end 1:start>end 比较两个日期的大小,例如, 2007.1.30小于2007.5.15 2008.11.23等于2008.11.23 2008.1.31大于2007.5.15 isLeap Year int year 1:year表示的年号是闰年 0:year表示的年号不是闰年 判断给定年号是否为闰年 makevalid DATE *r 无 若日期*r是非法的,即*r不是闰年时其日期为2月29日,或者其4、6、9、11等月份出现了31日,则将其日期改为当月最后 [C语言函数] int count_months(DATE start, DATE end) int years=0, months=0; DATE r; if (cmp_date(start, end)>0) r=start; start=end; end=r; years=end.year-start.year; /*计算年数*/ r=start; r.year=end.year; if (cmp_date(r, end)>0) /*修正年数*/ (1) ; r.year--; if(r. year<end. year) /*跨年度时,先计算到12月的月份数*/ months= (2) ; r. month= (12) ; months+=(end. month+12-r. month)%12; r. year=end. year; r. month=end. month; makeva!id( (3) ); /*将日期r修正为有效日期*/ if(cmp_date(r, end)>0) /*修正月份数*/ (4) ; months+= (5) ; /*计算总月份数*/ return months;
填空题阅读下列说明、图和Java代码,填补空缺。[说明]已知对某载客车辆(Car)进行类建模,如图13-2所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。[Java代码]classBody{//此处代码省略};//车身类classPassenger{//此处代码省略};//乘客类classWheel{//此处代码省略};//车轮类classDriver{//司机类publicStringname;//表示第几路公交车司机publicDriver(StringdriverName){name=driverName;}//构造函数};classEngine{//引擎类publicStringengineNo;//引擎编号publicEngine(StringengineNo){this.engineNo=engineNo;}//构造函数};publicclassCar{//汽车类staticfinalint{{U}}(1){{/U}}=7;//定义最多载客数staticfinalintMAX_WHEELS=5;//定义最多轮胎数protectedEngineengine;protectedDriverdriver;protectedBodybody=newBody();protectedWheel[]wheels;protectedPassenger[]passengers;publicCar(Driverdriver){//构造函数{{U}}(2){{/U}}.driver=driver;engine=newEngine("TX6536型号引擎");wheels=newWheel[MAX_WHEELS];passengers=newPassenger[MAX_PASSENGERS];for(intindex=0;index<MAX_WHEELS;index++){wheels[index]=newWheel();}for(intindex=0;index<MAX_PASSENGERS;index++){passengers[index]=null;}}intgetPassengerNumber(){//获取车上乘客数量//此处代码省略}voidgetOnPassenger(PassengeraPassenger){//乘客上车//此处代码省略}voidrun(){//开车if({{U}}(3){{/U}})(System.out.printin("司机尚未上车!");return;}//此处代码省略}publicstaticvoidmain(Stringargs[]){Driverdriver=newDriver("第五路公交车司机");Carcar=newCar({{U}}(4){{/U}});for(intindex=0;index<MAX_PASSENGERS;index++)car.getOnPassenger({{U}}(5){{/U}}Passenger());car.run();}}
填空题阅读以下说明和C++代码,填补C++代码中的空缺,将解答写在对应栏内。 [说明] 已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算);另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。 下面是实现该工资系统的C++代码,其中定义了4个类:工资系统类PayRoll、员工类Emplovee、正式工类Salaried和计时工类Hourly,Salaried和Hourly是Employee的子类。 [C++代码] //头文件和域名空间略 const int EMPLOYEE_NUM=5; class Employee protected: int emDCode; //员工号 string name; //员工姓名 double salary; //周发放工资 public: Employee(const int empCode,const string &name) this->empCode=empCode; this->name=name; virtual~Employee() virtual void pay()=0; double getSalary()return this->salary; ; class Salaried ______ private: double payRate; //年薪 public: Salaried(const int empCode,const string void pay() this->salary=______;//计算正式员工的周发放工资数 cout<<this->name<<":"<<this->salary<<endl; ; class Hourly ______ private: double payRate; //小时工资数 int hours; //周工作小时数 public: Hourly(const int empCode, const string this->hours=hours, void pay() this->saiary=______;//计算计时工的周发放工资数 cout<<this->name<<"::<<this->salary<<endl; ; class PayRoll public: void pay(Employee* e[]) for (int i=0; i<EMPLOYEE_ NUM; i++) e[i]->pay(); ; int main() PayRoll* payRoll=new PayRoll; ______ employees[EMPLOYEE_ NUM]= new Salaried(1001,"Zhang San",58000.00), //此处省略对其他职工对象的生成 new Hourly(1005,"L1",12,50.00), ; payRoll->pay(______); double total=0.0; for(int i=0;i<EMPLOYEE_ NUM;i++) (total+=employees[i]->getSalary(); //统计周发放工资总额 cout<<"总发放额="<<total<<endl; delete payRoll; retum 0;
填空题请指出错误所在行号并给出该行修改后的完整结果。
填空题类Stock的定义中有两处错误,请指出错误所在行号并给出该行修改后的完整结果。
填空题指出该代码是否存在内存泄漏。
填空题不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)
①sq=sh;②sh=tr;③tr=sq;④sq=tr;⑤sh=sq。
填空题阅读以下说明和流程图,填补流程图中的空缺。[说明]已知数组A[1:n]中各个元素的值都是非零整数,其中有些元素的值是相同的(重复)。为删除其中重复的值,可先通过以下流程图找出所有的重复值,并对所有重复值赋0标记之。该流程图采用了双重循环。处理思路:如果数组A某个元素的值在前面曾出现过,则该元素赋标记值0。例如,假设数组A的各元素之值依次为2,5,5,1,2,5,3,则经过该流程图处理后,各元素之值依次为2,5,0,1,0,0,3。[流程图]
填空题[说明] 已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。 函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。 程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)分别表示year是(或不是)闰年。 [C语言函数] int Count_5_13(int year) int date; /*date为0表示星期日,为1~6分别表示星期一至星期六*/ long days=0; /*days记录天数*/ int m, y, c=0; /*c用于表示黑色星期五的个数*/ if(year<1900) return-1; /*计算从1900年1月1日起,至给定年份year的1月13日间隔的天数*/ days=12; for(y=1900; y<year; y++) days +=365; if (iSLeapYear(Y)) (1) ; date=((days%7)+1)%7; /*算出给定年份year的1月13日是星期几+/ c=( (2) )?1:0; for(m=1; (3) ; m++) switch(m) case 1: case 3: case 5: case 7: case 8: case 10: case 12: days=31; break; case 4: case 6: case 9: case 11: days=30; break; case 2: days=28; if( (4) )days=29; break; /*end of switch*/ date=((days%7)+ (5) )%7; if (date==5) c++; /*end of for*/ return c;
填空题[说明]
完成以下中序线索化二叉树的算法。
[函数]
Typedef int datatype;
Typedef struct node {
Int ltag, rtag;
Datatype data;
*lchild,* rchild;
}bithptr;
bithptr pre;
void inthread ( p );
{if
{inthread ( p->lchild );
if ( p->lchild==unll )
________
;
if ( P->RCHILD=NULL) p->rtag=1;
if
________
{if
________
pre->rchild=p;
if ( p->1tag==1 )
________
;
}
INTHREAD ( P->RCHILD );
________
;
}
}
填空题阅读以下说明和C函数,填充函数中的空缺。 [说明] 已知两个整数数组A和B中分别存放了长度为m和n的两个非递减有序序列,函数Adjustment(A,B,m,n)的功能是合并两个非递减序列,并将序列的前m个整数存入A中,其余元素依序存入B中。例如: 合并前 合并后 数组A的内容 1,9,28 1,4,7 数组B的内容 4,7,12,29,37 9,12,28,29,37 合并过程如下:从数组A的第一个元素开始处理。用数组B的最小元素B[0]与数组A的当前元素比较,若A的元素较小,则继续考查A的下一个元素;否则,先将A的最大元素暂存入temp,然后移动A中的元素挪出空闲单元并将B[0]插入数组A,最后将暂存在temp中的数据插入数组B的适当位置(保持B的有序性)。如此重复,直到A中所有元素都不大于B中所有元素为止。 [C函数] void Adjustment(int A[],intB[],int m,int n) /*数组A有m个元素,数组B有n个元素*/ int k,temp; for(i=0;i<m;i++) if(A[i]<=B[0]) continue, temp=______;/*将A中的最大元素备份至temp*/ /*从后往前依次考查A的元素,移动A的元素并将来自B的最小元素插入A中*/ for(k=m-1;______;k--) A[k]=A[k-1]; A[i]=______; /*将备份在七emp的数据插入数组B的适当位置*/ for(k=1;______&&k B[k-1]=B[k]; B[k-1]=______;
填空题请补齐第21行代码中的空缺。
填空题[说明] 某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下: 拨入或拨出标记通话开始时间通话结束时间对方号码 注1:数据字段以一个空格作为分隔符。 注2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。 注3:通话开始和结束时间的格式均为:HH:MM:SS。其中HH表示小时,取值00~23;MM表示分钟,取值00~59;SS表示秒,取值00~59。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为1秒,最长不超过24小时。 注4:跨月的通话记录计入下个月的通话数据文件。 例如“o 23:01:12 00:12:15…”表示本次通话是本机呼叫其他用户,时间从23时01分12秒至次日的0时12分15秒,通话时间为71分03秒。 下面程序的功能是计算并输出该用户本月电话费(单位:元)。 通话计费规则为: (1)月通话费按每次通话费累加; (2)每次的通话费按通话时间每分钟0.08元计算,不足1分钟时按1分钟计费。 对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日0点0分0秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。 例如,若输入文件dial.txt的数据如下所示,则输出fee=7.44。 o 14:05:23 14:11:25 82346789 i 15:10:00 16:01:15 13890000000 o 10:53:12 11:07:05 63000123 o 23:01:12 00:12:15 13356789001 [C语句程序代码] #include<stdio.h> FILE *fin; int main( ) char str[80]; int h1, h2, m1, m2, s1, s2; long t_start, t_end, interval; int c; double fee=0; fin=fopen("dial. txt", "r")j; if (!fin) return -1; while(!feof(fin)) if(!fgets(str, 80, fin)) break; if( (1) ) continue; h1=(str[2]-48)*10+str[3]-48; m1=(str[5]-48)*10+str[6]-48; s1=(str[8]-48)*10+str[9]-48; h2=(str[11]-48)*10+str[12]-48; m2=(str[14]-48)*10+str[15]-48; s2=(str[17]-48)*10+str[18]-48; t_start=h1*60*60+m1*60+s1; /*通话开始时间*/ t_end=h2*60*60+m2*60+s2; /*通话结束时间*/ if( (2) ) /*若通话开始和结束时间跨日*/ interval= (3) -t_start+t_end; else interval=t_end-t_start; c= (4) ; /*计算完整分钟数表示的通话时间*/ if(interval%60) (5) ; fee+=c*0.08; fclose(fin); printf("fee=%.21f/n", fee); return 0;
填空题阅读以下说明和Java代码,填补Java代码中的空缺,将解答写在对应栏内。 [说明] 己知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算);另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。 下面是实现该工资系统的Java代码,其中定义了四个类:工资系统类PayRoll,员工类Employee,正式工类Salaried和计时工类Hourly,Salaried和Hourly是Employee的子类。 [Java代码] abstract class Employee protected String name; //员工姓名 protected int empCode; //员工号 protected double salary; //周发放工资 publ ic Employee(int empCode,String name) this.empCode=empCode; this.name=name; public double getSalary() return this.salary; public abstract void pay(); class Salaried ______ Employee private double annualSalary; Salaried(int empCode,String name,double payRate) super(empCode,name); this.annualSalary=payRate; public void pay() salary=______;//计算正式员工的周发放工资数 System.out.printin(this.name+":"+this.salary); class Hourly ______ Empioyee private double hourlyPayRate; private int hours; Hourly(int empCode,String name,int hours,double payRate) super(empCode,name); this.hourlyPayRate=payRate; this.hows=hours, public void pay() salary=______;//计算计时工的周发放工资数 System.out.printin(this.name+":"+this.salary); public class PayRoll private ______ employees[]= new Salaried(1001,"Zhang San",58000.00), //此处省略对其他职工对象的生成 new Hourly(1005,"Li",12,50.00) ; public void pay(Employee e[]) for(int i=0;i<e.length;i++) e[i].pay(); public static void main(String[]rgs) PayRoll payRoll=new PayRoll(); payRoll.pay(______); double total=0.0; for(int i=0;i<payRoll.employees.length;i++)//统计周发放工资总额 total+=payRoll.employees[i].getSalary(); System.out.printin(total);
填空题阅读以下说明和Java代码,将应填入______处的语句或语句成分写在对应栏内。 [说明] 某数据文件students.txt的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后选出排名前30%的学生。 [Java代码] import java.io.*; class Student private String sNO;//学号 private int Credit;//分数 public int getCredit() return Credit; public string toString() return"sNO="+this.sNO+",Credit="+this.Credit; Student(String sNO,int Credit) ______=sNO; ______=Credit; public class SortStudent void sort(Student[]s)//Sort the array s[] in decending order of Credit for(int i=0;i<s.length-1;i++) for(int j=i+1:j<s.length;j++) if(s[i].______<s[j].______) Student tmp=s[i]; s[i]=s[j]; s[j]=tmp; public static void main(String argv[]) Student[] testStudent=new Student[siZe]; try BufferedReader in=new BufferedReader(new FileReader("students.txt")); boolean done=false; int i=0; while(!done) String s=in.readLine(); //每次读取一个学生的学号和成绩 if(s!=null) String tmp[]=s.split(","); testStudent[i++]=______(tmp[0],Integer.parseInt(tmp[1])); else done=true; in.closeo(); ______=new SortStudent(); ss.sort(testStudent); System.out.printin("top 30%:"); for(int j=0;j<size*0.3;j++) System.out.printin(testStudent[j]); catch(IOException e) System.out.printin("io error!"); catch(NumberFormatException e) System.out.printin("not a number!"); ______int size=100; //学生总数
填空题{{B}}试题七{{/B}}阅读以下说明和流程图,填补流程图中的空缺。
[说明]
假设数组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。
[流程图] 本题流程图如图8-31所示。
填空题阅读以下说明和C程序代码,将程序补充完整。
[说明]
下面C程序代码的功能是:对于输入的一个正整数n(100≤n<1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将n与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278不是回文数,其反序数为872,相加后得到的1150还不是回文数,再将1150与其反序数511相加,得到的1661是回文数。
函数int isPalm(long
m)的功能是:将正整数m的各位数字取出存入数组中,然后判断其是否为回文数。若m是回文数则返回1,否则返回0。
[C程序代码] #include<stdio.h>
#include<stdlib.h> int isPalm(long m)
{ int i=0, k=0; char str[32];
while(m>0) { str[k++]={{U}} (1) {{/U}} +'0';
m=m/10; } for(i=0; i<k/2;
i++) if(str[i]!=str[{{U}} (2) {{/U}}])return 0;
return 1; } int main(
) { long n, a, t;
printf("input a positive integer: "); scanf("%ld",
if(n<100||n>=1000)return -1; while({{U}} (3)
{{/U}}) { printf("%id->", n); for(a=0, t=n;
t>0; ){ a={{U}} (4) {{/U}}*10+t%10; t=t/10;
n={{U}} (5) {{/U}}; printf("%id/n", n);
system("pause"); return 0;
