zoukankan      html  css  js  c++  java
  • 第八章 指针实验

    C程序实验报告

    实验项目:

    1、指针基础及指针运算

    2、数据交换

    3、字符串反转及字符串连接

    4、数组元素奇偶排列

    姓名:王治林  实验地点:教学楼514教室  实验时间:2019.6.12

    一、实验目的与要求

    1、掌握指针的概念和定义方法

    2、掌握指针的操作符和指针的运算

    3、掌握指针与数组的关系

    4、掌握指针与字符串的关系

    5、熟悉指针作为函数的参数以及返回指针的函数

    6、了解函数指针

     二、实验内容

    一、指针基础及指针运算(8.3.1)

    1、问题的简单描述

    (1)定义一个整形指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整形变量c并赋初值3。

    (2)使用指针变量,调用scanf函数分别输入a和b的值。

    (3)通过指针间接访问并输出a、b的值。

    (4)按十六进制方式输出p、q的值以及a、b的地址。

    (5)将p指向c,通过p间接访问c的值并输出。

    (6)输出p的值及c的地址,并与上面的结果进行比较。

    2、实验代码

    #include<stdio.h>
    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);
        printf("Result: 
    ");
        printf("%d,%f
    ",a,b);
        printf("%d,%f
    ",*p,*q);
        printf("The Address of a,b:%p,%p
    ",&a,&b);
        printf("The Address of a,b:%p,%p
    ",p,q);
        p=&c;
        printf("c=%d
    ",*p);
        printf("The Address of a,b:%x,%x
    ",p,&c);
        return 0;
    }

    3.运行效果:

    4.问题分析:指针基本交换,比较简单

    二、数据交换(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);
    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;
    }

    3.实验效果:
    4.实验分析

    注意指针和值的概念,转换起来才会知道步骤。还有注意当地址变化,值的变化与否。

    三、字符串反转及字符串连接

    1、问题的简单描述

    (1)定义两个字符指针,通过gets()函数输入两个字符串。

      (2)定义一个函数char reverse(char str),通过指针移动方式将字符串反转。

      (3)A定义一个函数char link(char str1,char *str2),通过指针移动方式将两个字符串连接起来。

      (4)从主函数中分别调用上述函数,输入字符串并打印输出结果。

    2、实验代码

    #include <stdio.h>
    char *reverse (char *str);
    char *link (char *str1,char *str2);
    main ()
    {
        char str[30],str1[30],*str2;
        printf("input revesing character string:");
        gets(str);
        str2=reverse(str);
        printf("
    output revesed character string:");
        puts(str2);
        printf("input string1: ");
        gets(str);
        printf("
    input string2: ");
        gets(str1);
        str2=link(str, str1);
        printf("link string1 and string2 :");
        puts(str2);
        return 0;
    }
    char*reverse(char *str)
    {
        char *p,*q,temp;
        p=str;
        q=str;
        while(*p!='')
            p++;
        p--;
        while(q<p)
        {
            temp=*q;
            *q=*p;
            *p=temp;
            q++;
            p--;
        }
        return str;
    }
    char *link(char *str1,char *str2)
    {
        char *p=str1,*q=str2;
        while (*p!='')
            p++;
        while (*q!='')
        {
            *p=*q;
            q++;
            p++;
        }
        *p=*q;
        return str1;
    }

    3.实验效果
    4.实验分析:这个题目说实话卡了很久,就是不明白相向移动到底该怎么做才算。还有就是不知道什么时候是++,什么时候是--。后面问同学才知道。

    四、数组元素奇偶排列(8.3.3)

    1、问题的简单描述

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

    2、实验代码:

    #include <stdio.h>
    #define N 10
    void arrsort (int a[],int n)
    {
        int *p,*q,temp;
        p=a;
        q=a+n-1;
        while(p<q)
        {
            while(*p%2!=0)
                p++;
            while(*q%2==0)
                q--;
            if(p>q)
               break;
            temp=*p;
            *p=*q;
            *q=temp;
            p++;
            q--; 
         } 
    } 
    main()
    {
        int a[N],i;
        printf("输入:");
        for(i=0;i<N;i++)   
        scanf("%d",&a[i]);
        arrsort(a,N);
        printf("输出:");
        for(i=0;i<N;i++)
        printf("%d ",a[i]);
    }

    3.实验效果:

    4.实验分析:这个题目和上一个类似,也要做到相向移动。一开始还是不明白怎么转换位置。还是对指针了解不够深入吧。但是看了同学的以后就看懂了。

    三、实验小结:

    指针是c语言的重难点,在上课的时候就看出来,比较难理解和容易搞混概念。经常会不明白位置变换对值的影响。还是的多看多理解。

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/wangzhilin/p/11031192.html
Copyright © 2011-2022 走看看