指针练习-18

实验十八  指针的使用

实验要求:

1、掌握指针的定义;

2、理解指针的含义;

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

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

特别要求:

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

程序设计

1.阅读下面的程序,了解指向简单变量的指针p和指向多个元素的指针t的特性。并掌握他们的方法。

#include<stdio.h>

voidmain()

{

       inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},i;

       int *p,(*t)[4];

       p=a[0];                /*指向数组的首地址*/

       t=a;                   /*指向数组的首地址*/

       printf("p=%lu,*p=%d\n",p,*p);

       printf("t=%lu,**t=%d\n",t,**t);

       printf("-------------------\n");

       p=p+1;

       t=t+1;

       printf("p=%lu,*p=%d\n",p,*p);

       printf("t=%lu,**t=%d\n",t,**t);

       printf("-------------------\n");

       p=p-1;                 /*重新指向数组的首地址*/

       t=t-1;                 /*重新指向数组的首地址*/

       printf("用指针p输出数组元素:\n");

       for(;p<a[0]+12;p++)  

              printf("%d  ",*p);

       printf("\n用指针t输出数组元素:\n");

       for(;t<a+3;t++)      

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

                     printf("%d  ",*(*t+i));

}

/*p11_1.c*/

 

 

2,月份的中英文转换

题目描述

编写程序,在主函数中定义含有12个指针的指针数组,使它的12个元素分别指向由月份组成的字符串常量(January 、February 、March 、April、May、June、July、August、September、October、November、December)。设计一个循环,根据键盘输入的数字月份(1-12),输出相应的月份字符串。若输入错误,则输出"Error"

输入描述

每个用例是一个整数。

输出描述

若该整数为1-12之间,则输出其对应的英文月份,否则输出“Error”。以换行结束。

样例输入

1

12

15

样例输出

January

December

Error

/*p11_2.c*/

#include <stdio.h>

 

int main()

{   char *a[]={"January","February","March","April",

              "May","June","July","August","September",

                   "October","November","December"};

    int n;

      scanf("%d",&n);

      if(n<1 || n>12)

           printf("Error\n");

      else

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

}

 

3、字符串中找最大字符

题目描述

编写一个函数char fact(char *p),功能是找字符串中ASCII码最大的哪个字符。

在主函数中输入一个字符串,串长不超过80个字符,调用函数fact,找出最大字符,并在主函数中输出。

输入描述

输入一个字符串

输出描述

串中最大的字符

样例输入

Waf89KZ

样例输出

f

/*p11_3.c*/

#include <stdio.h>

 

int main()

{   char fact(char *p);

      char a[81],z;

    gets(a);

      z=fact(a);

    printf("%c\n",z);

}

 

char fact(char *p)

{  int i;

   char a;

   a=p[0];

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

   {

         if(p[i]>a)

              a=p[i];

   }

   return a;

}

 

4、复制一维数字(指针)

题目描述

编写一个程序,初始化一个int数组source[5],然后把数组内容复制到另外两个数组target1[5]和target2[5]中。制作第一份拷贝的函数void copy_arr(,int source[], int tar1[])使用数组符号。制作第二份拷贝的函数voidcopy_ptr(int source[],int *tar2)使用指针符号,并使用指针的增量来操作。

输入描述

一个int数组source[5]

输出描述

输出“target1:X X X X X”和“target2:X X X X X”,各占一行

样例输入

10 24 11 30 38 42

样例输出

target1:10 24 11 30 38 42

target2:10 24 11 30 38 42

/*p11_4.c*/

#include <stdio.h>

#include <stdlib.h>

void main()

{  void copy_arr(int source[],int tar1[]);

   void copy_ptr(int source[],int *tar2);

   int source[5],i,tar1[5],*tar2;

   tar2=(int *)malloc(sizeof(int)*5);

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

   {   

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

   }

   copy_arr(source,tar1);

   copy_ptr(source,tar2);

   printf("target1:");

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

   {   

          printf("%d ",tar1[i]);

   }

   printf("\n");

   printf("target2:");

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

   {   

          printf("%d ",tar2[i]);

   }

   printf("\n");

}

void copy_arr(int source[],int tar1[])

{

     int i;

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

            tar1[i]=source[i];

}

void copy_ptr(int source[],int *tar2)

{

    int i;

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

         tar2[i]=source[i];

}

 

5、字符串的比较(指针版)(不能调用现有的比较函数)

题目描述

从键盘输入任意两个字符串s1和s2,其长度都不超过100。比较字符串的大小(字符串比较是从左到右逐位比较),如果s1>s2,输出1;s1=s2,输出0;s1<s2,输出-1。编写函数实现该功能。

int strcmpa(const char *s1,const char *s2)

在主函数中调用这个函数,进行验证。

输入描述

每个测试用例占两行,包含2个字符串。

输出描述

对应每个测试用例,输出一个整数,表示比较的结果;

样例输入1

C++

Program

样例输出1

-1

样例输入2

student

student

样例输出2

0

/*p11_5.c*/

#include <stdio.h>

#include <string.h>

int main()

{  int strcmpa(const char *s1,const char *s2);

   char s1[100],s2[100];

   int f;

   gets(s1);

   gets(s2);

   f=strcmpa(s1,s2);

   printf("%d\n",f);

}

 

int strcmpa(const char *s1,const char *s2)

{  if(strcmp(s1,s2)>0)

           return 1;

   else if(strcmp(s1,s2)==0)

           return 0;

   else 

           return -1;

}

 

6、删除升序数组中的重复元素(指针版)

题目描述

编写程序,在被调函数中删去一维数组中所有相同的数,使之只剩一个,数组中的数已按由小到大的顺序排列,被调函数返回删除后数组中数据的个数。

int unique(int *pArr,int num),pArr和num分别为数组首地址和数组元素的个数。

函数实现的功能如下:

原数组:2 2 2 3 4 4 5 6 6 6 67 7 8 9 9 10 10 10

删除后:2 3 4 5 6 7 8 9 10

输入描述

输出描述

输出删除重复元素以后的升序序列。各个元素以空格隔开,最后以换行结束。

样例输入

样例输出

2 3 4 5 6 7 8 9 10

/*p11_6.c*/

#include <stdio.h>

#include <string.h>

int main()

{  int unique(int *pArr,int num);

   int a[]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10};

   int num,i,f;

   f=unique(a,19);

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

   {   

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

   }

   printf("\n");

   return 0;

}

int unique(int *pArr,int num)

{   int i,j;

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

      {    

           if(pArr[j]!=pArr[i])

           { ++j;

             pArr[j]=pArr[i];

            

           }

      }

      return j;

}

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

1    数组名要对应。

2    函数调用中指针要用名称加*就表示值而不是指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值