20165103学习基础和C语言基础调查
学习基础和C语言基础调查
技能及其学习经验
在阅读老师做中学系列文章的时候,读到了一句话:
开发极点起因主要是个人兴趣爱好和工作需要。
-- 引用自《做中学之五笔输入法实践教程》
回顾自己的不断的学习实践过程中,自己所学得比较好的知识、技能大多都是由于自身的兴趣加上工作需要才一步步逐渐掌握。在最近掌握的几个技能当中,太极拳这项技能勉强可以达到一个较高的水平。
学习经验
入门
- 首先还是因为对传统武术有一定兴趣,加之可以锻炼身体,便决定加入学校社团,开始学习太极拳。
- 起初还是先了解了一下关于太极拳的历文化史及通过太极所能产生的积极作用,同时,了解了太极锻炼中的注意事项。
刚开始学习的也就是一些基础太极杨氏步法,一些基本的太极拳架。
学习过程
我在整个太极拳学习的过程中大致分为4个阶段:
- 第一阶段:学习套路中每一式的动作。由于传统武术很多都将套路分为很多式,实际上就是对整个套路分为了许多模块,而我学习的第一步就是将单个模块学会。在这里使用了在学习的基础上进行复习的方式,确保之前动作的熟练。
- 第二阶段:控制身体使各动作连贯起来。这个阶段就相当于程序设计里的debug,最终目的是为了让整个动作可以流畅地完成。这里由于自己身体的协调能力还行,进行的比较顺利。
- 第三阶段:对动作的优化。这一阶段也可以看作程序的优化。通过对动作的纠正,不断地走出舒适区,加强自己对身体的控制能力,使动作规范和美观。
第四阶段:在不断地刻意训练中体会其神韵。在将近一个多月的时间中,每天将同一套动作重复20遍以上,在闲暇时间也在脑中演练动作的流程。通过不断分析其动作的运动逻辑,改进自己的动作,调整身体状态,最后将整套动作的神韵逐步地发掘出来。
经验
- 在不断学习的过程中,毅力是很重要的一环,在身体锻炼、基本功的上只有通过每天的练习才能有所进步,不断地克服身体上的不适以及合理安排时间。在后期不断重复训练的同时也要克服精神上所带来倦怠。
- 在学习的时候要注意刻意练习,不要做单纯的低质量的重复劳动。
反馈很重要,通过不断的反馈才能发现问题所在,从而进一步思考如何解决问题。
C语言基础调查
你是怎么学习C语言的?(作业,实验,教材,其他),与你的高超技能相比,C语言的学习有什么经验和教训?
c语言的学习时从大一下学期《程序设计基础》课程开始学习的,主要学习方式是在课下看教材了解内容,课上听徐老师讲需要注意的知识点。主要的学习方式是通过老师、同学所给出的题目,进行编程,通过单步调试理解相关知识。
同太极拳不同,在c语言的学习中需要更好地将思路整理清晰,同时还要考虑学习重点内容。由于c语言学习时比较偏重于老师的实验和作业,所以在许多更加实用版块的学习不足。(如:链表、位运算、文件操作)同时,由于有一学期的时间没有进行大量的编程,曾经的一部分知识有遗忘的迹象。此外,还存在书上代码理解后却无法在脱离书本时快速准确使用的问题。
目前为止估算自己写过多少行C代码?理解的情况如何?量变引起质变,如何平衡质和量?
目前为止估算下来写下来有3000行代码。在基础的语句方面已初步理解,对部分操作、库函数的理解还不充分,在不断进一步地学习。我认为,在达到一定量的基础上,应该通过所积累的量,不断通过自己的运用从而在质的方面进行提升。
学过了C语言,你分的清数组指针,指针数组;函数指针,指针函数这些概念吗?
对于些概念,之前有学习,为了分清这些概念也研究过。概念虽能分清,但是由于自己写代码时没有运用它们,所以使用起来不熟悉。通俗来讲,==数组指针==是指向数组首地址的指针,在一般的运用指针对一维数组操作时经常用到。==指针数组==是指若干相同类型的指针构成的数组,是指若干指针构成的数组,主要用于对多维数组做处理。==函数指针==是指向函数首地址的指针,其声明通常如下:
int (*f)(int a);/*声明一个函数指针*/
f=func;/*函数首地址赋给指针*/
==指针函数==是一个函数,其返回值为指针。声明如下:
int *f(int a);/*声明一个整型形参且返回值为整型指针的指针的函数*/
学过了C语言,你明白文件和流的区别和联系吗?如何区分文本文件和二进制文件?如何编程操作这两种文件?
关于文件和流的区别和联系确实不明白,看过一些资料对二者有个粗浅的了解。文件是作为一个单元看待的外部相关数据的集合。而我看到对流的解释有一种是数据流,是按规定顺序读取的序列,另一种说的是流是一个类的对象,许多文件的输入输出都是通过调用类的成员函数来实现的。在文件I/O传输中,文件直接传输过程占用内核较多,而流可以做为一个缓冲,从而减少了系统调用。
文本文件和二进制文件的本质区别是存储数值型数据的方式不同,二进制文件中,数值型文件是以二进制文件形式存储的,而文本文件是将数值数据的ASCII码存储的。文本文件可以通过fopen()打开文件,参数可以是a+、w+、r+
二进制文件可用fopen()打开,参数为ab+、wb+、rb+
写入文件可以用fprintf()或fwrite()两类方式。
学过了C语言,你知道什么叫面向过程程序设计吗?它解决问题的方法是什么?
自己的理解为面向过程程序设计是以整个程序的过程为中心,以正在发生,处理的事物为准则来进行程序运行,不是为了适合具体对象所进行的程序设计。解决问题的方法是将问题整理划分,得到能反映问题各模块之间关系的结构图,然后通过模块化的程序设计进行编程,最后将各模块按关系连接。
在C语言里面,什么是模块?你写过多个源文件的程序吗?
这里我将模块理解为构成一个大项目的几个较小的部分,这些小部分分别执行各自的功能,由这些小部分互相通信构成整体项目的执行。在之前的学习过程中没有写过多个源文件的程序,就目前情况,需要进一步学习文件间的联系与使用。
学过了C语言,你知道什么是“高内聚,低耦合”吗?这个原则如何应用到高质量程序设计中?
内聚是程序中处理过程相关紧密程度的度量。高内聚意味着系统内各模块之间在处理过程中紧凑程度较高。耦合是对两个模块互相绑定紧密程度。两个模块间的耦合越紧,他们的独立性越差。而我们所需要的是各个模块间有较高的独立性,同时方便模块间的联系。高质量的程序中,模块处理过程紧凑,各模块相互绑定程度低,便是"高聚合,低耦合"。在程序设计中,可以通过尽量精简主程序,通过函数来实现那模块化来达到高内聚低耦合。
学过了C语言,你如何把数组A的内容复制到数组B中?如何查找整数数组A中有没有数字5?如何对整数数组A进行排序(从小到大,从大到小)?写出相应的程序。
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int input(int b[],int c);
int output(int e[],int c);
int copy(int a[],int d[],int n);
int cmp(const void *p, const void *q);
int cmp1(const void *p, const void *q);
int main()
{
int n,k=5;
int *p;
int a[100],d[100];
printf("输入数组中数字个数");
scanf("%d",&n);
input(a,n);
copy(a,d,n);
output(a,n);
output(d,n);
qsort(a,n,sizeof(int),cmp);
output(a,n);
qsort(d,n,sizeof(int),cmp1);
output(d,n);
p = (int *)bsearch(&k,a,n,sizeof(int),cmp);
(p == NULL) ? puts("not found") : puts("found");
return 0;
}
int input(int b[],int c)
{
int i;
for(i=0;i<c;i++)
{
scanf("%d",&b[i]);
}
return 0;
}
int output(int e[],int c)
{
int i;
for(i=0;i<c;i++)
{
printf("%d",e[i]);
}
printf("\n");
return 0;
}
int copy(int a[],int d[],int n)
{
int i;
for(i=0;i<n;i++)
{
d[i]=a[i];
}
return 0;
}
int cmp(const void *p, const void *q)
{
return strcmp((char *)p,(char *)q);
}
int cmp1(const void *p, const void *q)
{
return strcmp((char *)q,(char *)p);
}
这个程序是我通过进一步学习部分函数所写出来的。其中的排序和查找也可以用较为原始的方法来编程。
写一个程序,统计自己C语言共写了多少行代码。
说实话,看到这个真是不会,只是有个简单的思路就是遍历电脑固定文件中的.c后缀的文件,然后统计行数去空行,上网查了一下,大致理解了一下。关于这个还需要要进一步学习。
#include<stdio.h>
#include<Windows.h>
#include<string.h>
int main()
{
char filepath[1000], batpath[1010];
gets(filepath);
strcpy(batpath, filepath);
strcat(batpath, "\\Text1.bat");
FILE *fp;
fp = fopen(batpath, "w");
fputs("DIR *.c /B>list.txt", fp);
fclose(fp);
system(batpath);
static int count = 0;
FILE *fp1, *fp2;
fp1 = fopen("list.txt", "r");
char s[100];
char singleline[1000];
while(fgets(s, 100, fp1))
{
int len = strlen(s);
if(s[len-1] == ‘\n‘) s[len-1] = ‘\0‘;
printf("%s: ", s);
fp2 = fopen(s, "r");
while(fgets(singleline, 1000, fp2))
{
count++;
}
printf("%d\n", count);
fclose(fp2);
}
printf("\n");
fclose(fp1);
system("pause");
return 0;
}
你知道什么是断点吗?给出自己调试程序的例子。
断点我一般是在调试的时候用设置断点,设置断点后调试程序程序会在运行断点处中断。通常情况下是因为之前程序较多,存在循环的时候会设置断点,然后在断点结束处开始单步调试,发现问题。
每章提出一个问题
第一章:java的平台无关性是否可以理解为java自带一个虚拟机,针对不同平台将java代码做对应转换?
第二章:为什么int声明还可以像"平均=9898"这样?
第三章:instanceof我可以简单地理解为比较当前对象是否为一个集合(库)中的对象吗?
第四章:对象是否是限定于自己专属的类?对象同类中的变量和方法有什么关系?
第五章:子类的继承性也就是说子类中如果要使用父类中的方法和成员变量都不需要重写,直接使用?重写的在创建对象的时候是不是不需要再通过父类?
第六章:接口的设计是否在满足条件可以将不同类任意链接?
第七章:断言语句的作用是不是在最后程序的输出阶段可以去掉?也就是说断言语句的功能就是用来进行调试程序是作为一道保障?
第八章:string类是否也是通过库函数一样的调用来运行?
第九章:绑定键盘如何绑定区分带侧键键盘和不带侧键键盘?
第十章:缓冲流为什么相较于文件的直接操作要高效,流所运用的这种思想还能运用到哪里?
第十一章:MySQL库中的数据调用可以看做是c中的库的扩大版吗?库里具体可以调用哪些内容?
第十二章:多线程的使用如何更好地体现高内聚的思想?
第十三章:套接字链接的过程中是否会出现几个相同的程序同时链接的情况?
第十四章:在处理图像时,如何控制图像的显示分辨率?
第十五章:这一章同数据结构联系密切,树集和链表是否是一个高效的项目结构?
对比C语言的学习,你对《Java程序设计》的学习有什么具体目标?如何通过刻意训练提高程序设计能力和培养计算思维?如何通过“做中学”实现你的目标?
我选择java程序设计的目标是学习使用java,并能够完成一些小的项目。通过刻意训练提高程序设计能力应该从基础做起,首先自己学习基础知识,然后在不断地尝试中学习,走出舒适区,致力于解决问题,以问题为导向进行java学习。