C语言学习大纲郝斌讲解.docx
《C语言学习大纲郝斌讲解.docx》由会员分享,可在线阅读,更多相关《C语言学习大纲郝斌讲解.docx(51页珍藏版)》请在冰豆网上搜索。
C语言学习大纲郝斌讲解
C语言概述:
1、为什么学习C语言
1).C的起源和发展
2).C的特点
优点
代码量小速度快功能强大
缺点
危险性高
开发周期长
可移植性不强
3).c的应用领域
主要是系统领域
4).c的重要性
2、怎样学习C语言
3、学习的目标
了解程序语言及发展历史
熟练掌握c语言的语法规则
掌握简单的算法
理解面向过程的思想,这非常有助于将来对面向对象思想的学习
能看懂程序
会调试程序
掌握将大问题转化为一系列小问题来求解的思想
为学习c++、数据结构、c#、java打下良好的基础
4、常见的学习问题
1、学习java为什么建议先学习C语言
2、没学过计算机专业的课程能够学懂C语言
3、英语和数学不好能学好C吗
32个关键词:
(有系统定义,不能重做其他定义)
autobreakcasecharconst
continuedefaultdodoubleelse
enumexternfloatforgoto
ifintlongregisterreturn
shortsignedsizeofstaticstruct
switchtypedefunsignedunsigned
unionvoidvolatilewhile
5、课程规划
c语言简介
第一讲、基本编程知识
第二讲、数据类型
第三讲、运算符和表达式
第四讲、流程控制(所有语言都一样的)
第五讲、函数(体现出面向过程和面向对象的区别)
第六讲、数组
第七讲、指针(c语言的灵魂)
第八讲、变量的作用域和存储方式
第九讲、扩展数据类型
第十讲、专题:
字符串的处理
进制转换
补码
动态内存分配(java、数据结构必学)
综合应用:
链表的使用
6、举例子:
一元二次方程
#include
#include
intmain(void)
{
//把三个系数保存到计算机中
inta=1;//=不表示相等,表示赋值
intb=2;
intc=3;
doubledelta;//delta存放的是b*b-4*a*c
doublex1;//存放一元二次方程的其中一个解
doublex2;//存放一元二次方程的其中一个解
delta=b*b-4*a*c;
if(delta>0)
{
x1=(-b+sqrt(delta))/(2*a)
x2=(-b-sqrt(delta))/(2*a)
printf("该一元二次方程有两个解,x1=%f,x2=%f\n",x1,x2);
}
elseif(delta==0)
{
x1=(-b)/(2*a);
x1=x2;//右边赋给左边
printf("该一元二次方程有一个唯一解,x1=x2=%f\n",x1);
}
else
{
printf("无解\n");
}
}
Helloword程序举例
#include
intmain(void)
{
printf("欢迎大家学习C语言!
");
return0;
}
C语言编写的病毒举例:
1、龌龊的程序:
/*
龌龊的程序!
/*
#include
#include
#include
intmain(void)
{
intc;
inti;
intj;
Nihao:
printf("1:
死机\n");
printf("2:
机房爆炸\n");
printf("请选择:
");
scanf("%d,&c");
If(c==1)
{
System("shutdown-s-t60")
}
elseif(2==c)
{
printf("你太坏了我要惩罚你!
\n");
for(j=0;j<10;++j)
System("start");
}
else
{
printf("你敲错了,请重新输入!
\n")
gotonihao;
}
return0;
}
2、内存泄露(占满内存)程序导致死机实例
#include
#include
intmain(void)
{
while
(1)
{
int*p=(int*)malloc(1000);
}
return0;
}
C语言编程预备知识
1、cpu内存条硬盘显卡主板显示器之间的关系
2、Helloworld程序如何运行起来的
3、什么是数据类型
基本类型数据
整数
整型——int --4字节
短整型——shortint ——2字节
长整型——longint ——8字节
浮点数【实数】
单精度浮点数——float ——4字节
双精度浮点数——double ——8字节
字符
char ——1字节
复合类型数据
结构体
枚举
共用体(已淘汰)
4、什么是变量
变量的本质是内存中一段存储空间
5、cpu内存条vc++6.0操作系统之间的关系
6、变量为什么必须初始化
所谓初始化就是赋值的意思
7、如何定义变量
数据类型变量名=要赋的值;
等价于
数据类型变量名;
变量名=要赋的值;
举例子:
inti=3;等价于inti;i=3;
inti,j;等价于inti;intj;
inti,j=3;等价于inti;intj;j=3;
inti=3,j=5;等价于inti,j;i=5;j=5;
inti,j;i=j=5;等价于inti,j;i=5;j=5;
8、什么是进制
十进制就是逢十进一
二进制就是逢二进一
生活中用到进制的例子:
一周七天:
七进制
一年十二个月:
十二进制
一小时六十分钟:
六十进制
电脑中的数据:
二进制
进制转化:
什么叫进制
进制就是逢几进一
我们说的N进制实际就是指逢N进一
我们的计算机只识别二进制
人类最习惯使用的是十进制
为了实际需要我们又建立了八进制和十六进制
C语言规定八进制前要加0(注意是零不是字母o),十六进制前要加0X或0x,十进制前什么都不加!
在汇编中:
在数字后加字母B表示二进制数,加字母O表示八进制数,加字母D表示十进制,加字母H表示十六进制。
例:
1011B为二进制数1011,也记为(1011)2
1357O为八进制数1357,也记为(1357)8
2049D为十进制数2049,也记为(2049)10
3FB9H为十六进制数3FB9,也记为(3FB9)16
什么叫n进制
十进制
十个基数,逢10进一
基数:
0123456789
二进制
二个基数逢二进一
基数:
01
八进制
8个基数逢8进一
基数:
01234567
十六进制
16个基数逢16进一
基数:
0123456789abcdef或
0123456789ABCDEF
十进制
(D)
二进制
(B)
八进制
(O)
十六进制
(0x)
0
0
0
0
1
常用计数制对照表
2
3
4
5
6
7
8
9
10
11
12
13
14
15
9、常量在c语言中如何表示的
整数
十进制:
传统的写法
十六进制:
前面加0x或0X,是数字0加x
八进制:
前面加数字0
浮点数:
传统写法
floatx=3.2;//传统
科学计数法
floatx=3.2e3;//x的值是3200
floatx=123.45e-2;//x的值是1.2345
字符
单个字符用单引号括起来
'A'表示字符A
'AB'是错误的
"AB"是正确的
字符串用双引号括起来
"A"正确,因为"A"代表了'A''\0'的组合
10、常量以什么样的二进制代码存储在计算机中
整数是以补码的形式转化为二进制代码存储在计算机中的
实数是以IEEE754标准转化为二进制代码储存在计算机中的
具体可参见末尾的穿插在课堂中的零散知识笔记
字符的本质实际也是与整数的存储方式相同
11、代码规范化
代码的可读性更高【容易让别人和自己看懂】
是程序更不容易出错
林锐《高质量C/C++编程》代码要成对的敲
12、什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位
1字节=8位
1K=1024字节
1M=1024K
1G=1024M
买硬盘时的换算是以1000为单位的
13、不同类型的数据之间相互赋值的问题
暂不考虑
inti=45;
longj=102345;
i=j;
printf("%d%d\n",i,j);
floatx=6.6;
doubley=8.8;
printf("%f%lf\n",x,y);
14、什么是ASCII
ASCII不是一个值,而是一种规定,
ASCII规定了不同的字符是使用哪个整数值去表示
它规定了
'A'--65
'B'--66
'a'--97
'b'--98
15、字符的存储【字符本质上与整数的存储方式相同】
基本的输入和输出函数的用法
printf()----(重点讲)将变量的内容输出到显示器上
四种用法
1.printf("字符串\n")
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--同上
%s--字符串
为什么需要输出控制符
1.01组成的代码可以表示数据也可以表示指令
2.如果01组成的代码表示的是数据的话,那么同样的01代码组合以不同的输出格式输出就会有不同的输出结果
scanf()----Java中已经没有了
两种用法:
用法一:
scanf("输入控制符",输入参数);
功能:
将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入已输入参数的值为地址的变量中。
用法二:
scanf("非输入控制符输入控制符",输入参数);
功能:
将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
非输入控制符必须原样输入
如何使用scanf编写出高质量代码
1.使用scanf之前最好先使用printf提示用户以什么样的方式来输入
2.Scanf中尽量不要使用非输入控制符,尤其是不要用\n
3.应该编写代码对用户的非法输入做适当的处理【非重点】
while((ch=getchar())!
='\n')
continue;
运算符
算术运算符
+-*/(除)%(取余数)
除法的运算结果和运算对象的数据类型有关,两个数都是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的值。
取余的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相等。
如:
13%3==113%-3==1-13%3==-1
-13%23==-133%5==3
关系运算符
>>=<<=!
=(不等于)==(等于)
逻辑运算法
!
(非)&&(并且)||(或)
!
真假
!
假真
真&&真真
真&&假假
假&&真假
假&&假假
真||假真
假||真真
真||真真
假||假假
C语言对真假的处理
非零是真
零是假
真是1表示
假使0表示
&&左边的表达式为假右边的表达式肯定不会执行
||左边的表达式为真右边的表达式肯定不会执行
赋值运算符
=+=*=/=-=
优先级别
算术>关系>逻辑>赋值
附录一些琐碎的运算符知识
自增自减三目运算符逗号表达式
流程控制(学习c语言的第一个重点)
1.什么是流程控制
程序代码执行的顺序
2.流程控制的分类
顺序
选择
定义
某些代码可执行,也可能不执行,有选择的执行某些代码
分类
if
1.if最简单的用法
格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
2.if的范围问题(重点)
1.
if(表达式)
语句A;
语句B;
解释:
if默认只能控制语句A的执行或不执行
if无法控制语句B的执行或不执行
或者讲:
语句B一定会执行
2.
If(表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
由此可见:
if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行就必须把这些语句用{}括起来。
3.if...else...的用法
4.if...elseif...else...的用法
格式:
if(表达式1)
A;
elseif(表达式2)
B;
if(表达式3)
C;
else
D;
5.C语言对真假的处理
非零是真
零就是假
真用一表示
假用零表示
6.if举例---求分数的等级
7.if的常见问题解析
1.空语句的问题
if(3>2);
等价于
if(3>2)
;//这是一个空语句
2.
if(表达式1)
A;
else
B;
是正确的
if(表达式1);
A;
else
B;
是错误的
3.
if(表达式1)
A;
elseif(表达式2)
B;
if(表达式3)
C;
else
D;
即便表达式1和2都成立,也只会执行A语句
4.
if(表达式1)
A;
elseif(表达式2)
B;
if(表达式3)
C;
这样些语法不会错,但逻辑上有漏洞
、5.
if(表达式1)
A;
elseif(表达式2)
B;
if(表达式3)
C;
else(表达式4)//7行
D;
这样写是不对的,正确的写法是:
要么去掉7行的(表达式4)
要么在7行的else后面加if
if(表达式1)
A;
elseif(表达式2)
B;
if(表达式3)
C;
else(表达式4);
D;
这样写语法不会错,但逻辑上是错误的
else(表达式4);
D;
等价于
else(表达式4);
D;
对任意三个数字进行排序:
如果a>b
则a与c比较a>c则输出aa否则
b与c比较b>c则输出bb穿插在课堂中的零散知识笔记:
如何看懂一个程序,分三步:
1.流程
2.每个语句的功能
3.试数
如何学习一些需要算法的程序【如何掌握一个程序】
1.尝试自己去编程解决它
但要意识到大部分人都是自己无法解决的,如果解决不了,这时不要气馁
如果十五分钟还想不出来,此时我建议您就可以看答案了
2.如果解决不了,就看答案
关键是把答案看懂,这个要花很大的精力,也是我们学习的重点
看懂一个程序要分三步:
流程、每个语句的功能、试数
3.看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义不建议看懂程序之后就立即自己敲程序
4.照着答案去敲
5.调试错误
6.不看答案,自己独立把答案敲出来
7.如果程序实在无法彻底理解,就把它背会,无法彻底理解的程序很少很少几乎没有
强制类型转换
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转换为前面所执行的数据类型
例子:
(int)(4.5+2.2)最终值是6
(float)(5)最终值是5.0000000
浮点数的存错所带来的问题
float和double都不能保证可以把所有实数都准确的保存在计算机中
例子:
floati=99.9;
printf("%f\n",i);
最终结果在VC++6.0中的输出的结果是:
99.900002
因为浮点数无法准确存储,所以就衍生出来两个编程问题
举例:
有一个浮点型变量x,如何判断x的值是否是零
if(|x-0.0000001|<=0.0000001)
是零
else
不是零
为什么循环更新的变量不能定义成浮点型
进制的复习:
1.什么是进制
逢n进一
2.把r进制转成十进制
3.十进制转成r进制
十进制转r进制:
除r取余,直至商为0,余数倒序
4.不同进制所代表的数值之间的关系
十进制的3981转化成十六进制是F8D
十进制的3981和十六进制的F8D所代表的本质都是同一个数
一些琐碎的运算符知识
自增【或者自减】
前自增--++i
后自增--i++
前自增和后自增的异同:
相同:
最终都使i的值加1
不同:
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
为什么会出现自增
代码更精练
自增的速度更快
学习自增要明白的几个问题
1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
2.自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说
i++和++i单独成一个语句,不要把它作为一个完整的复合语句的一部分来使用
三目运算符:
A?
B:
C
等价于
If(A)
B;
else
C;
逗号表达式
格式:
(A,B,C,D)
功能:
从左到右执行
最终表达式的值是最后一项的值
switch(很少用到,以后讲)
把电梯程序看懂就行啦
循环
定义:
某些代码会被重复执行
分类
for------重点、用到最多、最难
1.格式:
for(1;2;3)
语句A;
2.执行的流程【重点】
单个for循环的使用
多个for循环的嵌套使用
for(1;2;3)//1
for(4;5;6)//2
A;//3
B;//4
整体式两个语句,123是一个语句4是第二个语句
for(1;2;3)
for(4;5;6)
{
A;
B;
}
整体式一个语句
for(7;8;9)for(1;2;3)
{A;
B;
for(4;5;6)
C;
整体是一个语句
3.范围问题
4.举例:
1+2+3+...+100
1+1/2+1/3+....+1/100
while
1.执行的顺序
格式:
while(表达式)
语句;
2.与for的相互比较
for和while可以相互转换
for(1;2;3)
A;
等价于
1;
While
(2)
{
A;
3;
}
while和for可以相互转化
但for的逻辑性更强,更不容易出错,推荐多使用for
3.举例
从键盘输入一个数字,如果该数字是会文数,
则返回yes,否则返回no
回文数:
正着写和倒着写都一样
比如:
12112321都是回文数
试数:
>m=121
sum=0*10+121%10=1
m=m/10=12;
>m=12成立
sum=1*10+12%10=12
m=12/10=1
>m=1成立
sum=12*10+1%10=121
m=1/10=0
>m=0不成立
sum==val
4.什么时候使用while,什么时候使用for
没法说,用多了自然而然就知道了
do...while
格式:
do
{
......
}while(表达式);
do...while.并不等价于for,当然也不等价于while
主要用于人机交互
一元二次方程举例
break和continue
break(很重要)
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除了if属于循环内部的一个子句
例子:
for(i=0;i<3;++i)
{
if(3>2)
break;//break虽然是if内的语句,但break终止的却是外部的for循环
printf("嘿嘿!
\n");//永远不会输出
}
在多层循环中,break只能终止距离它最近的那个循环
for(i=0;i<3;++i)
{
for(j=1;j<4;++j)
break;//break只能终止距离它最近的循环
printf("同志们好!
\n");
}
在多层switch嵌套中,break只能终止距离它最近的switch
例子:
intx=1,y=0,a=0,b=0;
switch(x)//第一个switch
{
case1:
switch(y)//第二个switch
{
case0:
a++;
break;//终止的是第二个switch
case1:
b++;
break;
}
b=100;
break;//终止的是第一个switch
case2:
a++;