第一篇:学习C语言需要哪些基础
www.xiexiebang.com
学习C语言需要哪些基础
C语言是.NET编程人员都需要掌握的语言,也是基础语言,而对于一种新语言的入门,往往有一定的困难,其实是人们心中的疙瘩,对新事物的恐惧心理,其实学习C语言并不难。软件培训网就为大家详细讲解C语言的入门。
变量名与变量值,变量名实际上是一个符号地址。程序编译时,系统给变量开辟该变量对应类型所需的内存空间(用于存储变量值),然后由系统建立一个从变量名到该内存空间的首地址的映射,这样就可以通过变量名访问到变量值了。变量名由数字、字母和下划线组成。大小写敏感,不能以数字开头。变量名的长度(字符个数)没有硬性的规定,只是不同的C编译器可能会有不同要求。C语言中,使用变量之前必须定义该变量,否则编译出错。定义变量时须写明变量所属类型。程序编译时,会根据变量的类型来决定为该变量开辟多大的内存空间,同时还可以检查运算的合法性。比如实型数据之间不能做求余数的操作。
整型数据,C语言中,整型数据的类别有三种:short,int,long;属性有两种:signed,unsigned。共有六种组合。整型数据类型的长度:C标准没有硬性规定每种类型的长度,只是规定:long的长度要不小于int;short的长度不大于int。一般的C编译器都会以一个机器
www.xiexiebang.com 字的存放一个int型数据。
变量初始化,变量的初始化不是在编译期间完成内存空间的分配(只有静态变量和外部变量是在编译期间初始化),而是在程序运行时执行函数时才赋值。
C语言的变量的存储类型,C语言的变量存储类型有很多种分法,根据生命周期来分可分为:动态变量和静态变量;根据使用域来分可分为:局部变量和全局变量(又叫内部变量和外部变量)。
(ps:本文章由北大青鸟广安门校区搜集自互联网)
第二篇:c语言基础总结
常见错误
1.使用未初始化和未赋值的变量
描述:非全局变量和静态变量在定义时不自动进行初始化,初值为一个与该程序运行环境有关的随机数。不赋值或没有显示初值就直接使用这样的变量是错误的。
解决:所有变量都显示地进行初始化,建议数值变量初始化为0,指针变量初始化为NULL
2.不考虑数值溢出的可能
描述:当赋值超过此范围数值,就会产生数值溢出,得到不正确的值。
解决:预先估算运行结果的可能范围,采用可能范围更大的,不处理负数,就用无符号类型。运算还没开始前,判断运算数是否在合理取值的范围内,超出则停止运算。采用第三方无取值范围的运算库。
3.不用sizeof()获得类型或变量的字长
描述:相同类型在不同平台上占得字节数不同。Int在16位,32位,64位系统分别占2,4,8个字节。结构体所占字节也不是所有成员字长的简单相加,而是和平台与编译器,编译项都有关系。
解决:用且只用sizeof获得字长
Intwriteint(intfh ,inti)
{
Returnwrite(fh ,&i,sizeof(i));
}
4.假定类型的取值范围
描述:类型的取值范围与程序编译息息相关。
解决:使用limits.h和float.h定义的宏(INT--MAX,INT----MINULONG--MAXFLT---MAX
5.期望两个整数的运算自动获得浮点数的结果
描述:两个数运算的结果还是整数,不是浮点数
方案:强制转换为浮点数,再运算
例:voidfunc(void)voidfunc(void)
{{
Floatf=0.0;floatf=0.0;
Inta =3,b=2;int a=3,b=2;
f=a/b;f=a/(float)b;
printf(“%f,f);printf
}
6.不预先判除除数是否为0
编译器反应:直接写入inti=100/0,编译器会报错,编译器对此问题沉默
解决方案:先判断除数是否为0,若是0则不运算。
7.混淆“&,|”与“&&,||”
说明:他们是两种不同的运算符,有人总是弄错
8使用依赖编译器求值顺序的语句
描述:printf(“%d,%d,%d,i++,i++,i++);i=0可能输出 0.1.20.0.0.2.1.0方案:按期望的顺序分别求职,再综合运算
Voidfunc(void)
{
Int a,b,c ,i=0;
a=i++;
b=i++
C=i++
Printf(“%d,%d,%d”,a,b,c)
9.使用依靠算符优先级的表达式
描述;没有记住优先级,容易出错。
解决:用括号明确优先计算的部分
10.表达式过于复杂
描述:(a>b||b>c)&&(o>P||q>p)?(a-b)*c+(o-p)*q:(a*b*c)-(o*p*q)
11.用“==”时误用“=”
12.用“==”比较两个浮点数
描述;两个数值表面相等或者非常接近的浮点时用“==”比较,结果可能不同
解决;不用float用double在精度运算中两个浮点数的差的绝对值只要小于一个
精度范围,就可以相等
13.使用幻数
描述:直接使用的常数
解决;把幻数定义为宏或枚举,建议使用枚举。编译提示会更清晰,准确
#definearray-srze10
Enum(array-size=10)printf()和scanf()中格式控制字符串与参数类型不匹配
15.循环或判断语句以“;”结尾
描述:分别表示循环和判断语句的终结,后面的代码不算循环体或分支,而是循环和判断
平行的代码
解决:禁止在循环判断语句末尾出现分号,循环体为空的情况下,While(.........)
{
}
16.在循环体内改变循环结束条件
例如:voidfunc(void)
{
Int a,end:
-------
While(a { 在这里修改end的值 } } 17.case分支不用break结束 规定每个case分支必须用break结束,两个分支用同样的代码,就把代码定义为函数 基本概念 函数是c的基本单位,必须有且仅有一个main函数。一个c可以包含一个到多个函数,在函数中可以调用系统提供的库函数 函数首部:函数返回值类型,函数名,形参类型,形参名的说明 函数 函数体:大括号中的内容,包括变量声明(对象)语句和执行(动作)语句c程序书写规则;以分号结束,并且书写注释;“/**/,注释之间不能留有空格常见关键字:asmautobreakcasecdeclchar Constcontinuedefaultdodoubleelse Enumexternfarfloatforgoto Hugeifinterruptintlongnear Pascalregisterreturnshortsigned Sizeofstaticstructswitchtypedef Unionunsignedvoidvolatilewhile 标识符:系统自定义标识符,用户自定义标识符 运算符:算数运算符:+—*/%关系运算符: >>==<<=!= 逻辑运算符:!&&|| 赋值运算符:= 复合的赋值运算符:+=-=*=/=%=&=!=^=<=>= 增一减一的运算符:++-- 条件运算符:?: 强制类型转换运算符: 指针和地址运算符:*& 计算字节数运算符:sizeof 下标运算符:[] 结构体成员运算符:-> 位运算符:<<>>|^&~ 逗号运算符:,分隔符:相邻保留字,标识符之间由空格或回车换行做分隔符:相邻同类项之间用逗号分隔 声明相同类型的变量之间可用逗号分离,向屏幕输出的变量中各变量表达式之间用 逗号分离。 常见的转义字符:n 换行r回车(不换行) 字符串结束t 水平制表 v 垂直制表b退格f走纸换页a响铃报警 ” 双引号’单引号 一个反斜线?问号 常见错误 数组;数组的下标都是从0开始的,访问时发生下标多1或者少1都会越界访问内存错误 用变量来定义数组长度会导致语法错误,应该用整型常量或整型常量表达式定义 用a[x,y]而不是a[x][y]的形式来访问二维数组中的元素,将导致语法错误 (数组的第1个元素的下标是0,数组元素1是指数组元素的下标为1,是数组的第二个元素) 忘记对需要进行初始化的元素初始化,导致运行结果错误 对数组初始化的过程中,提供的初值个数多于数组所能容纳的元素个数定义字符数组长度时,必须要多留一个字节的存储单元,存放结束标志 打印一个不包括字符串结束标志的 ,导致运行结果错误 直接使用赋值运算符对字符串赋值是错误的,必须用strcpy()赋值 直接使用关系运算符比较字符串大小是错误的,必须使用strcpy()比较 字符串必须使用双引号括起来,单引号括起来是错误的。 一对双引号将一个字符常量括起来,产生一个指向包含两个字符的字符串指针(把字符当做实参去调用形参是字符串的函数;把字符串当做实参去调用形参是字符的函数,都会导致语法的错误!) 误以为在函数中定义的静态局部数组元素中的元素,在每次函数调用时都初始化0(函数原型,函数定义的头部和函数调用语句三者,在形参和实参的数量,类型和顺序,以及返回值的类型上没有严格保持一致,将导致语法错误。) 指针:误以为用来声明指针变量的星号(*)会对同一个声明语句中的所有指针变量都起作用,而省略了其他指针变量名前的星号。实质是每一个每一个变量名前的星号都不能省略。 没有对指针变量进行初始化,或没有将指针变量指向内存中某一个确定存储单元的情况下,就利用这个指针变量去访问它所指向的存储单元,将导致严重的运行错误。没有意识到某些函数形参是属于“传地址掉调用”而数值不是指针当做实参赋值给这形参。 对没有指向数组中的某个元素的指针变量进行算数运算,是无意义的。 对并非指向同一数组中元素的两个指针进行相减或比较运算。是无意义的。每个数组都有上,下边界,指针超出了边界就会造成越界访问内存错误。 除非两个指针类型都是void,否则将一种类型的指针赋值给其他类型的指针,造成语法错误。 试图用一个void的指针变量去访问内存,是一个语法错误。 试图以指针运算的方式来改写一个数组名所代表的地址,是一个语法错误 内存分配不成功的话会导致非法内存访问错误,只要运行前检查指针是否为空指针,可以避免错误发生。 如果内存分配成功,但是没有初始化,将会导致非法内存访问错误。 向系统申请了一块内存,结束后忘了释放内存,造成内存泄露。 释放了内存,但却仍然使用,会产生“野指针” 结构体,共用体:定义一个结构体时,忘记最后加上一个分号,导致语法错误 将一种类型的结构体赋值给另一种类型的结构体,导致语法错误 对两个结构体或者共用体进行比较,导致语法错误 在结构体指向运算符的两个组成符号“-” 和“>”之间插了空格,或者写成“→”导致语法错误 只使用成员变量名访问结构体的一个成员,导致语法错误 直接使用结构体的每个成员类型所占内存字节数的“和”作为一个结构体实际所占的字节数。是错误的。 没有标明结构体数组下标 就访问其中一个结构体数组元素,导致语法错误。 函数 递归函数是需要返回值的,在递归函数中忘记返回数值,是错误的忘记了编写递归终止条件的分支语句,写错了递归步骤,都会导致递归函数不能收敛到递归的终止条件,引起无穷递归 定义函数指针时,忘记将函数指针变量名及前面的星号用圆括号括起来,使得本应声明函数指针变量的变量声明变成了一个函数声明语句。 将函数指针作为函数参数时,不在函数指针变量名后的一对圆括号中列出各函数参数的类型,导致编译错误。 实施细则 1.函数 1.函数指针:通式:数据类型(*指针名)()int(*p)() 错误:忘记前一个()意义是声明一个函数,函数名为P,返回值是一个指向整型变量的指针 忘记了后一个(),意义是定义了一个指向整型变量指针。使用:1.定义过程 2.函数指针赋值过程3.调用过程 2.递归:一个对象部分地由它和自己组成或它自己定义,称它是递归的。 3.返回指针值的函数:通式:数据类型*函数名(参数名){} 区别;不带*的函数值,函数值只能是一个数据,不能是一组带*的函数值,不仅是一个数据,还能是一组数据。 2.结构体,共用体 位段:指定了存储位数的结构体或共用体的成员叫位段 优点:用最少的位数存储数据注意:必须声明为int或unsigned型使用:用struct作为关键字,定义了unsigned 的三个位段 “:”代表位段宽度的整数常量,访问位段成员的方法与访问结构体成员的方法基本一致,用“圆点运算符”或“箭头运算符” 共用体:将不同的数据类型组合在一起,共占有同一段内存的用户自定义数据类型注意:必须有足够大的内存空间将占据最大内存空间的成员存储在内,内存空间的大小由占据内存空间成员所占的空间数决定。 动态数据结构:在结构体类型中,如果包含了本结构体类型的成员,由于本结构所占的内存字节数无法确定,系统无法正常分配内存。 声明结构体类型是不能包含自我,但可以包含指向本结构体类型的指针域。操作: Structtemp { Intdata; Structtemp*temp; }; 利用函数malloc()申请一个结构体的内存 Structtemp { Intdata; Charname[10]; }; Structtemp *p; P=(struct temp*)malloc(10*sizeof(structtemp));利用函数calloc()申请一个结构体内存 Structtemp *p P=(struttemp*)calloc(10*sizeof(struct 利用函数free()释放申请的内存空间,链表的定义 temp)); 《c语言程序设计基础》重修试卷 一、选择题(2’*20=40’) 1、c程序由构成。 A.函数B.命令C.程序D.表达式 2、以下选项中合法的变量名是 A.#y2B.a A.floatB.charC.intD.double4、在我们使用的turboC中,一个int型数据在内存中占个字节 A.0B.1C.2D.45、若有定义:int a=8,b=5,c;执行语句c=ab+0.4后c= A.1.4B.1C.2.0D.26、在c语言中,char型数据在内存中的存储形式是 A.补码B.ASSCIIC.原码D.反码 7、若运行时给变量x输入 C语言基础教案 教学目标: 一认知目标:了解C语言的特点和C语言的开发步骤 二能力目标:初步了解C程序的组成结构和主函数的作用; 掌握五种基本算术运算符的使用:+、—、*、/、%,了解优先级与结合性; 三情意目标:学习C语言基础上能使用Microsoft Visual C++6.0 进行基本的C程序开发 教学要求: 识记: 计算机程序设计语言的一些必备知识与理论 理解: 理解C程序的组成结构和主函数的作用; 理解C语言等高级程序设计语言的开发过程 理解C语言中各种运算的运算规则,由运算符和相关数据组成表达式的方法; 运用: 能使用printf()函数进行信息的输出; 能编写简单程序 教学重点: 1)计算机程序设计语言的理论知识,语言的分类和特点以及开发过程等; 2)C语言的简介,结构特征和特点等; 3)如何使用Microsoft Visual C++ 6.0进行C语言程序开发; 4)C语言源程序的结构介绍及基本语法的简介; 5)C语言源程序的书写要求; 6)C语言基础:函数的组成、标识符及其命名、变量的声明、变量的赋值、各种算数运算符的使用及优先级与结合性等。 教学难点: 如何让学生理解C语言的结构及语法基础还有源程序的书写要求,掌握对函数的组成、标识符及其命名、变量的声明、变量的赋值、各种算数运算符的使用及优先级与结合性等 授课方法: 讲授法与演示法相结合计算机程序设计语言基础 一新课导入 大家都听过程序员没?或者是网络上俗称调侃的码农?对,简单讲就是编写计算机代码的工作。在新世纪大家对与计算机相关的软件和产品都不陌生,每个人都使用过计算机软件如微信,QQ等等,那这些软件又是怎么开发出来的呢?简单来讲它们是怎么产生的呢?对,它们都是使用计算机程序编写出来的。今天我们就来学习了解下计算机程序设计语言。 二新课讲授 1计算机程序设计语言介绍及分类 程序概念:程序是由一系列指令组成的,为解决某一具体问题而设计的一系列排列有序的指令的集合。 程序设计语言分为三类:机器语言、汇编语言、高级语言。 机器语言:一台计算机中所有指令集合称为该计算机的指令系统,这些指令就是机器语言,它是一种二进制语言。 优点:面向机器、程序简洁、运行速度快; 缺点:不直观、难懂、难记、难写、难以修改和维护 汇编语言:使用符号(助记符)来代替机器语言中的二进制代码 优点:质量高、执行速度快、占用内存少 缺点:面向机器,与机器语言基本上一一对应,具有机器语言的缺点 高级语言:接近自然语言,使用英语单词表达语句,便于理解、记忆和掌握 优点:通用性强,便于理解、记忆和掌握 缺点:不能直接运行源程序,运行速度相对慢 2高级程序设计语言的开发过程 分析问题、建立模型 表现模型 源程序的编写 程序的编译与连接 程序的测试与调试C语言的特点 ① 既有高级语言的程序思想与设计方法,又有低级语言的操作能力; ② 结构化体系 ③ 可以直接访问内存的物理地址,丰富的运算符和数据类型 ④ 可移植性强 ⑤ 代码效率高 使用Microsoft Visual C++ 6.0开发C语言程序(1)启动Microsoft Visual C++ 6.0(2)(3)(4)(5)新建项目 新建文件 在出现的文本窗口中输入程序 编译并运行程序 C源程序的结构特征 #include /*编译预处理,包含标准输入输出文件头文件*/ Int main(void)/*主程序名*/ { /*表示函数的开头*/ Printf(“Hello,World!n”); /*函数体*/ Return 0;} /*表示函数的结束*/ 说明: (1)程序一般用小写字母书写; (2)C程序是由函数构成的,函数是C程序的基本单位;(3)每个程序必须要有一个main()(只能有一个),称主函数;(4)程序体必须要在{}之间; (5)每个语句的结尾,必须要有“;”作为终止符;(6)用/*..........*/作注释,//可作行注释; 三归纳小结 本节主要介绍了计算机程序设计语言及分类以及高级程序设计语言的开发过程,重点介绍C语言的特点和使用Microsoft Visual C++ 6.0开发C语言程序的步骤,最后由最简单的C语言源程序来学习了解C语言的重点基本规则。 四 课堂巩固练习 带领学生使用演示如何使用Microsoft Visual C++ 6.0开发环境,并演示简单的C语言源程序整个开发过程步骤。 五作业布置 在电脑上安装Microsoft Visual C++ 6.0软件,并学会新建项目和文件,将helloworld程序编辑运行出来,并练习其他输出语句的程序设计。 六后记 如何让学生对程序设计产生兴趣和感性和理性的认识是C语言程序设计良好开始的基础。 第一部分数据类型 一、基本数据类型: 字符型(char)表示一个字符。如‘a’,‘ ’。 整型(int,long)表示一个整数。 浮点型(float,double)表示一个浮点数,在计算机中用以近似表示任意某个实数。其中,char,int,long,float,double是类型符,是C语言中的关键字。 问题: 1如何知道TC2.0环境中,各种数据类型的长度? 2有了数据的长度,那么能够知道它们的表示范围。在TC下验证int和 long。注:整型包括有符号和无符号两种,不同分类的数据表示范围有所不同。 二、指针类型: char *,int *,long *,float *,double * 特别注意void * 指针有近指针和远指针,远指针要用“far”限定 问题:上述指针类型的长度 三、void: 理解以下两种含义 voidf(void){} void*malloc(size_t size) 思考有void型的数据吗? 四、变量: 变量对应数据类型。基本类型变量,比如char,int,double 指针变量。比如,char *,int *,使用变量要先定义。比如,int i;定义整型变量i,int *p定义一个整型指针变量。给变量赋值。比如 int *p;p=&p; 使用‘&’取变量的地址,使用‘*’访问指针变量指向的空间。 #define p(int *)*(int *)0x2000 main(){ p=(int *)&p; printf(“%x,%x,%xn”,p,&p,*p); } 问题:不运行,说出上述程序打印的结果什么? 五、常量 常量的定义 用const 如,const YEAR = 2010; 宏定义方式 #define OK 1分析下面程序: #define OK_0 0xff const OK=0x41; main(){ printf(“%sx,%x,%xn”,OK_0,&OK,OK); } 问题:为什么可以&OK,而不能&OK_0? 六、数组 一维数组定义数组举例,字符数组的定义,char str[30]=”hello”。还可以char str1[] = {‘s’,’t’,’r’};问题:1 如下形式定义数组char str[1]=‘A’;正确吗? 二维数组main(){ int a[][6] ={ {1,2,3,4,5},{6,7,8,9,0}}; printf(“%d,%d”,a[0][5],a[0][7]); } 结果:0,7 问题:为何,a[0][5]=0,0怎么来的?为何a[0][7]=7? 应用举例: #include main(){ char nam[][10]={“Sam”,“Jack”,“Diana”}; char cou[][10]={“masm”,“java”,“os”}; intgrd[][2]={{10,75},{11,80},{12,90}}; struct stu{char name[10];int No;char course[8];int grade;}s1={“Sam”,10,“masm”,75};struct stu s2,*s3,*p; strcpy(s2.name,nam[1]); 七、结构体 s2.No=grd[1][0]; strcpy(s2.course,cou[1]); s2.grade=grd[1][1]; s3=(struct stu *)malloc(sizeof(s2)); strcpy(s3[0].name,nam[2]); s3[0].No=grd[2][0]; strcpy(s3[0].course,cou[2]); s3[0].grade=grd[2][1]; p=&s2; printf(“name:%s,No:%i,course:%s,grade:%dnn”,s1.name,s1.No,s1.course,s1.grade);printf(“name:%s,No:%i,course:%s,grade:%dnn”,p->name,p->No,p->course,p->grade); printf(“name:%s,No:%i,course:%s,grade:%dnn”,s3[0].name,s3[0].No,s3[0].course,s3[0].grade);} 读懂程序,理解掌握结构体的定义和使用,熟练数组的使用,指针的使用。第三篇:c语言程序设计基础
第四篇:C语言入门基础教案
第五篇:C语言基础语法学习教程_数据类型v1.0