《C程序设计》上机实验报告(七)之指针的应用

实验内容:

1.运行程序

#include

void main()

{   int a=10,*p;

    p=&a;

    printf("%d",*p);

    scanf("%d",p);

    printf("%x",p);

    printf("%x",&p);

    *p=5;

    printf("%d",a);

    (*p)++;

    printf("%d",a);

}

要求:

  1. 分析程序,写出程序的运行结果。

(2)输入并调试上述源程序。

(3)运行程序,将分析结果和实际结果对照比。若不同,找出原因。

(4)说明p和a的关系。

2.运行程序

程序的作用是将输入的两个整数按从大到小的顺序输出。

#include

void main()

{

    int i1,i2,*p1,*p2,t;

    p1=&i1; 

    p2=&i2;

    printf("Enter two numbers:\n");

    scanf("%d%d",p1,p2);

    if(i1

    printf("i1=%d,i2=%d\n",i1,i2);

}

要求:

(1)写出并分析程序的运行结果。

(2)输入调试上述淅程序,并进行编译、连接、运行。

(3)若将变量定义改为:

int i1,i2,*p1,*p2,*p;

交换i1、i2值的语句改为:

   if(i1

结果将会怎样?为什么?

(4)若将第二条输出语句改为:

printf("Max=%d,Min=%d\n",*p1,*p2);

结果将会怎样?为什么?

3. 程序改错

程序中的函数fun的功能是:先将在字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面。例如,当s上的字符串为ABCDE时,则t中的字符串应为ABCDEEDCBA。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include

#include

#include

void main()

{

    int i,s1;

    s1=strlen(s);

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

        t[i]=s[i];

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

        t[s1+i]=s[s1-i-1];

    t[s1]='\0';

}

void main()

{

    char s[100],t[100];

    clrscr();

    printf("\nPlease enter string s:");

    scanf("%s",s);

    fun(s,t);

    printf("The result is :%s\n",t);

}

要求:

(1)分析改正源程序中的错误。

(2)对源程序进行编译、连接、运行。

(3)写出程序运行的正确结果。

4.程序填空

本程序从字符串str中截取从第m个字符开始的n个字符,然后输出。

#include

void main()

{

    static char str[]="goodmorning";

    char *p,*cut(char *s,int m,int n);

    p=cut(str,3,4);

    puts(p);

}

char *(char *s,int m,int n)

{

    int i;

    static char sub[10];

    for(i=0;i

        sub[i]=1 *(s + m + i - 1);     

sub[i]=2 '\0';       

return 3 sub;             

}

要求:

(1)输入并完善源程序。

(2)对源程序进行编译、连接、运行。

(3)写出程序运行的结果。

5.利用指针编写程序

编写一个函数,求1~m之间(含m)能被7或11整除的所有整数并放在数组a中,在main函数中输出这些数和这些数的个数。

例如:若m的值为50,则程序输出:

      7  11  14  21  22  28  33  35  42  44  49 

      总数:11

程序:#include

#define m 50//个数

bool hanser(int* p1)

{

  bool f = false;

  if (*p1 % 7 == 0 || *p1 % 11 == 0)

      f = true;

  return f;

}

void main()

{

  int a[m], i;

  bool f;

  int* p = a, t = 0;//t为总数

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

  {

      *(p + i) = i + 1;

      printf("%5d", *(p + i));

      if ((i + 1) % 5 == 0) printf("\n");

  }

  printf("能被7或11整除的所有整数有: \n");

  p = a;

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

  {

      f = hanser(p);

      if (f)

      {

          t++;

          printf("%5d", *p);

      }

      p++;

  }

  printf("\n");

  printf("t=%d", t);

}

6.利用指针编写程序

编写一个函数,将main函数输入的3×3矩阵转置,在main函数中输出转置的结果。

程序:void main()

{

  int a[3][3], i, j, t;

  printf("输入矩阵\n");

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

      scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);

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

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

      {

          t = *(*(a + i) + j);//数组a[i][j]= a[j][i];

          *(*(a + i) + j) = *(*(a + j) + i);

          *(*(a + j) + i) = t;

      }

  printf("转置后\n");

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

      printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);

}

7.利用指针编写程序

有n个学生围成一圈,按顺序排号。从第1个人开始报数,凡报到3的人退出圈子,问最后留下的是原来第几号的学生。  

要求及提示:

(1)n的值输入,输出最后留下的学生的顺序号

(2)用数组来存储n个学生。

(3)解题思路提示

step1:先利用数组开辟足够大的一个存储空间,指针P指向数组;

step2:输入n值,为这n个人编号;

step3:定义3个循环时所需计数变量

每次循环时的计数变量i,目的是控制指针是否指向了最后一个人,如果指向了最后一个人,则要使指向重新指向第一个人;  控制报数的变量k,目的是:按1、2、3报数时的计数变量。k为3时,将此人的编号设置为0,k重新计数;标识退出人数的变量m.目的是:记录已退出多少人,为循环结束做准备。

step4:循环继续条件:n-m>1。

程序:int main()

{

  system("color f3");

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

  printf("input the number of n:");

  scanf("%d", &n);

  p = num;

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

      *(p + i) = i + 1;

  i = 0;

  k = 0;

  m = 0;

  while (m < n - 1)

  {

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

          k++;

      if (k == 3)

      {

          *(p + i) = 0;

          k = 0;

          m++;

      }

      i++;

      if (i == n) i = 0;

  }

 

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

  printf("%d", *p);

  return 0;

}

8.利用指针编写程序

编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。

要求:

在主函数中输入字符串及m的值,并输出复制结果。在被调用函数中完成复制。

程序:#include

int main()

{

  void copy(int m, char* a, char* b);

  char a[] = "i am a studant", b[30];

  int m;

  printf("输入m:");

  scanf("%d", &m);

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

  scanf("%s", b);

  copy(m, a, b);

  printf("%s", a);

}

void copy(int m, char* a, char* b)

{

  int i, j;

  for (i = m - 1, j = 0; b[j] != 0; i++, j++)

  {

      a[i] = b[j];

  }

  a[i] = 0;

}

9.利用指针编写程序

设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。

例如:原数列为2,4,6,8,10,12,14,16,18,20。若要求把从第4个数开始的5个数按

逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20

要求:

进行逆序处理时使用指针方法。

程序:#define N 10

void order(int* pa, int m1, int n1)

{

  int temp, * pm1, * pend, * pminddle;

  pm1 = pa + m1 - 1;

  pend = pa + m1 + n1 - 2;

  pminddle = pa + m1 - 1 + n1 / 2;

  for (; pm1 < pminddle; pm1++, pend--)

  {

      temp = *pm1;

      *pm1 = *pend;

      *pend = temp;

  }

}

int main()

{

  int a[N];

  int m, n, i;

  printf("输入一个已排好序的数:");

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

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

  printf("输入指定位置m:");

  scanf("%d", &m);

  printf("输入重新排的个数n:");

  scanf("%d", &n);

  printf("输出原序的:");

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

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

  printf("输出重排序的:");

  order(a, m, n);

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

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

  return 0;

}

10.利用指针编写程序

编写具有如下原型的函数:

void chgStr(char *ip,char *op)

负责将ip所指向输入字符串中的各字符按照指定规则进行变换后,存放到由op指向的输出串中。即从头到尾逐字符地对ip所指向的字符串进行如下处理:

(1)若ip所指当前字符为字母,则将其改变大小写后存放到结果字符串op中。

(2)若ip所指当前字符是一个数字字符,则将其变换为另一个数字字符后存放到结果字符串op中:字符0变换为字符9,字符1变换为字符8,字符2变换为字符7,依此类推,字符9变换为0。

(3)若ip所指当前字符为其它字符,则将该字符复制到结果字符串op中。

例如:若调用时通过ip带来的字符串为“Nankai 1918-2004,x+y-5*6/37=?OK!”,则结果字符串op应为“nANKAI8081-7995,X+Y-4*3/62=?ok!”。

最后编写主函数,对chgStr()进行调用,以验证其正确性。

程序:void chgStr(char* ip, char* op)

{

    int i;

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

    {

        if (*(ip + i) >= 65 && *(ip + i) < 65 + 26)

        {

            *(op + i) = *(ip + i) + 32;

        }

        else if (*(ip + i) >= 97 && *(ip + i) <= 97 + 26)

        {

            *(op + i) = *(ip + i) - 32;

        }

        else if (*(ip + i) >= 48 && *(ip + i) <= 57)

        {

            *(op + i) = 48 + 57 - *(ip + i);

        }

        else

        {

            *(op + i) = *(ip + i);

        }

    }

    op[i] = '\0';

}

int main()

{

    char ip[30], op[30];

    scanf("%s", ip);

    chgStr(ip, op);

    printf("%S", op);

}

程序测试及运行结果:

1.《C程序设计》上机实验报告(七)之指针的应用_第1张图片

2.

《C程序设计》上机实验报告(七)之指针的应用_第2张图片

3.

《C程序设计》上机实验报告(七)之指针的应用_第3张图片

4.《C程序设计》上机实验报告(七)之指针的应用_第4张图片

5.

《C程序设计》上机实验报告(七)之指针的应用_第5张图片

6.

《C程序设计》上机实验报告(七)之指针的应用_第6张图片

7.《C程序设计》上机实验报告(七)之指针的应用_第7张图片

8.《C程序设计》上机实验报告(七)之指针的应用_第8张图片

 

9.《C程序设计》上机实验报告(七)之指针的应用_第9张图片

10.

《C程序设计》上机实验报告(七)之指针的应用_第10张图片

结果分析与讨论:

1.怎样正确使用数组的指针和指向数组的指针变量。

答:通过针引用数组元素的基本方法 (1)下标法:a [i]。 (2)指针法:* (a+i) 或 * (p+i),其中a是数组名,p是指向数组元素的指针变量,其初值p=a。因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

数组指针的类型和数组元素的类型有关,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int *

2.怎样正确使用字符型指针处理字符串问题?

答:将字符串地址赋予指针,然后用指针进行地址的交换或内容的交换,在使用字符指针时,要特别注意,是否后续会更改该字符串的值,若需要更改,不要使用char buf=“abcd”;

你可能感兴趣的:(实验报告,c语言,算法,开发语言)