• 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语言以来较为吃力的一个章节,在课后也预习过,经过实验课的学习较为理解。所以还是要打好基础,巩固练习。

  • 相关阅读:
    python2.7学习记录之三
    编程题
    解题的小问题(C++)
    算法入门(C++)
    逻辑回归
    入门级(python)
    python2.7学习记录之二
    sql语句-排序后加入序号再运算判断取想要的项
    linux中c多线程同步方法
    进程间的通讯方式
  • 原文地址:https://www.cnblogs.com/Xiongyi1218/p/13259440.html
Copyright © 2020-2023  润新知