指针练习-17

来源:互联网 发布:linux mmap 实例 编辑:程序博客网 时间:2024/06/05 15:49

实验十七  指针的使用

实验要求:

1、掌握指针的定义;

2、理解指针的含义;

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

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

特别要求:

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

程序设计

1. 下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。

#include<stdio.h>

#include<string.h>

void change(                  )          //1

{int i=0;

 for(i=0;          ;i++)              //2

   if(a[i]>='a'&&a[i]<='z')

                  ;           //3

}

void main()

{

char p[80];

gets(p) ;                   //读一行字符,中间可以有空格

 change(p);

 puts(p);

}

/*p11_1.c*/

char *a

a[i]!= '\0'

a[i]=a[i]-32

 

2,指向二维数组

阅读下面程序,写出结果,了解指针与二维数组地址的关系。

#include<stdio.h>

voidmain()

{

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

       int *p;

       p=a[0];

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

       printf("a=%lu\n",a);

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

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

       printf("a[0]=%lu\n",a[0]);

       printf("&a[0][0]=%lu\n",&a[0][0]);

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

       printf("a+1=%lu\n",a+1);

       printf("*a+1=%lu\n",*a+1);

       printf("p+1=%lu\n",p+1);

       printf("a[0]+1=%lu\n",a[0]+1);

       printf("&a[0][0]+1=%lu\n",&a[0][0]+1);

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

       printf("*a+1*4+2=%lu\n",*a+1*4+2);

       printf("p+1*4+2=%lu\n",p+1*4+2);

       printf("a[0]+1*4+2=%lu\n",a[0]+1*4+2);

       printf("&a[0][0]+1*4+2=%lu\n",&a[0][0]+1*4+2);

}

在上面的程序中,请回答以下问题:

(1)二维数组名a、*a分别代表什么含义?

(2)表达式a+1、*a+1分别代表什么含义?

(3)指针p与二维数组a的关联使用了这样的语句:p=a[0],是否还有其他的语句能将指针p与二维数组a相关联?能否使用这样的语句:p=a;相关联。

/*p11_2.c*/

1 a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。

2 a+1   第一行首地址*a+1    第0行第一列元素地址 。

3  p=a[0][0],    不能 a代表a数组的首行首元素的地址。

 

3、题目标题

回文

题目描述

回文指的是一个字符串顺过来读和倒过来读是一样的,比如”civic”。写一个函数,判断某个字符串是不是回文,并在主函数中输入字符串,调用此函数进行判断。函数原型如下:int is_huiwen(char* s);

输入描述

一个字符串

输出描述

如果此字符串为回文,输出yes,否则输入no

样例输入

civic

bonjour

样例输出

yes

no

 

/*p11_3.c*/

#include<stdio.h>

#include<string.h>

int main()        

{

      int is_huiwen(char* s);

    int a[81],f=1;

      gets(a);

    f=is_huiwen(a);

    if(f==1)

           printf("yes\n");

      else

           printf("no\n");

      return 0;

}

int is_huiwen(char *s)

{

   int i,j,f=1;

   i=0;j=strlen(s)-1;

   while(i<j)

   { 

        

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

   {    

         i++;j--;

   }

      else

        {     

             f=0;

           break;

        }

    

   }

  return f;  

}

 

 

4、下面程序的功能是将字符串a分段传送到字符串b中。要求在每五个字符后插入一个逗号,以示分段。例如字符串a为"abcdefg12345",则字符串b为"abcde,fg123,45",请选择填空。

# include <stdio.h>

main()

{ int  i,k=0;

  char  a[80],b[80],*p;

   p=a;

 gets(p);

  while(*p)

     {for(i=1;__①__;p++,k++,i++)

           b[k]=*p;

       if(__②__)

 {  b[k]=',' ;  k++;}

      }

  b[k]='\0';

  puts(b);

}

①  A、i<5            B、i<=5

  C、i<5&&*p!='\0'  D、i<=5&&*p!=’\0’

②  A、i= =6     B、*P= ='\0'  

C、!*p       D、i!=6

 

/*p11_4.c*/

D

A

 

5、空格删除

题目描述

完成函数 int strdel (char *s)的定义,它实现将指针s指向的字符串中所有空格字符删除,并统计所删除的空格字符的个数返回给主函数。编写主程序,验证strdel ()的有效性。

输入描述

输入一个带空格字符的字符串。

输出描述

对于每个测试实例,输出分两行:

第一行输出删除所有空格之后的字符串;

第二行输出被删除空格的总数。

样例输入

ab c  de

样例输出

abcde

4

/*p11_5.c*/

#include <stdio.h>

#include <string.h>

int main()

{  int strdel (char *s);

   char  a[81],*q;

   int i,sum=0;

   gets(a);

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

   { if(a[i]==' ')

              sum++;

   }

   q=strdel(a);

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

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

}

int strdel(char *s)

{   int i=0,j=0;

      for(;i<strlen(s);i++)

      {if(s[i]!=' ')

      {   

            s[j++]=s[i];

      }

      }

      s[j]='\0';

      return s;

}

 

6、编写程序,对一组英文单词字符串进行按字典排序方式(从小到大)进行排序。请设计一个排序函数void sort(char *words [], int n),可以对words中的n个字符串进行排序。

主函数已经给出如下:

#include<stdio.h>

#include<string.h>

void sort(char *words[], int n);

void main()

{

    char *wString[]={"implementation","language","design","fortran","computer "};

    int i, n=5;

    printf("The words are :\n");

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

       printf ("\twString[%d]=%s\n",i, wString[i]);

    printf("After sort,The wordsare:\n");

    sort(wString,n);      /* 调用函数,对指针数组wString中的n个字符串排序 */

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

       printf ("\twString[%d]=%s\n",i, wString[i]);

}

void sort(char *words[], int n)

{

}

请完成void sort(char *words[], int n)函数的功能。

/*p11_6.c*/

void sort(char *words [], int n)

 

{ char *s;

  int i,j,t;

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

  {   t=1;

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

             if(strcmp(words[t],words[j])>0)

             {   t=j;

          }

               s=words[t];

           words[t]=words[i];

           words[i]=s;

  }

 

}

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

1    把=和==搞混了。

2    忘记;

3    把实参字符在函数定义中使用