问答题阅读以下应用程序说明和C程序,将C程序段中(1)~(6)空缺处的语句填写完整。
【说明】
某大学征询学生意见,从各学院预选的n(n≤60)位优秀大学生中,评选出“十佳大学生”。以下【C程序】对各位学生选票进行相关的统计、排序等处理。
(1)各学院预选的优秀大学生按1,2,…顺序连续编号,每个编号用两个字符表示,即01,02,…。
(2)所回收的选票按以下格式存于文件source中,每行字符串对应一张选票。其中,姓名占10个字符,学院名称占30个字符,大学生编号占20个字符。
(3)对应名次的大学生编号可以有空缺,但必须用00表示。
(4)若编号超出规定范围,或编号重复出现,按照废票处理。
(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下: 一 二 三 四
五 六 七 八 九 十 15 12 9 7 6 5
4 3 2 1
(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。 名次
大学生编号 合计得分
合计得票数 若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。
以下【C程序】中所应用到的函数fopen、fclose和fgets都是I/O程序库中的函数。
【C程序】 #include <stdio. h> #define n
60 long int tn[n], td[n], score[n+1][10], order[n];
char s[80]; int mark[]=(15,12,9,7,6,5,4,3,2,1);
FILE *fp, *fopen(); Main() { int c,
g, k, I, j, b[10]; long int e, d, t, tt, dd;
char * p; for(i=0; i<=n; i++)
for(j=0; j<10; j++)
score[i][j]=0; fP=fopen("source",
"r"); /*以读方式打开文件source*/
p=fgets(s, 80, fp); /*读fp所指文件的下一行字符串于s*/
while(*p){ g=l; k=0; p+=40;
while(k<10){
c=((*p++)-'0')*10+((*p++)-'0');
b[k++]=c)
if(c<=n){
if(c)
{
i=0;
While({{U}} (1) {{/U}});
If({{U}} (2) {{/U}}){g=0; break;}
}
else{g=0;
break;}
}
If(g)
For(i=0; i<k; i++)
If(b[i])
{{U}}(3) {{/U}};
p=fgets(s, 80, fP);
}
Fclose(fp);
/*关闭fp所指文件*/
For(i=1; i<n; i++){
For(t=0, d=0, j=0; j<10;
j++){
t +=(e=score[i][j]);
d +=e *
mark[j];
}
tn[i-1]=t; td[i-1]=d; order[i-1]=i;
}
For(i=0; i<n-1; i++){
k=i;
for(j=i+1; j<n; j++)
if((t=td[order[j]-1])>(d=td[order[k]-1]))
k=j;
else
if(t==d){
tt={{U}}
(4) {{/U}};
dd={{U}}
(5) {{/U}};
for(c=0; c<10; c++)
if((e={{U}} (6) {{/U}})>0){
k=j; break;}
else
if(e<0)break;
}
If(k!=i){
t=order[k]; order[k]=order[i];
order[i]=t;
} }
For(i=0; i<10; i++)
Printf("%2d%2d%d%d/n", i+1, order[i], td[order[i]-1],
tn[order[i]-1])); } }
问答题[说明]
本程序实现了雇员信息管理功能,其中封装了雇员信息及其设置、修改、删除操作。已知当输入为“Smith 31 2960.0”时,程序的输出是:
姓名:Smith 年龄:31 工资:2960
姓名:Smith 年龄:31 工资:3500
姓名:Mary 年龄:23 工资:2500
[C++程序]
#include <iostream.h>
#include <string.h>
class employee{
char *name; //雇员姓名
short age; //年龄
float salary;//工资
public:
employee();
void set_name(char *);
void set_age(short a) {age=a;}
void set_salary(float s) {salary=s;}
{{U}} (1) {{/U}};
~ employee(){delete[] name;}
};
employee::employee() { name="";
age=0;
salary=0.0;
void employee::set_name(char *n)
{ name=new char[strlen(n)+1];
{{U}}(2) {{/U}} (name,n);
}
void employee::print()
{ cout<<"姓名":"<<name<<" 年龄:"<<agc<<" 工资:" <<salary<<endl;
}
void main()
{ char *na;
short ag=0;
float sa=0;
{{U}} (3) {{/U}};
na=new char[10];
cin>>na>>ag>>sa;
emp.set_name(na);
emp.set_age(ag);
emp.set_salary(sa);
emp.print();
{{U}} (4) {{/U}} (3500.0);
emp.print();
{{U}} (5) {{/U}};
emp.set_name("Mary");
emp.set_age(23);
emp.set_salary(2500.0);
emp.print();
}
问答题【说明】
单击窗体上的“测试”(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。
【程序代码】
Private Sub cmdTest_Click( )
Dim strT1 ,strT2 As String
Dim strCh As {{U}}(1) {{/U}}
Dim intL As Integer
Dim intl As Integer
strT1 = {{U}}(2) {{/U}}("请输入一串字符","字符串输入")
intL = {{U}}(3) {{/U}}
strT2 = " "
For intl = I To intL
strCh = Mid ( strT1, intl, 1 )
If(strCh>"A"And{{U}} (4) {{/U}}) Or (strCh >"a" And suCh <"z" )Then
strT2 = strT2 + strCh
End If
Next intl
txtShow. Text= {{U}}(5) {{/U}}
End sub
问答题【说明】
本程序的功能是生成螺旋方阵,用户可以输入该方阵的行列数,然后就生成对应的螺旋方阵。例如:当n=5时,对应的螺旋方阵如下:
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
【C++代码】
#include"stdio.h"
#include"iostream,h"
int array[11][11];
int temp;
int ROW;
void godown(int temp<=ROW;temp++)
if(array[temp][a]==0)
array[temp][a]={{U}} (1) {{/U}};
a++;
}
void goright(int temp<=ROW;temp++)
if(array[b][temp]==0)
array[b][temp]=m++;
b--;
}
void goup(int temp>0;temp-)
if(array[temp][c]==0)
array[temp][c]=m++;
c--;
}
void goleft(int temp>0;temp--)
if(array[d][temp]==0)
array[d][temp]=m++;
{{U}}(2) {{/U}};
}
void main()
{
int a,b,c,d,max,m;
cin>>ROW;
cout>>end1;
for(a=1;a<=ROW;a++)
for(b=1;b<=ROW;b++)
{{U}} (3) {{/U}};
m=1;
a=d=1;
b=c=ROW;
max={{U}} (4) {{/U}};
whiie(m<=max)
{
godown(m,a);
{{U}} (5) {{/U}}(m,b);
goup(m,c);
goleft(m,d):
}
for(a=1;a<=ROW;a++)
{
for(b=1;b<=ROW;b++)
printf("%3d ",array[a][b]);
cout<<end1;
}
}
问答题[说明]
循环队列的类型定义如下(其中队列元素的数据类型为datatype):
typedef struct{
datatype data[MAXSIZE]; /*数据的存储区*/
int front,rear; /*队首、队尾指针*/
int num; /*队列中元素的个数*/
}c _ SeQueue; /*循环队*/
下面函数及其功能说明如下:
(1) c_SeQueue* Init_SeQueue():新建队列;
(2) int ln_SeQueue( c_SeQueue *q, datatype x):将元素x插入队列q,若成功返回1否则返回0;
(3) int Out_SeQueue (c_SeQueue *q, datatype *x):取出队列q队首位置的元素,若成功返回1否则返回0。
[函数]
c_SeQueue* Init_SeQueue()
{ q=malloc(sizeof(c_SeQueue));
q->front=q->rear=MAXSIZE-1;
{{U}} (1) {{/U}};
return q;
}
int In_SeQueue( c_SeQueue *q, datatype x)
{ if(q->num= =MAXSIZE) return 0; /*队满不能入队*/
else {
q->rear={{U}} (2) {{/U}};
q->data[q->rear]=x;
{{U}}(3) {{/U}};
return 1; /*入队完成*/
}
}
int Out_SeQueue( c_SeQueue *q, datatype *x)
{ if (q->num= =0) return 0; /*队空不能出队*/
else{
*x= {{U}}(4) {{/U}}; /*读出队首元素*/
q->front= {{U}}(5) {{/U}};
q->num- -;
return 1; /*出队完成*/
}
}
问答题[说明]某公司的服务器上为每位员工提供了一定大小的存储空间,用于数据的备份。下面的程序面向公司员工,提供了本地计算机与服务器端之间文件传输的功能。主要操作介绍如下:(1)连接服务器:员工需要输入用户名和口令才能连接到服务器端,checkUser函数用于检查用户名和口令是否合法,返回真假值。(2)上传文件:从本地计算机上传文件到服务器。员工可以在本地文件列表中选择一个或多个文件,这些文件通过上传操作被复制到服务器端指定的某个文件夹中;(3)下载文件:从服务器端下载文件到本地。在开发过程中,本地驱动器列表框名为Drive1,本地和服务器端目录列表框分别名为Dir1和Dir2,本地和服务器端文件列表框分别名为File1和File2,界面上有上至下四个按钮分别名为Command1至Command4。[VisualBasic代码]PrivateSubDrive1_Change(){{U}}(1){{/U}}’更新目录列表框的路径EndSubPrivateSubDir1_Change()File1.Path=Dir1.Path’更新文件列表框file1的路径EndSubPrivateSubDir2_Change()File2.Path=Dir2.Path’更新文件列表框file2的路径EndSub’连接服务器PrivateSubCommand1_Click()Dimuser,passwordAsStringuser={{U}}(2){{/U}}(“请输入用户名:”)password={{U}}(2){{/U}}(“请输入口令:”)IfcheckUser(user,password)Then’若用户名和口令正确Dir2.Path=……’打开服务器上某一指定目录Else:MsgBox“口令错误,请重试!”EndIfEndSub’上传文件PrivateSubCommand2_Click()DimfsoAsnewFileSystemObject,fAsFile,iAsIntegerIfFile1.FileName=""Then’判断是否已经选中文件MsgBox“请选择本地的文件!”ExitSubEndIf’创建文件系统对象Setfso=CreateObject(“Scripting.FileSystemObject”)’上传文件Fori=0To{{U}}(3){{/U}}’遍历文件列表框File1中的全体文件If{{U}}(4){{/U}}Then’若该文件被选中Setf=fso.{{U}}(5){{/U}}(Dir1.Path&“/”&File1.List(i))f.CopyDir2.Path&“/”&File1.List(i),True’复制文件至服务器端EndIfNextFile2.RefreshEndSub’下载文件PrivateSubCommand3_Click()……EndSub’退出程序PrivateSubCommand4_Click()EndEndSub
问答题【说明】
为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置。(假设R[]中的元素互不相同)
[算法]
1.变量声明
X: Data Type
i,j,low, high,mid,r:0..n
2.每循环一次插入一个R[i]
循环:i以1为步长,从2到n,反复执行。
(1)准备
X←R[i];{{U}} (1) {{/U}}; high←i-1;
(2)找插入位置
循环:当{{U}} (2) {{/U}}时,反复执行。
{{U}} (3) {{/U}}
若X.key<R[mid].key
则high←mid-1;
否则{{U}} (4) {{/U}}
(3)后移
循环:j以-1为步长,从{{U}} (5) {{/U}},反复执行。
R[j+1]←R[j]
(4)插入
R[low]←X
3.算法结束
问答题【说明】计算三角函数sinx给定精度e和n,若第k步后的结果为sin1,第k+1步后的结果为sin2,若|sin1·sin2|<e,则返回sin1的值。若没有达到精度e,但是步骤达到n步,则返回第n步后的值。其流程图如下所示:
问答题阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明]在股票交易中,股票代理根据客户发出的股票操作指示进行股票的买卖操作。其类图如下图所示。相应的Java代码附后。类图[Java代码]importJava.util.ArrayList;importjava.util.List;ClassStock{privateStringname;privateintquantity;publicStock(Stringname,intquantity){thiS.name=name;this.quantity=quantity;}publicvoidbuy(){System.out.println("[买进]:"+name+",数量:"+quantity);}publicvoidsell(){System.out.println("[卖出]:"+name+",数量:"+quantity);}}interfaceOrder{VOidexecute();}classBuyStock______Order{privateStockStock;publicBuyStock(Stockstock){______=stock;}publicvoidexecute(){stock.buy();}}//类SellStock实现和BuyStock类似,略clasSBroker{privateList<Order>orderList=newArrayList<Order>();DublicvoidtakeOrder(______Order){orderList.add(order);}publicvoidplaceorders(){for{______order:orderList){order.execute();}orderLiSt.clear();}}publicclassStockCommand{publicstaticvoidmain(String[]args){StockaStock:newStock("股票A",10);StockbStock=newStock("股票B",20);OrderbuyStockorder=newBuyStock(aStock);OrdersellStockOrder=newSellSt0Ck(bStoCk);Brokerbroker=newBroker();broker.takeOrder(buyStockorder);broker.takeOrder(sellStockOrder);broker.______;}}
问答题【说明】某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点AP(AccessPoin)。假设每个无线AP覆盖范围的半径是6米,因此必须使得每台笔记本电脑上的无线网卡到某个无线AP的直线距离不超过6米。为了简化问题,假设所有无线网卡在同一直线上,并且无线AP沿该直线放置。该问题可以建模为如图1-16所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现利用贪心策略实现用尽可能少的无线AP覆盖所有的无线网卡。实现贪心算法的流程如图1-17所示。其中,①d[i](1≤i≤N)表示第i张无线网卡到通道A端的距离,N表示无线网卡的总数,无线网卡的编号按照无线网卡到通道A端的距离从小到大进行编号;②s[k]表示第k(k≥1)个无线AP到通道A端的距离。算法结束后k的值为无线AP的总数。1.【问题1】请填补图1-17流程图中(1)-(4)空缺处的内容。
问答题【说明】
以下【C++程序】实现一个简单的小型复数类MiniComplex,该复数类能进行输入、输出、复数的加法、减法、乘法和除法运算,还可以进行复数的相等比较。
【C++程序】
#ifndef H_MiniComplex
#define H_MiniComplex
#include <iostream>
using namespace std;
class MiniComplex{
public: //重载流插入和提取运算符
{{U}} (1) {{/U}}ostream
return osObject;
}
{{U}} (2) {{/U}}istream
isObject >>complex.realPart>>ch>>complex.imagPart>>ch;
return isObject;
}
MiniComplex(double real=0,double imag=0); //构造函数
MiniComplex operator+(const MiniComplex //重载运算符+
MiniComplex operator-(const MiniComplex //重载运算符-
MiniComplex operator*(const MiniComplex //重载运算符*
MiniComplex operator/(const MiniComplex //重载运算符/
bool operator==(const MiniComplex //重载运算符==
private :
double{{U}} (3) {{/U}};
double imagPart;
};
#end if
#include "MiniComplex.h"
bool MiniComplex::operator==(const MiniComplex
}
MiniComplex::MiniComplex(double real,double imag){
realPart== real; imagPart==imagPart;
}
MiniComplex MiniComplex::operator+(const MiniComplex
temp.realPart = realPart+ortherComplex. realPart;
temp.imagPart = imagPart +ortherComplex. imagPart;
return temp;
}
{{U}} (4) {{/U}}
{ MiniComplex temp;
temp.realPart= realPart-ortherComplex. realPart;
temp.imagPart = imagPart-ortherComplex. imagPart;
return temp;
}
MiniComplex MiniComplex::operator*(const MiniComplex
temp.realPart = (realPart*ortherComplex. realPart)-(imagPart *ortherComplex.imagPart);
temp.imagPart = (realPart*ortherComplex. imagPart)+(imagPart *ortherComplex.realPart);
return temp;
}
MiniComplex MiniComplex::operator/(const MiniComplex
float tt;
tt=1/(ortherComplex.realPart*ortherComplex.realPart+ortherComplex.imagPart *ortherComplex. imagPart);
temp.realPart=((realPart*ortherComplex, realPart)+(imagPart *ortherComplex. imagPart))*tt;
temp.imagPart =((imagPart *ortherComplex. realPart)-(realPart*ortherComplex. imagPart))*tt;
return temp;
}
#include <iostream>
#include <MiniComplex.h>
using namespace std;
int main(){
MiniComplex numl(23, 34),num2(56, 35);
cout<<"Initial Value of num1="<<num1<<"/n Initial Value of num2="<<num2<<end1;
cout<<num1<<"+"<<num2<<"="<<num1+num2<<end1; //使用重载的加号运算符
cout<<num1<<"-"<<num2<<"="<<num1-num2<<end1; //使用重载的减号运算符
cout<<num1<<"*"<<num2<<"="<<num1*num2<<end1; //使用重载的乘号运算符
cout<<num1<<"/"<<num2<<"="<<num1/num2<<end1; //使用重载的除号运算符
{{U}} (5) {{/U}};
}
问答题【说明】 使用MFC的CSocket类在两个或者多个应用程序之间建立通信。服务器应用程序先创建一个特殊的 Socket,用于监听客户应用程序的连接请求,然后再创建新的Socket来完成连接。从客户和服务器两端读取该连接,直到一个需要处理的报文到来为止。以下Visual C++程序将封装这些功能,这样所有应用程序需要完成的只是创建一个Socket连接,然后处理到来的报文。这将包括一个新的服务器Socket类、新客户端Socket类和新的报文队列类。 创建新的服务器Socket类程序的框架如下。第1个函数ListenEx()用于通知Socket开始监听客户应用程序。第2个函数OnAccept()在接收到连接请求时被调用。在其中创建新的Socket,并立刻设置它开始从客户应用程序读取报文,这些是通过调用第3个函数RecvThread()来完成的,该函数位于它自己的线程中。 【Visual C++程序】 【ListenEX()函数】 void CWzdServer::ListenEx( int hdrSz, int bodyPos, CWzdQueue *pQueue,CWnd *pWnd, UINT id ) //初始化接收数据 m_RecvData.hdrSz = hdrSz; m_RecvData.bodyPos = bodyPos; m_RecvData.pQueue = pQueue; m_RecvData.pWnd = pWnd; m_id = id; //启动标志 //开始监听 (1) 【OnAccept()函数】 void CWzdServer::OnAccept ( iht nErrorCode ) if ( nErrorCode == 0 ) CSocket *pSocket = (2) ; //创建新的套接字并添加到映射图中 m_mapSockets[m_id] = pSocket; Accept( ( CasyncSocket //用该新的套接字去连接客户端 //置套接字于同步模式 DWORD arg = 0; pSocket -> AsyncSelect( 0 ); pSocket -> IOCtl( FIONBIO, m_RecvData.pSocket = pSocket; m_RecvData.id = m_id++; //启用线程 AfxBeginThread( RecvThread, 【RecvThread()函数】 UINT RecvThread( LPVOID pParam ) //从线程中苑取数据 RECVDATA *pRecv = ( RECVDATA * )pParam; int len = 1; int error = 0; char *pBody = NULL; char *pHdr = NULL; //两个套接字都开放 while (TRUE) //开始读报文头部 iht res; pBody = NULL; pHdr = new char[pRecv -> hdrSz]; if ( ( res = pRecv -> pSocket -> CAsyncSocket::Receive( pHdr, pRecv ->hdrSz ) ==SOCKET_ERROR ) error = ::GetLastError(); else len = res; //如果完毕,则退出线程 if ( len == 0 || error == WSAECONNRESET || error == WSAECONNABORTED ) break; if ( !error pBody = new char[bodyLen]; if((res=pRecv -- >pSocket >CAsyncSocket::Receive(pBody,bodyLen))==SOCKET_ERROR) error = ::GetLastError(); else (3) ; //如果完毕,则退出线程 if(len == 0 || error == WSAECONNRESET || error == WSAECONNABORTED) break; //将消息排入队列 pRecv -> pQueue ->Add(new CWzdMsg(pRecv -> id,pHdr, p B o d y,len,error) ); //传送消息到窗口来处理新信息 pRecv -> pWnd -> PostMessage(WM_NEW_MESSAGE); //清记录 delete [ ]pHdr; delete [ ]pBody; //向相关对象发送停止通知 pRecv->pWnd->SendMessage(WM_DONE_MESSAGE, WPARAM)pRecv->id, (LPARAM)error); (4) ; 【SendEx()函数】 void CWzdServer::SendEx( int id, LPSTR lpBuf, int len ) //为该标识符设置套接字 CSocket *pSocket = (5) ; if ( pSocket ) m_SendData.pSocket = pSocket; m_SendData.lpBuf = lpBuf; m_SendData.len = len; //启动线程 AfxBeginThread( SendThread, 【SendThread()函数】 UINT SendThread( LPVOID pParam ) SENDDATA *pSend = ( SENDDATA * )pParam; //从线程中获取数据 pSend -> pSocket -> (6) ( pSend -> lpBuf, pSend -> len ); //执行写入操作 return 0; 【CloseEx()函数】 void CWzdServer::CloseEx() int id; CSocket *pSocket; for ( POSITION pos = m_mapSockets.GetStartPosition(); pos; ) m_mapSockets.GetNextAssoc( pos,id,pSocket ); pSocket -> Close(); (7) ;
问答题
问答题[说明]
有若干教师,每个教师只有姓名,一个教师可以指导多名研究生;每名研究生有姓名和研究方向,程序最后输出每个教师指导的所有研究生的姓名和研究方向。
[Java程序]
public class Teacher {
String name;
int top=0;
Student[] student=new Student[20];
public Teacher() {}
public Teacher(String name) { this.name=name;}
boolean add(Student stu){
int len=this.student.length;
if (top<len-1) {
this.student[top]=siu;
{{U}}(1) {{/U}};
return true;
}
else
return {{U}}(2) {{/U}};
}
void disp(){
System.out.println(“指导老师"”+this.name);
System.out.println(“研究生:”);
for(int i=0;i<{{U}} (3) {{/U}};i++){
System.out.println(“姓名:”+this.student[i].name+“/t研究方向:”+this.student[i]. search);
}
}
public static void main(String[] args){
Teacher t[]={new Teacher(“李明”),new Teacher(“王华”)};
Student s1 = new Student(“孙强”,“数据库”);
Student s2 = new Student(“陈文”,“软件工程”);
Student s3 = new Student(“章锐”,“计算机网络”);
if(! t[0].add(s1)) {System.out.println(“每个老师最多只能指导20个学生!”);}
if(! t[0].add(a2)) {System.out.println(“每个老师最多只能指导20个学生!”);}
if(! t[1].add(s3)) {System.out.println(“每个老师最多只能指导20个学生!”);}
for(int i=0;i<2;i++)
{{U}}(4) {{/U}};
}
}
class {{U}}(5) {{/U}}{
String name;
String search;
public Student(){}
public Student(String name,String search){
this.name=name;
this.search=search;
}
String getName(){return this.name;}
String getSearch(){return this.search;}
}
问答题【说明】 设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,则此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去,直到所有的人都出圈为止。 现要求按出圈次序,每10人一组,给出这n个人的顺序表。 设n=100,s=1,m=10。 (1)将1到n个人的序号存入一维数组p中; (2)若第i个人报数后出圈,则将p置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置: (3)重复第(2)步,直至圈中只剩下p[1]为止。 #include<stdio.h> #define N 100 #define S 1 #define M 10 void main() int p[100],n,s,m; m=M; n=N; s=S; int i,j,s1,w; s1=s; for(i=1; (1) ;i++) (2)=i; for(i=n;i>=2;i--) s1= (3) ; if(s1==0)s1=i; w= (4) ; for(j=s1;j<i;j++) p[j-1]=p[j]; p[i-1]= (5) ; printf("%4d",p[i])
问答题【程序说明】
函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。
函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。
【程序】
int strlen(char * s)
{char *t=s;
while( * ++);
return t-s-1;
}
int commstr(char) *str1,char *str2,int *sublen
{ char*s1, *s2;
int count=0,len1 ,len2,k,j,i,p;
len1:=strlen(str1)
len2 = strlen(str2);
if(len1>len2)
{s1=str1 ;s2=str2;}
else {len2 = len1;s1 = str2;s2 = str1;}
for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/
{for(k=0;{{U}} (1) {{/U}}<:len2;k++) /*k为子串s2的开始位置*/
{for(i=0;s1[{{U}} (2) {{/U}}]!='/0';i++;) /*i为子串s1的开始位置*/
{ /*s1的子串与s2的子串比较*/
for (p=0;p<j)p++);
if ({{U}} (4) {{/U}}) /*如果两子串相同*/
{for(p=0);p<j;p++} /*输出子串*/
printf ("%c",s2[k+p]);
printf ("/n");
count++;/*计数增1 */
}
}
}
if (count>0) break;
*sublen=(count>0)?{{U}} (5) {{/U}}:0;
return count;
}
问答题【说明】
设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。
【函数】
int StrCompare(SStrType s, SStrType t)
{
int n=s.length, m={{U}} (1) {{/U}}, i,j,tag;
i=0; j=0;
while({{U}} (2) {{/U}})
{
if({{U}} (3) {{/U}})
{
i++;
j++;
}
else if(s.str[i]>t.str[j])
{
tag=1;
return tag;
}
else
{
tag=-1;
return tag;
}
}
if(n==m)
tag=0;
else if({{U}} (4) {{/U}})
tag=1;
else if(n<m)
tag=-1;
{{U}} (5) {{/U}};
}
问答题试题六(共 15 分)
阅读以下说明和C++程序代码,将应填入(n) 处的字句写在答题纸的对应栏内。
[说明]
在下面的C++代码中,类SalesTicket 能够完成打印票据正文的功能,类HeadDecorator 与FootDecorator 分别完成打印票据的台头和脚注的功能。
已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。
这是票据的台头!
这是票据正文!
这是票据的脚注!
------------------------
这是票据的台头!
这是票据的脚注!
[C++程序代码]
#include
using namespace std;
class SalesTicket {
public:
(1) printTicket() { cout printTicket();
}
};
class HeadDecorator : public Decorator{
public:
HeadDecorator(SalesTicket *t): (2) { }
void printTicket() {
cout << "这是票据的台头!" << endl;
Decorator::printTicket();
}
};
class FootDecorator :public Decorator{
public:
FootDecorator(SalesTicket *t): (3) { }
void printTicket() {
Decorator::printTicket();
cout << "这是票据的脚注!" << endl;
}
};
void main(void) {
SalesTicket t;
FootDecorator f(
HeadDecorator h( (4) );
h.printTicket();
cout << "------------------------"<< endl;
FootDecorator a(NULL);
HeadDecorator b( (5) );
b.printTicket();
}
问答题试题三(共15分)阅读以下说明和C程序,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某种传感器的输出值Ratio依赖于环境温度temp(-40oC≤temp≤50oC)。对一组环境温度值(ITEMS个),人们已经测量得到了相应的Ratio值(见表1)。该表粗略地描述了曲线Ratio(temp)。校正系数K是Ratio的倒数,因此也依赖于环境温度temp。在数据处理中,人们需要用更多的列表值细致地描述曲线K(temp),如表2所示。在表2中,各温度值所对应的K值是对表1进行线性插值再求倒数得到的,具体的计算方法如下:1.根据temp值,在表1中用二分法查找;2.若找到相应的温度值,则按相应的Ratio值求倒数得到K值;3.若没找到相应的温度值,则可确定temp所在的温度区间[Tp1,Tp2],同时获得了相应的Ratio1和Ratio2,再按如下公式计算K值:Step=(Ratio1-Ratio2)/(Tp1-Tp2)K=1.0/(Ratio1+Step*(temp–Tp1))在程序中,当temp高于50oC或低于-40oC时,设定K=0。[程序]#includetypedefstruct{intTemp;/*环境温度*/doubleRatio;/*传感器的输出值*/}CURVE;#defineITEMS7doubleGetK(int,CURVE*,int);voidmain(){intDegree;doublek;CURVECurve[ITEMS]={{-40,0.2},{-20,0.60},{-10,0.8},{0,1.0},{10,1.17},{30,1.50},{50,1.8}};printf("环境温度校正系数\n");for(Degree=-40;DegreeTemp)||(Temp>(p+high)->Temp))return0.0;/*超出温度范围时返回0.0*/while(lowTemp)return(2);if(TempTemp)high=m-1;elselow=(3);}p+=high;Step=((4))/((p+1)->Temp-p->Temp);return1.0/(p->Ratio+Step*((5)));}
问答题【说明】一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表代表树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点,例如,如图5-9(a)所示的树和如图5-9(b)所示的树的孩子一兄弟表示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对如图5-9所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表5-12所示。{{B}}表5-12实现队列基本操作的函数原型表{{/B}}函数原型说 明 voidInitQueue(Queue*Q) 初始化队列 BoolIsEmpty(Queue*Q) 判断队列是否为空,若是则返回true,否则返回alse voidEnQueue(Queue*Q,TreeNodep) 元素入队列 voidDeQueue(Queue*Q,TreeNode*p) 元素出队列Bool、Status类型定义如下:typedefenum{FALSE=0,TRUE=1}Bool;typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1)Status;树的二叉链表节点定义如下:typedefstructN6de{chardata;structNode*firstchild,*nextbrother;}Node,*TreeNode;【C函数程序】StatusLevelTraverse(TreeNoderoot){/*层序遍历树,树采用孩子一兄弟表示法,root是树根节点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue({{U}}(1){{/U}};brotherptr=root->nextbrother;while(brotherptr)(EnQueue({{U}}(2){{/U}};}/*end-while*/while({{U}}(3){{/U}}){{{U}}(4){{/U}};Printf("%c/t",ptr->data);if({{U}}(5){{/U}})continue;{{U}}(6){{/U}};brotherptr=ptr->firstchiid->nextbrother;while(brotherptr){EnQueue({{U}}(7){{/U}};}/*end-while*/}/*end-while*/returnOK;}/*LevelTraverse*/