指针程序设计(二)

来源:互联网 发布:链表java 编辑:程序博客网 时间:2024/05/17 21:57

实验八  指针程序设计(二)

一.实验目的

1. 掌握指针的基本概念与操作方法;

2. 掌握字符指针、指针函数访问方式的程序设计。

二.实验环境

1. 硬件:PII以上计算机;

2. 软件:Windows、Visual C++ 6.0;

3. 其它:一张软盘或者U盘等可移动的存储设备。

三.实验内容

练习1.用指针变量的处理方法编写一个程序,功能为统计某一字符在字符串“This is a c/c++ program.”中出现的次数。

要求:程序中不得出现数组。

运行结果示例:

练习2.用指针变量的处理方法编写一个程序,其中包含一个子函数,功能为将字符串s中的字符c1用字符c2替换。

子函数形式为:void replace(char *str,char c1,char c2);

运行结果示例:

练习3.用指针数组的处理方法编写一个程序,其中包含一个子函数,功能为从键盘输入四个字符串,找出其值最小的一个字符串。

子函数形式为:int min(char *p[],int n);

(其中:n为字符串的个数,子函数返回值为最小字符串的指针数组元素的下标)

运行结果示例:

练习4.编写一个程序,其中包含一个子函数,功能为统计一个字符串在另一个字符串中出现的次数。要求:

l      子函数形式为:int strat(char *a,char*sub);

l      主函数中使用函数指针变量的方式调用子函数;

运行结果示例:

练习5.利用随机数生成一个M*M的二维数组(数据在0~20范围),以4*4矩阵为例:

⑴ 分别以上三角和下三角形式显示矩阵;

子函数形式:void out(int *p[]);

⑵ 求出矩阵两条对角线上所有元素之和;

子函数形式:void add(int *p[]);

⑶ 将矩阵的第一行与最后一行对应元素交换位置存储,并输出新矩阵的结果。

子函数形式:void exchange(int *p[]);

程序要求:程序中对数组的处理全部使用指针数组方式。

运行结果示例:

*练习6.编写一个程序,其中包含一个子函数,功能为将a,b两个字符串中共有的字符存储至数组c中并输出。要求:

l      子函数形式为:void seek(char *a,*b,*c);

指定测试数据:

 

 

练习1:

#include"iostream.h"

#include"stdio.h"

void main()

{

       chara,*p;

       inti=0;

       p="Thisis a c/c++ program.";

       cout<<"字符串为:";

       printf("%s\n",p);

       cout<<"输入字符:";

       cin>>a;

       for(;*p!='\0';p++)

              if(*p==a)i++;

              cout<<"字符"<<a<<"出现的次数:"<<i<<endl;

}

 

练习2:

#include"iostream.h"

#include"stdio.h"

#include"string.h"

void main()

{

  void replace(char *str,char c1,char c2);

  char s[80],c1,c2;

  printf("输入字符串:"); gets(s);

  cout<<"输入被替换字符:";cin>>c1;

  cout<<"输入新字符:";cin>>c2;

  replace(s,c1,c2);

  printf("新的字符串:%s\n",s);

}

 voidreplace(char *str,char c1,char c2)

 {

        char *p=str;

        for(;*p!='\0';p++)

               if(*p==c1)*p=c2;

}

 

练习3:

#include"stdio.h"

#include"string.h"

void main()

{

       intmin(char *p[],int n);

              chars[4][30],*p[4]=s[0];

       inti,m;

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

              gets(p[i]);

       m=min(p,4);

       printf("最小的字符串为:%s",p[m]);

}

       intmin(char *p[],int n)

       {

              intn=0,j;

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

              {

                     if(strcmp(p[j],p[j+1])<0)      n=j;

                     elsen=j+1;

              }

              return(n);

       }

 

练习4:

#include<iostream.h>

#include<stdio.h>

#include<string.h>

int strat(char *a,char *sub)

{

       char*p1=a,*p2=sub;

       inti=0,j,k,m;

       m=strlen(p2);

       while(*p1!='\0')

       {

              if(*p1==*p2)

              {

                     for(j=0,k=0;*(p1+j)!='\0',*(p2+k)!='\0';)

                     {

                            if(*(p1+j)==*(p2+k))

                            {

                                   k++;

                                   j++;

                            }

                            else

                                   break;

                     }

                     if(k==m)

                            i++;

                     p1++;

              }

              else

                     p1++;

       }

       returni;

}

void main()

{

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

       printf("输入字符串1:");

       gets(a);

       printf("输入字符串2:");

       gets(b);

       cout<<"n="<<strat(p1,p2)<<endl;

}

 

练习5:

#define M 4

#include<iostream.h>

#include<time.h>

#include<iomanip.h>

#include<stdlib.h>

void out(int *p[])

{

       inti,j;

       cout<<"上三角形式:"<<endl;

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

       {

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

                     cout<<*(p[i]+j)<<setw(6);

              cout<<endl;

       }

       cout<<"下三角形式:"<<endl;

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

       {

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

                     cout<<setw(8);

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

                     cout<<*(p[i]+j)<<setw(6);

              cout<<endl;

       }

}

void add(int *p[])

{

       inti,sum=0;

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

              sum+=*(p[i]+i);

       for(i=M-1;i>=0;i--)

              sum+=*(p[i]+i);

       if(M%2==1)

              sum=sum-*(p[(M-1)/2]+(M-1)/2);

       cout<<"对角线之和为:"<<sum<<endl;

       }

void exchange(int *p[])

{

       inti,j,t;

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

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

              {

                     t=*(p[i]+j);

                     *(p[i]+j)=*(p[M-1-i]+j);

              }

       cout<<"新矩阵为:"<<endl;

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

       {

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

                     cout<<*(p[i]+j)<<setw(6);

              cout<<endl;

       }

       cout<<endl;

}

void main()

{

       inta[M][M],*p[M]={a[0],a[1],a[2],a[3]},i,j;

       srand(time(NULL));

       cout<<M<<"*"<<M<<"矩阵的内容:"<<endl;

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

       {

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

              {

                     *(p[i]+j)=rand()%20;

                     cout<<*(p[i]+j)<<setw(6);

              }

              cout<<endl;

       }

       out(p);

       add(p);

       exchange(p);

       cout<<endl;

}

 

练习6:

#include<iostream.h>

#include<stdio.h>

void seek(char *a,char *b,char *c)

{

       inti,j;

       char*p1=a,*p2=b,*p3=c;

       for(;*p1!='\0';p1++)

              for(i=0;*(p2+i)!='\0';i++)

                     if(*p1==*(p2+i))

                     {

                            *p3=*p1;

                            p3++;

                     }

                     *p3='\0';

       for(p3=c;*p3!='\0';*p3++)

              for(i=1;*(p3+i)!='\0';i++)

              {

                     if(*p3==*(p3+i))

                     {

                            j=i;

                            for(;*(p3+j)!='\0';j++)

                            {

                                   *(p3+j)=*(p3+j+1);

                                   *(p3+j)='\0';

                            }

                     }

              }

}

void main()

{

       chara[10],b[10],c[10],*p1=a,*p2=b,*p3=c;

       printf("输入字符串a:");

       gets(a);

       printf("输入字符串b:");

       gets(b);

       seek(p1,p2,p3);

       cout<<"包含共有字符的字符串c:"<<c<<endl;

}