}}
(A)100(B)110(C)0(D)随机值
20.设有结构体数组及指针的定义如下,其下列引用非法的是(D)
structstudent
{intnum;
floatscore;
}stu[3]={{101,95},{102,89},{103,75}},*p=stu;
A)(p++)->num;B)(p+1)->score;C)(*p).numD)p=&stu.score
二、程序填空题
1.函数DecTo2816(intd,intr)的功能是将十进制整数d转换为r进制数的形式,实现方法是辗转除取余,将每次取得的余数转换为字符存入字符数组trans[]后反向输出。
voidDecTo2816(intd,intr)
{intres,i=0;chartrans[33]={'\0'};
while(d)
{res=d%r;//取余数
if(res<=9)trans[i++]=‘0’+res【1】;//余数<=9,如何存入字符?
else‘0’+res%10【2】;//若r=16,10~15的余数如何转换?
d=d/r;
}
while(i>=0)putchar(trans[i--])【3】;//反向输出trans[]中的字符
}
2.本程序功能是将两个递增整数表LA=(3,5,8,11)和LB=(2,6,8,9,11,15,20)归并到新的整数表LC=(2,3,5,6,8,8,9,11,11,15,20)。
整数表均采用单向链表存储。
#include
typedefstructelem//链表结点类型intNode的定义
{intv;//数据域,存储整数
structelem*next;//指针域
}intNode;
intNode*CreateList(intNode*Head,intn)//函数:
创建能存储n个整数的链表
{intNode*pnew,*pend;inti;//pnew用于创建新结点,pend为辅助指针
for(i=1;i<=n;i++)
{pnew=newintNode;
cin>>pnew->v;
if(Head==NULL)Head==pnew【4】;//若当前头指针为空,应赋什么值
elsepend->next=pnew;//新结点接入当前尾部结点之后
pend=pnew;pend->next=NULL;//pend更新,当前尾结点指针域赋空
}
return(Head);//返回链表头指针
}
//以下MergeList()函数,归并LA、LB到LC
intNode*MergeList(intNode*LA,intNode*LB,intNode*LC)
{intNode*pa=LA,*pb=LB,*pnew,*pend;
while(pa&&pb【5】)//当pa与pb不为空时
{pnew=(intNode*)malloc(sizeof(intNode));//为LC创建新结点
if(pa->v<=pb->v)//若结点pa的v值小于或等于pb结点的v值
{pnew->v=pa->v;//LC的新结点的v赋值为pa结点的v值
pa=pa->next;//当前结点处理完毕,pa指针下移
}
else
{pnew->v=pb->v【6】;pb=pb->next【7】;}
if(LC==NULL)LC=pnew;//当前LC链表还为空
elsepend->next=pnew;
pend=pnew;
pend->next=NULL;
}
while(pa!
=NULL)//如果LA比LB长,将剩余部分接入LC
{pnew=newintNode;
pnew->v=pa->v;pa=pa->next;
pend->next=pnew;pend=pnew;pend->next=NULL;
}
while(pb!
=NULL)//如果LB比LA长,将剩余部分接入LC
{pnew=newintNode;
Pnew->v=pb->v【8】;pb=pb->next【9】;
pend->next=pnew;pend=pnew;pend->next=NULL;
}
ReturnLC【10】;//此函数应返回什么值
}
voidmain(void)
{//以LA=(3,5,8,11)和LB=(2,6,8,9,11,15,20)为实例数据
intNode*LA=NULL,*LB=NULL,*LC=NULL;
LA=CreateList(la4)【11】;//创建链表LA
LB=CreateList(LB7)【12】;//创建链表LB
LC=MergeL
ist(LA,LB,LC);//归并LA和LB到LC
}
3.以下函数功能是使用对分法在递增排序的整型数组a[]中查找指定元素SearchNum,算法思想是:
取数组的中点下标c,若a[c]==SearchNum则找到,若SearchNum>a[c],则查找范围缩小为右半,否则缩小为左半,依此循环直到查找范围不能再缩小为止。
voidBisectSearch(inta[],intn)//n为数组长度,即元素个数
{ints=0,e=n-1,c;//s和e分别为查找范围的起点和终点下标,c为中点
intflag=0,SearchNum;//flag作为是否找到的标志,SearchNum待查找
cin>>SearchNum;
if(a[0]==SearchNum)//判断数组首元素
{cout<<"Fountit:
a[0]="<if(a[n-1]==SearchNum)//判断数组尾元素
{cout<<"Foundit:
a["<while(el=(s+1)【13】)//e==s+1时,查找范围不能再缩小
{c=(s+e)/2;//取数组的中点下标
if(a[c]==SearchNum){flag=1【14】;break【15】;}
elseif(a[c]elsee=c【17】;//更新s还是e
}
if(flag==1)cout<<"Fountit!
a["<elsecout<<"Notfound!
"<}
4.下列函数LocateSubString(char*s,char*t)的功能是在字符串s中定位字符串t并返回首次出现的位置(又称模式匹配,s称目标串,t称模式串)。
char*LocateSubString(char*s,char*t)
{ints_len=strlen(s),t_len=strlen(t);//求串s和t的长度
char*ps=s,*pt=t,*pa;//ps和pt分别指向s和t的首字符,pa为辅助指针
intflag=0;//标志变量,找到t为1,否则为0
while(ps<=s+s【18】)//ps指针最多只能移动到什么地方?
{pa=ps;pt=t;//为本轮匹配运算做准备工作
while(*pt!
='\0')//pt指针往下移动直到串尾
{if(*pa==*pt)//如果对应字符相等,如何处理?
{flag=1;pa++【19】;pt++【20】;}
else//对应字符不相等,也就是不匹配
{flag=0;break;}//不匹配,提前结束内层循环
}//while内层循环
if(flag==1)break;//上面的内层循环结束,flag=1说明找到了子串t
elseps++;//本轮结束后,没找到子串t,ps下移一个字符
}//while外层循环
if(flag==1)returnps;//当前ps即子串t首次出现的位置
elsereturn"\0";//返回空串
}
三、编制程序题
1.编写一个函数sort(inta[],intn),实现任意长度一维整型数组的元素排序,在main()中完成一维数组的定义和初始化,调用sort()函数后输出排序的结果。
2.编程实现:
求11~9999之间的m,使满足m、m2、m3均为回文数。
例如121、1221、43634等即为回文数。
要求将求得的m存储到一个动态数组之中并输出。
四、参考例程
1.简单的学生成绩管理演示程序
//文件包含及命名空间的使用语句,此处省略
//结点类型定义
typedefstructstudent
{intID;
charname[16];
floatscore;
structstudent*next;
}StuNode;
//存储文件的函数
voidSave*Head)
{intk=0;
if(Head==NULL)
{
cout<<"链表为空,无法存储文件!
"<system("pause");
return;
}
fstreamoutfile;
out("..\\Stu.dat",ios:
:
out);
StuNode*pt=Head;
while(pt)
{k++;
out((char*)pt,sizeof(StuNode));
pt=pt->next;
}
out();
cout<<"创建结点数="<}
//读取文件的函数
StuNode*ReadFile()
{intk=0;
StuNode*Head=NULL,*pnew=NULL,*paid=NULL;
ifstreaminfile;
in("..\\Stu.dat",ios:
:
in);
if(in())
{cout<<"文件不存在,打开失败!
"<system("pause");
returnHead;
}
while(!
in())
{pnew=newStuNode;
pnew->next=NULL;
in((char*)pnew,sizeof(StuNode));
if(in()<0)
{deletepnew;
break;
}
k++;
if(Head==NULL)
{Head=pnew;
paid=pnew;
paid->next=NULL;
}
else
{paid->next=pnew;
paid=pnew;
paid->next=NULL;
}
}//while,读文件结束
in();
cout<<"读取结点数="<returnHead;
}
//创建学生信息链表的函数
StuNode*CreateList(StuNode*Head)
{
StuNode*pnew,*paid,*ps,*pe;
cout<<"开始创建学生链表,输入学号为0或负则停止:
"<for(;;)
{pnew=newStuNode;
pnew->next=NULL;
cout<<"学号:
";
cin>>pnew->ID;
if(pnew->ID<=0)
{deletepnew;
break;
}
cout<<"姓名:
";
fflush(stdin);
cin.getline(pnew->name,15);
cout<<"成绩:
";
cin>>pnew->score;
if(Head==NULL)
{Head=pnew;
pnew->next=NULL;
paid=pnew;
}
else
{if(pnew->ID<=Head->ID)
{pnew->next=Head;
Head=pnew;
}
elseif(pnew->ID>=paid->ID)
{paid->next=pnew;
pnew->next=NULL;
paid=pnew;
}
else
{ps=Head;
pe=ps->next;
while(pnew->ID>=pe->ID)
{ps=ps->next;
pe=pe->next;
}
ps->next=pnew;
pnew->next=pe;
}
}
}
returnHead;
}
//输出链表的函数voidPrintList(StuNode*Head)(省略)
//主函数
voidmain()
{StuNode*Head=NULL;
Head=CreateList(Head);
Save);
Head=ReadFile();
PrintList(Head);
system("pause");
}
一、选择题参考答案
1~5:
BCDDC6~10:
AABBC
11~15:
BDADC16~20:
AABAD
二、程序填空题参考答案
【1】’0’+res【2】’A’+res%10
【3】putchar(trans[i--])【4】Head==pnew
【5】pa&&pb【6】pnew->v=pb->v
【7】pb=pb->next【8】pnew->v=pb->v
【9】pb=pb->next【10】returnLC
【11】CreateList(LA,4)【12】LB=CreateList(LB,7)
【13】e!
=(s+1)【14】flag=1
【15】break【16】s=c
【17】e=c【18】s+s_len-t_len
【19】pa++【20】pt++