20165318 预备作业二 学习基础和C语言基础调查

20165318 学习基础和C语言基础调查

技能学习经验

我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此。可这些技能中,唯一能拿的出手的就是舞蹈了。按照《优秀的教学方法---做教练与做中学》中的标准:一项技能的掌握程度分为:新手/高级初学者/合格者/精通/专家。我认为自己尚且只达到合格者的程度,并不能说自己的水平凌驾于大多数人之上。

从4岁学到14岁,这些年的学习,还是带给我很多启发,要学好一项技能,要具备以下几点:

  • 兴趣:兴趣是最好的老师。我小时候就对舞蹈很有兴趣,看着电视上的舞蹈节目,总会跟着音乐跳起来,4岁的时候便参加了舞蹈班,进行系统的学习。随着学习的进程,我更加深入的体会到民族舞的韵味,对其的兴趣也愈发深厚,现在到了大学,我依然对舞蹈兴趣不减,加入了学校的舞蹈队,在校庆等舞台上展现风采。
    毅力不要只看时钟,要效仿时钟,一直前行。每天一万步,每周减十斤》中说到:限制你每天完成一万步的障碍是什么?生病了?遇到台风了?下大雨了?雾霾了?其实什么都不是,就是你的毅力和决心。就像我练习舞蹈的那段日子,不管是下雨还是下雪,我都没有迟到过。从9岁开始,由于当时县城里师资不足,妈妈便每个周末都带我到市里上舞蹈课,风雨无阻。练舞蹈最重要的是基本功,而基本功的训练总是痛苦的,每次拉腰,扩肩都很痛苦,在这段时间中,我也曾有过退缩的念头,但最终都咬咬牙坚持了下来,直到初三时不得不放弃。
  • 刻意训练:《「做中学(Learning By Doing)」之乒乓球刻意训练一年总结》一文中说到:迈出 「舒适区」,只在 「学习区」 学习,注意循序渐进,不能进入 「恐慌区」 。例如基本功的训练,在做动作时不能凭着自己的感觉,怎么舒服怎么来,而要记住动作的要领,在训练时,根据要领做动作。基本功的训练是每节课都要重复练习的,从而拥有肌肉记忆。民族舞最动人的地方在于韵味,声韵练习也是民族舞基本功的组成部分,经过长期的刻意练习,舞蹈动作才会有其特有的韵味。

套路(Kata)指针对某一种特定技术或技能进行重复性的练习,从而将其熟练掌握。这个概念借鉴于武术,指的是可以独自或多人共同练习的一系列动作、招式。
体育运动的初学者练习时候都需要重复动作,比如「学习打乒乓球时」要练习挥拍,挥拍成千上万遍之后动作就会定型,也就是教练常说的「肌肉有了记忆能力」,以后实战中可以不假思索地做出来。
-- 引用自《优秀的教学方法---做教练与做中学

  • 及时反馈:舞蹈动作有很多要领,做得不标准有时会影响总体效果,在我学习的过程中,我的老师总能及时纠正我的错误,使我得到及时反馈,进而循序渐进,获得更高的水平。

我认为Java学习也是如此:

  • 要培养对Java的兴趣
  • 拥有学好Java的决心,并坚持下去
  • 每天进行刻意的练习,要熟练掌握基本技能,进入学习区
  • 即时总结自己的问题,并及时反馈,向老师或同学提问

C语言基础调查

你是怎么学习C语言的?(作业,实验,教材,其他),与你的高超技能相比,C语言的学习有什么经验和教训?

我学习C语言主要是上课听讲,有时候会进行课前预习和课后练习,但由于当时对C语言重视程度不够,平时并没有坚持日常练习,是在接近期末的时候才进行了大量练习。在C语言学习过程中,我一直停留在舒适区,对于一个问题,只停留在能够解决,而没有深入探索,导致我仅仅只是通过考试,并没有很熟练的掌握C语言。坦诚的说,我的C语言基础并没有打牢,对其探索程度还不够,这是很大的教训。优秀的教学方法---做教练与做中学中提到,
对技能要有个期许,不能有了高级初学者的水平就满足了,要有当专家的梦想。要想做好一件事情,对自己的要求不能太低,并且要有规划的去学习。

目前为止估算自己写过多少行C代码?理解的情况如何?量变引起质变,如何平衡质和量?

代码数量我估计自己大概写过3000行左右,基本上都能理解,一些简单的程序能熟练掌握,但难一些的程序,只能理解并基本掌握。我觉得,量变引起质变,质和量是循序渐进,不是一蹴而就的。例如一个知识点,不是练一遍就能掌握的,要至少三次以上的刻意练习,融会贯通,才算基本掌握,这个过程中,我这些刻意练习是量变的积累,我掌握这个知识点并能将它灵活应用,这是质变,量变的逐次积累,循环渐进,最终达到质变。

学过了C语言,你分的清数组指针,指针数组;函数指针,指针函数这些概念吗?

数组指针是一个指向数组的指针,其本质是指针;
指针数组是一个由指针为元素组成的数组,其本质是数组;
函数指针是一个指向函数的指针,其本质是指针;
指针函数是一个返回值为指针的函数,其本质是函数。

学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?

我不太清楚文件和流的区别和联系,但通过查资料,我了解到:文件是计算机管理数据的基本单位,同时也是应用程序保存和读取数据的一个重要场所。流是字节序列的抽象概念,提供一种向后备存储器写入字节和从后备存储器读取字节的方式。当流到磁盘而成为文件时,要启动磁盘写入操作,这样流入一个字符或者流入一个字节均要启动磁盘操作,将大大降低传输效率,并且影响磁盘的使用寿命。
文本文件是以一些常用字符编码方式编码的,每个字符都对应相应的编码,独自占用一个字节的存储空间,是定长的;二进制文件是用二进制进行编码的,可以自定义编码,是不定长的。在C中,文本文件操作是通过库函数完成的;二进制文件是通过fopen,fread,fwrite三个函数完成的。

学过了C语言,你知道什么叫面向过程程序设计吗?它解决问题的方法是什么?

面向过程是指以过程为中心,通过构建过程,自顶而下,逐步求精,模块化的解决一个问题。它通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用来解决问题。

在C语言里面,什么是模块?你写过多个源文件的程序吗?

把程序要解决的总目标分解为若干目标,再进一步分解为具体的小目标,把每个目标称为一个模块。很惭愧,我并没有写过多个源文件的程序。

学过了C语言,你知道什么是“高内聚,低耦合”吗?这个原则如何应用到高质量程序设计中?

高内聚是指每个模块是由相关性很强的代码组成,只负责一项任务,独立性强。低耦合是:一个完整的系统,各个模块相互独立,模块与模块之间的接口,尽量的少而简单。在高质量的程序设计中,要遵循“高内聚,低耦合”的原则,具有相同功能的模块尽量整合在一起,不同模块间的嵌套要尽可能的少。

学过了C语言,你如何把数组A的内容复制到数组B中?如何查找整数数组A中有没有数字5?如何对整数数组A进行排序(从小到大,从大到小)?写出相应的程序。

利用strcpy函数将数组A的内容复制到数组B中:

#include <stdio.h>
#include <string.h>
#define N 50

int main()
{
    char a[N],b[N];
    printf("The string A is:");
    gets(a);
    strcpy(b,a);
    printf("The string B is:");
    puts(b);
    return 0;
}

查找整数数组A中有没有数字5,并对整数数组A进行排序(从小到大,从大到小)

#include<stdio.h>
#include<stdlib.h>

int search(int a[],int n)//查找整数数组A中有没有数字5
{
    int i;
    int flag=0;
    for(i=0;i<20;i++)
    {
        if(a[i]==5)
            flag=1;
    }
    return flag;
}

void min(int a[],int n)//整数数组A进行排序(从小到大)
{
    int i,j,k,temp;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i;j<n;j++)
        {
            if(a[k]>a[j])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

void max(int a[],int n)//整数数组A进行排序(从大到小)
{
    int i,j,k,temp;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i;j<n;j++)
        {
            if(a[k]<a[j])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

int main()
{
    int n,i,a[50];
    printf("How many numbers?\n");
    scanf("%d",&n);
    printf("Please input numbers:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(search(a,n)==1)
    {
        printf("数组中有 5 !\n");
    }
    else
    {
        printf("数组中没有 5 !\n");
    }
    min(a,n);
    printf("从小到大排序:");
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    printf("\n");
    printf("从大到小排序:");
    max(a,n);
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    return 0;
}

qsort(对数组进行排序):

void qsort ( void * base, size_t num, size_t width, int ( * comparator ) ( const void *, const void * ) );

其中base是数组首地址,num是数组中元素数量,width是元素所占空间,comparator是函数指针,需要自己定义。
bsearch(对数组进行查找):

void *bsearch(const void *key, const void *base, size_t nmem, size_t width, int (*comp)(const void *, const void *));

key是关键词指针,base是整个要查找的数组,nmem数组中元素数量,width每个元素所占内存,comp是函数指针,需要自己定义。
参考:qsort(百度百科)
这两个函数我通过查阅资料有了最初的了解,也尝试了编程,但最终结果没有调试出来,便还是用了之前学过的方法解决的问题。

写一个程序,统计自己C语言共写了多少行代码。

这个我没有独立写出来,下面是在别人代码基础上写出来的。

#include <stdio.h>
#include <string.h>

int  main()
{
    int    all=0;
    FILE   *fp;
    char   filename[100];
    char   str[4096];
    printf("Enter a filepath/filename:\n");
    gets(filename);
    fp=fopen(filename, "rt");//打开文件
    if(fp==NULL)//判断文件是否正确打开
    {
        printf("Failure to open. \n");
        exit(0);//如果错误终止程序
    }
    while (fgets(str,4096,fp))  //读取一行,并判断文件是否结束
    {
        all++;
    }
    fclose(fp);
    printf("filename:%s 代码行数:%d",filename,all);
}

你知道什么是断点吗?给出自己调试程序的例子。

断点就是程序运行过程中自动中断的地方,以便住不检查调试程序。当时练习C语言代码时,程序不能运行时,常常找不到错误,这时候就可以通过设置断点,监视程序运行过程,进而找到问题出现的地方,并进行改正。在娄老师对去年预备作业的总结中提到调试器不光用来除错,还是很好的学习工具。这个我之前并没有探索过,我以后会尽力去学习这种用法。

章节提问(参考怎样快速阅读一本书我的提问如下)

  1. 第一章中提到Java源文件中类可以自己编写,也可以引入类库中的类。我的困惑是:如果源文件中有public类,这个类必须是自己编写的吗?如果是引入类库中的类,这个类又该如何表示呢?
  2. 在类型转换运算的例子中,有以下程序
float f =123456.6789f ;
double d=123456789.123456789;
f=(float)d;

运行结果是f=1.23456792E8。我的困惑是:ppt中有说,float型变量存储是要取8位有效数字,而这个结果却有9位有效数字。而且我不是很明白如果将级别高的变量赋给级别低的变量时,小数部分是如何取舍?四舍五入?全部舍去?全部进位?
3. 关于switch开关语句的介绍中提到“break语句是可选的”,但下面又解释“这里面必须要有break语句”,且按我们之前学过的内容,如果没有break语句,程序就会在switch语句中从变量匹配的地方一直执行到结束。所以,“break语句是可选的”中的“可选”是什么定义?
4.

public class A{
void f(){
    int m=10,sum=0;//成员变量,在整个类中有效

以上程序中m和sum是在f的方法体中进行的定义,它们为什么是A的成员变量?
5. 第五章中提到“除了Object类,每个类都有且仅有一个父类”,那么是否存在一个类,它的父类还有自己的父类,也就是是否包含多重的父子关系?而且有“子类可以通过继承的方法来操作子类未继承的变量和方法”的说法,既然子类没有继承这些变量和方法,有为什么能操作它们?而且又该如何操作?
6. 第六章主要在讲接口,我觉得接口和abstract类较为类似,它们有什么区别?接口体中只能定义常量吗?这在我之后看ppt的过程中得到了解答。但是为什么接口体中只能定义常量呢?为什么要有这样的限制?
7. 内部类有什么优点,一般用它解决什么情况?关于断言,如何让它在调试代码阶段发挥作用,又在程序正常运行是关闭呢?
8. 第八章中说,“String对象的字符序列是不可修改的,StringBuffer类独享试题的内存空间可以自动的改变大小。”我比较疑惑String类和StringBuffer类在使用时有没有特定的环境?这一章中类比较多,该如何更为明确的区分它们?
9. 第九章中提到“直接子类”和“间接子类”,我对这两个的概念不是很明白。如果我在第五章中的问题“是否包含多重的父子关系”成立的话,那么一个子类是它父类的直接子类,是它父类的父类的间接子类呢?
10. 第十章中提到了“文件锁”的概念,文件锁一般使用在什么情况下?

前四章的内容我基本上都能理解,第五章往后只能理解大部分,第十章以后的内容理解的不是很好,感觉自己不能通过自己的思考提出什么满足怎样快速阅读一本书中要求的问题。因为在看ppt的时候没有进行相应的练习,有些定义经常会混淆,只能一次次回头看,这样浪费了一些时间。以上是我阅读ppt后的问题,有的还不够完善,以后会继续补充。

Java学习目标与实现方法

  • 通过下学期Java课程的学习,理论上,我希望能够了解这种面向对象的程序设计语言的设计思想;实践上,我希望能熟练的掌握这门语言,并利用它解决一些问题。同时,我希望能够发挥主观能动性,养成良好的学习习惯,提高自学能力。

  • 首先,我必须迈出[舒适区],在[学习区]中学习,并且克服恐惧心理。其次,要给自己制定小目标,例如每天练习一些代码,并坚持下去;同时,对自己的薄弱点进行针对练习,通过不断的练习,把那些低层次的问题都解决了,变成不用经过大脑的自动操作,然后才有时间和脑力来解决较高层次的问题。并且在练习的过程中要集中注意力,这样长期的坚持,就能提高程序设计能力和培养计算思维。

  • 做中学》一文中说到:“学习是要思考的,仅仅实践是不够的: 不光会动手,还要理解背后的原理,不光会用工具,还要理解支撑的理论。”由此可见,在Java学习中,要理论与实践相结合,学习理论的同时进行大量的练习,在练习中进行总结。“做中学”是学生为主体、老师为主导的学习方式,我希望能提高自己的自学能力,借助博客园和码云这些平台,努力自己解决问题;同时也要与老师互动,获得及时反馈。

posted @ 2018-02-04 11:37  孙晓暄  阅读(294)  评论(2编辑  收藏  举报