20165316 技能学习心得与c语言学习
20165316 技能学习心得与c语言学习
一、技能学习经验
我会打乒乓球,在中国,我只能说我“会”打,至于“比大多数人更好”我不敢断言,因为我无时无刻不感受到乒乓球圈子远比我想象的要深。但是,我觉得乒乓球学习的过程对我今后的学习有所启发,我希望通过总结给大家,最主要还是给自己,一个方向。
像乒乓球这类运动,主要是反复练习,我记忆最深刻的是小学一年级,刚刚能在台子上打球,教练就让我练习多球,即一次使用一个动作套路连续打200到300个球。之后每次练球都必须练习基本功。可以毫不夸张的说,基本功贯穿了一个乒乓球运动员的一生。但是,很多人会发现乒乓球运动员在比赛时经常为了救球做出一些“非套路”的动作,很多经典的照片都记录了他们的精彩瞬间,那么,是什么让他们能够打出这些精彩的对抗呢?答案很简单,是平时基本功训练形成的“球感”。最终,运动员们又不拘泥于“型”,而是追求更加内在的东西——控球能力。据说国家级运动员可以精确到把球打到一个硬币上,可见控球能力,换句话说就是自我控制能力,更为重要。这一点与娄老师在乒乓球训练总结中所叙述:“任何的学习都是在增强人的可控能力”是相同的。
另外,在打乒乓球的这十几年里,我对乒乓球的态度从“被动接受”变成了“主动学习”,很显然,反复的训练带来的不一定是枯燥和无趣,反而随着训练难度的提高和对自身要求的严格,我逐渐感受到挑战自我的乐趣。而这种乐趣,是科学的训练方法所致:每个目标都是可以达到,但有一定难度的。这样,我就不会放弃或者自大,日积月累,技术水平自然有所提升。这一点娄老师在乒乓球训练总结中也有论述。其实,与不同的对手对打也有这种效果:能够看到自己的不足,进而进行自我的,或者有教练帮助的反思和改进,最终实现自我提升。此时,比赛的胜负已经变得不再重要了。
二、c语言学习调查
1.你是怎么学习C语言的?(作业,实验,教材,其他),与你的高超技能相比,C语言的学习有什么经验和教训?
我学习c语言主要是上课听老师讲,课下在网上平台练习,遇到不会的问题用百度查答案,将答案程序复制下来,进行分析和学习。在c语言学习过程中,我在自我学习方面比较欠缺,自认为掌握老师要求所学就可以,考试通过就可以,自我满足,没有想要进一步学习的欲望和动力,导致我c语言的学习一直停留在舒适区,简单程序重复化,没有尝试过挑战自己,没有主动探索c语言更多的功能。简言之,我的c语言基础不够牢固,对计算机语言的理解还不够深刻。
2.目前为止估算自己写过多少行C代码?理解的情况如何?量变引起质变,如何平衡质和量?
代码数量我在上一篇博客中也提到过,大概3000行左右,基本自己写过的都理解了(现在也快忘光了)。由此可见,没有持之以恒的练习,任何技能都会退步。所以关于质和量,我认为应该循序渐进。像我这种普通学生,理解示例程序之后不进行再创造是不行的。就是说我起码要写2到3个类似程序(解决方法类似)才能够基本掌握。所以,在学完一个知识点之后,我必须自己试一下能不能使用,这就是量变的过程;然后再考虑更难的程序,即质变。我觉得量变与质变数量上2:1到3:1最为合适。用的时间上大概要反过来量变比质变大概1:2到1:3比较合适。
3.学过了C语言,你分的清数组指针,指针数组;函数指针,指针函数这些概念吗?
这些概念主要是看名词吧,即“指针”、“数组”、“指针”、“数组”。所以数组指针和函数指针本质上是一个指针,分别指向数组中的一个地址和某个函数的地址;而指针数组顾名思义是一组地址;指针函数就是返回指针——一个地址的函数。
4.学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?
惭愧,不知道。但是我查到了文本文件和二进制文件的区别;二者的编程操作似乎是相同的,只是写入读取时规则不同,参阅c语言里面文本文件和二进制文件有什么区别,从侧面印证了二者的编码方式不同。
5.学过了C语言,你知道什么叫面向过程程序设计吗?它解决问题的方法是什么?
面向过程顾名思义就是以过程为中心,主要关注一句话里的“动词”的解决问题办法。把需要的步骤一步一步实现。
6.在C语言里面,什么是模块?你写过多个源文件的程序吗?
我个人理解为把一个程序的不同步骤拆分成一个一个的模块,分别调用,进而实现预期效果。惭愧的是,我没有写过多个源文件的程序。
7.学过了C语言,你知道什么是“高内聚,低耦合”吗?这个原则如何应用到高质量程序设计中?
根据之前对钱老师的话的模糊记忆和我的理解,“高内聚,低耦合”是指一个程序的各个模块之间的联系尽量少,模块的泛用性尽量高的一种状态。在高质量程序设计中,我们应尽量使用现成的函数和模块,用尽量少的语言将几个模块连接起来,达到预期的目的。
参考:百度百科
8.学过了C语言,你如何把数组A的内容复制到数组B中?如何查找整数数组A中有没有数字5?如何对整数数组A进行排序(从小到大,从大到小)?写出相应的程序。
解答如下
#include <stdio.h>
#include <stdlib.h>
void maxnumber(int a[30],int n)//从大到小排序
{
int i, j, max, temp;
for(i=0; i<n; i++)
{
max = i;
for(j=i; j<n; j++)
{
if(a[max]<a[j])
{
max=j;
}
}
if(max!=i)
{
temp=a[i];
a[i]=a[max];
a[max]=temp;
}
}
}
void minnumber(int a[30],int n)//从小到大排序
{
int i, j, min, temp;
for(i=0; i<n; i++)
{
min = i;
for(j=i; j<n; j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)
{
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}
int main()
{
int i,n,a[30],b[30];
printf("how many numbers?\n");
scanf("%d",&n);
if(n>30&&n<1)
{
printf("too many!\n");
}
else
{
printf("please input numbers:\n");
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];//数组内容复制
}
maxnumber(a,n);
for(i=0; i<n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
minnumber(a,n);
for(i=0; i<n; i++)
{
printf("%d ",a[i]);
}
}
return 0;
}
根据老师对去年作业的指导,我查找了strcpy、qsort和bsearch函数的使用方法,实际上我们上课学过strcpy函数,这里之所以不引用是因为该函数适用于字符串的复制,而我在这里规定的变量是整数数组形式,在查找中,我发现了另一个函数strncpy,此函数可以实现将一个字符串复制到另一个字符串的某个位置,并能检测是否溢出。
关于qsort这个函数
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
显然,base是数组地址,num是数组的量,size是每个数占内存大小,comparator是一个函数指针,这个函数需要自己去写,假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,如果是降序反过来即可。const是指保证只读变量不被意外改变。
关于bsearch这个函数
void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *));
key是关键词指针,base是整个要查找的数组,nmem数组中元素的数量,size每个元素长度(占内存大小),最后一个和上文qsort函数基本相同。
9.写一个程序,统计自己C语言共写了多少行代码。
惭愧,不会写,只能放一段我改过的别人的代码。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv)
{
FILE* rf = fopen("f:\\main.txt","r");
char a[1024][128];
int i=0;
while(fgets(a[i],128,rf))i++;
int n=i;
printf("行数:%d\n",n);
fclose(rf);
i=0;
system("pause");
return 0;
}
这个代码可以统计一个txt文档当中的代码,但是每行必须小于128字节,而且无法统计是否会溢出,有些文件(比如这里的main.txt是我用图片base64编码得到很长一段代码),就会导致崩溃,可以说只能进行简单的统计工作。
参考:百度知道
10.你知道什么是断点吗?给出自己调试程序的例子。
断点就是程序调试是自动中断的地方,比如说我在调试第9问的程序时查找崩溃的原因就是把断点设置在主程序第五行的时候程序崩溃,表明在打开文件进行循环时数据溢出导致崩溃。
三、阅读PPT提出问题
- 在针对JAVA平台无关性的介绍中,特别强调了JAVA根据不同平台需要搭建运行环境,而c却不用搭设环境,直接生成针对不同平台的运行文件。但是我之前在学习c的时候,出现过因为环境没有搭设好而产生的无法编译的情况,请问这个该如何解释,如何通过几个浅显易懂的例子来说明两种语言在编译到运行过程中的差异?
- 在“把级别高的变量的值赋给级别低的变量”这一段,使用了“显示类型转换运算”,那么类型转换运算之后数值会有怎样的变化?比如在“int x=(int)34.89;”这个例子中,x最后应该是多少?
- 在程序
class Test
{ public static void main(String args[])
{ int x,y=10;
if( ((x=0)==0) || ((y=20)==20) )
{
System.out.println("现在y的值是:"+y);
}
}
}
我不太理解“((x=0)0) || ((y=20)20)”的意思,难道x=0也是一个值吗?如果是,它应该等于?a=(x=0)是一个连等的构造,a的值取决于x的值。问题已解决。
4. 在程序
public class A {
void f() {
int m = 10,sum = 0; //成员变量,在整个类中有效
……
明明定义m和sum是在f的方法体中进行的声明,为什么它们还是A的成员变量?怎样区分成员变量和局部变量?
5. 在学习上转型对象时,在把上转型对象强制转化为子类的对象的过程中,是不是必须满足子类和父类一个子类新增了一个变量导致父类一个变量被隐藏的关系?
6. 面向接口的类里面的方法一定要用public修饰吗?接口产生的class文件又是指什么?
7. 在程序
public void loading(int m) throws DangerException {
realContent += m;
if(realContent>maxContent) {
throw new DangerException();
}
System.out.println("目前装载了"+realContent+"吨货物");
}
第一行的throws是什么意思?DangerException();又在整个类中扮演什么演的角色?是一个方法还是子类?
8. “常量池中的数据在程序运行期间再也不允许改变”这句话的意思时放入字符序列的内存空间不允许改变,还是放入字符的内存空间和引用(地址)都不允许改变?那么,是不是“String s = new String("we are students");
String t = new String("we are students");
”和“String s = new String("we are students");
String t = s;”是不同的语句?
9. 程序中
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
是什么意思?
10. 重写接口中的方法语句
public boolean accept(File dir,String name) {
return name.endsWith(extendName);
}
是什么意思?创建一个目录是在文件类中创建还是用“public boolean mkdir()”语句创建?二者有什么不同?
11. 通配符在预处理中有什么作用?事物描述前后关闭和开启自动提交模式有什么作用?一定要把开始事务处理放在行为描述之后吗?
12. 垃圾实体是怎样产生的?是否说明一个线程可以被分配多个实体?如何避免这种情况?
13. 服务器建立一个ServerSocket对象时,必须知道客户的IP地址或者端口号,有什么方法能够在不知道以上两个信息的时候与客户连接?
14. Ellipse2D类中,括号里的四个变量分别表示什么?set类中setArc方法括号里的六个变量又分别表示什么?
15. 怎样实现树集中“大小”的比较?树集是怎样引用对象中的比较方法的?对象必须有Comparable接口和compareTo方法吗?
四、JAVA学习的目标与途径
和我之前在第一篇博客中写的一样,在课程内容的学习中,基础上,我希望能够掌握这门语言,并使用它编写简单的应用程序;深层次上,既然JAVA被称作“面向对象的程序设计”,我认为相对c来讲,一定有它的独到之处,在思维方式上也一定有所不同,我希望能够了解掌握这门计算机语言的设计思路和思维模式。从而能够举一反三,触类旁通。
我认为,我应该勇敢地从“舒适区”走出来:在学习上,勇于挑战难题,平时多关注行业前沿动态,在博客园这个平台上,利用它丰富的资源,挑战难关,寻求解答;在生活中,调整自己的心态,磨练自己的意志,挤出更多时间用以提升自我价值,进而养成良好习惯,使终身受益。
写程序主要是实践,光看书是不可能有所突破,娄老师在做中学一文中提到“不光要动手,还要理解背后的原理;不光要会用工具,还要理解支撑的理论”“学习提升要有反馈”。谁都想成为“专家”,但是最终实现梦想的能有几人?因此,我计划这学期充分利用时间,进行有益的、大量的学习,在前期尽量积累经验,通过博客园增长自己的见识,让自己不至于陷入“疲于应付”的境地中,同时,通过多种方式与老师、同学们交流,甚至可以通过网络学习一些“大神”的操作。简而言之,仰望星空,脚踏实地,相信在老师“做中学”的正确思想引导下,我能够实现目标。