20165201 学习基础和C语言基础调查
技能
我的一项拿得出手的技能是绘画,从 5 岁学到了 13 岁。 国画、素描、水粉、水彩都包括在内,虽然水平不一,但是绘画技巧是相通的。
8 年时间,它带给了我很多,最重要的一点,就是对基本功的掌握。举个例子,我刚学国画的时候,赵XY老师让我们用小白云画同心圆,从最内圈开始不间断,直到画完最外圈,宣纸上要画满,每天最少一张。当然,前几张的圆都惨不忍睹,直到过了一个月左右,才好看些。赵老师的目的其实不是让我们练习画圆,而是让我们充分掌握毛笔的笔锋和手感,练的时间久了,这些自然就有了。这和娄老师博客中提到的是同样的道理:
套路(Kata)指针对某一种特定技术或技能进行重复性的练习,从而将其熟练掌握。这个概念借鉴于武术,指的是可以独自或多人共同练习的一系列动作、招式。
体育运动的初学者练习时候都需要重复动作,比如「学习打乒乓球时」要练习挥拍,挥拍成千上万遍之后动作就会定型,也就是教练常说的「肌肉有了记忆能力」,以后实战中可以不假思索地做出来。
-- 引用自娄老师《优秀的教学方法---做教练与做中学》
但是如果没有兴趣作为驱动,也就不会有日复一日的练习。我的爷爷在我很小的时候,教我用毛笔画虾,兴趣大概就是从那时候培养起来的吧。
说实话,我也有一段时间遇到瓶颈觉得坚持不下去了,有过放弃的念头,然而正如娄老师所说:
现实生活中,只有极少部分人有意志力能长时间大量重复枯燥的基础练习。半途而废是许多人都经常面临的事情。
-- 引用自娄老师《做中学之乒乓球刻意训练一年总结》
能否从入门到精通,就看有没有毅力坚持下来,将量变积累成质变。 想成功又不去付出,是绝不可能的。
此外,赵老师能给我的最大帮助,就是课上在我练习的时候能够及时纠正我手法上的错误。这也就是娄老师所说的及时反馈。我在画鸟雀时有个别人都不会出现的毛病,我画出来的所有鸟都长得一样>_<...后来在赵老师多次手把手的纠正下最终克服了。可以说,仅凭自己是很难做到的。
Java
我认为学Java也应当如此。
- 首先克服对 Java 的抵触心理
- 简略看一下整本书大致要学的内容
- 万事开头难,尝试编写第一个 hello world 程序
- 继续学习之后的内容,对于每个知识点要反复练习
- 出现问题要及时向老师或同学提问,直到问题得到解答
C语言基础
-
Q:你是怎么学习C语言的?(作业,实验,教材,其他),与你的高超技能相比,C语言的学习有什么经验和教训?
A:去年寒假我买了一本C语言的书提前自学的,开学后又用教材、作业系统进行巩固。期间编写了2个版本的成绩管理系统,综合性很强,收获很大。C语言的学习就是反复练习的过程,当我们编写综合性强的程序时,很多语句都是不需要停下来动脑子想的,比如冒泡排序、结构体等。 -
Q:目前为止估算自己写过多少行C代码?理解的情况如何?量变引起质变,如何平衡质和量?
A:我大概写过5000行以上的C代码。量变到达足够程度才能引起质变,但是要注意的是,一定要把握度,比如练习选择排序,当已经能够熟练运用时,就基本代表掌握了,不必再刻意的反复练习。我认为质变的标准是:能够在编写一个程序时不假思索的写出这些语句。 -
Q:学过了C语言,你分的清数组指针,指针数组;函数指针,指针函数这些概念吗?
A:分得清啊。
数组指针是一个指向数组的指针,本质是指针;
数组指针:(* p)[数组大小]
指针数组是一个包含若干个指针的数组,本质是数组;
指针数组:* p[数组大小]
函数指针是一个指向函数的指针,本质是指针;
函数指针:(* p)(参数)
指针函数是一个返回值为指针的函数,本质是函数。
指针函数:* p(参数) -
Q:学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?
A:程序在和文件交互时,是通过数据流的形式进行的。打开文件时,数据流先从磁盘到缓冲区,再从缓冲区到程序,关闭文件时正相反。
文本文件是以某种常用字符编码方式编码的,定长的,比如 ASCII ;而二进制文件是用自定义的编码方式编码的,不定长,打开二进制文件会显示一堆乱码。但它们在物理层面上都是二进制编码。我没有实际操作过这两种文件...... -
Q:学过了C语言,你知道什么叫面向过程程序设计吗?它解决问题的方法是什么?
A:C语言是面向过程的,而Java是面向对象的。
举个例子:
面向过程是定义三个事件:吃早饭、吃午饭、吃晚饭。再确定由 Bob 来做,也就是参数是 Bob ,重点是把过程写出来;
而面向对象是先定义 Bob ,再确定他要做什么,重点是这个对象怎么做。 -
Q:在C语言里面,什么是模块?你写过多个源文件的程序吗?
A:模块就是能够实现一定功能的源文件。我还没有写过过个源文件的程序... -
Q:学过了C语言,你知道什么是“高内聚,低耦合”吗?这个原则如何应用到高质量程序设计中?
A:高内聚就是每个模块独立性强,所实现的功能具有专一性,内部各要素紧密结合;低耦合就是各个模块之间的联系弱,接口较为简单,相互影响程度小。 -
Q:学过了C语言,你如何把数组A的内容复制到数组B中?如何查找整数数组A中有没有数字5?如何对整数数组A进行排序(从小到大,从大到小)?写出相应的程序。
A:
1、把数组A的内容复制到数组B
#include<stdio.h>
#include<string.h>
#define N 100
int main()
{
char A[N]={"afisniuiksnfinai"},B[N];
memcpy(B,A,strlen(A));
printf("%s
",B);
return 0;
}
2、查找整数数组A中有没有数字5
#include<stdio.h>
int main()
{
int A[20]={3,7,4,1,8,223,65,23,65,8,5,32,78,12,16,861,34,5,57,19};
int i;
for(i=0;i<20;i++)
{
if(A[i]==5)
{
printf("数组中有 5 !
");
break;
}
}
return 0;
}
3、对整数数组A进行排序(从小到大,从大到小)
冒泡排序
#include<stdio.h>
void Sortup(int N[]);
void Sortdown(int N[]);
int main()
{
int i;
int A[20]={3,7,4,1,8,223,65,23,65,8,5,32,78,12,16,861,34,5,57,19};
Sortup(A);
for(i=0;i<20;i++)
{
printf("%d ",A[i]);
}
Sortdown(A);
for(i=0;i<20;i++)
{
printf("%d ",A[i]);
}
return 0;
}
void Sortup(int N[])
{
int i,j,temp;
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{
if(N[i]>N[j])
{
temp=N[i];
N[i]=N[j];
N[j]=temp;
}
}
}
}
void Sortdown(int N[])
{
int i,j,temp;
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{
if(N[i]<N[j])
{
temp=N[i];
N[i]=N[j];
N[j]=temp;
}
}
}
}
选择排序
#include<stdio.h>
void Sortup(int N[]);
void Sortdown(int N[]);
int main()
{
int i;
int A[20]={3,7,4,1,8,223,65,23,65,8,5,32,78,12,16,861,34,5,57,19};
Sortup(A);
for(i=0;i<20;i++)
{
printf("%d ",A[i]);
}
Sortdown(A);
for(i=0;i<20;i++)
{
printf("%d ",A[i]);
}
return 0;
}
void Sortup(int N[])
{
int i,j,k,temp;
for(i=0;i<19;i++)
{
k=i;
for(j=i+1;j<20;j++)
{
if(N[k]>N[j])
{
k=j;
}
}
if(i!=k)
{
temp=N[i];
N[i]=N[k];
N[k]=temp;
}
}
}
void Sortdown(int N[])
{
int i,j,k,temp;
for(i=0;i<19;i++)
{
k=i;
for(j=i+1;j<20;j++)
{
if(N[k]<N[j])
{
k=j;
}
}
if(i!=k)
{
temp=N[i];
N[i]=N[k];
N[k]=temp;
}
}
}
-
Q:写一个程序,统计自己C语言共写了多少行代码。
A:上一次作业统计过了。 -
Q:你知道什么是断点吗?给出自己调试程序的例子。
A:断点就是当我们运行程序时,到断点处会停止,以便逐步检查程序。 -
Q:对比C语言的学习,你对《Java程序设计》的学习有什么具体目标?如何通过刻意训练提高程序设计能力和培养计算思维?如何通过“做中学”实现你的目标?
A:在学习Java时,我要坚持每周写一定量的代码,并在博客写上自己的学习心得,通过进度条监督自己。
在学习C语言的过程中,我有一个特别好的方法,就是对于同一个问题,去用多个办法解决,比如对于排序问题,可以用冒泡排序、选择排序、插入排序等,也可以直接用库函数解决,这样可以加深理解。