c语言基础工程实践心得
“来日方长”通过精心收集,向本站投稿了8篇c语言基础工程实践心得,下面是小编给大家带来c语言基础工程实践心得,一起来阅读吧,希望对您有所帮助。
- 目录
篇1:c语言基础面试题
c语言基础面试题
1、statac 全局变量、局部变量、函数与普通全局变量、局部变量、函数static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?static 函数与普通函数有什么区别?
答 、全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量,全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static 全局变量与普通的全局变量有什么区别:static 全局变量只初使化一次,防止在其他文件单元中被引用;
static 局部变量和普通局部变量有什么区别:static 局部变量只被初始化一次,下一次依据上一次结果值;
static 函数与普通函数有什么区别:static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
2、程序的内存分配
答:一个由 c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码
3、解释堆和栈的区别
答:堆(heap)和栈(stack)的区别
(1)申请方式
stack:由系统自动分配。例如,声明在函数中一个局部变量 int b;系统自动在栈中为 b 开辟空间
heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数
如 p1=(char*)malloc(10);
在 C++中用 new 运算符
如 p2=(char*)malloc(10);
但是注意 p1、p2 本身是在栈中的。
(2)申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 delete 语句才能正确的释放本内存空间,
另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
(3)申请大小的限制
栈:在 Windows 下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M(也有的说是 1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的.剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
(4)申请效率的比较:
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在 WINDOWS 下,最好的方式是用 Virtual Alloc 分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。
(5)堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的 C 编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
(6)存取效率的比较
char s1[]=“aaaaaaaaaaaaaaa”;
char *s2=“bbbbbbbbbbbbbbbbb”;
aaaaaaaaaaa 是在运行时刻赋值的;
而 bbbbbbbbbbb 是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
voidmain
{
char a=1;
char c[]=“1234567890”;
char *p=“1234567890”;
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器 cl 中,而第二种则要先把指针值读到 edx 中,在根据 edx 读取字符,显然慢了。
篇2:c语言实践报告
在科技高速发展的今天,计算机互联网在人们之中的作用越来越突出。而c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。
在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,更多的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。
学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程不能安排过多的统一上机实验,所以希望学生有效地利用课程上机实验的机会,尽快掌握用c语言开发程序的能力,为今后的继续学习打下一个良好的基础。为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面:
1、加深对课堂讲授内容的理解
课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。
2、熟悉程序开发环境、学习计算机系统的操作方法
一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。所谓“;环境”;就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握c语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。
3、学习上机调试程序
完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。
篇3:c语言实践报告
做完这个课程设计,我们的自信一下子提高了;尽管对于有些人这种程序会很简单,可对我们c语言初学者来说,已经很不容易了。这次体验为以后的学习计算机的我们增强了信心。享受劳动成果的滋味实在很美妙啊!虽然对着电脑做程序,有点累有点热,可是当看到劳动成果时,真是别有一番滋味在心头啊!世上无难事,只怕有心人,的确如此。做完这个程序最大的收获就是感受到了集体的力量,当然个人的智慧也是很重要的哦!
忙碌了一个多星期,在大家的共同努力下,我们总算将此程序设计出来。尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
篇4:C语言学习secondC语言基础学习
1.标准C语言
C语言诞生于20世纪70年代,年龄比我们自己还要大,期间产生了很多标准,但是各种编译器对标准的支持不尽相同,
ANSI C是使用的最广泛的一个标准,也是第一个正式标准,被称为“标准C语言”。ANSI C于1980年由美国国家标准局(American National Standards Institute,简称ANSI)对外发布,各种编译器几乎都完整支持ANSI C,市面上的书籍、大学里的教材、网上的教程大都以ANSI C为基础进行讲解,C语言中文网也不例外,也以ANSI C为基础。
如果你遇到其他称呼,如ISO C、C89、C90、ANSI / ISO C,要知道都是指一个版本,其中的故事请查看:C语言的发展及其版本
2.标示符
程序中所使用的在程序中使用的变量名、函数名、标号等统称为标识符,可以由“A-Za-z”“0-9”和下划线组成,其中库函数由系统定义,除此之外,函数的第一个字符必须是以字母或者下划线组成,不能由其他开头;
以下标识符是合法的:
a, x, x3, BOOK_1, sum5
以下标示符是不合法的:
3s 以数字开头
s*T 出现非法字符*
-3x 以减号(-)开头
bowy-1 出现非法字符减号(-)
标识符应用需要注意的地方:
标准C语言不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。例如在某版本C语言中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
在标识符中,大小写是有区别的,
例如BOOK和book 是两个不同的标识符。
标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于阅读理解,作到“顾名思义”。
3.关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。
一些常用关键字:
分类说明类型说明符用于定义、说明变量、函数或其它数据结构的类型。如前面例题中用到的int、double等。语句定义符用于表示一个语句的功能。如【例1-3】中用到的if else就是条件语句的语句定义符。预处理命令字用于表示一个预处理命令。如前面各例中用到的include。全部关键字请参考这里:C语言关键字及其解释[共32个]
4.运算符
C语言中含有丰富的运算符,运算符和变量,函数一起结合成为表达式,表示各种运算功能,运算符由+-*/等组成。
5.分隔符
在C语言中采用飞分隔符有逗号和空格两种,逗号主要用在类型说明和函数参数中,分隔各个变量。空格用于语句单词间,作为间隔符。在关键字,标识符之间必须要有一个以上的空格符作为间隔,不如会出现语法错误,例如把int a;写成inta;C语言编辑器将会把inta当成一个标识符处理,结果显然会出错。
6.常量
常量是值不能被改变的量。C语言中使用的常量可以分为数字常量,字符常量,字符串常量,符号常量,转义字符多种。这里就不再一一详细介绍。
7.变量
变量由用户自己命名,用来保存特定类型的数据,数据可以被改变,数据类型有整数,浮点数,字符等。
8.注释
标准C语言的注释以/*开头以*/结尾的串。在/*和*/之间的为注释,程序编译时,不会对注释做任何处理,注释可以出现在程序中的任何位置。注释用来向用户提示或者解释程序的意义。在调试程序中对暂不使用的语句也可以用注释符号注释掉,使编译跳过不处理,待调试结束后再取消注释。
另外在许多编译器中//也作为注释使用,虽然其不是C语言标准,但是早已成为事实标准,其只支持单行注释,/**/支持多行注释。
篇5:C语言基础笔试题
C语言基础笔试题
1、C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符、C、1
2、C语言程序的三种基本结构是____ A、顺序结构,选择结构,循环结构 B、递归结构,循环结构,转移结构 C、嵌套结构,递归结构,顺序结构 D、循环结构,转移结构,顺序结构、A、1
3、C语言规定,程序中各函数之间 A) 既允许直接递归调用也允许间接递归调用 B) 不允许直接递归调用也不允许间接递归调用 C) 允许直接递归调用不允许间接递归调用 D) 不允许直接递归调用允许间接递归调用、A、1
4、C语言中可处理的文件类型是( ) A) 文本文件和数据文件 B)文本文件和二进制文件 C) 数据文件和二进制文件 D)数据代码文件、B、1
5、C语言可执行程序的开始执行点是( ) A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数、C、1
6、C语言提供的合法的数据类型关键字是 A)double B) short C) integer D) char、B、1
7、C语言中,运算对象必须是整型数的运算符是 A) % B) C) %和 D) * *、A、1
8、C语言中函数返回值的类型是由( )决定, A) return语句中的表达式类型 B) 调用函数的主调函数类型 C) 调用函数时临时 D) 定义函数时所指定的函数类型、D、1
9、C语言中数组名作为参数传递给函数,作为实在参数的数组名被处理为_____。 A、该数组的长度。 B、该数组的元素个数。 C、该数组中各元素的值。 D、该数组的首地址。、D、1
10、C语言中数组下标的下限是________。 A、1 B、0 C、视具体情况 D、无固定下限、B、1
11、C语言中提供的合法关键字是____ A、swith B、cher C、case D、default、D、1
12、C语言中文件的.存取方式是________。 A、顺序存取 B、随机存取 C、顺序存取、随机存取均可 D、顺序存取、随机存取均不可、C、1
13、C语言中最简单的数据类型包括 A) 整型、实型、逻辑型 B) 整型、实型、字符型 C) 整型、字符型、逻辑型 D) 整型、实型、逻辑型、字符型、B、1
14、sizeof(float)是( ) A) 一种函数调用 B) 一个不合法的表示形式 C) 一个整型表达式 D) 一个浮点表达式、C、1
15、x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是 A) input x,y,z; B) scanf(“%d%d%d”,&x,&y,&z); C) scanf(“%d%d%d”,x,y,z); D) read(“%d%d%d”,&x,&y,&z);、B、1
16、表达式:10!=9的值是 A) true B) 非零值 C) 0 D) 1、D、1
17、表示关系x<=y<=z的c语言表达式为 A) (X<=Y)&&(Y<=Z) B) (X<=Y)AND(Y<=Z) C) (X<=Y<=Z) D) (X<=Y)&(Y<=Z)、A、1
18、程序片段:在TC20中, int i=65536; printf(“%d”,i);的输出结果是____ A) 65536 B) 0 C) 有语法错误,无输出结果 D) -1、B、1
19、当调用函数时,实参是一个数组名,则向函数传送的是____ A) 数组的长度 B) 数组的首地址 C) 数组每一个元素的地址 D) 数组每个元素中的值、B、1
20、对嵌套子程序调用说法正确的是____。 A、外层子程序可以调用所有的内层子程序 B、内层了程序只可以调用包含本身的外层子程序,不可以隔层调用 C、外分程序必须能完全套住内分程序 D、以上说法均不正确、C、1
21、对于基类型相同的两个指针变量之间,不能进行的运算是 A) < B) = C) + D) -、C、1
22、合法的C语言中,合法的长整型常数是 A) 't' B) “A” C) 65 D) A、A、1
23、假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是 A) 3 B) 6 C) 10 D) 20、D、1
24、假定有以下变量定义: int k=7 ,x=12; 则能使值为3的表达式是 A x%=(k%=5) B x%=(k-k%5) C x%=k-k%5 D (x%=k)-(k%=5)、D、1
25、请读程序片段(字符串内没有空格): printf(“%d”,strlen(“ATS0121”));的输出结果是 A) 11 B) 10 C) 9 D) 8 、C、1
26、请选出合法的C语言赋值语句 A) a=b=58 B) i++; C) a=58,b=58 D) k=int(a+b);、B、1
27、若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是 A) -3 B) 9 C) -12 D) 6、C、1
28、若int类型占两个字节,则以下语句输出为________。 int k=-1; printf(“%d,u%”,k,k); A、-1,-1 B、-1,65536 C、-1,32768 D、-1,65535、D、1
29、若变量a是int类型,并执行了语句:a=‘A'+1、6;,则正确的叙述是 A) a的值是字符C B) a的值是浮点型 C) 不允许字符型和浮点型相加 D) a的值是字符‘A’的ASCII值加上1,
、D、1
30、若变量已正确说明为float类型,要通过语句scanf(“%f %f %f ”,&a,&b,&c);给a赋于10、0,b赋予22、0,c赋予33、0,不正确的输入形式是: A) 10 B) 10、0,22、0,33、0 22 33 C) 10、0 D) 10 22 22、0 33、0 33、B、1
31、若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为 A) a0 B) !a C) a=0 D) a、B、1
32、若已定义x和y为double类型,则表达式:x=1,y=x+3/2的值是 A)1 B)2 C)2、0 D)2、5、C、1
33、若有定义:int a=8,b=5,c;,执行语句c=a/b+0、4;后,c的值为 A) 1、4 B) 1 C) 2、0 D) 2、B、1
34、若有定义:int x,y;char a,b,c;并有以下输入数据(此处< CR>代表换行符,/u代表空格): 1u2 AuBuC 则能给x赋整数1,给y赋整数2,给a赋字符A,给b赋字符B,给c赋字符C 的正确程序段是 A) scanf(“x=%d y+%d”,&x,&y);a=getchar;b=getchar();c=getchar(); B) scanf(“%d %d”,&x,&y);a=getchar();b=getchar();c=getchar(); C) scanf(“%d%d%c%c%c,&x,&y,&a,&b,&c); D) scanf(“%d%d%c%c%c%c%c%c:&x,&y,&a,&a,&b,&b,&c,&c);、D、1
35、若有定义和语句: char s[10]:s=”abcd”;printf(“%s”,s); 则结果是(以下u代表空格) A) 输出abcd B) 输出a C) 输出abcduuuuu D) 编译不通过、D、1
36、若有以下程序段, int c1=1,c2=2,c3; c3=1、0/c2*c1; 则执行后,c3中的值是 A) 0 B) 0、5 C) 1 D) 2、A、1
37、若有以下定义: char a; int b; float c; double d; 则表达式a*b+d-c值的类型为 A) float B) int C) char D) double、D、1
38、若有以下定义和语句 char c1=’b',c2=’e'; printf(“%d,%c”,c2-c1,c2-’a'+”A”); 则输出结果是: A)2,M B)3,E C)2,E D)输出项与对应的格式控制不一致,输出结果不确定、B、1
39、若有以下函数调用语句: fun(a+b,(x,y),fun(n+k,d,(a,b)));在此函数调用语句中实参的个数是 A)3 B)4 C)5 D)6、A、1
40、若执行下面的程序时从键盘上输入3和4,则输出是____ A) 14 B) 16 C) 18 D) 20 main( ) { int a,b,s; scanf(“%d %d”,&a,&b); s=a; if(a、B、1
41、若执行下面的程序时从键盘上输入5,则输出是 A) 7 B) 6 C) 5 D) 4 main() { int x; scanf(“%d”,&x); if(x++>5) printf(“%d”,x); else printf(“%d”,x–);}、B、1
42、若执行以下程序时从键盘上输入9,则输出结果是 A) 11 B) 10 C) 9 D) 8 main( ) { int n; scanf(“%d”,&n); if(n++、B、1
43、设 a、b、c、d、m、n均为 int型变量,且 a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式 (m=a>b)&&(n=c>d)运算后,n的值为____ A) 0 B) 1 C) 2 D) 3、C、1
44、设 int a=12,则执行完语句 a+=a-=a*a后,a的值是 A) 552 B) 264 C) 144 D) -264、D、1
45、设 int b=2;表达式(b>>2)/(b>>1)的值是 A) 0 B) 2 C) 4 D) 8、A、1
46、设a,b和c都是int型变量,且a=3,b=4,c=5,则下列表达式中,值为0的表达式是________ A)’a'&&’b’ B)a<=b C)a||b+c&&b-c D)!((a
47、设x、y、z和k都是int型变量,则执行表达式:x=(y=4,z=16,k=32)后,x的值为 A 4 B 16 C 32 D 52、C、1
48、设x=3,y=-4,z=6,写出表达式的结果。 !(x>y)+(y!=z)||(x+y)&&(y-z) A、0 B、1 C、-1 D、6、B、1
49、设x和y均为int 型变量,则以下语句:x+=y;y=x-y;y=x-y;x-=y;的功能是 A、把x 和y按从大到小排列 B、把x和y按从小到大排列 C、无确定结果 D、交换x和y中的值、D、1
50、设有 int x=11; 则表达式 (x++ * 1/3) 的值是 A) 3 B) 4 C) 11 D) 12、A、1
篇6:零基础C语言学习方法
零基础C语言学习方法
一、要读就读好书,否则不如不读
所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。
大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)
Kernighan和Ritchie的.《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。
如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。
切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。
二、Unix/Linux还是Windows,这是个很大的问题
不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。
对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等
所以我建议初学者应该以Visual C++ 6.0(不是VisualC++ .NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。
等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格
归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。
三、万事俱备,你就是东风
书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。
学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b) == c和a = (b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。
例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。
也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。
仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。
写到最后,还有非常非常重要的一点没有提及──代码风格,从最开始学习就必须强迫自己模仿最优秀的代码风格。
篇7:零基础如何学习C语言
零基础如何学习C语言
一、【电脑】
首先准备一台PC,学编程一般对PC没有太大的要求,一般主流的配置就好。
二、【操作系统】
有了电脑之后,就得考虑安装什么操作系统了,主流使用的操作系统是windows,不过在这里不建议学习C编程使用windows,建议使用Linux。所以学习者最好安装双系统,或者彻底习惯Linux系统。
三、【书籍】
不管学习哪门编程语言,我都建议学习者必须有一本关于此语言的全面知识的.书籍,大学里一般采用的是谭浩强老师的《C语言程序设计》,建议学习者可以去仔细研读。
四、【笔记】
在平时学习看书的时候,一定有学会做笔记的习惯,而且不仅要记录,还要经常看自己所做的笔记,这样才会有较好的学习效率。
五、【分享代码阅读他人代码】
多逛技术论坛或者技术问答社区,想别人分享自己的代码,有要积极去阅读别人的代码,互相取长补短。
六、【做项目】
在C语言基础学习得差不多之后,可以深入学习数据结构,以及自己尝试做一些简单的项目,比如学生学籍管理系统、图书管理系统,银行管理系统等。
语言功能掌握到一定程度之后就是要考虑方向的时候了,建议向嵌入式编程方向发展,这是你就有必要学习一些硬件的东西。嵌入式产品在航空、医疗、家电、消费电子、汽车电子、移动等众多领域都可以看到,应用领域极为广泛,所以现在嵌入式开发相当热门,并且具备非常好的发展前景!
篇8:基础工程心得
为了加强我们的专业课基础知识的学习,学校这学期给我们安排了《基础工程》这门课程。既然是学校安排的课程,其重要性不言而喻。随着课程学习的不断深入,我对基础工程这门课程也逐渐的有了更加深刻的理解。学习了这门课程,也让我有诸多的收获!
任何建筑物都建造在一定的地层上,建筑物的全部荷载都由它下面的地层来承担。一般而言,将承受建筑物各种作用的地层称为地基,而将建筑物与地基接触的最下部分,也就是将建筑物的各种作用传递至地基的结构物称为基础。基础工程是一门工程学科,所研究的主要内容即为桥梁,道路及其它人工构造物基础及其所在地基的设计与施工,以及相关的基本概念,计算原理和计算方法。
基础工程课程内容涉及其它学科较多,因而要求我们有较广泛的先修课知识如《公路工程地质》,《土质学与土力学》,《桥涵水文》,《材料力学》,《结构力学》,《结构设计原理》,和《桥梁工程》。尤其是《土力学与土质学》,是这门课程的重要理论基础,要求我们要有较好的土力学基础,并且注意两门课程间的紧密联系。我们要能熟练的运用土力学的知识,来解决基础工程中遇到的相关问题。
地基与基础的设计方案,计算中有关参数的选用,都需要根据当地的地质条件,水文条件,上部结构形式,作用特性,材料情况及施工要求等因素全面考虑。施工方案和方法也应该结合设计要求,现场地形,地质条件,施工技术设备,施工季节,气候和水文等情况来研究决定。因此,应在事前通过详细的调查研究,充分掌握必要的,符合实际情况的资料。这门课程是一门考察我们综合能力的课程。
《基础工程》课程总共包括七章内容,包括了导论,天然地 基上的浅基础,桩基础的基本知识及施工,桩基础的设计计算,沉井基础及地下连续墙,地基处理和几种特殊土地基上的基础工程。我们主要学习了浅基础,桩基础,沉井基础及地下连续墙和地基处理。
学习了导论部分,让我对基础工程有了最基本的认识。建筑物地基与基础的设计和施工质量的优劣,对整个建筑物的质量和正常的使用起着根本的作用。基础工程是隐蔽工程,如有缺陷,较难发现,也较难弥补和修复,而这些缺陷往往直接影响整个建筑物的使用甚至安全。
基础工程的进度,经常控制整个建筑物的施工进度。基础工程的造价,通常在整个建筑物造价中占相当大的比例,尤其是在复杂的地质条件下或深水中修建基础更是如此。了解到这些内容,让我更加明确基础工程在工程中的重要性,我们要认真学习这门课程,在我们以后在工作中对基础工程必须做到精心设计,精心施工。
在天然地基上的浅基础这一章中,我们学习了浅基础按不同标准的分类。按照受力条件可分为刚性基础(也称无筋扩展基础)和钢筋混凝土扩展基础两大类。而浅基础根据构造形式的不同又可以分为刚性扩大基础,单独和联合基础,条形基础,筏板和箱形基础。
这一章我们还学习了刚性扩大基础的施工,了解了基坑的开挖及围护,基坑排水方法,水中刚性扩大基础修筑时的围堰工程的施工方法。学习了不同类型板桩墙的侧向压力计算方法,还掌握了基坑稳定性的验算方法和封底混凝土厚度计算公式。学习了如何确定地基承载力容许值,学习了刚性扩大基础的设计和软弱下卧层承载力验算,基础稳定性和地基稳定性验算。这一章加深了我对浅基础的了解,让我初步认识到基础工程这门课的多样性,复杂性。
通过桩基础的学习,我们知道了单桩,单排桩,多排桩不同 的特性,以及各种桩基础的适用条件。桩基础按承台位置可分为高桩承台基础,低桩承台基础。按施工方法可分为沉桩,灌注桩,管桩基础,钻埋空心桩。按桩的设置效应分为挤土桩,部分挤土桩和非挤土桩。按承载性状可以分为摩擦桩,端承桩,主动桩,被动桩,竖直桩与斜桩。按桩身材料的组成成分又可以分为钢桩,钢筋混凝土桩。
根据基桩的构造不同,可分为钢筋混凝土钻孔灌注桩,钢筋混凝土预制桩,钢桩。这一章还介绍了各种桩基础具体的施工方法,步骤,注意事项以及水中桩基础施工的特点,方法,注意事项。我们学习了用不同的方法如何检验桩基础质量。
桩基础的设计计算,这一章我们学习了如何计算单桩承载力。在学习单排桩基桩内力与位移计算中,我们了解计算地基系数的不同方法包括m法,K法,C法,和常数法。有了单排桩的.基础我们,还学习了多排基桩内力与位移计算,掌握了这些计算方法,我们也就掌握了桩基础设计计算的核心内容,这也是我们期末课程设计的主要内容。
学会了如何设计桩基础还不够,我们还学会如何验算自己设计的桩基础是否合格。我们学会了从单桩轴向承载力,单桩横向承载力,单桩水平位移及墩台顶水平位移,弹性桩桩侧土的水平土抗力,群桩基础承载力和沉降量等几个方面检验设计好的桩基础是否合格的方法。当然一个完整的桩基础少不了承台,我们也学习了,承台的设计计算和承台局部受压,抗冲切,抗弯和抗剪承载力验算。这一章是我们学习的重点,也是我们必须牢牢掌握的知识点。
通过沉井基础及地下连续墙的学习,我们了解了沉井基础的特点,适用条件,沉井基础按建筑材料可分为混凝土沉井,钢筋混凝土沉井,竹筋混凝土沉井,刚沉井。沉井按形状分类可分为圆形,矩形,圆端形根据井孔布置方式又可分为单孔,双孔,多孔沉井和多排孔沉井,按沉井的立面形状可分为柱形,阶梯形 和锥形沉井。
同时我们学习了不同类型沉井基础的构造,了解了沉井基础的组成部分——井壁,刃脚,内隔墙,井孔,射水管,封底及井盖和它们各自的作用。老师还向我们介绍了各种沉井施工的过程,注意事项及各种施工问题的处理方法。我们了解了地下连续墙的概念,类型,特点,构造及其应用与发展。我们还自学了沉井的设计与计算。
在地基处理的学习过程中,我首先学习了什么是软弱土地基,以及它的危害。处理软弱土地基的方法主要有一下几个类别置换,排水固结,化学加固,振密挤密,加筋。每种类别里面都包含了若干种具体的施工方法。各类地基处理方法,均有各自的特点和作用机理。在不同的土类中产生不同的加固效果,并也存在着局限性。
地基的工程地质条件是千变万化的,工程对地基的要求也是不尽相同的材料,施工机具和施工条件等亦存在显著差别,没有哪一种方法是万能的。因此,对于每一工程必须进行综合考虑,通过方案的比选,选择一种技术可靠,经济合理,施工可行的方案,既可以是单一的地基处理方法,也可以采用多种方法进行综合处理。
我们了解了软土的成因及划分,软土按沉积环境可分为滨海沉积,湖泊沉积,河滩沉积,沼泽沉积。软土的工程特性包括1含水率较高,空隙比较大2抗剪强度低3压缩性较高4渗透性很小5结构性明显6流变性显著。我们掌握了软土地基的沉降计算方法。软土地基的沉降包括固结沉降,瞬时沉降,次固结沉降。我们详细解了换土垫层法的过程和它的优点,排水固结法的原理,施工方法。
我国是一个具有悠久历史的文明古国,古代劳动人民在基础工程方面,也早就表现出高超的技艺和创造才能,许多宏伟壮丽的中国古代建筑逾千年仍留存至今安然无恙的事实就充分说明 了这一点。如隋代李春设计建造的河北赵州安济桥,是世界上首创的石砌敞肩平拱桥。采用扩大基础建在较浅的密实粗砂地基上。赵州桥反映了我国历史上有关桥梁基础工程方面的工艺和技术成就,因受当时社会生产力和自然科学发展水平的限制,还仅限于凭经验的感性认识阶段。
由于清朝的闭关锁国,我国的桥梁技术一度陷入停滞状态。自新中国成立以后,经过专家学者的赶拼,我国桥梁技术水平在五十年代达到世界先进水平。从1978年实行改革开放以来,30余年经过我国桥梁工作者呕心沥血,锐意进取,我国桥梁深水基础技术已进入世界前列,进入与世界同步发展的新阶段。我们的先辈们在艰 苦的环境中迎头赶上外国的先进技术,我们今天更要认识到基础工程的重要性,学好基础工程未将我们祖国的基础工程建设出一份力。
通过一个学期的基础工程课程的学习,我从一开始的不了解到现在慢慢的认识到基础工程这门学科的重要性,这是老师平时循循善诱和严格要求的结果。学习是一个循序渐进的过程,随着学习的深入,对课程的了解也逐渐的加深,自己对课程的认识也有了根本的改变。更加坚定了自己要学好这门课程的决心和信心,也为自己以后的学习,工作打下坚实的基础。
同时我们也应该认识到基础工程是一门比较年轻的学科,地基土又是自然历史的产物,复杂多变。因此,为使基础工程问题得到切合实际的,合理的和完善的解决,除了要求我们有丰富的理论知识外,还需要有较多的工程实践知识。在学习理论教学的同时应注意理论联系实际,紧密结合工程实践,才能提高对理论的认识,提高处理基础工程问题的能力。
★ 工程测量心得
★ 工程管理实习心得
★ 青马工程培训心得