计算机二级C语言笔记.docx
《计算机二级C语言笔记.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言笔记.docx(20页珍藏版)》请在冰点文库上搜索。
计算机二级C语言笔记
C语言概述
(一)为什么要学习C语言
1).C的起源和发展
2).C的特点
优点
代码量小速度快功能强大
缺点
危险性高开发周期长可移植性不强
3).C的应用领域
系统软件的开发
1.操作系统:
Windows\linux\Unix
2.驱动程序:
主板驱动、显卡驱动、摄像头驱动
3.数据库:
DB2、Oracle、SqlServer
应用软件开发
1.办公软件:
Wps
2.图形图像多媒体:
ACDSeePhotoshopMediaPlayer
3.嵌入式软件开发:
智能手机、掌上电脑
4.游戏开发:
2D,3D游戏
4).C的重要性
(二)怎样学习C语言
(三)学习的目标
(四)常见问题答疑
1.学习java为什么建议先学C语言
2.没学过计算机专业课程能够学懂C语言
3.英语和数学不好能学好C吗?
(五)课程计划
(六)举例子:
一元二次方程
C语言编程预备知识
1)CPU内存条硬盘显卡主板显示器之间的关系
2)HelloWord程序如何运行起来的
3)什么是数据类型
基本类型数据
整数表示字节
整形--int4
短整型shortint2
长整形longint8
浮点数(实数)
单精度浮点数float4
双精度浮点数double8
字符char1
复合类型数据
结构体
枚举
共用体
4)什么是变量
变量的本质就是内存中的一段储存空间
5)CPU内存条VC++6.0操作系统之间的关系
6)变量为什么必须初始化
所谓初始化就是赋值的意思
7)如何去定义变量
数据类型变量名=要赋的值;
等价于
数据类型变量名;
变量名要赋的值;
举例子
Inti=3;等价于intI;I=3;
IntI,j;等价于intI;intj;
8)什么是进制【ppt】
十进制就是逢十进一
二进制就是逢二进一
9)常量在C语言中是如何表示的
整数
十进制:
传统的写法
十六进制:
前面加0x或0X
八进制:
前面加0【是数字零不是字母O】
浮点数
传统的写法
Floatx=3.2;
科学计数法
Floatx=3.2e3;
字符
单个字符用单引号括起来
‘A’表示字符A
‘AB’错误
“AB”正确
字符串用双引号括起来
“A”正确,因为“A”表示了‘A’‘\0’的组合
10)常量是以什么样的二进制代码储存咋计算机中
整数是以补码的形式转化为二进制代码存储在计算机中
实数是以IEEE754标准化转化为二进制代码存储在计算机中的
字符的本质实际也是与整数的储存方式相同
11)代码的规范化
12)什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位
1字节=8位
1K=1024字节
13)不同类型的数据之间的相互之间赋值的问题
14)什么是ASCII码
ASCII不是一个值,二是一种规定,ASCII规定了不同的字符是使用哪个整数值去表示
它规定了
‘A’---65‘B’---66
‘a’----97‘b’---98‘0’---48
15)字符的存储【字符本质上与整数的存储方式相同】
基本的输入和输出函数的用法:
Printf()--将变量的内容输出到显示器上
四种用法
1.printf(“字符串”)
2.printf(“输出控制符”,输出参数)
3.printf(“输出控制符1输出控制符2.。
。
”,输出参数1,输出参数2.。
)
4.printf(“输出控制符非输出控制符”,输出参数)
输出控制符包含如下
%d--int
%ld--longint
%c--char
%f--float
%lf--double
%x(或者%X后者%#X)--int或longint或shortint
%o--int或longint或shortint
%s--字符串
为什么需要输出控制符
1.01组成的代码可以表示数据也可以表示指令
2.如果01组成的代码表示的事数据的话,那么同样的01代码组合一不同的输出格式输出就会有不同的输出结果
Scanf()[通过键盘将数据输入到变量中]
两种用法:
1.Scanf(“输入控制符”,输入参数);
例如:
scanf(“%d”,&i)//&i表示取i地址,&为取地址符
功能:
将从键盘输入的字符转化为输入控制符所规定的格式的数据,然后存入以输入参数的值为地址的变量中
2.Scanf(“非输入控制符输入控制符”,输入参数);
功能:
将从键盘输入的字符转化为输入控制符所规定的格式的数据,然后存入以输入参数的值为地址的变量中
非输入控制符必须原样输入
如何使用scanf编写出高质量代码
1.使用scanf之前最好先用printf提示用户以什么样的方式输入
2.Scanf中尽量不要使用非输入控制符,尤其是不要用\n
3.应该编写代码对用户的非法输入做适当的处理【非重点】
While((ch=getchar())!
=‘\n’)
Continue;
16)运算符
算术运算符
+-*/(除)%(取余数)
关系运算符
﹥>=
=(不等于)==(等于)
逻辑运算符
!
(非)&&(并且)||(或)
!
真假
!
假真
真&&真真
真&&假假
假&&真假
假&&假假
真||真真
真||假真
假||真真
假||假假
C语言对真假的处理
非零时真
零是假
真是用1表示
假是用0表示
&&左边的表达式是假时,右边的表达式不执行
||左边的表达式是真时,右边的表达式不执行
赋值运算符
=+=-=*=/=
优先级别
算术>关系>逻辑>赋值
附录的一些琐碎的运算符知识
自增自减三目运算符逗号表达式
除法与取余运算符
1.除法(/)的运算结果与运算对象的数据类型有关,两个数都是int型,则商就是int型,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。
如:
16/5==316/5.0==3.20000-13/4==-4
-13/-3==43/5==05/3==1
最经典的例题就是求S=1+1/2+1/3+1/4+1/5……+1/100的值(具体的程序以后再讲)。
2.取余%的运算符对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同
如:
13%3==113%-3==1-13%3==-1
-13%23==-13-13%-23==-133%5==3
17)流程控制【是我们学习C语言的第一个重点】
1.什么是流程控制
程序代码的执行顺序
2.流程控制的分类
a)顺序执行
b)选择执行
定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码
分类:
if
(1)If最简单的用法
格式:
If(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
(2)If的范围问题【重点】
1.If(表达式)
语句A;
语句B;
解释:
if默认只能控制语句A的执行或不执行
If无法控制语句B的执行或不执行
或者讲:
语句B一定会执行
2.If(表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
由此可见:
if默认只能控制一个语句的执行或不执行,
如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来
(3)Ifelse的用法
(4)Ifelseifelse的用法
格式:
If(语句1)
语句A;
Elseif(语句2)
语句B;
Else语句C
(5)C语言对真假的处理
非零是真,零是假
真用1表示,假用零表示
(6)If举例—求分数的等级
(7)If的常见问题解析
Swith
c)循环执行
定义:
某些代码会被重复执行
分类:
A.For
i.格式:
For(1;2;3)
语句1;
ii.执行的流程【重点】
单个for循环的使用
多个for循环的嵌套使用
For(1;2;3)
For(4;5;6)
A;
B;
iii.范围
iv.举例:
1+2+3+4+……+100
1/2+1/3+1/4+……+1/100
B.While
11执行顺序
格式:
while(表达式)
语句;
12与for的相互比较
For与while可以相互转换
但for的逻辑更强,更不容易出错,推荐使用for
13举例
从键盘输入一个整数,如果数字是回文数,输出yes,否者输出no
回文数:
正着写和倒着写一样
14什么时候使用while,什么时候使用for
C.Do…..while……
格式:
Do
{………
}while(表达式)
Do….while并不等于for,当然也不等于while
主要用于人机交互
D.Break和continue
Break:
break如果用于循环式用来终止循环
Break如果用于switch,则是用于终止switch
Break不能直接用于if,除非if属于循环内部的一个子集,用来终止外部的循环
在多层循环中,break用于终止最近的循环
在多层switch语句中,break只能终止距离最近的switch语句
Continue:
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
强制类型转换:
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转换为前面所执行的数据类型
例子:
(int)(4.5+2.2)最终值是6
(float)(5)最终值为5.000000
浮点数的存储所带来的问题:
Float和double都不能保证可以精确的存储一个小数
举例:
有一个浮点型变量X,如何判断X的值是否是零
If(|x–0.000001|<=0.000001)
是零
Else
不是零
为什么循环中更新的变量不能定义成浮点型
附录的一些琐碎的运算符知识
自增自减三目运算符逗号表达式
1.自增【或自减】
分类:
前自增——++i
后自增——I++
前自增和后自增的异同:
相同:
最终都使i的值加1
不同:
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
为什么会出现自增
代码更精练
自增速度更快
学习自增要明白的几个问题
1)我们编程是应尽量屏蔽掉前自增和后自增的区别
2)自增表达式最好不要作为一个完整复合语句的一部分或则说i++和++i单独使用
2.三目运算符
A?
B:
C
等价于
If(A)
B;
Else
C;
3.逗号表达式
格式:
(A,B,C,D)
功能:
从左到右执行,最终表达式的值是最后一项的值
18)数组
为什么需要数组
为了解决大量同类型的储存和使用问题
为了模拟现实世界
数组的分类
一位数组
怎样定义一位数组
为n个变量连续分配
所有变量的数据类型必须相同
所有变量所占的字节大小必须相等
有关以为数组的操作
初始化
完全初始化
Inta[5]={1,2,3,4,5}
不完全初始化,未被初始化的元素自动为零
Inta[5]={1,2,3}
不初始化,所有元素师垃圾值
Inta[5];
清零
Inta[5]={0}
错误写法:
1.inta[5];
a[5]={1,2,3,4,5}//错误
只有在定义数组的同时才可以整体的赋值
其他情况下整体赋值都是错误的
2.inta[5]={1,2,3,4,5}
a[5]=100;//错误
3.inta[5]={1,2,3,4,5};
intb[5];
如果要把a数组中的值全部赋值给b数组
错误写法:
b=a;//错误
一维数组名不代表数组,只代表数组中所有的元素,一维数组名代表数组第一个元素的
正确写法:
for(i=0;i<5;++i)
b[i]=a[i];
赋值:
排序:
求最大值/最小值;
倒置:
查找:
插入:
删除:
二维数组
a[i][j]表示第i+1行,j+1列的元素看待
初始化:
输出二维数组内容:
用两个for循环就可以了
操作:
多为数组:
是否存在多维数组————不存在
因为内存是线性一维的
N维数组可以当做每个元素似乎n-1维数组的一位数组
19)函数
为什么需要函数
避免了重复性操作
有利于程序的模块化
什么叫函数
逻辑上:
能够完成特定功能的独立的代码单元
物理上:
能够接收数据【当然也可以不接收数据】,能够对接收的数据进行处理,能够将数据处理的结果返回
总结:
函数是个工具,它是为了解决大量类似问题而设计的,函数可以当做一个黑匣子
如何定义函数
函数的返回值函数的名字(函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法。
2.Return表达式;的含义:
<1>.终止被调函数,向主调函数返回表达式的值
<2>.如果表达式为空,则只终止函数,不向主调函数返回任何值
<3>.break是用来终止循环和switch的,而return是用来终止函数的
3.函数返回值的类型也称为函数的类型,因为如果函数名前面返回值类型和函数执行体中的return表达式中表达式的类型不同的话,则最终函数的返回值的类型以函数名前的返回值的类型为准
函数的分类
有参函数和无参函数
有返回值和无返回值
库函数和自定义函数
普通函数和主函数
一个函数必须有且只有一个主函数
主函数可以调用普通函数,
普通函数不能调用主函数,
普通函数可以相互调用,
主函数是函数的入口,也是程序的出口
注意的问题
函数的调用和函数的定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明:
1.告诉编译器即将可能出现的若干个字母代表的是一个函数
2.告诉编译器即将可能出现的若干个字母代表的函数的形参和返回值的具体情况
3.函数声明是一个语句,末句必须加分号
4.对库函数的声明是通过#include<库函数所在的文件的函数>
形参和实参
个数相同位置一一对应数据类型必须相互兼容
常用的系统函数
专题:
递归
变量的作用域和存储方式:
按作用域分:
全局变量:
在所有函数外部定义的变量叫全局变量
使用范围:
从定义位置开始到整个程序结束
局部变量:
在一个函数内部定义的变量或者函数的形参都统称为局部变量
使用范围:
只能在本函数内部使用
注意的问题:
全局变量和局部变量命名冲突的问题
在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
按变量的存储方式
静态存储
自动变量
寄存器变量
20)指针
指针的重要性
表示一些复杂的数据结构
快速的传递数据
使函数的返回一个以上的值
能直接访问硬件
能够方便的处理字符串
是理解面向对象语言中引用的基础
总结:
指针是C语言的灵魂
指针的定义
地址
内存单元的编号
从零开始的非负整数
范围:
4G【0-4G】
指针
指针就是地址,地址就是指针
指针变量就是存放内存单元的编号
指针和指针变量时两个不同的概念
但是要注意:
通常我们叙述是会把指针变量简称为指针,实际他们不相同
指针的本质就是一个操作受限的非负整数
指针的分类
1.基本类型的指针
Int*p;//
2.指针和数组
指针和一位数组
数组名
一维数组名是一个指针常量,存放的是数组第一个元素的地址
下标和指针关系
如果p是个指针变量,则
P[i]永远等价于*(p+i)
如果一个函数要处理一个一维数组,则要接受该数组的哪些信息
需要两个参数:
数组的第一个元素地址;数组的长度
指针变量的运算
指针变量不能相加,相乘,相除
如果两个指针变量指向的事同一块连续空间中的不同存储单元则这两个指针变量才可以相减
一个指针变量到底占几个字节
预备知识:
Sizeof(数据类型)
功能:
返回值就是该数据类型所占的字节数
Char1;int4;double8;
一个变量的地址使用该变量首字节的地址来表示
指针和二位数组
3.指针和函数
4.指针和结构体
5.多级指针
专题:
动态内存分配【重点难点】
传统数组的缺点:
1.数组长度必须事先制定,且只能是常整数,不能是变量
2.传统形式定义的数组,该数组的内存程序员无法手动释放。
数组一旦定义,系统为该数组分配的存储空间就会一直存在,除非数组所在的函数运行完毕时,数组的空间才会被系统释放
3.数组一旦被定义,其长度就不能再更改;
数组的长度不能再函数运行的过程中动态的扩充或缩小
4.A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕之后,A函数中数组将无法再被其他函数使用
传统方式定义的数组不能跨函数使用
为什么需要动态分配内存:
动态数组很好的解决了传统数组的这4个缺陷
传统数组也叫静态数组
动态内存分配举例---动态数组的构造:
静态内存和动态内存的比价:
跨函数使用内存的问题:
21)
(七)