第六周作业

  这个作业属于那个课程    C语言程序设计ll
       这个作业要求在哪里    https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/homework/2827
       我在这个课程的目标是   会简单使用指针
       这个作业在那个具体方面帮助我实现目标   回顾了上个学期学的函数
         参考文献    各大博客和论坛
  6-1 求两数平方根之和 (10 分)
        函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。
        函数接口定义:
          double fun (double *a, double *b); 
   其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。

裁判测试程序样例:

  #include<stdio.h>
 #include <math.h> 
double fun (double *a, double *b); 
int main ( 
{ double a, b, y;
scanf ("%lf%lf", &a, &b );
y=fun(&a, &b);
 printf ("y=%.2f\n", y );
return 0;
}

/* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94

1.实验代码

        double fun (double *a, double *b)
        {
          double sum=0;
          sum=sqrt(*a)+sqrt(*b);
          return sum;
        }

2设计思路
1581803-20190405123931926-743853554.png

3
主要是对指针的理解
4运行截图
1581803-20190405124240135-412967734.png

7-1 利用指针返回多个函数值 (30 分)
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。

输入格式:
输入有两行: 第一行是n值; 第二行是n个数。

输出格式:
输出最大值和最小值。

输入样例:
在这里给出一组输入。例如:

5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:

max = 12
min = 0
1,实验代码

        #include<stdio.h>

        void max_min(int n, int *a);

        int main()
        {
            int n;
            scanf("%d", &n);
        int a[n];
        for(int i = 0;i < n;i++)
        {
            scanf("%d", (a + i));
        } 
    
        max_min(n, a);
        return 0;
    }

    void max_min(int n, int *a)
    {
        int t;//临时变量 
        for(int i = 0;i < n - 1;i++)
        {
            for(int j = 0;j < n - i - 1;j++)
            {
                if(*(a + j) < *(a + j + 1))
                {
                    t = *(a + j + 1);
                    *(a + j + 1) = *(a + j);
                    *(a + j)= t; 
                }
            }
        }
        printf("max = %d\n", *(a));
        printf("min = %d\n", *(a + n - 1));
    
    }

2设计思路
1581803-20190405134251246-1817905621.png

3主要错误
对数组掌握还是不太好
当中for嵌套中总是出错,指针运用的不灵活
4 运行截图
1581803-20190405134552184-285923676.png

1581803-20190405134625483-792296286.png
1581803-20190405134653246-879621097.png

              6-3 最小数放前最大数放后 (10 分)

为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。。

函数接口定义:

void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);

三个函数中的 arr和n 都是用户传入的参数。n 是元素个数。

input函数的功能是输入 n个元素存到指针arr所指向的一维数组中。

max_min函数的功能是求指针arr所指向的一维数组中的最大值和最小值,其中最小的数与第一个数对换,将最大的数与最后一个数对换。

output函数的功能是在一行中输出数组元素,每个元素输出占3列。

裁判测试程序样例

#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
 max_min(a,10);
 output(a,10);
 return 0;
}

/* 请在这里填写答案 */
输入样例:
5 1 4 8 2 3 9 5 12 7
输出样例:
1 5 4 8 2 3 9 5 7 12

1 实验代码

    #include<stdio.h>
    void input(int *arr,int n);
    void max_min(int *arr,int n);
    void output(int *arr,int n);
    int main()
    { int a[10];
    input(a,10);
     max_min(a,10);
         output(a,10);
     return 0;
    }
       /*以下为答案*/
    void input(int *arr, int n)
    {
      int i;
      
      for(i = 0;i<n; i++)
      {
        scanf("%d", &arr[i]);
      }
    }
    void max_min(int *arr,int n)
    {
      int i, max, min;
          int t, pmax, pmin;
          max = min = arr[0];
      for(i = 1; i<n; i++){  
       if(max<arr[i])
        {
          max = arr[i];
          pmax = i;
        }  
        if(min>arr[i])
        {
          min = arr[i];
          pmin = i;
        }
       } 
       //按要求交换max,min位置,其他不变
        t = arr[0];
        arr[0] = arr[pmin];
        arr[pmin] = t;
        t = arr[n-1];
        arr[n-1] = arr[pmax];
            arr[pmax] = t;
    }
    void output(int *arr, int n)
    {
      int i;
      for(i = 0; i<n; i++)
      printf("%3d", arr[i]);
    }

2 设计思路

3问题
将for循环嵌套范围弄错了
最大值最小放入数组的顺序错了
4运行截图
1581803-20190405140458807-2118561082.png

思考题:(分值等同于编程题)
   1.为什么要使用指针?它有什么用?
在实际编程中,既然使用变量就可以访问数据,为什么还用指针呢?使用指针来操纵自动变量的唯一原因是,为了说明指针的工作原理。指针真正的用途是被用于完成下列3种任务:

管理自由存储区中的数据
访问类的成员数据和函数
按引用传递参数
    在“函数的 工作原理 ”中,提到了5个内存区域:

全局名称空间
自由存储区
寄存器
代码空间
堆栈
     局部变量和函数参数位于堆栈中 :当然,代码位于代码空间中;而全局变量位于全局名称空间中;寄存器用于内部管理工作,如记录栈顶指针和指令指针。余下的所有内存都被作为自由存储区,通常被称为堆。

     局部变量不是永久性的,函数返回时,局部变量就被删除。这很好,因为这意味着根本不用为管理这种内存空间而劳神;也不好,因为这使得函数在不将堆中的对象复制到调用函数中的目标对象的情况下,将难以创建供其他对象或函数使用的对象。全局变量解决了这种问题,其代价是整个程序中都可以访问它们。这导致创建了难以理解和维护的代码。如果管理得当,将数据存储在自由存储区可以解决这两种问题。

可以将自由存储区视为一块很大的内存,其中有数以千计的依次被编号的内存单元,可用于存储数据。与堆栈不同,你不能对这些单元进行标记,而必须先申请内存单元的地址,然后将它存储到指针中。

     可以使用这样的类比:朋友给了你交通银行的800客服电话号码。你回到家中,将该电话号码与某个按钮绑定,然后扔掉记录电话号码的纸张。如果按下按钮,被拨打的电话将响铃,交通银行的职员进行接听。你不需要记下这个电话号码,,也不知道被拨打的电话在哪里,但只要按下绑定的按钮就能致电交通银行。自由存储区中的数据就像交通银行一样,你不知道它在什么地方,但知道如何找到它。你使用地址(在这个例子中,地址为电话号码)访问它。你不必知道地址,只需将其放在一个指针(按钮)中。指针让你能够访问数据,而不必知道细节。

     函数返回时,堆栈被自动清空。所有局部变量都不在作用域内,他们被从堆栈中删除。程序结束前,自由存储器不会自动清空,程序员使用完自己分配的内存后,必须负责将其释放。

自由存储区的优点是,你从中分配的内存将一直可用,知道你明确的指出不再需要——将其释放为止。如果在函数中分配自由存储区中的内存,在函数返回后该内存仍可用。

这也是自由存储区的缺点,如果你忘记释放内存,被占据而没有使用的内存将随着时间的推移愈来愈多,导致系统崩溃。

     采用这种内存访问方式而不是全局变量的优点是,只有能够访问指针的函数才能访问它指向的数据。这样只有将包含指针的对象或指针本身传递给函数,函数才能修改指针指向的数据,从而减少了函数能够改变数据,而又无法跟踪变更的情况发生。
 作者:isnil
来源:CSDN
原文:https://blog.csdn.net/isnil/article/details/4221636

                        它有什么用?

C语言的重要用途:

指针允许你以更简洁的方式引用大的数据结构
程序的数据结构从原子级别的数据结构:整型、浮点型、字符型、枚举型,到分子级别的数组、结构体(又称为“记录”),再到数据结构中的队列、栈、链表、树等,无论如何复杂,数据结构总是位于计算机的内存中,因此必有地址。利用指针就可以使用地址作为一个完整值的速记符号,因为一个内存地址在内部表示为一个整数。当数据结构本身很大时,这种策略能节约大量内存空间。

指针使程序的不同部分能够共享数据 
类似于共享内存,如果将某一个数据值的地址从一个函数传递到另外一个函数,这两个函数就能使用同一数据。

利用指针,能在程序执行过程中预留新的内存空间 
大多数情况下,可以看到程序使用的内存是通过显式声明分配给变量的内存(也就是静态内存分配)。这一点对于节省计算机内存是有帮助的,因为计算机可以提前为需要的变量分配内存。但是在很多应用场合中,可能程序运行时不清楚到底需要多少内存,这时候可以使用指针,让程序在运行时获得新的内存空间(实际上应该就是动态内存分配),并让指针指向这一内存更为方便。

指针可以用来记录数据项之间的关系   
在高级程序设计应用中,指针被广泛应用于构造单个数据值之间的联系。比如,程序员通常在第一个数据的内部表示中包含指向下一个数据项的指针(实际上就是链表了),来说明这两个数据项之间有概念上的顺序关系。
---------------------
作者:空天遮阳伞
来源:CSDN
原文:https://blog.csdn.net/zhanshen112/article/details/80265830

2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
在编译器里定义一个指针变量,编译器会给这个指针变量分配一个空间,这个空间里存放的是一段内存的首地址,先解释一段内存,一段内存的大小是与你所定义的指针类型相关的,比如int,这段内存占四个字节(当然要看你的机器是多少位的了),则这段内存的首地址是第一个字节的地址,如char类型,占一个字节,这段内存的首地址就是这个字节的地址,还如结构体类型,此时内存大小要看该结构体的所有属性所占内存之和。现在解释这个空间,编译器给指针分配的空间大小是和CPU的寻址长度相关的,比如32位的CPU,它的寻址长度为32位,那么这个空间也就占四个字节,其实不管你定义什么样的指针类型,这个空间只是用来存地址,只占四个字节,而真正该空间所存的地址是哪一段内存的首地址才和所定义的指针类型相关。

转载于:https://www.cnblogs.com/liualiu/p/10658611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值