20165218 学习基础和C语言基础调查

个人技能及阅读心得

  • 个人技能之绘画

绘画是我从很小便开始接触的,从最初的简笔画到国画、素描、水粉,大约也学了七八年。但是到了高中之后,就逐渐放下了。

记得当初学素描时,老师的一句话让我记忆犹新,她说,画素描就是要 “抄”:一是“抄”作品,也就是临摹;而是“抄”实物,因为素描追求的是真实,什么时候能把摆在桌子上的静物原封不动地“抄”到纸上,那水平才算是达标。

临摹 是一种在技术不成熟的时期里很有效的学习方法。特别是在画水粉画的时候,初学者很难掌握调色技巧,比如有些绿色水果的暗面要用深红色、靛蓝处理,这对于初学者来说,很难从实物上看出来;而临摹时,因为有作品参考,便更容易把颜色从整体的物体上剥离。临摹不仅是单纯的复制,这是一个锻炼技巧、学习经验、把理论知识融会贯通的过程。对于编程语言的学习来说,这就相当于开始的抄代码,在“抄”的过程中巩固理论知识,明白上课讲的知识的用法。

  • 个人技能之阅读与写作

我的写作技能不能算是出类拔萃,但至少在中学时期,这是我领先大部分人的一个加分项。阅读与写作,是知识的积累与运用过程,这二者在某种意义上是一体的。

同绘画一样,我也是在很小的时候就开始阅读。但是到高中时期,由于学业,也由于手机的影响,我纸质书的阅读量大大减少,到了大学才又渐渐重拾。在我多有起伏的阅读经历中,我最大的心得就是要找到适合自己的方法.

高中时期,阅读常常是为了积累写作素材、锻炼语感,那是我读到值得记录的段落、句子,就直接抄下来,虽说有些费时,但摘抄的过程可以大大加深记忆、也给人进一步思考的机会,同时,这也是个练字的过程,可谓一举多得。

而到大学时期,我看书的同时会使用一个叫 “萝卜书摘” 的APP,它提供扫描功能,可以把文字拍摄并扫描记录,同时附上一个写感想的模块,最后生成一个完整的书摘保存。这样一来,大大节省了摘抄的时间。同时,该APP还提供书摘整理、“萝卜坑”(类似读书小组,可以一起读书、坑主领读等)等功能。利用这个APP,在阅读的同时,随手写下感想,还能保持写作的手感。从去年二月到现在,我一共读了12.5本书,写了91篇书摘、2篇随笔。看着自己的数据,也是小有成就感,更加激励自己坚持阅读。

  • 阅读心得

读了老师的博客以后,我记忆最深刻的就是老师的做一件事时的目的性、系统性、总结性。无论减肥、学习五笔、背单词、乒乓球,娄老师在过程中以及结束后,都会进行系统地总结,条理清晰、阶段分明,这是我以前从未见到过的。

有关C语言学习的调查

  • 你是怎么学习C语言的?

说实话,我C语言的学习做的并不好。水平止步于比较浅的程度。学习的过程就是练习;在期末复习阶段,我有用笔记本整理过一些容易混淆的知识。

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

估算大概在3000行以上。理解的情况较一般,有些知识点比如指针和数组、指针和函数、文件操作等只停留在初步了解阶段,几乎没有实际编程操作过。

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

数组指针是一个指针变量,保存一个数组的首地址;
指针数组是有若干及类型相同的指针构成的数组,其中每个元素都是一个指针;
函数指针就是指向函数的指针,指向函数的指针变量中存储的是一个函数在内存中的入口地址;
指针函数是一个返回值为指针的函数。

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

文件和流

计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。通常是磁盘上一段命名的存储区。流是数据之间的传输操作。比如:

标准I/O流:内存与标准输入输出设备之间信息的传递;文件I/O流:内存与外部文件之间信息的传递;字符串I/O流:内存变量与表示字符串流的字符数组之间信息的传递。
——C++ 流(stream)总结

文件的I/O函数都是针对文件描述符进行操作的,比如说当调用open或者其他函数打开一个文件,返回一个文件的描述符fd,然后针对这个fd进行后续的I/O操作,由于需要多次反复调用对应的系统调用,效率低是自然的。
而流I/O函数的操作是围绕流(Stream)进行的,当使用流I/O库打开或者创建一个文件时,可以使一个流和一个文件结合,接下来的操作就是对流进行读写、定位等,最后关闭即可。……用户可以简单地把流看做一块由操作系统分配的内存缓冲区,在该缓冲区中存放了文件对应的数据。——流和文件的区别 - CSDN博客

我个人的理解,流就是程序输入/输出数据过程的载体。流连接了输入/输出设备与程序。

文本文件和二进制文件

C语言文件有两种类型,文本文件(也称 ASCII码文件)和 二进制文件。其差别在于存储数值型数据的方式不同。在二进制文件中,数值型数据是以二进制形式存储的,而在文本文件中,则是将数值型数据的每一位数组作为一个字符及其ASCII码的形式存储的。因此, 文本文件中的每一位数字都单独占用一个字节的存储空间。而二进制文件则是把整个数字作为一个二进制来存储的,并非熟知的每一位数字都占用单独的存储空间。
——《C语言程序设计(第3版)》P373

编程编辑

字 符 含 义
“r" 以只读方式,打开文本文件;该文件必须是已经存在的,并且只能读出,不能写入数据;若文件不存在,则会出错
“w" 以只写方式,创建并打开文本文件,已存在的文件将被覆盖;无论文件是否存在,都需创建一个新的文本文件,只能写入数据
“a” 以只写方式,打开文本文件,位置指针移到文件末尾,向文件尾部添加数据,原文件数据保留;若文件不存在,则会出错
“+” 与上面的字符串组合,表示以读写方式打开文本文件;既可以向文件中写入数据,也可从文件中读出数据
“b” 与上面的字符串组合,表示打开二进制文件

例如,

fp=fopen("D:\\demo.txt","a+");

表示以读写方式打开D盘的文本文件demo.txt,保留原内容,并向尾部添加数据;

fp=fopen("D:\\demo.bin","ab+");

表示以读写方式打开D盘的二进制文件demo.bin,保留原内容,并向尾部添加数据;

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

我以前没有接触过这个概念,通过查资料,我了解到“面向过程”是一种以过程为中心的编程思想。

“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。——面向过程_百度百科

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

个人理解模块就是函数,将主函数中一些比较繁琐,或者使用次数较多的部分写成函数方便随时调用。在利用c语言编程解决密码学数学基础的问题时用的比较多。
我没有写过多个源文件的程序。

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

模块分解的基本原则是:高聚合、低耦合,保证每个模块的相对独立型。 无论结构化方法还是面向对象方法,都要遵循这个原则。高聚合指的是模块内部的联系越紧密越好,内聚性越强越好,简单地说就是模块的功能要相对独立型和单一,让模块各司其职,每个模块只专心负责一件事情。低耦合指的是模块之间的联系越松散越好,模块之间仅仅交换那些为完成系统功能必须交换的信息,这意味着模块对外的接口越简单越好,因为借口越简单,模块与外界打交道的变量和交换的数据就越少,这样就会降低模块之间的互相影响到程度。——《C语言程序设计》P171

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

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

#include <stdio.h>
#include <stdlib.h>
# define N 6
int main()
{
    int a[N], b[N];
    int i;
    printf("输入数组a:");
    for(i=0; i<6; i++)   //录入数组a的值
    {
        scanf("%d",&a[i]);
    }
    for(i=0; i<6; i++)  //将数组a的值复制到数组b中
    {
        b[i]=a[i];
    }
    printf("以下是数组b:\n");
    for(i=0; i<6; i++)  //打印数组b
    {
        printf("%d\t", b[i]);
    }
}
  1. 查找整数数组A中有没有数字5

#include <stdio.h>
#include <stdlib.h>
#define N 6

int main()
{
    int a[N], b[N];
    int i;
    printf("输入数组a:");
    for(i=0; i<6; i++)   //录入数组a的值
    {
        scanf("%d",&a[i]);
    }
    for(i=0; i<6; i++)  //将数组a的值复制到数组b中
    {
        b[i]=a[i];
    }
    printf("以下是数组b:\n");
    for(i=0; i<6; i++)  //打印数组b
    {
        printf("%d\t", b[i]);
    }
}
  1. 对整数数组A进行排序(从小到大,从大到小)

#include <stdio.h>
#include <stdlib.h>
void upsort(int a[],int m);
void printa(int a[],int m);
void downsort(int a[], int m);

int main()
{
    int a[7]={12,67,3,78,36,90,40,2};
    upsort(a,8);
    printf("升序为:");
    printa(a,8);
    downsort(a,8);
    printf("\n降序为:");
    printa(a,8);
}

void upsort(int a[],int m)//用选择排序法实现生序排序
{
    int i,j;
    int k;
    int temp;
    for(i=0; i<m-1; i++)
    {
        k=i;
        for(j=i+1; j<m; j++)
        {
            if(a[j]<a[k])
                k=j;
        }
        if(i!=k)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

void printa(int a[], int m)//打印数组
{
    int i;
    for(i=0; i<m; i++)
        printf("%d\t",a[i]);
}

void downsort(int a[], int m)//用冒泡排序法实现降序排序
{
    int i,j;
    int temp;
    int flag=0;
    for(i=0; i<m; i++)
    {
        for(j=0;j<m-1-i; j++)
        {
            if(a[j]<a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=1;
            }
        }
    }
}

  • 写一个程序,统计自己C语言共写了多少行代码。

很抱歉我不会写这个程序。我在网上也找到了很过类似的程序,但是文件操作这一部分是我的薄弱之处。参考过其他人的代码后,我认为该程序大致思路应是

graph LR
A[遍历一个目录下所有.c的文件]-->B[分别统计行数]
B-->C[分别相加]
  • 你知道什么是断点吗?给出自己调试程序的例子。

断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。

断点也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。

断点模式可以看作一种超时。所有元素(例如,函数、变量和对象)都保留在内存中,但它们的移动和活动被挂起了。在中断模式下,您可以检查它们的位置和状态,以查看是否存在冲突或 bug。您可以在中断模式下对程序进行调整。例如,可以更改变量的值。可以移动执行点,这会改变执行恢复后将要执行的下一条语句。在 C++、C# 和 Visual Basic 中,甚至可以在中断模式下对代码本身进行更改(使用一种称为“编辑并继续”的强大功能)。
——断点-百度百科

个人理解,断点就是在调试程序的过程中,程序运行到该处可以暂停,所有数据保留。而后通过逐行分析数据变化,检查程序的错误。

断点调试的例子有很多,比如上学期密数实验:求一个数的生成元中,我就曾使用过断点调试测试程序。

  1. 如何理解类?
  2. 标识符由字母、下划线、美元符号和数字组成

为什么例子中会有这样的代码,出现了中文?

byte x= -12,  tom=28,  漂亮=98
  1. 何谓“boolean型数据”,这与用一个实数的1、0判断逻辑有何不同?
  2. 各个类之间有执行顺序的先后吗?如果如果需要先后执行,如何实现?
  3. 什么叫做“子类和父类在/不在一个包中”?“包”是什么?
  4. 将接口类比为C语言函数中的“形参”可以吗?
  5. C语言中,断点调试是设置断点,而后从断点开始逐行调试,Java中断言是否类似?
  6. 实用常用类中的特定的类是不是就是Java已经设定好的,针对特定对象的?
  7. GUI是什么?
  8. 流在何处使用?不能直接操作文件吗?
  9. 数据库是什么?
  10. wait()方法和sleep(int millsecond) 有什么区别?
  11. Java网络编程除了传输数据、远程调用之外还可以实现哪些功能?
  12. Java是否可以实现多种图形编辑功能?
  • 对比C语言的学习,你对《Java程序设计》的学习有什么具体目标?如何通过刻意训练提高程序设计能力和培养计算思维?如何通过“做中学”实现你的目标?

对比C语言的学习,我希望Java我能学的更深入,不止停留于浅层知识。对于提高程序设计能力和培养计算思维,除了坚持练习和及时反馈外,我认为应逐渐接触一些比自身水平更难一点的程序,由浅入深,不能“知难而退“,只停留在学习的舒适区。

posted @ 2018-02-03 13:00  zicerain  阅读(305)  评论(1编辑  收藏  举报