zoukankan      html  css  js  c++  java
  • 2019 第六周作业

    2019春季第六周作业

    这个作业属于哪个课程 C语言程序设计ll
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888)
    我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算
    这个作业在哪个具体方面帮助我实现目标 这个作业让我大概了解了指针的定义及用法
    参考文献 https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html)

    一、基础题

    1、求两数平方根之和

    函数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
    ", y );
    return 0;
    }
    

    /* 请在这里填写答案 */

    输入样例:

    12 20
    

    输出样例:

    y=7.94
    

    (1)实验代码

    #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
    ", y );
    
           return 0;
    }
    double fun (double *a, double *b)
    {
    	double result;
    	
    	result=sqrt(*a)+sqrt(*b);
    	
    	return result;
     } 
    

    (2)设计思路

    (3)本题调试过程中碰到问题及解决方法

         本题比较简单,调试过程中没有遇到任何问题
    

    (4)运行结果截图

    2、利用指针返回多个函数值

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

    输入格式:

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

    输出格式:

    输出最大值和最小值。

    输入样例:

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

    5
    8 9 12 0 3
    

    输出样例:

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

    max = 12
    min = 0
    

    (1)实验代码

    #include<stdio.h>
    void max_min(int a[100],int n,int* pmax,int* pmin);      //函数声明 
    int main(void)
    {
        int n,i,max,min; 
    	int *pmax,*pmin;          //定义指针 
        int a[100];
        scanf("%d",&n);
      
        for(i=0;i<n;i++)          //输入数组 
        {
            scanf("%d",&a[i]);
        }
      
        max_min(a,n,&max,&min);                  //调用函数 
        printf("max = %d
    min = %d",max,min);    //输出最大值和最小值 
        
        return 0;
    }
    
    void max_min(int a[100],int n,int* pmax,int* pmin)         //函数的定义
    {
        int i;
        *pmax=*pmin=a[0];
        
        for(i=1;i<n;i++)    //比较大小,找到最大值及最小值 
        {
            if(*pmax<a[i]) 
    	        *pmax=a[i];
            if(*pmin>a[i])
    	        *pmin=a[i];
        }
    }
    

    (2)设计思路

    (3)本题调试过程中碰到问题及解决方法

    问题1:对于指针数组还不是特别会用
    解决方法:搜了一下百度,看了专门讲指针数组的视频

    (4)运行结果截图

    二、预习题

    1、最小数放前最大数放后

    为一维数组输入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 x, y, m;
        
             max = min = arr[0];
        
            for(i = 1;i < n;i++)
          {
                   if(max < arr[i])
                   {
                            max = arr[i];
                            x = i;
                   }
            
                   if(min > arr[i])
                  {
                           min = arr[i];
                          y = i;
                   }
           }
            m = arr[0];
            arr[0] = arr[y];
            arr[y] = m;
        
           m = arr[n-1];
           arr[n-1] = arr[x];
           arr[x] = m;
        } 
     void output(int *arr,int n)
     {
            int i;
         
            for(i = 0;i < n; i++)
            {
                      printf("%3d", arr[i]);
            }
     } 
    

    (2)设计思路

    (3)本题调试过程中遇到的问题及解决方法

    问题1:一开始编译出来的数直接是从小排到大
    解决方法:多次调试之后就找到错的地方然后就改了

    问题2:缺少中间替换的变量,导致编译结果为1 1 4 8 2 3 9 5 12 12
    解决方法:看了一下其他同学的博客然后就懂了

    (4)运行结果截图

    三、预习的主要内容

    预习了指针的第2小节角色互换,函数参数可以使整数、字符型和浮点型,当然也可以是指针类型。如果将某个变量的地址作为函数的实参,相应的形参就是指针。在C语言中实参和形参之间的数据传递是单向的“值传递”方式,调用函数不能改变实参变量的值,当指针变量作为函数参数时也遵守这一个规则。调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。这样的机制被称为引用调用。采用引用调用机制需要在函数定义时将指针作为函数的形参,在函数调用时把变量的地址作为实参。目前大概就理解了这些。

    四、学习进度条

    周/日期 这周所花的时间 代码行数 学到的知识点简介 目前比较迷惑的问题
    2/25-3/3 三天 45 数组的认识及用法 数组长度的理解
    3/4-3/10 两天 37 编写程序时处理文件 fscanf与fprintf的具体用法
    3/11-3/17 三天 53 二维数组的使用及文件插入 二维数组的用法、上三角的判断及文件的处理
    3/18-3/24 两天 113 选择排序法、二分查找法、二维数组的引用与矩阵 不清楚选择排序法和冒泡排序法的区别
    3/25-3/31 两天 78 判断回文、一维字符数组的用法、使用字符串编程 使用字符串编程
    4/1-4/7 两天 88 指针变量的基本运算,内存单元和地址之间的关系 不太了解指针数组

    五、学习感悟

    本周学习了变量、内存单元和地址之间的关系,定义指针变量,使用指针变量,进行指针变量的初始化,指针变量的基本运算,指针作为函数参数的作用,使用指针实现函数调用返回多个值。地址和指针是计算机中的两个重要概念,在程序运行过程中,变量或者程序代码被储存在以字节为单位组织的存储器中。在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元。指针声明符在定义指针时被使用,说明被定义的那个变量是指针。定义多个指针变量时,每一个指针变量前面都必须加上。指针的类型和它所指向变量的类型必须相同。只能将一个指针的值赋给另一个相同类型的指针。我自己看了一下指针数组,感觉挺难的,本周学的对于内存单元和地址之间的关系不是很清楚,看了一些其他老师的视频帮助理解。

    感悟:长风破浪会有时,直挂云帆济沧海!

    六、结对编程感想

    每周三晚自习是我们结对编程的时间,我的搭档换成了我的室友,我们会在双方互相写完代码后再进行讨论,然后看一下双方的代码有什么区别,然后再互相讲一下思路。我觉得结对编程的优点就是可以了解一个代码不同的思路,不同的写法,也可以增进同学之间的关系;缺点就是讨论时会扰乱双方的思路。

    七、表格和折线图

    时间 代码行数 博客字数
    第一周 45 870
    第二周 37 1055
    第三周 112 1158
    第四周 113 1696
    第五周 78 1854
    第六周 114 2977

    八、思考题:

    1.为什么要使用指针?它有什么用?

    (1)用指针在函数间传递数据效率高,尤其是当数据量大的时侯。
    (2)用指针的话,对内存的占用会比较小,而直接用中间变量会复制出副本,占用双重内存,即便在函数调用后变量副本会被撤销
    (3)指针的功能强大,它可以指向数据存放的地址,指针既可以指向变量地址,也可以指向函数。因此,无论是调用数据,还是调用函数,都可已使用指针。指针实现间接访问,可以保证原数据不会丢失

    指针的作用:

    (1)在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
    (2)数据转换,利用指针的灵活的类型转换,可以用来做数据类型转换,比较常用于通讯缓冲区的填充,比如说,一个数据缓冲区char buf[100],如果其中buf[0,1]为命令号,buf[2,3]为类型,buf[4~7]为某一数值,类型为int,就可以使用如下语句进行赋值:
    (short)&buf[0]=cmdID;
    (short)&buf[2]=type;
    (int)&buf[4]=value;
    (3)字符串指针,是使用最方便,且常用的。
    (4)函数指针,形如:#define PMYFUN (void*)(int,int),可以用在大量分支处理的实例当中,如某通讯根据不同的命令号执行不同类型的命令,则可以建立一个函数指针数组,进行散转。
    (5)在数据结构中,链表、树、图等大量的应用都离不开指针。

    2.指针变量在内存中暂用多大的空间?它的大小由什么决定?

    一般是四字节,指针大小是由当前CPU运行模式的寻址位数决定

  • 相关阅读:
    对MVC模型的自悟,详尽解释,为了更多非计算机人员可以理解
    openSUSE leap 42.3 实现有线 无线同时用
    Fedora27 源配置
    Ubuntu16.04添加HP Laserjet Pro M128fn打印机和驱动
    openSUSE leap 42.3 添加HP Laserjet Pro M128fn打印机和驱动
    OpenSUSE Leap 42.3下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    OpenSUSE Leap 42.3 安装java(Oracle jre)
    linux下支持托盘的邮件客户端Sylpheed
    Ubuntu下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    Firefox 浏览器添加Linux jre插件
  • 原文地址:https://www.cnblogs.com/zmzhang/p/10655210.html
Copyright © 2011-2022 走看看