20165312 C语言基础调查和JAVA学习展望

时间:2023-03-08 23:59:59
20165312 C语言基础调查和JAVA学习展望

C语言基础调查和JAVA学习展望

一、有关学习技能的经历

掌握一项技能,我认为最重要的是练习和认真程度。

我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢琴产生了浓厚的兴趣,开始练习钢琴。或许是电子琴的底子在,我练习接受的速度就很快。

体育运动的初学者练习时候都需要重复动作,比如「学习打乒乓球时」要练习挥拍,挥拍成千上万遍之后动作就会定型,也就是教练常说的「肌肉有了记忆能力」,以后实战中可以不假思索地做出来。

--引用自《优秀的教学方法---做教练与做中学

像打乒乓球一样的道理,弹钢琴如果只是练习一两遍可能会把一小段弹出来,可是效果绝对不会和练习十遍的效果一样。所以我初中的时候,每天会坚持抽出一个小时的时间练习钢琴,先从最简单的指法然后再练习老师的作业以及原来学习过的曲子。日积月累,在不经意之间已经背下来很多曲子的谱子,手已经有记忆力了,自然而然的可以弹出曲子,感觉很奇妙。后来上高中了,时间比较紧张就没有再上钢琴课了,不过有时候我还会自娱自乐一下。

为了锻炼身体,高考之后我学习了游泳。最开始的基础学习进程很快,最后一步“换气”我学习几天、喝了不少水可是还是不会。回到家之后我在网上找了教学视频,又想了想教练说的要领,发现自己还是对水有害怕的情绪,不敢再水里做动作,害怕喝到水,身体过于僵硬,所以总是找不到感觉。后来在多次尝试、练习下终于学会,不敢说我的游泳技能有多么强,不过从一开始怕水到现在克服恐惧还是有些进步的。

大一暑假回家我坚持每天去健身房游泳,一开始每天800m,很累,后来逐步每天加50m,适量的练习强度是必要的,我自己能明显感觉我的速度以及耐力有所提升。虽然还不是很快,但是我还会在今年夏天继续练习的。

二、有关C语言的学习

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

我的C大部分是自学的,结合老师上课讲的,课下自己看书,结合书上的例子在C的系统上做题,还有通过实验练习。C的练习还有依靠大二上的密数实验,编写了几个较长的程序,对他的理解进一步加深。

一项技能的掌握程度分为:新手/高级初学者/合格者/精通/专家

--引用自《优秀的教学方法---做教练与做中学

我认为我的C的水平勉强算一个高级初学者,还有很多知识不会,我认为还是练习量不够。仅仅依靠作业的练习量是能够应付过期末考试的,但是离真正掌握还相差甚远。

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

很惭愧的说,我没有统计过C的代码的行数,也没有将以前练习的文件保存,但是离老师要求的10000行代码还相差甚远。我认为想要理解一门语言还是需要练习,简单的程序我可以写出来。量变引起质变,保持一定量的练习再加上理解分析比较才能更好地提高C的水平。

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

数组指针:它的本质是一个指针,即指向数组的一个指针。

指针数组:它的本质是一个数组,即数组的每个元素都是指针。

20165312 C语言基础调查和JAVA学习展望

图片引用自《C语言指针数组和数组指针

我在网上找了一个例子来说明数组指针和指针数组的区别,显然很容易能判断出p1为指针数组,p2为数组指针。

函数指针:本质是一个指针,是一个指向函数的指针变量。以整数型为例写一个声明格式:int (*p1)(int a,int b);

指针函数:本质是一个函数,它的返回值为某一类型的指针(一个地址值)。以整数型为例写一个声明格式:int *p2(int a,int b);

注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

--引用自《指针函数与函数指针的区别

我认为这个方法同样也适用于指针数组和数组指针的区别。

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

流(stream):磁盘或其它外围设备中存储的数据的源点或终点,它提供或储存数据。

数据流将整个文件内的数据看作一串连续的字符(字节),数据流借助文件指针的移动来访问数据,文件指针目前所指的位置即是要处理的数据,经过访问后文件指针会自动向后移动。

--引用自《「C语言」文件的概念与简单数据流的读写函数

流就相当于一个文件指针,有流水的意思。

文件(file):存储在计算机外部存储器中的数据的集合。文件是字符构成的序列,以字节的形式进行储存。

根据文件的储存形式,分为文本文件(ASCII文件)和二进制文件。

文本文件:文本文件在磁盘上储存的是字节所对应的ASCII码,可以在显示器上读出来,可以读懂文件内容。文本文件所占用的空间较大。

二进制文件:是按照二进制代码进行存放的,用0\1表示,虽然也可以在显示器上显示,但我们不知道内容是什么意思。二进制文件所占用的空间较小。

要打开指定的文件可以使用fopen()函数

FILE *fopen(const char *filename,const char *mode);

20165312 C语言基础调查和JAVA学习展望

图片引用自《C中的文件操作

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

面向过程是以过程为中心的编程思想。解决方法:分析出程序所需要的步骤,然后用函数把每一个步骤写出来,最后再依次调用。

参考:《面向过程

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

我认为模块是指将一个程序分成多个步骤来完成,分别编程实现每个步骤,就是模块。函数就可以看作模块。我没有写过多个源文件的程序。

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

高内聚是模块内各个元素彼此结合的紧密程度高,一个模块只负责一项任务,即单一负责原则。低耦合是指程序中各个模块之间联系较少,每个模块的相对独立性很高,模块与模块之间的接口少而简单,这样就很容易改变各个模块的程序。

在程序设计中,将每一个步骤模块化,擅长使用已经存在的函数简化程序。

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

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

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(){
int a[N],b[N];
int i,n;
printf("请输入n:\n");
scanf("%d",&n);
printf("请输入数组a:\n");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
b[i]=a[i];
}
printf("请输出数组b:\n");
for(i=0;i<n;i++){
printf("%d ",b[i]);
}
return 0;
}

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

    int a[100];
int i,n,flag=0;
scanf("%d",&n);
printf("请输入数组a:\n");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]==5){
printf("此数组中有5.");
flag=1;
}
}
if(flag==0){
printf("此数组中没有5.");
}
return 0;

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

int main(){
int a[100];
int i,j,n,flag=0;
int temp;
printf("请输入n:\n");
scanf("%d",&n);
printf("请输入数组a:\n");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)//从大到小{
for(j=i+1;j<n;j++){
if(a[i]<a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
printf("请从大到小输出a:\n");
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
for(i=0;i<n-1;i++)//从小到大{
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
printf("请从小到大输出a:\n");
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
return 0;
}
  • 9.写一个程序,统计自己C语言共写了多少行代码。

能力有限,没能自己写出程序。我在网上找了相关的知识,找到了一段代码,现在能看懂了。不过我还是想尝试自己写出来。

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

断点:在程序的某行代码处设置断点,程序运行到就停止,开始单步调试。

单步调试数组从大到小排列的例子

20165312 C语言基础调查和JAVA学习展望

三、有关JAVA的学习

1.有关ppt上的问题

  • (1)在第一章ppt中,安装jdk在D盘,而设置环境变量JAVA_HOME、path、classpath时却在E盘,我认为这里应该是jdk安装的路径,而非E盘。我在实际操作中按照我自己的想法更改了ppt的做法,事实证明我的想法是正确的。但是我不知道设置在E盘是否正确,如果在E盘也存在一个JDK,那应该是可以行得通的。

20165312 C语言基础调查和JAVA学习展望

20165312 C语言基础调查和JAVA学习展望

  • (2)在第二章ppt、2.3类型转换运算中,基本数据类型精度排列,float变量占4byte,long变量占8byte。我认为排序应该是:byte char short int float long double。而ppt中是:

    20165312 C语言基础调查和JAVA学习展望

后来我查阅了资料:java----基本数据类型精度的研究与使用(char,byte,int等)。发现自己错了,那字节数和精度之间是否有联系呢?

  • (3)在第二章ppt中,输入基本型数据,Scanner reader=new Scanner(System.in);我没有看懂这个是什么意思。可能需要几个例子来理解一下。
  • (4)在第三章ppt中,自增自减运算符中:

int f=2;

int m=2;

int y=(f*++m)+m; //y=9;

我计算的y=8,在第二个m是取m=2(原值)还是取m=3(前面m运算后的值)?

  • (5)
class Lader
{ float above,area;
float computerArea()
{ area=(above+bottom)*height/2;
return area;
}
float bottom;
void setHeight(float h)
{ height=h;
}
float height;
}

这段代码中,bottom、height是局部变量还是成员变量呢?我比较偏向于成员变量,因为他不在方法体中。那这样是否就代表了成员变量的声明可以在方法之后?和位置无关?

  • (6)
      int add(int x,int y,int z)
{ return x+y+z;
}

在这段代码中的意思是声明有参数的方法头,显而易见x、y、z为局部变量,局部变量是没有默认值的。在使用局部变量的时候我们要保证其有具体的值,那这个是如何直接return x+y+z的呢?

  • (7)
class Circle
{ double rad;
void changeRad(double newRad)
{ rad=newRad;
}
}
class Test
{ public static void main(String args[])
{ Circle cir=new Circle(10);
cir.changeRad(100);
}
}

在这段代码中,cir.changeRad(100);表达的意思是什么呢?我理解的意思是调用方法changeRad,其引用值是100,那是否rad的值由10变成100?

  • (8)在第五章中,子类是如何继承父类的方法?在ppt中没有看到具体的例子。
  • (9)在第六章中,程序设计中的“开-闭”原则是什么?
  • (10)在第七章中,异常类(exception)和error有什么区别?

后续的ppt我还没有阅读完,前面的ppt中已经有很多不懂的地方,没有前面的基础后面的就更不容易理解,我会在以后自学的时候及时补充我的疑问。

2.有关JAVA的学习

相比较C的学习,我会加大JAVA练习的程度。通过这几天的自学速读ppt,我觉得理解JAVA相比较C而言更困难,万事开头难,我会努力克服困难的,主张问题自己解答。在阅读ppt的同时,我也看了视频,我觉得视频中讲解的更加通俗易懂,并且讲到了很多ppt中没有的小细节,是自学理解的好办法。当然还需要实践,我自己尝试运行了Hello.java,虽然成功运行出来了,但是中间出了很多我意想不到的小问题,比如需要大写的我打的小写,因为一个小小的错误无法编译,所以下一步学习中我会多自己尝试着运行程序,结合教学视频尽多的掌握知识。我也会在后续的学习中积极补充我的问题。看过如何提问我受益很多,我会多结合自己的思考提出更有价值的问题。