获取技能的成功经验与C语言
你有什么技能比大多数人好
小时候学过很多东西(钢琴、书法、画画、竹笛、葫芦丝、古筝……),不过都没学出什么成绩。对于这些艺术,年纪小的时候,对这些都只有一时的兴趣,也不懂什么坚持,很多学一学就放弃了。年纪稍大点的时候,又开始忙于学习,哪有时间去发展艺术兴趣。书法是坚持最久的,学了两年,那时我在班上是字写得最好的,老师批改我的作文会在后面注“小书法家”,课堂作业每篇我都是100+10(全对的基础上,字写得好加10分),搭着小凳子帮老师抄题到黑板上,还写过作品到教委参展呢……不过后来教我的老书法家因为身体原因不能再给我们上课了,也因为学业负担慢慢变重,书法就被我完完全全的放下了。现在回想起来还真是挺遗憾的。
针对这个技能的获取你有什么成功的经验
除了在艺术上的学习,在多年的课程学业上,我感悟出自己认为的学习核心和本质就是四个字“熟能生巧”,我发现学习一个新的技能,最开始都是从模仿开始的,不断地模仿,达到熟练,才能“生巧”。
与老师博客中的学习经验有什么共通之处
我感受到的学习诀窍“熟能生巧”和娄老师说的通过“刻意训练”产生“肌肉记忆”有些异曲同工之妙吧。所以我一般学东西开始也都不懂,但我不会急躁,因为我知道学习是个循序渐进的过程,不急不躁才能慢慢领悟到精髓。
下学期的Java课应该也是这样,从模仿开始,写些小程序,不断熟练,体会老师的话,积累到一定程度,就像冯老师说的“开窍就是一瞬间的事”希望下学期java的学习中,我能体会到这种豁然开朗的感觉。
关于C语言
你是怎么学习C语言的?(作业,实验,教材,其他),与你的高超技能相比,C语言的学习有什么经验和教训?
上学期C语言的学习我的学习方式是以课堂和题目为主,配合着看书理解。现在反省当时的学习状态,发现学习不够深入,不能举一反三,还有当时极不好的编程习惯,对很多编程方法不求甚解,都让我在面对大程序时寸步难行。所以在下学期Java学习过程中,我会更加注重对很多东西本质的理解。
目前为止估算自己写过多少行C代码?理解的情况如何?
目前为止5000行代码应该是有的,自己编的程序当时肯定是理解了,只是说很多东西理解不够深入全面吧。
学过了C语言,你分的清数组指针,指针数组;函数指针,指针函数这些概念吗?
我的理解是:数组指针是指向数组的指针,是一个指针变量;指针数组是一个数组里面存放的全是指针,是一个数组;函数指针是指向函数的指针,是一个指针变量;指针函数是返回值是一个指针的函数,是一个函数。
学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?
二进制文件和文本文件最大的区别是存储数值型数据的方式不同,二进制文件中数字是直接按其二进制形式存储的,优点在于大数存储节省空间,又因为无需转换为节省时间;文本文件是一个个数字分开存的,还有按ASCII转换,优点在一个字节对应一个字符,方便读取,在打开文本文件时只需在文本文件打开方式后面加个b。C语言文件都是字节流,又称为流式文件。
学过了C语言,你知道什么叫面向过程程序设计吗?它解决问题的方法是什么?
至于什么叫面向过程程序设计我还没有体会,下学期的Java课程里我会重点体会这个问题。
面向对象的方法主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势,因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
在C语言里面,什么是模块?你写过多个源文件的程序吗?
我对模块的理解就是模块是解决问题的一个步骤吧,往往是通过一个函数来实现的。源文件的程序我还没有涉及过。
学过了C语言,你知道什么是“高内聚,低耦合”吗?这个原则如何应用到高质量程序设计中?
“高内聚,低耦合”我这学期的密数实验课上体会特别深刻,一个“高内聚,低耦合”的程序会将每个步骤分离出来写成函数,而主函数中简单几句话便可将它们联系起来,这样在单步调试的时候,会轻松很多。所以我们在编程之前一定要先有个整体的框架思路,每个步骤尽量编写函数实现。
学过了C语言,你如何把数组A的内容复制到数组B中?如何查找整数数组A中有没有数字5?如何对整数数组A进行排序(从小到大,从大到小)?写出相应的程序。
对数组的处理我一般有两种,一种是直接使用下标遍历数组,另一种是通过指针来遍历数组;对于特殊的数组比如字符串,还可以使用简便的字符串函数来处理。
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int A[N],B[N];
int i,j,k,temp;
int flag=0;
for(i=0;i<N;i++)
{
scanf("%d",&A[i]);
}
printf("\n");
//A复制到B
for(i=0;i<N;i++)
{ B[i]=A[i];
printf("%d ",B[i]);
}
printf("\n");
//A中查找5
for(i=0;i<N;i++)
{
if(A[i]==5)
{
flag=1;
}
}
if(flag)
{
printf("A中有5");
}
else
{
printf("A中没有5");
}
printf("\n");
//对A排序,从大到小,选择排序法
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
{
if(A[j]>A[k])
{
k=j;
}
}
if(i!=k)
{
temp=A[k];
A[k]=A[i];
A[i]=temp;
}
}
for(i=0;i<N;i++)
{
printf("%d ",A[i]);
}
}
写一个程序,统计自己C语言共写了多少行代码。
为了写统计电脑里代码行数的程序我真是花费了好大力气!在冯老师的帮助下总算是有了一个成品。在这个过程中我有三点体会:
- 命名的规范性很重要。以前看C语言书上的变量命名好长,还觉得这样费事,但经过这个程序,我才发现正是它规范的变量命名,竟让我从完全不懂一步步慢慢看懂了这个程序!可见变量命名对程序可读性的重要作用。
- 宏的优势。这个程序里判断磁盘类型的函数是直接判断函数返回值是不是3,来判断磁盘是不是本地磁盘,这样其实是不好的,应该用宏DRIVE_FIXED来表示,这样可以使程序兼容性更好。
- 函数参数不理解。打开文件的函数fopen第一个参数是文件名,之前打开文件都是自己键入的文件名,格式一般是fopen=("D:\\.","r"),但这个程序里我找到文件后,文件名直接就是filename里的字符串了,所以直接是fopen=(filename,"r")即可打开,可见我对字符串的理解还不够到位,特别是字符串的表示方法上不能贯通。
#include<stdio.h>
#include<windows.h>
void FindFile(char* ,char* );
int count=0;//统计文件数
char fname[32];
int hangshu=0;//统计总行数
#define BUFSIZE 256//获取本地磁盘驱动器的盘符及类型
int main(int argc,char* argv[])
{
char szLogicalDriveStrings[BUFSIZE];
DWORD iLength;//DWORD 就是 Double Word, 每个word为2个字节的长度,每个字节是8位,共32位。
int iSub;
printf("请输入要搜索的文件名:");
scanf("%s",fname);
ZeroMemory(szLogicalDriveStrings, BUFSIZE);//全部清零
iLength = GetLogicalDriveStringsA(BUFSIZE-1, szLogicalDriveStrings);
for(iSub=0; iSub<iLength; iSub+=4)
{
//如果不是固定磁盘驱动器:本地硬盘或移动硬盘,忽略
if(GetDriveType(szLogicalDriveStrings+iSub)!=DRIVE_FIXED)//DRIVE_FIXED=3; {本地硬盘}
continue;
FindFile(szLogicalDriveStrings+iSub,"*.*");
}
printf("%d",hangshu);
printf("一共发现%d个文件...\n",count);
scanf("%*d");
return 0;
}
void FindFile(char* pfilename,char* pfilter)
{
char ch;int j;int t;
FILE *fp;
WIN32_FIND_DATA findfiledate;//WIN32_FIND_DATA这个结构用于装载与找到的文件有关的信息。该结构可用于后续的搜索
HANDLE hfind;
char filename[512];
char lpFileName[512];
char _lpFileName[512];
int i;
int result;
for(i=0;*(pfilename+i)!='\0';i++)
filename[i]=*(pfilename+i);
filename[i]='\0';//如果最后一个字符不是'\'
if(filename[strlen(filename)-1]!='\\')
{strcat(filename,"\\");} //添加'\'
strcpy(lpFileName,filename);
strcat(lpFileName,pfilter);
hfind=FindFirstFile(lpFileName,&findfiledate);//该函数到一个文件夹(包括子文件夹)去搜索指定文件
if(hfind==INVALID_HANDLE_VALUE)//FindFirstFile执行错误的返回值一个常数,即-1
return;
do
{
//如果不是目录
if(!(findfiledate.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))//FILE_ATTRIBUTE_DIRECTORY——找到的是一个目录
{
//如果找到指定文件
if(0==strcmp(fname,findfiledate.cFileName))
{
strcat(filename,findfiledate.cFileName);
printf("%s\n",filename);
if((fp=fopen(filename,"r"))==NULL)//打开找到的文件
{
printf("Failure to open !\n");
exit(0);
}
while((ch=fgetc(fp))!=EOF)//统计行数
{
if(ch=='\n')
hangshu++;
}
count++;
}
}
//如果是目录
else
{
//.和..不输出 返回的文件名中会包含"."和".."。“.'代表本目录,".."代表上一层目录。一般情况下需要把这两个名称过滤掉。
if(findfiledate.cFileName[0]!='.')
{
strcpy(_lpFileName,filename);
strcat(_lpFileName,findfiledate.cFileName);
FindFile(_lpFileName,pfilter); //递归
}
}
}while(FindNextFile(hfind,&findfiledate));//FindNextFile返回为真,继续搜索
FindClose(hfind);
return;
}
你知道什么是断点吗?给出自己调试程序的例子
断点是调试程序时运行停止的地方。但我单步调试的能力其实比较差,调很久才能找到错误。
对《Java程序设计》的学习有什么具体目标?如何通过刻意训练提高程序设计能力和培养计算思维?如何通过“做中学”实现你的目标?
具体目标:每天5道编程题。
正如老师的“做中学”所说,学习不能总在舒适区学习,学C时,我就有些惧怕复杂的程序,简单的程序练了很多遍,进步不明显。所以下学期的Java课,在掌握简单程序的基础上,我要进一步尝试稍微复杂的程序。
公文写作
就我个人而言,我还是喜欢写东西的,也喜欢看书,我想在课余时间,广泛积累,开拓视野,所谓“读书破万卷,下笔如有神”,不仅仅是专业课的书籍,各方面的书籍都要涉猎,开卷有益。为写好公文打下坚实的基础!