2019春第六周作业Compile Summarize

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 在这里
我在这个课程的目标是 能够熟练掌握指针的用法
这个作业在那个具体方面帮助我实现目标 对指针的使用更加得心应手
参考文献与网址 C语言程序设计II(第三版) 菜鸟教程中关于指针的教学

编程题一

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

我的代码

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

编程流程图

解决此题遇见的困难与解决办法

问题截图:

问题原因:我一直想怎么用结构体写出此题,却忘记了题目要求是将尾巴写出来,不是将整个代码全写出来,类似于一种填空题。

问了我的邻居后,他提示我注意看题目要求,遂改之,他的博客:在这所以说审题还是很重要的

运行结果截图

编程题二

读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。

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

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

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

5
8 9 12 0 3

输出样例:
在这里给出相应的输出。例如:

max = 12
min = 0

我的代码

#include<stdio.h>
#include<string.h>
void max_min(int a[],int len,int* pmax,int* pmin);
int main ()
{
  int n,i,max,min,len;
  int *pmax,*pmin;
  int a[10];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
    len++;
  }
  max_min(a,len,&max,&min);
  printf("max = %d\nmin = %d",max,min);
  return 0;
}
void max_min(int a[],int len,int* pmax,int* pmin)
{
  int i;
  *pmax=a[0];
  *pmin=a[0];
  for(i=1;i<len;i++)
  {
    if(*pmax<a[i]) *pmax=a[i];
    if(*pmin>a[i]) *pmin=a[i];
  }
}

编程流程图

解决此题遇见的困难与解决办法

问题编程截图

问题原因:忘记给两个最大最小指针赋初值了,小的错误不应再犯。

运行结果截图

编程题三

为一维数组输入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

我的代码

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 idx=0,i,t;
    for ( i = 0; i < n; i++ ) { 
         if ( arr[i] < arr[idx] ){ 
          idx=i; }      
    }   
    if(idx!=0){
        t=arr[0];arr[0]=arr[idx];arr[idx]=t;
    }
    idx=0;
    for ( i = 0; i < n; i++ ) { 
         if ( arr[i] > arr[idx] ){ 
           idx=i;}      
    } 
    if(idx!=(n-1)){
        t=arr[n-1];
        arr[n-1]=arr[idx];
        arr[idx]=t;}
}
void output(int *arr,int n){
    int i;
    for(i = 0;i < n;i++){
        printf("%3d",*(arr + i));
    }   
}

编程流程图

解决此题遇见的困难与解决办法

问题截图

问题原因:忘记看题目要求了,它要求输出每个之间空三格。

我是怎么发现这个错误的?

因为它的报错老是格式错误,所以我就把找错的主要目标放在输入与输出上,结果输出的格式不对,遂改之。

运行结果截图

思考题一:为什么要使用指针?它究竟有什么用处?

为了解决这个问题,我们首先要知道指针是用来干嘛的,也就是:

1.它能干什么?

指针实际上就是一个内存地址,比如一个函数指针,就是一个函数的入口地址,通过这个地址,系统就可以找到这个函数的位置并调用它。简单地说指针就是指向变量和对象的地址。指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行。

其次,当我在选择工具编码时,我完全可以用最简单的,最易理解的工具,所以:

2.我为什么不用其他工具而使用指针?

原因在于:
1.指针允许你以更简洁的方式引用大的数据结构
2.指针使程序的不同部分能够共享数据 **
3.
利用指针,能在程序执行过程中预留新的内存空间 **
3.指针可以用来记录数据项之间的关系

综上,我可以浅显的解释,使用指针,可以便捷的传递值,也可以高效,迅速的实现储存空间的动态分配。作为“C语言之眼”的指针,她能做的,不仅仅是对复杂数据的处理,不仅仅是对计算机内存分配进行控制,在未来,也许会出现比她更加强大的工具,但是,指针的原理与奥妙,在C语言史上,具有划时代的影响力,我相信,这种影响力会一直持续到永远。

思考题二:指针变量在内存中占用多大的空间?它的大小由什么决定?

要解决这个问题,我们要首先去理解“字节”的概念,她就是:

字长:在同一时间中处理二进制数的位数叫字长。通常称处理字长为8位数据的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据。二进制的每一个0或1是组成二进制的最小单位,称为一个比特(bit)。

  一般说来,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”。字长与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)和双倍字长运算。在其他指标相同时,字长越大计算机的处理数据的速度就越快。早期的微机字长一般是8位和16 位,386以及更高的处理器大多是32位。目前市面上的计算机的处理器大部分已达到64位。

  字长由微处理器(CPU)对外数据通路的数据总线条数决定。

  最小可寻址单位:内存的最小可寻址单位通常都是字节。也就是说一个指针地址值可对应内存中一个字节的空间。

  寻址空间:寻址空间一般指的是CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位 (字节是最小可寻址单位),如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位寻址的CPU最大能搭配4G内存的原因,再多的话CPU就找不到了。

  这里CPU的寻址位数是由地址总线的位数决定,32位CPU的寻址位数不一定是32位,因为32位CPU中32的意义为字长。

  有关寻址范围计算解释,对于32位寻址的CPU,其地址值为32位的二进制数,所以可以表示的最大地址为2的32次方(即4G,最大内存空间为4GB,这里G表示数量、GB表示容量)。同时我们不难看出,一个指针的值就是一个32位的二进制数,32位对应4字节(Byte)。所以,指针的大小实际上是由CPU的寻址位数决定,而不是字长。

指针的大小与处理器和操作系统关系如下图所示:

处理器与操作系统 指针占用
32位处理器上32位操作系统的32位编译器 指针大小4字节
32位处理器上32位操作系统的16位编译器 指针大小2字节
32位处理器上16位操作系统的16位编译器 指针大小2字节
16位处理器上16位操作系统的16位编译器 指针大小2字节

以上内容和来自百度百科并由本人整理排版

所以,我们所讲的指针占用空间,就是将占用字节的数量,而具体限制她占用空间的具体因素,在计算机界仍然存在争议,大多数人认为指针大小是由当前CPU运行模式的寻址位数决定,另一部分则认为与之无关,具体要看系统方面对于指针的自适应。

个人学习感悟

写在前面:这周还是蛮忙的,当然学到的东西也是不在少,每一周我们的课就一节,所以大部分知识只能自己学,我总不能自己编出一些我学的什么东西吧,手动滑稽,我对我目前的学习状况来看,还是比较不满意的,具体在于:

1.知识储备太少。脑子里一顿骚操作,问题是脑子里装的东西不允许

2.学艺不精。做作业和高中的完成任务差不多,自己所能学到的,少之又少

3.不思考。学到什么东西,就单单是学到,完全不在思考一下,做题目也是,必须思考

4.动手。干我们这行,一天不打代码就会一秒变小白,正是应了那句:“学如逆水行舟,不进则退”

结对编程感悟

这次的结对编程,总体而言比上一次也就是第一次要好得多,体现在:

1.我是充分理解了再教我的搭档,避免上次的情况。

2.突出重点,上次讲了太多废话

这次的问题与矛盾也依然存在,体现于:

1.硬本领不足

2.敷衍了事

3.学习的态度还没有端正过来

4.自己定制的计划没有充分实行

基于上述问题与毛病,将尽全力去改正,多做事,少空想,华为设计师不是靠想就可以当的上的学艺尚未成精,同志们仍需努力

学习进度表

| 时间|代码行数|这周所花的时间|学到的知识点简介|目前比较疑惑的问题|
| ------------: | ------------: | ------------: | ------------: |
| 3/2-3/19 |35|两天|通过代码读取文件里的数据,并且在屏幕上打印|为什么文件的使用还要进行关闭
|3/9-3/19 |65|三十分钟|没有学到任何知识点|想知道指针与数组之间的内在联系|
|3/19-3/22|186|五个小时|二维数组的用法加上二分法找元素|需要多打代码多多练习|
| 3/22-3/28 | 31 | 一天 | 字符串的使用 | 数组排序的内部原理 |
|3/28-4/5| 108 | 一天 | 指针初步 | 行参与实参如何相互影响 |

写在最后:这次的编程总结确实赶了点,因为刚好碰见清明节,开了一上午高速,扫墓到四点,简单整理了一下就吃晚饭,可以说是时间紧迫了,但是呢,即便如此紧迫,作业还是要写要交的,我在尽量保证质量的情况下,勉强完成了作业,突然觉得我好屌

posted @ 2019-04-01 18:12  404NFD  阅读(369)  评论(3编辑  收藏  举报