阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。
[说明]
本程序使用类来管理员工的通讯地址信息。已知程序的输出为:
输出记录:5
姓名:王丽华
街道地址:中华路15号
市:襄樊市
省;湖北省
邮政编码:430070
[C++程序]
include < iostream, h >
include < string, h >
class employee.
{ protected:
char name[10];
char street[ 20 ];
char city[10];
char (1) [10];
char post[7];
int no;
(2):
(3) (char [] ,char [] ,char [] ,char [] ,char [] ,int);
void changename (char n [] ) { strcpy (name, n); }
void changestreet(char s[] ) { strcpy(street,s) ;}
void changecity (char c [] ) { strcpy (city, c ); }
void changeprov(char p [] ) { strcpy(prov,p); }
void changeno(int nnm) { (4);}
void display();
};
employee:: (3) (char n[] ,char s[] ,char c[] ,char p1[] ,char p2[] ,int nam)
{ strcpy(name,n);
strcpy (street, s);
strcpy (city, c);
strcpy (prov, p1 );
strcpy (post, p2 );
no = nam; }
void employee:: display() { cont< <"输出记录: "< <no< <endl;
cout< < "姓名: "< < name < < endl;
coot < < "街道地址: "< < street < < endl;
cout < < "市: "< < city < < endl;
cout< <"省: "< <prov < <endl;
cout < <"邮政编码: "< < post < < endl;
}
void main() { employee cmp("王华" ,"中华路15号" ,"武汉市","湖北省","430070", 1 );
emp. changename("五丽华" );
emp. changecity ("襄樊市" );
emp. changeno(5);
(5);
第1题
【说明】
下面的程序按照以下规则输出给定名词的复数形式。
a.若名词以“y”结尾,则删除y并添加“ies”;
b.若名词以“s”、“ch”或“sh”结尾,则添加“es”;
c.其他所有情况,直接添加“s”。
【C程序】
include <stdio.h>
include <string.h>
char*plural(char *word)
{
int n;
char *pstr;
n=strlen(word); /*求给定单词的长度*/
pstr=(char*)malloc(n+3);/*申请给定单词的复数形式存储空间*/
if (!pstr||n<2)
return NULL;
strcpy(pstr,word); /*复制给定单词*/
if ((1))
{
pstr[n-1]='i';pstr[n] ='e';pstr[n+1]='s';(2);
}
else
if(pstr[n-1]=='s'| |pstr[n-1]=='h'&&((3)))
{
pstr[n]='e';pstr[n+1]='s';pstr[n+2]='\0';
}
else
{ pstr[n]='s';pstr[n+1]='\0';)
(4);
}
main()
{ int i; char *ps;
char wc[9][10]=
{"chair","dairy","boss","circus","fly","dog","church","clue","dish");
for(i = 0;i<9; i++) {
ps= (5) ;
printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
system("pause");
}
第2题
【说明】
以下程序的功能是计算正方体、球体和圆柱体的表面积和体积并输出。
程序由4个类组成:类cube、sphere和cylinder分别表示正方体、球体和圆柱体;抽象类 container为抽象类,提供了两个纯虚拟函数surface_area()和volum(),作为通用接口。
【C++程序】
include<iostream.h>
define pi 3.1416
class container{
protected:
double radius;
public:
container(double radius) {container::radius=radius;}
virtual double surface_area()=0;
virtual double velum()=0;
};
class cube:(1){ //定义正方体类
public:
cube(double radius):container(radius){};
double surface_area () {return 6 * radius * radius;}
double volum() {return radius * radius * radius;}
};
class sphere:(2){ //定义球体类
public:
sphere(double radius): container(radius){};
double surface_area() { return (3);}
double volum() {return pi * radius * radius * radius * 4/3;}
};
class cylinder:(4){ //定义圆柱体类
double height;
public:
cylinder(double radius,double height):container(radius)
{
container::height=height;
}
double surface_are a () { return 2 * pi * radius * (height+radius); }
double volum () {return (5);}
};
void main()
{
container * p;
cube obj1 (5);
sphere obj2(5);
cylinder obj3(5,5);
p=&obj1;
cout<<“正方体表面积”(<<p->surface_area()<<end1;
cont<<“正方体体积”<<p->volume()<<end1;
p=&obj2;
cout<<“球体表面积”<<p->surface_area()<<end1;
cout<<“球体体积”<<p->volume()<<end1;
p=&obj3;
cout<<“球体表面积”<<p->surface_area()<<end1;
cout<<“球体体积”<<p->volume()<<end1;
}
第3题
【说明】
设计一个日期类Date包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。
在Date类中设计如下重载运算符函数:
Date operator + (int days) : 返回某日期加上天数得到的日期。
Date operator - (int days) : 返回某日期减去天数得到的日期。
int operator - (Date&b): 返回两日期相差的天数。
【程序】
include<iostream.h>
int day tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年class Date
{
int year, month, day //年,月,日
int leap(int); //判断是否闰年
int dton(Date&)
Date ntod(int)
public:
Date() { }
Date (int y, int mint d) I year = y; 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 =(1)
date = ntod(number)
return date
}
Date operator - (int days) //-运算符重载函数
{
staffs Date date;
int number=(2);
number - = days;
date = ntod(number)
return date;
}
int operator - (Date &b) //-运算符重载函数
{
int days=(3);
return days;
}
void disp()
{
cout<<year<<"."<<month<<". "<<day<<endl;
}
};
int Date: :leap(int year)
if((4)) //是闰年
return 1; //不是闰年
else
return0:
}
int Date:: dton(Date &d) //求从公元0年0月0日到d日期的天数
{
inty,m,days =0;
for(y=1;y<=d. year;y++)
if((5))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(1)
{ if(leap(y))
if(rest<= 366) break;
else rest - = 366;
else //非闰年
if(rest = 365 ) break;
else rest-=365;
第4题
【说明】
字符串在程序设计中扮演着重要角色。现需要设计字符串基类string,包含设置字 符串、返回字符串长度及内容等功能。另有一个具有编辑功能的串类edlt_string,派生于string,在其中设置一个光标,使其能支持在光标处的插入、删除操作。
【程序】
include <iostream.h>
include <stdio.h>
include <string.h>
class string
{
int length;
char *data;
public:
int get_length() {return length;}
char *get_data() {return data;}
~string() {delete data;}
int set data(int in_length, char *in_data);
int set_data(char *data);
void print() {cout<<data<<endl;}
};
class edit_string: public string
{
int cursor;
public:
int get_cursor() {return cursor;}
void move_cursor(int dis) {cursor=dis;}
int add_data(string *new_data);
void delete_data(int num);
};
int string::set_data(int in_length,char *in_data)
{
length=in_length;
if(!data)
delete data;
(1)
strcpy(data,in_data);
return length;
}
int string::set data(char *in_data)
{
(2)
if(!data)
delete data;
(1)
strcpy(data,in_data);
return length;
}
int edit_string::add_data(string *new_data)
{
int n,k,m;
char *cp,*pt;
n=new_data->get_length();
pt=new_data->get_data();
cp=this->get_data();
m=this->get_length();
char *news=new char[n+m+1];
for(int i=0; i<cursor; i++)
news[i]=cp[i];
k=i;
for(int j=0; j<n; i++,j++)
news[i]=pt[j];
cursor=i;
for(j=k; j<m; j++,i++)
(3)
news[i]='\0';
(4)
delete news;
return cursor;
}
void edit string::delete_data(int num)
{
int m;
char *cp;
cp=this->get_data();
m=this->get_length();
for(int i=cursor; i<m; i++)
(5)
cp[i]='\0';
}
第5题
阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。
[说明]
下面程序是为汽车市场编制的一个程序的一部分。其中automobile是基类。
[C++程序]
//Auto.h
ifndef AUTO_H
define AUTO_H
class automobile
{
(1):
int miles_per_gallon; //汽车每加仑行驶公里数
float fuel_capacity; //油箱容积
public:
void initialize(int in_mpg,int in_fuel);
int get_mpg(void);
float get_fuel(void);
float travel_distance(void);
}
endif
//Auto.cpp
include"auto.h"
void automobile::initialize(int in_mpg,float in fuel)
{
miles_per_gallon=in_mpg;
fuel_capacity=in_fuel;
)
int automobile::get_mpg() //提供一辆特定汽车每加仑公里数
{return miles per_gallon;}
float automobile::get_fuel() //提供油箱容积
{return fuel_capacity;}
float automobile::travel_distance()
{return (2) }
//car.h
ifndef CAR_H
define CAR_H
include"auto.h"
class car: (3)
{
int Total_doors;
public:
void initialize(int in_mpg,float in_fuel,int doors=4);
int doors(void);
};
endif
//car.cpp
include"car.h"
void car::initialize(int in_mpg,float in_fuel,int door)
{
Total_doors=door;
miles_per_galion=in_mpg;
fuel_capacity=in_fuel;
}
int car::doors(void)
{return Total doors;}
//Allauto.cpp
include
include"auto.h"
include"car.h"
int main()
{
car sedan;
sedan.initialize(24,20.0,4);
tout<<"The sedan can travel"<< (4) <<"miles.\n";
cout<<"The sedan has"<< (5) <<"doors.\n";
return 0;
}
第6题
[说明]
下面程序用来将打乱的单词还原为原来的次序,比如将rty还原为try。单词的原来次序存储于wordlist.txt文件中,原则上可用穷举法(rty对应的穷举为:rty、ryt、try、tyr、ytr、yrt),但考虑到破译速度,采用如下方法。
注意到单词列表中不存在组成字符完全相同的单词(如Hack12与Hack21包含完全相同的字符),因此将单词中的字符进行重组再进行比较,例如,try单词重组为rty(按ASCⅡ码顺序),这样不管打乱的单词是什么顺序,只要是由r、t、y三个字母组成的均破译为try,大大提高破译速度。程序中借助二叉排序树以进一步提高查找效率,二叉排序树左子树(如果有)上的节点对应的值均小于根节点的值,右子树(如果有)上的节点对应的值均大于根节点的值。
函数中使用的符号定义如下:
#define NumberofWords 1275//单词总数
#define MaxLength 10//最长单词所含字符数
char WordList[NumberofWords][MaxLength];//存储单词列表
int cmp(Node *q,Node *p);//q与p比较。p小,返回负值;P大返回正值:相等,返回0
typedef struct Node(//二叉树节点
char *eleLetters;//重组后的字符串
int index;//对应单词表中的下标
struct Node *lChiId,*rChiid;//左右子节点
}Node;
[C代码]
void reCompose(Node *p,char *temp)
//重纰,亦即将temp字符串中的字符升序排序,存储于p节点中
//采用直接插入排序法
{
char c;
strcpy(p->eleLetters,temp);//
int len=strlen(temp);
int i,j,k;
for(i=0;i<len-1;i++){
k=i;
for(j=i+1;j<lan;j++){
if(p->eleLetters[j]<P->eleLetters[k])k=J;
}
if( (1) ){
C=P->eleLetters[i];
P->eleLetters[i]=P->eleLetters[k];
P->eleLetters[k]=c;
}//if
}//for
};
int find(Node &root,char *temp)
//在二叉排序树root中查找与temp匹配的单词。
//若匹配返回相应单词在WordList中下标;若查找失败,返回-1
{
Node *P,*q;
int flag;
P=(2);//临时存储
reCompose(p,temp);//将temp重组
q=&root;
while((flag=(3))&&q !=NULL){
if(flag<0){//搜索左子树
q=q->lChiid;
}else(//搜索右子树
q=q->rChild;
}
}//while
if(flag==0){//找到匹配的,保存下标
return (4);
}
}
if( (5) ){//查找失败
printf("cant unscramble the following word:%s",temp);;
return -1;
}
};
(1)
第8题
阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
下面的程序按照以下规则输出给定名词的复数形式:
a. 若名词以“y”结尾,则删除 y 并添加“ies” ;
b. 若名词以“s” 、 “ch”或“sh”结尾,则添加“es” ;
c. 其他所有情况,直接添加“s” 。
[C 程序]
#include <stdio.h>
#include <string.h>
char *plural(char *word)
{
int n;
char *pstr;
n = strlen(word); /*求给定单词的长度*/
pstr = (char *)malloc(n+3); /*申请给定单词的复数形式存储空间*/
if (!pstr || n < 2)
return NULL;
strcpy(pstr,word); /*复制给定单词*/
if ( (1) )
{
pstr[n-1] = 'i'; pstr[n] = 'e'; pstr[n+1] = 's'; (2) ;
}
else
if(pstr[n-1]=='s'||pstr[n-1]== 'h' && ( (3) ))
{
pstr[n] = 'e'; pstr[n+1] = 's'; pstr[n+2] = '\0';
}
else
{ pstr[n] = 's'; pstr[n+1] = '\0'; }
(4) ;
}
main( )
{ int i; char *ps;
char wc[9][10] =
{"chair","dairy","boss","circus","fly","dog","church","clue","dish"}
for(i = 0; i < 9; i++) {
ps = (5) ;
printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
system("pause");
}
第9题
[说明]
以下程序的功能是统计学生成绩,包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对前百分之七十的学生定为合格(PASS),而后百分之三十的学生定为不合格(FAIL)。例如,当输入4名学生的姓名和成绩“Alice 67 Mary 90 Tom 56 John 88”后,程序的执行结果如下:
姓名 成绩 合格否
Mary 90 PASS
John 88 PASS
Alice 67 FAIL
Tom 56 FAIL
[C++程序]
include <stdio.h>
include <string.h>
define N 10
class student
{ protected:
char name[10];
int deg;
public:
void setname(charna[]) {strcpy(name,na);}
char * getname() {return name;}
void setdeg(int d) {deg= d;}
int getdeg(){return deg;}
};
class compute
{ int ns;
student na[N];
public:
void getdata();
void sort();
void disp();
};
void compute::getdata()
{ int i,tdeg;
char tname[10];
printf("输入学生人数:");
scanf("%d",&ns);
printf("输入学生姓名和成绩:\n");
for(i=0;i<ns;i+ +){
scanf("%s%d",tname,&tdeg);
(1);
na[i].setdeg(tdeg);
}
}
void compute::sort()
{ int i,j,pick;
(2);
for(i=0;i<ns-1;i+ +){
pick=i;
for(j=i+1;j<ns;j+ +)
if(na[j].getdeg()>na[pick].getdeg()) (3);
temp=na[i];
na[i]=na[pick];
na[pick]=temp;
}
}
void compute::disp()
{ int cutoff,i;
printf("RESULT\n");
printf("姓名 成绩 合格否\n");
cutoff=ns*7/10-1;
for(i=0;i<ns;i+ +) {
printf("%-6s%3d",(4));
if((5)) printf("\tPASS\n");
else printf("\tFAIL\n");
void main()
{ compute obj;
obj.getdata();
obj.sort();
obj.disp();
}
第10题
【程序说明】
某网络由n个端点组成,这些端点被物理地分成若干个分离的端点组。同一组内的两件端点i和j,它们或直接相连,或间接相连(端点i和端点j间接相连是指在这两件端点之间有一个端点相连序列,其中端点i和j分别与这相连序列中的某个端点直接相连)。网络的n个端点被统一编号为0,1,…,n-1。本程序输入所有直接相连的端点号对,分别求出系统各分离端点组中的端点号并输出。
程序根据输入的直接相连的两件端点号,建立n个链表,其中第i个链表的首指针为s[i],其结点是与端点i直接相连的所有端点号。
程序依次处理各链表。在处理s[i]链表中,用top工作链表重新构造s[i]链表,使s[i]链表对应系统中的一个端点组,其中结点按端点号从小到大连接。
【程序】
inelude
define N 100
typeef struct node{
int data;
struct node *link;
}NODE;
NODE * s[N];
int i,j,n,t;
NODE *q,*p,*x,*y,*top;
main()
{
printf(“Enter namber of components.”);
scanf(“%d”,&n);
for(i=0;i<n;i++) printf(“Enter pairs.\n”);
while(scanf(“%d%d”,&i,&j)==2)
{ /*输入相连端点对,生成相连端点结点链表*/
p=(NODE*)malloc(sizeof(NODE));
p→data=j;p→link=s[i];s[i]=p;
p=(NODE*)malloc(sizeof(NODE));
p→data=i;p→link=s[j];s[j]=p;
}
for(i=0;i<n;i++) /*顺序处理各链表*/
for(top=s[i], (1);top! =NULL;)
{ /*将第i链表移入top工作链表,并顺序处理工作链表的各结点*/
q=top;
(2);
if(s¨[j=q→data]!=NULL)
{ /将j链表也移入工作链表*/
for(p=s[j];p→link! =NULL;p= p→link);
p→link= top;top=s[j];
(3);
}
/*在重新生成的第i链表中寻找当前结点的插入点*/
for(y=s[i]; (4);x=y,y=y→link);
if(y!=NULL && y→data==q→data)
free(q); /*因重新生成的第i链表已有当前结点,当前结点删除*/
else{
(5);
if(y ==s[i])s[i]=q;
else x→link=q;
}
}
for(i =0;i < n;i++)
{/*输出结果*/
if(s[i]==NULL)continue;
for(p=s[i];p!=NULL;){
printf(“\t%d”,p→data);
q=p→link;free(p);p=q;
}
printf(“\n”);
}
}
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!