刘喆君

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

从《做中学》学到的经验

  • 首先,在老师的这几篇文章中,最核心的一片文章就是《做中学》这一篇了,在文章中强调了不断联系的重要性,然后在学以致用的过程中发现并解决问题,在迭代中提升。在老师的文章在我也看到了不少的介绍

套路(Kata)指针对某一种特定技术或技能进行重复性的练习,从而将其熟练掌握。这个概念借鉴于武术,指的是可以独自或多人共同练习的一系列动作、招式。

CodeKata(代码套路)可以说是程序员的基本功。

  • 除此之外,在实践中也有许多要注意的地方,也是老师提到而我以前没有注意的,比如:

技能的提升要[刻意训练],要摆脱[舒适区],进入[学习区]学习。
学习要有提升要有反馈。

等等。

  • 最后我想在下个学期的学习首先就是以自己在实践中先学习,然后找到问题,然后解决问题这样的一个顺序去做。

技能

  • 对于技能这一方面我其实想了很久,我总觉得我没有什么技能是可以称得上比90%的人更好的,但是最后我把题中的大多数理解为所有人,也就是包括有不会这项技能的人,在这个前提下,我可以说我的B-box是比大多数人更好的。
  • 我从学习这项技能地过程中认识到,第一,兴趣真的是最好的老师,我在学习中就是完全自学,而且就是特别感兴趣,才让我能在只是看视频的前提下掌握这项技能;第二,就是不断练习,在学习过程中我能得到的就只有网上的视频而已,要不断去看,不停练习,直到发出正确的声音,学会之后还要在不同的表演段子中去练习。
  • 我的学习过程与老师的过程也有许多共同之处。比如,“实践要具备一定的量才能引起质变”,在练习时,一个发音我不可能当下就学会,要不断地去找发音的点,找到之后再不断练习形成肌肉的记忆,然后才能要在要用的时候马上就能用。还例如,我只要是空闲的就一直在联系,走路的时候练,玩手机的时候练,上厕所的时候练,也多亏了B-box的练习是可以随时随地做的,这一点也与老师的“技能的提升要[刻意训练]”也不谋而合了。

有关C语言学习的调查

1.你是怎么学习C语言的?与你的高超技能相比,C语言的学习有什么经验和教训?

我学习C语言的方法是教材与作业相结合,先练习课本上的代码,掌握一定的套路之后,再做作业。与学习B-box相比,C语言的练习的要求显然要高许多,它需要练习软件,需要更加专注地投入,需要大量的学习加练习,需要学习不同类型的代码,难度也是更上了一层的,代码套路显然比单纯的肌肉记忆要更难做到,也要付出更多的精力。

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

在上一篇博客中我大概地估算了我在大一下至少写过4200行代码(用作业系统中平均每天的题量乘上每题的大约行数),但是在上学期也写了三篇较长的使用C语言的实验报告,粗略估计至今最少也写过4500行代码了。只要是自己编写的代码都可以完全理解,有些复杂代码可以做到看懂。在平衡质与量是,要做到有的放矢,量不可只贪多,不能简单代码一直写,也不能贪难,只找难的代码写,要循序渐进,做阶梯式的练习,找到适合自己本阶段的练习,才能一直进步。

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

从概念上来分:

数组指针:是指针,指向数组;

指针数组:是数组,由指针组成;

函数指针:是指针,指向函数;

指针函数:是函数,返回值是指针。

但到目前为止,我的运用还比较少;

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

这部分我不知道,是百度来的。

1.>流的概念“流是磁盘或其他外围设备中存储的数据的源点或终点。”。这是《C程序设计语言》上的原话。按我的理解,流主要是指一种逻辑上的概念,它提供或储存数据。产生数据的叫输入流,消耗数据的叫输出流。C语言中对流除了分为I/O流之外,还分为文本流和二进制流。

2.>文件的概念,每个操作系统为了存储的管理,都会提供文件系统,文件系统由接口与实现组成。接口定义了文件,目录的属性与操作。实现与具体的物理设备有关。用户不必要关注具体是怎么实现的,只要了解了接口就可以操作文件了。
文件也是一个逻辑上的概念,它定义了一个逻辑上的存储对象是什么样子的,如它的结构,属性等。

3.>流与文件的联系,这两个都是逻辑上的概念,都是对I/O设备的一种高级抽象。它们往往指那些物理上的设备,所以 它们经常互换着使用。但它们还是有区别的,主要的区别是它们各自的侧重点不同。流是动态的,更偏重于操作的过程,将数据看成是一种正在朝向个方向运动的对象,输入或输出;文件是静态的,更偏重于操作的对象本身,将数据看成是操作的对象或结果,文件在其它系统里本来就只有存储对象的意思,Unix扩展了这个概念。不过,我们一般都不加区别地使用它们,尤其是在Unix系统与C语言环境中。

4.>文本文件与二进制文件:简单来说,文本文件是按我们日常能够直接阅读的文本格式进行存储的文件,如汉字、英文、符号标点等等。二进制文件是按机器(或电脑)能够阅读的格式(只有0和1)进行存储的文件。

5.>在C语言中编写一个文本文件,以将输出结果输出到特定的文本文件为例:

#include<stdio.h>
main()
{
    FILE *fp;/*建立文件指针*/
    char c[10]="abcde";
    fp=fopen("c:\\kk.txt","w");/*将文件指针指向C盘的kk.txt文件*/
    fprintf(fp,"%s",c);/*将字符串内容输出到文件中*/
    fclose(fp);
 }

在c语言中编写一个二进制文件,例如:

#include <stdlib.h>
#include <stdio.h>
int main ()
{
    FILE * fpPhoto, * fpText, * fpTarget ;
    int iRead ;
    char szBuf[100] ;
    printf ("请输入第一个文件名(jpg):\n") ;
    gets (szBuf) ;
    fpPhoto = fopen (szBuf, "rb") ;
    printf ("请输入第二个文件名(txt):\n") ;
    gets (szBuf) ;
    fpText = fopen (szBuf, "rb") ;
    printf ("请输入目的文件名(jpg):\n") ;
    gets (szBuf) ;
    fpTarget = fopen (szBuf, "wb") ;
    if (!fpPhoto || !fpText || !fpTarget)
    {
        printf ("打开文件失败!\n") ;
        system("pause") ;
        return -1 ;
    }
    while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpPhoto)) > 0)
    fwrite (szBuf, 1, iRead, fpTarget) ;
    while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpText)) > 0)
    fwrite (szBuf, 1, iRead, fpTarget) ;
    fclose (fpPhoto) ;
    fclose (fpText) ;
    fclose (fpTarget) ;
    return 0 ;
    }

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

在我的理解,面向过程就是指具体的动作,在c语言里体现在写程序是将每一步的运算步骤都写出来,让程序按照我的代码逐步进行。
它解决的方法就是把过程一步一步的,详细的,都写出来,按照顺序去完成。

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

在c语言中,采用模块化的编程思想,需合理地将很大的软件划分为一系列功能独立的部分合作完成系统的需要,在模块的划分上主要依据功能。模块由头文件和实现文件组成。

我还没有写过多个源文件的程序。

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

我不知道什么是“高内聚,低耦合”,但我在查了资料后有了一些了解。

高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一负责原则。对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。--自百度百科。

要做到高内聚低耦合,设计模块时需要做到:1.各个模块之间的功能不可以有交叉;2.各个功能模块间实现的功能不可以有交叉;3.不允许出现模块间的相互调用;4.如果必须出现模块间调用,那么只允许单向调用。

8.学过C语言,你如何把数组A的内容复制到数组B中?如何对整数数组A进行排序(从大到小,从小到大)?

1.>把数组A的内容复制到数组B中:

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

int main()
{
    char a[100],b[100];
    int i;
    gets(a);
    for(i=0;a[i]!='\0';i++)
    {
        b[i]=a[i];
    }
    b[i]='\0';
    puts(b);
}

2.>对整数数组A从大到小排序

#include<stdio.h>
#include<string.h>
int main()
{
    int a[100],n,i,j,temp;
    printf("Input number of integers\n");
    scanf("%d",&n);
    printf("Input integers in order\n");
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        if(a[j]>a[j+1])
        {
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
        }
        for(i=n-1;i>=0;i--)
            {
                printf("%d ",a[i]);
            }
    printf("\n");
}

3.>对整数数组A从小到大排序

#include<stdio.h>
#include<string.h>
int main()
{
    int a[100],n,i,j,temp;
    printf("Input number of integers\n");
    scanf("%d",&n);
    printf("Input integers in order\n");
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        if(a[j]<a[j+1])
        {
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
        }
        for(i=n-1;i>=0;i--)
            {
                printf("%d ",a[i]);
            }
    printf("\n");
}

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

  • 我开始的思路是统计代码中回车键的个数,但是我开始的想法只能把代码全部复制然后粘贴到运行时的输入框中,这样很复杂,然后我就上网去查了可以直接到某一个文件的方法,然后学到了fopen,fgets,fclose这几个函数,尤其是fgets这个函数可以直接统计行数。

      #include<stdio.h>
      #include<string.h>
      int main()
      {
          FILE *pf=fopen("D:/C题库/text/text.cbp","r");
          char b[1000];
          int line=0;
          if(!pf)
               return -1;
          while(fgets(b,1000,pf))
              line++;
          fclose(pf);
          printf("file line count=%d",line);
          return 0;
      }
    

<img src="http://i1.bvimg.com/630914/65033e2cb99c9ab8.png" width="350"height="300" />

  • 至于怎么样统计一个文件夹内的所有文件的代码行数我看了许多网上的版本,感觉看不懂,所以打算慢慢学一下关于文件的函数,然后再自己写。

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

  • 断点指的是在某行代码处设置断点后,调试程序时,程序运行到该行时会自动停止,然后就可以在此进行逐步调试了。
  • 由于我的codeblock编译器损坏,所以很遗憾我不能做调试的例子了。

快速看完PPT后提出的问题

  1. 如何创建并简单编写一个JAVA程序?
  2. 如何精确定义不同类型数据?
  3. 能否实现不同循环语句的转换?
  4. 如何实现一个“类”的应用?
  5. 如何理解类的继承性?
  6. 怎样理解接口?
  7. 如何使用内部类和异常类?
  8. 字符串怎样使用?字符串分析器怎样使用?
  9. 如何应用Swing包中的各种组件,各种布局和事件处理器?
  10. 如何通过文件流读写数据?能否区分各种数据流的区别?
  11. 创建数据源和掌握JDBC连接的方法是什么?
  12. 如何创建多线程?
  13. URL的使用方法是什么?套接字连接机制是什么?
  14. 如何绘制基本图形?如何播放音频?
  15. 泛型和集合是如何使用的?

JAVA学习目标

  • 对比c语言的学习,我希望JAVA能比C语言的掌握的更好,更全面,能够独立解决问题,也能够做一些有趣的代码,能够做到自己解决问题,然后不断进步。
  • 在刻意训练时做到不偷懒,有问题首先自己解决,不行的话再求助老师同学,能够做到一个较多的练习量,让自己形成CodeKata。逐步提升程序设计能力,培养计算思维能力。
  • “实践要具备一定的量才能引起质变”,大量的练习是必不可少的,要学好编程,一定要写大量的代码。“刻意练习”也是要做到的,我们需要一直处在[学习区],才能有所进步。“学习提升要有反馈”,与老师做好沟通是事半功倍的。在不断的练习中发现并解决大量的问题,然后有所升华,这就是我的目标。
posted on 2018-02-02 22:50  mushroom1111  阅读(261)  评论(2编辑  收藏  举报