20165234 预备作业2 学习基础和C语言基础调查

时间:2022-05-04 16:19:10

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

一、技能学习经验及体会

  • 你有什么技能比大多人(超过90%以上)更好?

看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好。

我从小喜欢五子棋,并且对其有着自己的见解,但是一直未接受过棋类的培训,所以也只能算是一个爱好。可能是这方面的学习与理解能力较强吧,象棋、斗地主都是我通过观看别人对战而学会的,水平也还行。同时我还很爱玩游戏,尤爱那种需要耐心的探索型游戏,以及需要思考的益智型游戏。

体育运动方面,我从初一时开始接触排球,虽然只是在业余水平里很一般,但是每年我都会不断参加训练,在初中、高中参加班级排球赛,乃至在大学参加院排球赛。高考完之后我才去学了游泳,在学会之后我依旧经常去游泳馆练习,上大学后我还保持着至少每周一次去游泳馆的频率。当然我的这些爱好并不是比大多数人好,或者说只是很普通的爱好,但是对我而言是不错的锻炼身体的运动。

  • 针对这个技能的获取你有什么成功的经验?

就对这些技能的获取过程而言,论成功的经验,我觉得可以归结为以下三点。

1. 对这些技能的热爱

我从小就对体育运动较为感兴趣,所以我愿意去接触、学习它们。从棋类游戏到益智类游戏,我都觉得非常有意思,所以我愿意去进行思考并进行尝试。

2. 持之以恒的练习

在学游泳时,我只用了五个课时,便掌握了蛙泳的所有要领,但接下来的五个课时都是练习。正所谓熟能生巧,经过后期不断地大量练习,才能真正掌握这一项技能。

3. 专业人士的指导

我无论是在学习排球还是学习游泳时,都得到过老师和教练的指导。在习得一项技能的过程中,老师和教练的指导是必不可少的。他们会根据我的及时反馈来告诉我正确的做法,能帮助我少走弯路。

  • 与老师博客中的学习经验有什么共通之处?

正如我在上一个问题里所回答的,我并没有太出众的技能,但是我所拥有的这些技能/爱好,在获取的过程中都有共通之处。

娄老师在博客《优秀的教学方法---做教练与做中学》中分享了一些在学习,工作,健身中的实践:

做中学(Learning by Doing)之背单词-扇贝网推荐:两年词汇量超过22000.

做中学之五笔输入法实践教程:通过一个月的训练学会五笔输入法

每天一万步,一周减十斤:通过五个月的训练减肥30斤

「做中学(Learning By Doing)」之乒乓球刻意训练一年总结: 通过一年的训练提升乒乓球技能。

娄老师通过自己的背单词经历五笔练习经历减肥经历乒乓球练习经历,详细地阐明了「做中学(Learning By Doing)」的重要性,并且总结了其中的要点:

学习是要思考的,仅仅实践是不够的;

技能是分层次的;

实践要具备一定的量才能引起质变;

技能的提升要「刻意训练」;

学习提升要有反馈。

我的学习经验也与这些要点有共通之处。“学而不思则罔,思而不学则殆”是我们从小就听过的道理,也是我一直以来具备的学习准则,学习中的思考与实践缺一不可。并且,量变决定质变因此,要想掌握一项技能,大量的练习必不可少。并且,在学习过程中时常做有针对性的练习,并且通过不断反馈来自我完善、自我提升。在下学期的学习中,我会争取巧妙地运用做中学(Learning By Doing)的方法,我们便可以在实践中发现问题,解决问题,不断提升自我。

二、C语言学习调查

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

我在大一第一学期时曾通过网课的形式自学过一部分C语言,对C语言有了初步的了解。在第二学期的课堂上,老师是按照PPT来教学。因为对前面的部分比较熟悉,起初我有些松懈,但随着难度的加大,我必须在课堂上紧跟老师的思路,明白老师如何去分析一道题。同时,在课下对照课本多敲代码,多加练习。课本中有很多算法的基础实例,通过对教材进行细致研究,够获取新的知识,丰富自己的思路。

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

说实话,我C语言学得很一般。平时我对练习并不是特别重视,直到临近期末才开始大量地练习,我估计自己写过的代码大概有2000-3000行。我对C语言的理解程度也较为一般,前面的内容还相对熟悉,后面的很多知识点诸如指针和数组、结构体和共用体、文件操作,就比较陌生。我认为对于C语言,唯有大量的练习加深刻的理解才能够掌握,所以量大才能引起质变。

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

概念 解释 表示
数组指针 指向数组的指针 (*p)[数组大小]
指针数组 数组内的元素都是指针,存储指针的数组 *p[数组大小]
函数指针 指向函数的指针包含函数的地址,调用函数 (*p)(参数)
指针函数 函数声明其返回值为某个指针时,给函数返回一个地址,用于需要指针的表达式 *p(参数)
  • 学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?

我不明白,上网查询得知:

概念 解释
文件 是计算机管理数据的基本单位,是应用程序保存和读取数据的一个重要场所。
是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道等。

文本文件与二进制文件的区别是逻辑上的,这两者只是在编码层次上有差异。文本文件是基于字符编码的文件,而二进制文件是基于值编码的文件。因此,文本文件与二进制文件的区别仅仅是编码上的不同,二者无本质区别。

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

面向过程程序设计,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。简单来说,就是在设计任务时要先明白自己要做什么,然后分成每个小任务完成,再整合到主线中完成。

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

在C语言里可用函数实现各个功能,作为不同的模块,然后在主函数中调用各个功能模块(函数),这样在维护或升级程序时就可以只关注某个模块,可以简化编程问题。我还没写过多个源文件的程序。

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

我不知道。通过上网查阅资料得知:

概念 解释
内聚性 又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
耦合性 也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
高内聚 一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
低耦合 一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

——引用自百科《高内聚低耦合

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

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

#include <stdio.h>
#include <stdlib.h> void main()
{
int n,i,j,a[N],b[N];
printf("Input n:");
scanf("%d",&n );
printf("A:\n");
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
printf("B:\n");
for(j=0; j<n; j++)
{
b[j]=a[j];
printf("%d",b[j]);
}
}

2. 查找整数数组A中有没有数字5:

#include <stdio.h>
#include <stdlib.h> void main()
{
int a[20],i,b=0;
for(i=0; i<20; i++)
{
scanf("%d",&a[i]);
}
for(i=0; i<20; i++)
{
if(a[i] == 5)
{
b=1;
printf("第%d个数字是5",i);
}
}
if(b == 0)
printf("没有数字5\n");
}

3. 对整数数组A进行排序(从小到大,从大到小):

#include <stdio.h>
#include <stdlib.h>
//从小到大
void main()
{
int a[10];
int i,j,p;
printf("Input 10 numbers:\n");
for(j=0; j<10; j++)
scanf("%d",&a[j]);
printf("\n");
for(i=0; i<9; i++)
for(j=0; j<9-i; j++)
if(a[j]>a[j+1])
{
p=a[j];
a[j]=a[j+1];
a[j+1]=p;
}
for(j=0; j<10; j++)
printf("%d\n",a[j]);
printf("\n");
} #include <stdio.h>
#include <stdlib.h>
//从大到小
void main()
{
int a[10];
int i,j,p;
printf("Input 10 numbers:\n");
for(j=0; j<10; j++)
scanf("%d",&a[j]);
printf("\n");
for(i=0; i<9; i++)
for(j=0; j<9-i; j++)
if(a[j]<a[j+1])
{
p=a[j];
a[j]=a[j+1];
a[j+1]=p;
}
for(j=0; j<10; j++)
printf("%d\n",a[j]);
printf("\n");
}
  • 写一个程序,统计自己C语言共写了多少行代码

我的想法是用某个函数,可以统计整个文件目录下的所有程序代码的行数,并将所有程序代码行数汇总。限于水平,目前不会写。

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

断点就是程序中断的地方。在某行代码处设置断点后,调试程序时,程序运行到该行代码时会自动停止,然后就可以在这进行逐步调试。

关于这部分我有些遗忘,在网上搜索资料时发现一篇不错的博客可参考:设置断点调试程序

20165234 预备作业2 学习基础和C语言基础调查

图:设置断点

  • 每章提出一个问题

第一章:保存源文件时需注意什么(怎样保存)?

第二章:C语言的数据类型和数组,与Java中的是否相通?数组的引用这部分不太懂。

第三章:如何利用复合语句进行运算?

第四章:类方法和实例方法的区别,类和对象在使用上的区别?

......(不懂的地方太多了)

我本身的C语言基础一般,越往后面看越费劲,我也对PPT里的很多内容一知半解,就不笼统地提出问题来糊弄了。

在今后的学习中,我会通过上手操作与实践,在实践中加深理解,解决所有遇到的这些问题。

  • 对比C语言的学习,你对《Java程序设计》的学习有什么具体目标?如何通过刻意训练提高程序设计能力和培养计算思维?如何通过“做中学”实现你的目标?

在接下来的学习当中,我应该端正学习态度。我的具体目标就是,养成每天练习编程的习惯,将学习Java作为每天学习生活中的一部分。可以根据每天的情况不同来分配任务量,无论或多或少,每天都要写代码。并且,每次作业争取独立按时完成,多和班里的大佬交流讨论但不抄袭,有问题能与同学们和老师讨论。每一节课都认真听,每一次作业也都认真完成,及时查漏补缺。在具备基础知识的条件下,做更多的拓展以增加自己的见识。

我希望在学习Java时,思考与实践并行,努力理解课本上的大部分知识。并且在平时的学习中就一步到位,对学习中薄弱的地方进行刻意训练,不把遇到的问题堆到最后。并且,经常看看娄老师的博客,汲取经验,运用“做中学”的方法鞭策自我。