C++第3-4章所有习题——慢慢千行

来源:互联网 发布:死亡宣告知乎 编辑:程序博客网 时间:2024/06/05 07:09

/*普通题号为课本的部分重点例题(写法力求精简通用,大多不同于课本)

题号含x表示课本的习题,b为习题册习题里的编程题,s为习题册的实验题*/

 

//第3章 流程控制语句

//【3-10.求1到10的阶乘的和】

//写法一:用双循环来做

#include<iostream.h>

void main()

{

      inti,j,t,s=0;

      for(i=1;i<=10;i++){

           t=1;       //必须每次赋初值!

           for(j=2;j<=i;j++)

                 t*=j;

           s+=t;

      }

      cout<<s<<endl;

}

 

//写法二:用单循环来做

#include<iostream.h>

void main()

{

      inti,t=1,s=0;     //注意两个初值1和0不要赋错!

      for(i=1;i<=10;i++){

           t*=i;  

           s+=t;

      }

      cout<<s<<endl;

}

 

//【3-12.求2~100的非素数】

#include<iostream.h>

void main()

{

      inti,j,k=0;

      for(i=2;i<=100;i++)

           for(j=2;i>=2*j;j++)

                 if(i%j==0){

                      cout<<i<<'\t';

                      if(++k%5==0)cout<<endl;

                      break;

                 }

      if(k%5)cout<<endl;       //最后一行不足5个时最好也要转行!

      cout<<"2~100中共有"<<k<<"个非素数\n";

}

 

//【3-13.求二元一次方程的解】

#include<iostream.h>

#include<math.h>     //用sqrt()注意写<math.h>!

void main()

{

      floata,b,c,d;     //注意类型不要用int!

      cout<<"请输入3个系数:";

      cin>>a>>b>>c;

      d=b*b-4*a*c;

      if(d>0)cout<<"方程有两个不同的实根\n"<<"x1="<<(-b+sqrt(d))/2/a<<"\nx2="<<(-b-sqrt(d))/2/a;

      elseif(d==0)cout<<"方程有两个相同的实根\n"<<"x1=x2="<<-b/2/a;

           elsecout<<"方程无实根";

      cout<<endl;

}

 

//【3-14.求所有水仙花数】

//一个各位数字的立方和等于此数本身的三位数

#include <iostream.h>

#include <math.h>     //pow()求乘方要有<math.h>!

void main()

{

      inti,j,s;

      for(i=100;i<1000;i++){

           s=0;

           for(j=i;j;j/=10)

                 s+=pow(j%10,3);

           if(s==i)cout<<i<<'\t';

      }

      cout<<endl;

}

 

//【3-15.求Fibonacci数列的前20项,每行输出4项】

//后项是前面两项的和,最初两项都是1

//写法一:用迭代法迭代求和

#include<iostream.h>

void main()

{

      inti,f1=1,f2=1,t;

      cout<<f1<<'\t'<<f2<<'\t';

      for(i=3;i<=20;i++){

           t=f2;

           f2+=f1;

           f1=t;

           cout<<f2<<'\t';

           if(i%4==0)cout<<endl;

      }

}

 

//写法二:滚动向前求和

#include<iostream.h>

void main()

{

      inti,f1=1,f2=1;

      cout<<f1<<'\t'<<f2<<'\t';

      for(i=3;i<=20;i++){

           if(f1<=f2){

                 f1+=f2;

                 cout<<f1<<'\t';

           }

           else{

                 f2+=f1;

                 cout<<f2<<'\t';

           }

           if(i%4==0)cout<<endl;

      }

}

 

//【3-16.迭代法求平方根近似值,前后两次差值小于10的-5】

//迭代公式为x1=(x0+a/x0)/2

#include<iostream.h>

#include<math.h>     //用fabs()注意写<math.h>!

void main()

{

      floata,x0,x1;

      cout<<"请输入一个非负数:";

      cin>>a;

      if(a<0)cout<<a<<"不能开平方\n";

      else

           if(a==0)cout<<a<<"的平方根为0\n";

           else{

                 x1=a/2;     //开根的初始值!

                 do{       //注意用do{}while;

                      x0=x1;

                      x1=(x0+a/x0)/2;       //由于要做分母,必须先讨论0!

                 }while(fabs(x1-x0)>1e-5);     //注意1e-5写法!

                 cout<<a<<"的平方根为:"<<x1<<endl;

           }

}

 

//【3-17.求π的近似值,要求公式最后一项的值不大于10的-6】

//近似值π/4≈1-1/3+1/5-1/7+...

#include<iostream.h>

void main()

{

      floati=1,j=1,s=1;

      do{

           i+=2;

           j*=-1;

           s+=j/i;

      }while(1/i>1e-6);

      s*=4;

      cout<<"π的近似值为:"<<s<<endl;

}

 

//【3-1x.求输入的3个数的最大值】

#include <iostream.h>

void main()

{

      floati,j,k;

      cout<<"请输入3个数:";

      cin>>i>>j>>k;

      cout<<"最大值为:";

      if(i<j)i=j;

      if(i<k)i=k;

      cout<<i<<endl;

}

 

//【3-2x.判断输入的3边值是否能够成三角形,能则求面积】

#include <iostream.h>

#include<math.h>

void main()

{

      floati,j,k,p,s;

      cout<<"请输入3个正数:";

      cin>>i>>j>>k;

      p=(i+j+k)/2;

      if(p>i&&p>j&&p>k){

           s=sqrt(p*(p-i)*(p-j)*(p-k));

           cout<<"能构成三角形,且面积为:"<<s<<endl;

      }

      elsecout<<"不能构成三角形\n";

}

 

//【3-3x.输入月份求季节】

#include <iostream.h>

void main()

{

      inti;

      cout<<"请输入一个月份数:";

      cin>>i;

      switch(i%12/3){         //求模可把12变成0!

           case0:cout<<"属于冬季\n";break;

           case1:cout<<"属于春季\n";break;

           case2:cout<<"属于夏季\n";break;

           case3:cout<<"属于秋季\n";

      }

}

 

//【3-4x.求输入的10个整数的平均值】

#include <iostream.h>

void main()

{

      inti,j;

      floatk=0;       //注意用float且累加赋初值!

      cout<<"请输入10个整数:";

      for(i=0;i<10;i++){

           cin>>j;

           k+=j;

      }

      cout<<"平均值为:"<<k/i<<endl;

}

 

//【3-5x.输入学生成绩统计并输出最高成绩和最低成绩,输入负数结束】

#include <iostream.h>

void main()

{

      inti;

      floatj,k,n;

      cout<<"请输入若干学生的成绩(输入负数结束):";

      cin>>n;

      k=j=n;             //注意赋初值再比较!

      for(i=0;n>=0;i++){

           if(k<n)k=n;

           if(j>n)j=n;

           cin>>n;

      }

      cout<<"学生总数:"<<i<<endl;

      if(i)cout<<"最高成绩:"<<k<<"\n最低成绩:"<<j<<endl;

}

 

//【3-6x.计算s=1+2+3+...+i累加到s大于1000,并输出s和i】

#include <iostream.h>

void main()

{

      inti=0,s=0;

      while(s<=1000)

           s+=++i;

      cout<<s<<'\t'<<i<<endl;     //如果用for则i要自减1!

}

 

//【3-1b.输入三个整数并从大到小输出】

#include <iostream.h>

void main()

{

      inti,j,k,t;

      cout<<"请输入3个整数:";

      cin>>i>>j>>k;

      if(j>i){t=i;i=j;j=t;}

      if(k>j){t=j;j=k;k=t;}

      if(j>i){t=i;i=j;j=t;}

      cout<<"从大到小输出:"<<i<<'\t'<<j<<'\t'<<k<<endl;

}

 

//【3-2b.求100~300所有平方被6除余3的奇数】

#include <iostream.h>

void main()

{

      for(inti=100;i<=300;i++)

           if(i*i%6==3&&i%2)cout<<i<<'\t';

      cout<<endl;

}

 

//【3-3b.输入十进制整数显示为十六进制的逆序形式(不许用hex)】

#include <iostream.h>

void main()

{

      inta,i;

      cout<<"请输入一个十进制整数:";

      cin>>a;

      while(a){

           i=a%16;

           a/=16;       //直接如此做即为逆序!如要求正常输出则需换序!

           switch(i){

                 case10:cout<<'A';break;

                 case11:cout<<'B';break;

                 case12:cout<<'C';break;

                 case13:cout<<'D';break;

                 case14:cout<<'E';break;

                 case15:cout<<'F';break;

                 default:cout<<i;

           }

      }

      cout<<endl;

}

 

//【3-1s.查找10~1000的回文数,8个一行输出并记录个数】

#include <iostream.h>

void main()

{

      inti,j,k,count=0;

      cout<<"Theresult:\n";

      for(ints=11;s<1000;s++){

           i=s/100;

           j=s/10%10;

           k=s%10;

           if(i==0&&j==k||i!=0&&i==k){       //&&比‖优先级高!

                 cout<<s<<'\t';

                 count++;

                 if(count%8==0)cout<<endl;

           }

      }

      cout<<"count="<<count<<endl;

}

 

//【3-2s.有函数当x为正则y=1,x为负则y=-1,x为0则y=0,输入x求y】

#include <iostream.h>

void main()

{

      floatx;

      inty;

      cout<<"x=";

      cin>>x;

      y=x>0?1:x?-1:0;

      cout<<"y="<<y<<endl;

}

 

//【3-3s.三种循环求5~20中所有偶数的和】

//循环一:用for语句

#include <iostream.h>

void main()

{

      inti,j=0;

      for(i=5;i<=20;i++)

           if(i%2==0)j+=i;

      cout<<j<<endl;

}

 

//循环二:用while语句

#include <iostream.h>

void main()

{

      inti=5,j=0;

      while(i<=20){

           if(i%2==0)j+=i;

           i++;

      }

      cout<<j<<endl;

}

 

//循环三:用do while语句

#include <iostream.h>

void main()

{

      inti=5,j=0;

      do{

           if(i%2==0)j+=i;

           i++;

      }while(i<=20);

      cout<<j<<endl;

}

 

//【3-4s.求满足12+22+32+...+n2<=1000的最大n】

#include <iostream.h>

void main()

{

      inti,s=0;

      for(i=1;s<=1000;i++)

           s+=10*i+2;

      i-=2;       //理解为何要减2!

      cout<<i<<endl;

}

 

//【3-5s.迭代法求方程3x^3-2x^2-5=0在1附近的根,要求精确到10^-5】

//牛顿迭代公式为x=x-f(x)/f'(x)

#include <iostream.h>

#include<math.h>

void main()

{

      floatx=1,x0,f,f1;

      do{

           f=3*x*x*x-2*x*x-5;

           f1=9*x*x-4*x;

           x0=x;

           x=x-f/f1;

      }while(fabs(x-x0)>=1E-5);

      cout<<x<<endl;

}

 

//第4章 数组

//【4-4.实现二维数组的转制,即行列互换】

#include <iostream.h>

void main()

{

      inta[4][3],b[3][4],i,j;

      for(i=0;i<4;i++)

           for(j=0;j<3;j++)

                 a[i][j]=3*i+j+1;     //1~12顺序赋值!

      for(i=0;i<3;i++)       //注意i,j及3和4的调换!

           for(j=0;j<4;j++)

                 b[i][j]=a[j][i];

      cout<<"原数组为:\n";

      for(i=0;i<4;i++){

           for(j=0;j<3;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

      cout<<"转制后的数组为:\n";

      for(i=0;i<3;i++){

           for(j=0;j<4;j++)

                 cout<<b[i][j]<<'\t';

           cout<<endl;

      }

}

 

//【4-6.将输入字符串每个空格后的小写字母变大写】

#include <iostream.h>

void main()

{

      chara[100];

      cin.getline(a,100);

      for(inti=0;a[i];i++)

           if(a[i]==''&&a[i+1]>='a'&&a[i+1]<='z')     //也可换为97和122!

                      a[i+1]-=32;       //注意大小写差±32!

      cout<<a<<endl;

}

 

//【4-7.将一个字符串插入另一个字符串的指定位置】

//在"We China"的第3个字符后插入"love"

//编法一:不使用字符串处理函数实现插入

#include <iostream.h>

void main()

{

      chara[]="love ",b[100]="We China";

      inti=0,j=0,n=3;

      while(a[i])i++;

      while(b[j])j++;

      while(j>=n)

           b[j+i]=b[j--];       //结束标记也复制上去!

      for(j=0;j<i;j++)

           b[j+n]=a[j];

      cout<<b<<endl;

}

 

//编法二:使用字符串处理函数实现插入

#include <iostream.h>

#include<string.h>

void main()

{

      chara[100]="love ",b[100]="We China";

      intn=3;

      strcat(a,b+n);

      strcpy(b+n,a);

      cout<<b<<endl;

}

 

//【4-8.将字符串中的字符逆序排列】

#include <iostream.h>

void main()

{

      inti=0,j=0,t;

      chara[]="I am a student.";

      while(a[i])i++;

      i--;               //若不自减则指结束标记!

      while(j<i){    

           t=a[j];

           a[j]=a[i];

           a[i]=t;

           j++;

           i--;

      }

      cout<<a<<endl;

}

 

//【4-13.32位2进制IP转为10进制,中间加.分隔】

//把10101011000110110111011000000101转为171.27.118.5

#include <iostream.h>

void main()

{

      inta[32]={1,0,1,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,1,0,1};

      inti,j,k,s;

      cout<<"IP:\n";

      for(i=0;i<32;i++)

           cout<<a[i];

      cout<<endl;

      for(i=0;i<4;i++){

           k=1;            //注意此两行,每回重置初值!

           s=0;

           for(j=7;j>=0;j--){     //注意是自减!

                 s+=a[8*i+j]*k;

                 k*=2;

           }

           cout<<s;

           if(i<3)cout<<'.';     //注意最后没有'.'!

      }

      cout<<endl;

}

 

//【4-14.将数组元素按升序排列】

//使用优化的<冒泡排序法>

#include <iostream.h>

void main()

{

      inti,j,k,t,a[10]={5,9,2,6,10,8,1,7,4,3},n=10;

      for(i=0;i<n-1;i++){

           k=i;                  //冒泡的指针编法见题【4-4s】

           for(j=i+1;j<n;j++)

                 if(a[k]>a[j])k=j;

           if(k!=i){

                 t=a[i];

                 a[i]=a[k];

                 a[k]=t;

           }

      }

      for(i=0;i<n;i++)

           cout<<a[i]<<'\t';

      cout<<endl;

}

 

//【4-15.将键盘输入的数有序的插入有序数列num中】

#include <iostream.h>

void main()

{

      floatk,a[10]={1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5};

      inti,n=9;

      cout<<"请输入要插入的数:";

      cin>>k;

      for(i=n;i>0&&k<a[i-1];i--)     //插入要逆序右移!

           a[i]=a[i-1];

      a[i]=k;

      for(i=0;i<n+1;i++)

           cout<<a[i]<<'\t';

      cout<<endl;

}

 

//【4-16.删除空格字符】

#include <iostream.h>

void main()

{

      intj,i=0;

      chara[100];

      cin.getline(a,100);

      while(a[i])

           if(a[i]=='')

                 for(j=i;a[j];j++)     //可用strcpy(&a[i],&a[i+1])替换!

                      a[j]=a[j+1];

           elsei++;       //注意每次都要判断当前位else再++!

      cout<<a<<endl;

}

 

//【4-17.把r行c列无重复值的二维数组b中最小元素放到左上角,最大元素放到右下角】

#include <iostream.h>

#define r 3

const int c=4;     //两种定义方式类似,都是符号常量!

void main()

{

      intb[r][c]={2,5,8,6,1,4,12,9,3,11,7,10};

      inti,j,n,m,ni,mi,nj,mj;

      cout<<"原数组为:\n";

      for(i=0;i<r;i++){

           for(j=0;j<c;j++)

                 cout<<b[i][j]<<'\t';

           cout<<endl;

      }

      m=n=b[0][0];

      ni=mi=nj=mj=0;

      for(i=0;i<r;i++)

           for(j=0;j<c;j++)

                 if(b[i][j]<n){

                      n=b[i][j];

                      ni=i;

                      nj=j;

                 }

                 elseif(b[i][j]>m){

                      m=b[i][j];

                      mi=i;

                      mj=j;

                 }

      if(b[0][0]==m){     //注意特例b[0][0]为最大值!

           mi=ni;

           mj=nj;

      }

      b[ni][nj]=b[0][0];

      b[0][0]=n;

      b[mi][mj]=b[r-1][c-1];       //注意要-1!

      b[r-1][c-1]=m;

      cout<<"交换后的数组为:\n";

      for(i=0;i<r;i++){

           for(j=0;j<c;j++)

                 cout<<b[i][j]<<'\t';

           cout<<endl;

      }

}

 

//【4-18.将二维字符数组中的元素上移一行,第一行移到最后】

#include <iostream.h>

void main()

{

      inti,j;

      chart,week[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

      for(i=0;i<10;i++){

           t=week[0][i];

           for(j=1;j<7;j++)        //可用strcpy(week[i-1],week[i])替换!

                 week[j-1][i]=week[j][i];

           week[j-1][i]=t;

      }

      for(i=0;i<7;i++)

           cout<<week[i]<<endl;     //二维字符数组每行可直接输出!

}

 

//【4-19.用指针判断输入的是否为自反数】

//正序与逆序相同的数,如12421

#include <iostream.h>

void main()

{

      intn,a[10],*p1=a,*p2=a;

      cout<<"请输入一个正整数:";

      cin>>n;

      cout<<n;      //后来n值改变,所以先输出!

      while(n){

           *p2++=n%10;

           n/=10;

      }

      p2--;

      while(p1<p2&&*p1==*p2){

           p1++;

           p2--;

      }

      if(p1<p2)cout<<"不是自反数\n";

      elsecout<<"是自反数\n";

}

 

//【4-21.给英文中的指定单词后加s】

//将"We are student, you are student."中student后加s

//编法一:不使用字符串处理函数实现操作

#include <iostream.h>

void main()

{

      chara[100]="We are student, you are student.",b[]="student";

      inti=0,n=0,j,k;

      while(a[n])n++;

      while(a[i]){

           j=0;

           while(a[i]==b[j]){

                 i++;

                 j++;

                 if(!b[j]){

                      for(k=++n;k>i;k--)     //先复制结束标记!

                            a[k]=a[k-1];

                      a[i]='s';

                 }

           }

           if(j==0)i++;

      }

      cout<<a<<endl;

}

 

//编法二:使用字符串处理函数实现操作

#include<iostream.h>

#include<string.h>

void main()

{

      chara[100]="We are student, you are student.",b[]="student";

      char*p=a,c[100];

      inti=strlen(b);

      while(p=strstr(p,b)){     //不可改为strstr(a,b)

           p+=i;

           strcpy(c,p);

           *p++='s';

           strcpy(p,c);

      }

      cout<<a<<endl;

}

 

//【4-1x.找出一维数组最大元素及下标】

//如{3,5,2,7,6,1,7,4,7,5}最大元素7下标3,6,8

#include<iostream.h>

void main()

{

      inta[10]={3,5,2,7,6,1,7,4,7,5},i,j=a[0];

      for(i=1;i<10;i++)

           if(a[i]>j)j=a[i];

      cout<<"最大元素为:"<<j<<"\n其下标分别为:";

      for(i=0;i<10;i++)

           if(a[i]==j)cout<<i<<'\t';

      cout<<endl;

}

 

//【4-2x.求键盘输入的n个实数的方差】

#include<iostream.h>

#include<math.h>

void main()

{

      floats=0,j,k=0,a[10];

      inti,n=10;

      cout<<"请输入这"<<n<<"个实数:\n";

      for(i=0;i<n;i++){

           cin>>a[i];

           s+=a[i];

      }

      j=s/n;

      for(i=0;i<n;i++)

           k+=pow(a[i]-j,2);

      cout<<"方差为:"<<k<<endl;

}

 

//【4-3x.求二维数组外围元素的和】

#include<iostream.h>

void main()

{

      inti,j,s=0,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

      for(i=0;i<3;i++)

           for(j=0;j<4;j++)

                 if(i==0||i==2||j==0||j==3)s+=a[i][j];

      cout<<s<<endl;

}

 

//【4-4x.将杨辉三角前n行保存到二维数组下半三角中】

//最左最右都是1,其它数为左上与正上的和

#include<iostream.h>

#define n 6

void main()

{

      inti,j,a[n][n];

      for(i=0;i<n;i++)

           for(j=0;j<=i;j++)

                 if(j==0||j==i)a[i][j]=1;

                 elsea[i][j]=a[i-1][j]+a[i-1][j-1];

      for(i=0;i<n;i++){

           for(j=0;j<=i;j++)         

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

}

 

//【4-5x.通过指针变量拼接字符串】

//即实现strcat(a,b)的效果

#include<iostream.h>

void main()

{

      chara[100],b[100],*p1=a,*p2=b;

      cout<<"请输入一串字符:";

      cin.getline(a,100);

      cout<<"请输入另一串字符:";

      cin.getline(b,100);

      while(*p1)p1++;     //等同于p1+=strlen(a)

      while(*p2)

           *p1++=*p2++;

      *p1='\0';       //补结束标记!等同于strcpy(p1,b)

      cout<<"拼接结果为:"<<a<<endl;

}

 

//【4-6x.通过指针变量求输入的一串字符中单词的个数】

#include<iostream.h>

void main()

{

      cout<<"请输入一段英文:\n";

      chara[100],*p=a;

      cin.getline(a,100);

      while(*p=='')p++;

      for(inti=0;*p;i++){

           while(*p&&*p!='')p++;

           while(*p=='')p++;

      }

      cout<<"其中包含"<<i<<"个单词\n";

}

 

//【4-1b.交换一维数组最大元素和最小元素的位置】

#include<iostream.h>

void main()

{

      inti,min,max,a[6]={18,16,19,15,11,8};

      cout<<"原数组为:\n";

      for(i=0;i<6;i++)

           cout<<a[i]<<'\t';

      min=max=0;

      for(i=1;i<6;i++){

           if(a[min]>a[i])min=i;

           if(a[max]<a[i])max=i;

      }

      i=a[min];

      a[min]=a[max];

      a[max]=i;

      cout<<"\n交换后数组为:\n";

      for(i=0;i<6;i++)

           cout<<a[i]<<'\t';

      cout<<endl;

}

 

//【4-2b.将二维数组每个元素向右移一列,最后一列移到最左边】

#include<iostream.h>

#define r 3

#define c 4

void main()

{

      inti,j,a[r][c],b[r][c];

      for(i=0;i<r;i++)

           for(j=0;j<c;j++)

                 a[i][j]=b[i][j]=c*i+j+1;

      cout<<"移动前的数组为:\n";

      for(i=0;i<r;i++){

           for(j=0;j<c;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

      for(i=0;i<r;i++)

           for(j=0;j<c;j++)

                 b[i][(j+1)%c]=a[i][j];       //求模思想!

      cout<<"移动后的数组为:\n";         

      for(i=0;i<r;i++){

           for(j=0;j<c;j++)

                 cout<<b[i][j]<<'\t';

           cout<<endl;

      }

}

 

//【4-3b.统计字符串中各类字符的个数】

//假设把字符分为控制字符(<32)、数字字符、英文字母和其他字符

#include<iostream.h>

void main()

{

      chara[100],*p;

      intk=0,s=0,y=0,q=0;

      cout<<"请输入一串字符:\n";

      cin.getline(a,100);

      for(p=a;*p;p++)

           if(*p<32)k++;

           elseif(*p>='0'&&*p<='9')s++;    //注意数字(仅0~9)和字母(大小写)的码域!

                 elseif(*p>='A'&&*p<='Z'||*p>='a'&&*p<='z')y++;     //先与后或!

                      elseq++;

      cout<<"控制字符"<<k<<"个\n数字字符"<<s<<"个\n英文字母"<<y<<"个\n其他字符"<<q<<"个\n";

}

 

//【4-4b.将一维数组b中的元素依次插入二维数组a的每列中,并保持每列的有序性】

#include<iostream.h>

void main()

{

      inti,j,b[3]={2,7,1},a[4][3]={1,3,5,4,6,8,8,9,10};

      cout<<"原数组为:\n";

      for(i=0;i<3;i++){

           for(j=0;j<3;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

      for(j=0;j<3;j++){

           for(i=2;i>=0&&b[j]<a[i][j];i--)     //逆序更简便!

                 a[i+1][j]=a[i][j];

           a[i+1][j]=b[j];

      }

      cout<<"插入后的数组为:\n";

      for(i=0;i<4;i++){

           for(j=0;j<3;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

}

 

//【4-5b.通过行指针求二维数组中正数元素和负数元素各自的平均值】

#include<iostream.h>

void main()

{

      inta[3][4]={1,3,-5,8,-7,0,4,-2,9,6,-8,5};

      inti,j,n1=0,n2=0,(*p)[4]=a;       //注意行指针的定义!

      floats1=0,s2=0;

      cout<<"二维数组为:\n";

      for(i=0;i<3;i++){

           for(j=0;j<4;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

      for(i=0;i<3;i++)

           for(j=0;j<4;j++)

                 if(p[i][j]>0){

                      s1+=p[i][j];

                      n1++;

                 }

                 elseif(p[i][j]){

                      s2+=p[i][j];

                      n2++;

                 }

      cout<<"正数元素平均值为:"<<s1/n1<<"\n负数元素平均值为:"<<s2/n2<<endl;

}

 

//【4-6b.通过指针查找一维数组中值为k的元素】

#include<iostream.h>

void main()

{

      inta[14]={3,1,7,9,12,15,4,8,4,3,5,10,9,7},n=14,i=0,j,*p=a;

      cout<<"请输入要查找的元素:";

      cin>>j;

      while(i<n&&p[i]!=j)i++;

      if(i!=n){

           cout<<"在数组中的下标为:"<<i;

           while(++i<n)

                 if(p[i]==j)cout<<"、"<<i;

      }

      elsecout<<"数组中查无此数";

      cout<<endl;

}

 

//【4-7b.通过指针删除字符串中从键盘输入的字符】

#include<iostream.h>

void main()

{

      chara[100],*p=a,*p1,c;

      cout<<"请输入字符串:\n";

      cin.getline(a,100);

      cout<<"请输入要删除的字符:";

      cin.get(c);       //注意可能要删除空格等字符!

      while(*p)

           if(*p==c)

                 for(p1=p;*p1;p1++)       //可用strcpy(p,p+1)替换!

                      *p1=*(p1+1);

           elsep++;

      cout<<"删除字符"<<c<<"后的字符串为:\n"<<a<<endl;

}

 

//【4-1s.把二维数组每行的最大元素和每列的最小元素分别放入两个一维数组】

#include<iostream.h>

#include<stdlib.h>

#define r 3

#define c 6

void main()

{

      inti,j,k,a[r][c],b[r],d[c];

      for(i=0;i<r;i++)

           for(j=0;j<c;j++)

                 a[i][j]=rand()%100;

      cout<<"随机赋值的二维数组为:\n";

      for(i=0;i<r;i++){

           for(j=0;j<c;j++)

                 cout<<a[i][j]<<'\t';

           cout<<endl;

      }

      cout<<"每行的最大元素为:\n";

      for(i=0;i<r;i++){

           b[i]=a[i][0];

           for(j=1;j<c;j++)

                 if(b[i]<a[i][j])b[i]=a[i][j];

           cout<<b[i]<<'\t';

      }

      cout<<"\n每列的最小元素为:\n";

      for(j=0;j<c;j++){

           d[j]=a[0][j];

           for(i=1;i<r;i++)

                 if(d[j]>a[i][j])d[j]=a[i][j];

           cout<<d[j]<<'\t';

      }

      cout<<endl;

}

 

//【4-2s.删除字符串中的重复字符】

#include <iostream.h>

void main()

{

      chara[]="I am a student.You are a student too.";

      cout<<"原字符串为:\n"<<a<<endl;

      inti,j,k;

      for(i=0;a[i];i++){       //去重的指针编法见题【7-4x】

           j=i+1;

           while(a[j])

                 if(a[i]==a[j])

                      for(k=j;a[k];k++)     //可用strcpy(&a[j],&a[j+1])替换!

                            a[k]=a[k+1];

                 elsej++;

      }

      cout<<"去重后的字符串为:\n"<<a<<endl;

}

 

//【4-3s.通过指针变量交换实型序列的前n项和后n项】

#include <iostream.h>

void main()

{

      floata[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,11};

      inti,j,n=10;

      cout<<"原实型序列为:\n";

      for(i=0;i<n;i++){

           cout<<a[i]<<'\t';

           if((i+1)%5==0)cout<<endl;     //数组第一项是i=0,故要i+1!

      }

      cout<<"请输入要交换的项数:";

      cin>>j;

      float*p1=a,*p2=a+n-j,t;

      for(i=0;i<j;i++){

           t=p1[i];

           p1[i]=p2[i];

           p2[i]=t;

      }

      cout<<"交换后的实型序列为:\n";

      for(i=0;i<n;i++){

           cout<<a[i]<<'\t';

           if((i+1)%5==0)cout<<endl;

      }

}

 

//【4-4s.通过指针变量将字符串中的字符按ASCII码值从小到大排列】

#include <iostream.h>

void main()

{

      chara[100],*p1,*p2,*p3,t;

      cout<<"请输入一个字符串:";

      cin.getline(a,100);

      for(p1=a;*p1;p1++){

           p3=p1;

           for(p2=p1+1;*p2;p2++)

                 if(*p2<*p3)p3=p2;

           if(p3!=p1){

                 t=*p1;

                 *p1=*p3;

                 *p3=t;

           }

      }

      cout<<"排序后的字符串是:"<<a<<endl;

}

0 0
原创粉丝点击