指针练习-19

实验十九  指针的使用

实验要求:

1、掌握指针的定义;

2、理解指针的含义;

3、掌握指针的基本使用;

4、能进行程序调试,并修改程序。

特别要求:

在实验中遇到困难时,切忌不要动不动就问老师,而是应该先思考。如果确实不能解决困难,先与坐在旁边的同学讨论,而无论这个同学在以前是否认识。如果有同学问你问题,无论你是否能解决这个问题,都应该和他讨论。如果讨论了仍然不能解决问题,就一起问老师。讨论问题的好处在于能够深刻的理解问题,记住问题。

程序设计

1. 编写程序,从键盘输入一个字符ch,在字符串string中查找是否存在有该字符,若存在,则给出该字符在字符串中第1次出现的位置。要求设计函数char * search(char *str,char c),其功能为:在str所指的字符串中,查找是否有字符变量c的字符,如果有,返回字符串中相同字符的地址,如果没有则返回NULL。

输入描述:

在main函数里面分别输入字符串str和字符c;

输出描述:

如果有则输出yes,没有则输出no.

输入样例:

Ashdaslas

h

输出样例:

yes

/*p11_1.c*/

#include <stdio.h>

 

int main()

{ char * search(char *str,char c);

  char s[81],c;

  gets(s);

  scanf("%c",&c);

  printf("%s\n",search(s,c));

}

char * search(char *str,char c)

{int i;

 for(i=0;str[i]!='\0';i++)

    if(str[i]==c)  return("yes");

 return("no");

}

 

2,指出下面常用指针定义的含义

int i;

int *i;

int **i;

int *i[5];

int (*i)[5];

int *i( );

int *(*i)( );

int *(*i[])();

int (*i)();

 

/*p11_2.c*/

int i;整形变量i

int *i;i为指向整形数据的指针变量

int **i;i是一个指针变量,它指向一个指向整形数据的指针变量

int *i[5];i为指针数组,它由5个指向整形数据的指针元素组成、

int (*i)[5];i为指向含5个元素的一维数组的指针变量

int *i( );i为返回一个指针的函数,该指针指向整形数据

int *(*i)( );指向函数的指针的值

int *(*i[])();指向返回值为整数指针的函数的指针数组

int (*i)();指向函数的指针,该函数返回一个整形值

 

 

3、编写一个程序,输入星期,输出该星期的英文名(MondayTuesdayWednesdayThursdayFridaySaturdaySunday)。用指针数组处理。

输入样例:

1

输出样例:

Monday

/*p11_3.c*/#include <stdio.h>

 

int main()

{   char *a[]={"Monday","Tuesday",

               "Wednesday","Thursday","Friday",

               "Saturday","Sunday"};

    int n;

      scanf("%d",&n);

      if(n<1 || n>8)

           printf("Error\n");

      else

        printf("%s\n",a[n-1]);

}

 

 

 

4、删除大写字母

题目描述

输入一个字符串,将这个字符串中的大写英文字母除去,输出剩余的字符组成的字符串。(要求用指针做)

输入描述

输入一个字符串,包含有大写英文字母

输出描述

输出除去大写英文字母的剩余字符串

样例输入

123YUadfNBweK89

样例输出

123adfwe89

/*p11_4.c*/

#include <stdio.h>

#include <string.h>

int main()

{   char a[81],*p;

    int i,j;

      p=a;

      gets(a);

      for(i=0,j=0;i<strlen(a);i++)

      {

           if(a[i]<'A' || a[i]>'Z')

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

             

      }

    p[j]='\0';

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

      return 0;

}

 

5、报文解密

题目描述

输入一个字符串,将该字符串进行解密。解密规则:大写字母'A', 'B','C', 'D'用'W', 'X', 'Y', 'Z'代替,对于'E'到'Z'的字母,分别用原字母的前4个字符代替,其他字符保持不变。(要求用指针来做)

输入描述

原字符串

输出描述

解密后的字符串

样例输入

ABCDEFGHIJKLMNOPQRSTUVWXYZ

样例输出

WXYZABCDEFGHIJKLMNOPQRSTUV

/*p11_5.c*/

#include <stdio.h>

#include <string.h>

Int main()

{

char a[81];

int i;

gets(a);

for(i=0;i<strlen(a);i++)

{

  if(a[i]>=’E’ && a[i]>=’Z’)

      a[i]=a[i]-4;

  else if(a[i]>=’A’ && a[i]>=’D’)

a[i]=a[i]+21;

     else

          a[i]=a[i];

}

puts(a);

return 0;

}

 

6、矩阵的加法

题目描述

求两个n*n(n<10)矩阵的加法。矩阵的数据由用户输入,输出矩阵和。

要求:

1.void ADD(int (*pa)[10],int(*pb)[10],const int n);

函数功能:将行指针pa指向的矩阵与行指针pb指向的矩阵相加,结果存放到pa指向的矩阵中。

输入描述

第一行输入n的数值;然后输入矩阵a的n*n个数据和矩阵b的n*n个数据

输出描述

矩阵a和矩阵b相加后得到的矩阵。

样例输入

3

1 2 3

4 5 6

7 8 9

7 8 9

4 5 6

1 2 3

样例输出

8  10  12

8  10  12

8  10  12

/*p11_6.c*/

#include <stdio.h>

void main()

{   void ADD(int (*pa)[10],int (*pb)[10],const int n);

    int a[10][10],b[10][10],i,j,n;

      scanf("%d",&n);

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

      {

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

           {

            scanf("%d", &a[i][j]);

        }

    }

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

      {

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

           {

            scanf("%d", &b[i][j]);

        }

    }

    ADD(a,b,n);

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

      {

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

           printf("%d ",a[i][j]);

           printf("\n");

      }

}

void ADD(int (*pa)[10],int (*pb)[10],const int n)

{

      int i,j;

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

       {

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

           {

            pa[i][j]=pa[i][j]+pb[i][j];

        }

       }

}

7、约瑟夫问题

题目描述

下面是一种变化的约瑟夫问题,有30个人围坐一圈,从1到M按顺序编号,从第1个人开始循环报数,凡报道7的人就退出圈子,请按照顺序输出退出人的编号。

输出样例(5个一组):

7  14 21 28 5

13 22 30 9  18

27 8  19 1 12

25 10 24 11 29

17 6  3 2  4

16 26 15 20 23

/*p11_6.c*/

#include <stdio.h>

 

int main()

{

    // 假设k=3为报到计数单位量

    int i,k,m,n,num[50],*p;

    printf("输入人的数量:n=");

    scanf("%d",&n);

    p=num;

     

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

        *(p+i)=i+1;//1n为序给每个人编号

    i=0;//i为每次循环时计数变量

    k=0;//k为按1,2,3报数时的计数变量

    m=0;//m为退出人数

    while (m<n-1)//当退出人数比n-1少时执行循环体

    {

        if(*(p+i)!=0) k++;

        if (k==7)

        {

            printf("出局人序号:%d\n",*(p+i));

         *(p+i)=0;//将退出的人的编号置为0

        k=0;//k报到7,重置为0

        m++;//退出的人数+1

        }

        i++;

        if (i==n) i=0;//报数到尾后,i恢复为0

    }

    while (*p==0) p++;//如果p所指向的值等于0.那么就执行p++让它指向下一个元素,直到不为0.

    printf("最后留下的人的编号是:%d\n",*p);//经过上面的循环后,*p的指向的编号就是最后留下的人

     

    return 1;

}

 

 

 

总结(本次实验遇到的问题、解决方法,今后要注意的地方)

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值