c语言第7次实验报告

姓名:熊毅

实验地点:寝室

实验时间:2020.6.1

实验项目:

8.3.1指针基础及指针运算;
8.3.2数据交换;
8.3.3字符串反转及字符串连接;
8.3.4数组元素奇数偶数排列

实验目的与要求

(1)掌握指针的概念和定义的方法;
(2)掌握指针的操作符和指针的运算;
(3)掌握指针和数组的关系;
(4)掌握指针和字符串的关系;
(5)熟悉指针为函数的参数及返回指针的函数;
(6)了解函数指针。

实验内容

一、实验练习:8.3.1指针基础及指针运算
1问题的简单描述:

(1)定义一个整型指针变量p,使它指向一个整型变量a, 定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外-个整型变量c并赋初值3。
(2)使用指针变量,调用scanf(0函数分别输人a和b的值。
(3)通过指针间接访问并输出a、b的值。
(4)按十六进制方式输出p、q的值及a、b的地址。
(5)将p指向c,通过p间接访问c的值并输出。
(6)输出p的值及c的地址,并与上面的结果进行比较。

2实验代码:

  #include<stdio.h>
  int main() 
  {
      int *p,a,c=3;
      float *q,b;
      p=&a;
      q=&b;
	      printf("Please Input the Value of a, b:");
      scanf ("%d,%f",p,q);/*使用指针p和q输入a,b的值*/ 
      printf("Result: 
");
      printf("%d,%f
",a,b);
          printf("%d,%f
",*p,*q); /*通过指针p和q间接输出a,b的值*/
      printf("The Address of a, b:%p,%p
",&a,&b) ;
      printf("The Address of a, b:%p,%p
",p,q) ; /* 输出p和q的值并与上行输出结果进行比较*/
      p=&c;
      printf("c=%d
 ",*p) ;
      printf("The Address of C: %x,%x
",p,p); /*输出P的值及c的地址*/
      return 0 ;
  }

3问题分析:无
二、实验练习:8.3.2数据交换
1问题的简单描述:

(1)定义两个函数,分别为void swap1(int a, int b)和void swap2(int *a, int *b),用于交换a、b的值。
(2)从主函数中分别输人两个整型变量a、b。
(3)从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。
2实验代码:

  #include<stdio.h>
  void swap1(int x,int y);
  void swap2( int *x,int *y);
  int main()
  {
      int a,b;
      printf("Please Input a=:");
      scanf("%d",&a);
      printf("
b=:");
      scanf("%d",&b);
      swap1(a,b);
      printf("
After Call swap1:a=%d b=%d
",a,b);
      swap2(&a,&b);//实参传递
      printf("
After Call swap2:a=%d b=%d
",a,b);


      return 0;
  }
  void swap1(int x,int y)
  {
      int temp;
      temp=x;
      x=y;
      y=temp;
  }
  void swap2(int *x,int *y)
  {
      int temp;
      temp=*x;
      *x=*y;
      *y=temp;
  }

问题分析:无
三、实验练习:8.3.3字符串反转及字符串连接
1问题的简单描述:

(1)定义两个字符指针,通过getsO函数输人两个字符串。
(2)定义一个函数char *reverse(char *str), 通过指针移动方式将字符串反转。
(3)定义一个函数char *link(char *str1, char *str2), 通过指针移动方式将两个字符串连接起来。
(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。

2实验代码:

  #include<stdio.h> 
  char *reverse(char *str);
  char *link(char *str1,char *str2);
  int main()
  {
      char str[30] ,str1[30],*str2;
      printf("Input Reversing Character String:");
      gets(str);
      str2=reverse(str);
      printf("
Output Reverseed Character String:");
      puts(str2);
      printf("
Inpute String1:");
      gets(str);
      printf("
Inpute String2:");
      gets(str1);
      str2=link(str,str1);
      printf("Link String1 and String2:%s",str2);
      return 0;
  }
  char *reverse(char *str)
  {
      char *p,*q,temp;
      p=str,q=str;
      while(*p!='')//判断是否达到最后一个字符 ,让p指向最后一个字符,也就是''
      p++;
      p--;//回退一个字符 
      while(q<p)
      {
	temp=*q;//交换 pa所指向的字符 
	*q=*p;
	*p=temp;
	p--;//pa相向移动 
	q++;
      }
      return p;//返回交换好的字符串 
  }
  char *link(char *str1,char *str2)
  {
      char *p=str1,*q=str2;
      while(*p!='')//与上一个同理 
      p++;
      while(*q!='')
      {
	      *p=*q;//q指向的元素放在q里面,也就是在str1后面连接字符串 
	      q++;//指针相向移动 
	      p++;
      }
      *p='';//结尾赋值为'' 
      return str1;//返回交换好的字符串 
  }

问题分析:主要注意指针反转和return语句的返回值。
四、实验练习:8.3.4数组元素奇数偶数排列
1问题的简单描述:

(1)定义一个整型一 维数组,任意输人数组的元素,其中包含奇数和偶数。
(2)定义一个函数,实现数组元素奇数在左、 偶数在右的排列。
(3)在上述定义的函数中,不允许再增加新的数组。
(4)从主函数中分别调用上述函数,打印输出结果。

2实验代码:

  #include<stdio.h> 
  #define N 10 
  void arrsort(int a[],int n);//函数声明 
  int main()
  {
      int a[N],i;
      for(i=0;i<N;i++)
      scanf("%d",&a[i]);//注意这里&a[i] 的写法 
      arrsort(a,N);//调用函数 
      for(i=0;i<N;i++)
      printf("%d ",a[i]);

  }
  void arrsort(int a[],int n)
  {
      int *p,*q,temp;
      p=a;//指针先指向数组第一个元素 
      q=a+n-1;//指针先指向最后一个元素 
      while(p<q){//左边的偶数与右边的奇数调换位置 
	      while(*p%2!=0)//判断*p是不是奇数,目的是找到偶数 
	      p++;
	      while(*q%2==0)//*q找到奇数 
	      q--;
	      if(p>q)//两个指针交叉,结束程序 
	      break;
	      temp=*p;//交换两个指针所指向的值 
	      *p=*q;
	      *q=temp;
	      p++;//指针相向移动,便于下一步循环进行 
	      q--;
	
      }
  }

3问题分析:理解一个指向一维数组的指针加1或减1运算将指向数组的下一个元素或前一个元素,以及注意处理循环的条件。

实验小结

指针这一章是学习c语言以来较为吃力的一个章节,在课后也预习过,经过实验课的学习较为理解。所以还是要打好基础,巩固练习。

原文地址:https://www.cnblogs.com/Xiongyi1218/p/13259440.html