}
voidbubble(intx[],intn,float&av){//一维数组冒泡排序函数
inti=0,j,k=1,t;
while(k){//冒泡算法
k=0;//设置逆序标志k(同时也是循环条件,1为有逆序,0为无逆序)
for(j=0;jif(x[j]>x[j+1]){//出现逆序
k=1;t=x[j];x[j]=x[j+1];x[j+1]=t;//重置k,交换逆序数对
}
i++;
}
for(i=0;iav=av/n;
}
4.定义一个二维数组inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}。
定义函数intlsum(intx[],intn,int&sum)返回每行元素之和并求所有元素之和,要求该函数中使用静态局部变量s存储二维数组总和。
按行输出数组及每行之和,最后输出总和。
定义数组voidexch(intx[][4],intn)其功能是转置该数组并作如上操作。
#include
#include
intlsum(intx[],int,int&);//求和函数,返回每行之和。
voidexch(intx[][4],int);//转置函数
voidmain(){
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
inti,j,sum;
sum=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++)cout<cout<cout<}
cout<<"total:
"<exch(a,4);
sum=0;//这句必须吗?
for(i=0;i<4;i++){
for(j=0;j<4;j++)cout<cout<cout<}
cout<<"total:
"<}
intlsum(intx[],intn,int&sum){
inti,t=0;statics;//静态变量记录总和
if(!
sum)s=0;//等价于sum==0,去掉这句行吗?
for(i=0;it+=x[i];s+=x[i];
}
sum=s;//总和由引用sum返回
returnt;
}
voidexch(intx[][4],intn){
inti,j,t;
for(i=0;ifor(j=i;jelse{
t=x[i][j];x[i][j]=x[j][i];x[j][i]=t;
}
}
5.编写求组合的程序,在主函数中输入任意两个正整数n,m求其组合。
要求:
使用递归函数求阶乘。
#include
longfact(intx);
voidmain(){
intc,m,n,t;
cin>>m>>n;
if(mt=m;m=n;n=t;
}
c=fact(m)/fact(n)/fact(m-n);
cout<<"Comb("<}
longfact(intx){
longf;
if(x==0)f=1;
elsef=x*fact(x-1);
returnf;
}
6.定义一个整型数组a[]={11,27,19,23,15,27,19,11,13,13,13,17},并且定义一个函数,intdel(intx[],int&m),该函数的功能为删除数组中所有重复的元素,并返回所删除元素的个数。
要求:
输出原数组,和删除后的数组,分别用一行四位宽度输出,并输出所删除元素的个数c。
#include
#include
intdel(intx[],int&m);
voidmain(){
inta[]={11,27,19,23,15,27,19,11,13,13,13,17};
inti,n=12,c=0;
for(i=0;icout<c=del(a,n);
cout<for(i=0;icout<}
intdel(intx[],int&m){//删除相同元素函数,返回删除个数,由于有元素的删除,所以数组长度m要相应改变,并回传
inti,j,k,c=0;//算法:
用x[i]与后面的元素逐个比较x[j],有相同元素,则由j开始将后面的元素逐个前移(删除x[j])
for(i=0;ifor(j=i+1;jif(x[i]==x[j]){
cout<for(k=j;km--;j--;c++;
}
returnc;
}
7.在一个有序整型数组{2,4,6,8,10,12,14,16,18}中,输入一个数k,如果是奇数,则插入,插入后数组仍保持有序。
编写二分查找函数intbisearch(inta[],intn,intb)返回一个任意输入整数a的下标。
要求输出原数组,插入后的数组,分别用一行四位宽度输出。
并输出所查找数的下标,若没找到则输出“该数不存在”。
#include
#include
intbisearch(inta[],intn,intb);
voidmain(){
intx[20]={2,4,6,8,10,12,14,16,18};//因为要插入数据,数组定义要比实际数据大
intn=9,i,j,k,a;
for(i=0;icout<do{
cout<<"请输入一个数:
";
cin>>k;
}while(k%2==0);
i=n;
while(k0){//插入方法:
k从最后一个数开始比较,小则把数组元素后移
x[i]=x[i-1];
i--;//i为插入指针(下标)
}
x[i]=k;n++;//插入,不要忘记数组长度增加!
for(i=0;icout<cout<<"输入待查找的整数:
";cin>>a;
if((j=bisearch(x,n,a))>=0)cout<<"该数下标为:
"<elsecout<<"该数不存在!
"<}
intbisearch(inta[],intn,intb){//二分查找函数:
要求待查序列必须是排序好的!
intl=0,h=n-1,m;
while(l<=h){//循环条件:
低边界小于等于高边界
m=(l+h)/2;//二分
if(a[m]==b)break;
elseif(belsel=m+1;//待查数据在高区,右移低边界
}
if(l>h)return-1;//没找到,返回-1(不存在的下标)
elsereturnm;//找到,返回该数下标
}
8.在主函数中定义一个字符串“WearelearningC++language.C++isuseful.”并显示。
输入一个字符串(如“Fortran95”)替换句中的“C++”。
定义函数voidexch(char*)将其倒序。
输出替换及倒序后的字符串。
要求:
使用指针操作完成倒序运算。
//字符串的操作练习,并熟悉常用字符串函数的用法
#include
#include
voidexch(char*);
voidmain(){
chars0[80]="WearelearningC++language.C++isuseful.";
charst[80],s1[20],*sp;
intn,i;
cout<cout<<"输入一个字符串:
";
cin.getline(s1,20);//输入字符串的方式(可含空格)
n=strlen(s1);//测定输入字符串的长度(字符数)
for(i=0,sp=s0;*sp;i++,sp++)//工作指针sp指向初始字符串s0逐个字符查找"C++"(子字符串)
if(strncmp(sp,"C++",3)==0){//找到,(sp所指字串前3个字符为"C++")
strcpy(st,sp+3);//把"C++"后面的内容复制到数组st(保护起来)
strcpy(sp,s1);//用输入的字符串s1替换"C++"及其以后的内容,sp也可写为s0+i
sp+=n-1;i+=n-1;//把指针以及下标值置于替换后字符串尾部
strcat(sp,st);//把保存在st中原字符串的其余部分再复制回来,完成一次替换。
继续如上过程替换后面的"C++"
}
cout<exch(s0);
cout<}
voidexch(char*str){//倒序函数
char*p,*q,c;
p=str;q=p+strlen(str)-1;//工作指针p指向字符串str首字符,q指向尾字符
while(pc=*p;*p=*q;*q=c;
p++;q--;
}
}
9.定义一个字符串常量,并判断该字符串是否为“回文”。
要求:
定义一个顺序栈charst[],编写入栈、出栈函数(voidpush(char*st,charc,int&top),charpop(char*st,int&top),利用栈结构的性质完成该判断。
//堆栈:
一种数据结构,规定只能在一端进行插入和删除数据(类似子弹夹),最后入栈的元素最先出栈
#include
voidpush(char*st,charc,int&top);
charpop(char*st,int&top);
voidmain(){
char*p="madam",*q=p,s[20];
intt=-1;//设置空栈指针(数组下标)
while(*q){//把指针q所指字符逐个压入堆栈s中
push(s,*q,t);
q++;
}
q=p;//重要!
重置指针q
cout<while(t>=0&&*q==pop(s,t))q++;//正向*q,逆向pop(s,t)逐个字符比较字符串,若完全相同(至t<0)则为回文
if(t<0)cout<<"是回文!
\n";
elsecout<<"不是回文!
\n";
}
voidpush(char*st,charc,int&top){//入栈函数
top++;//栈顶指针(栈顶元素的下标)上移
st[top]=c;//将字符c压入栈中(入栈一个元素)
}
charpop(char*st,int&top){//出栈函数,返回栈顶元素
charc=st[top];//栈顶元素初始化c
top--;//栈顶指针下移,(出栈一个元素)
returnc;
}
10.输出1900–2100的所有闰年,要求每年7位宽度(每行10年)。
输入一个日期:
年(1900–2100)、月、日,求该日期为本年的第几天。
要求:
编写返回每月天数的函数,并对输入的年、月、日进行合理性检测。
#include
#include
intmd(int,int);
inlineintly(intyear){return(year%400==0||year%4==0&&year%100!
=0);}
voidmain(){
inty,m,d,yd,i,k=1;
for(i=1900;i<=2100;i++)
if(ly(i)){
cout<if(k++%10==0)cout<}
cout<do{
cout<<"\n请输入年、月、日(yyyymmdd):
";
cin>>y>>m>>d;
}while(!
(y>=1900&&y<=2100&&m>0&&m<13&&d>0&&d<=md(y,m)));//输入合法性检测
yd=d;//当月的天数
for(i=1;icout<<"是"<}
intmd(intyear,intmonth){//返回任意一个月份的天数
intn;
switch(month){
case4:
case6:
case9:
case11:
n=30;break;
case2:
if(ly(year))n=29;
elsen=28;
break;
default:
n=31;
}
returnn;
}