C语言经典知识详解超好Word格式.docx
- 文档编号:18248079
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:27
- 大小:23.71KB
C语言经典知识详解超好Word格式.docx
《C语言经典知识详解超好Word格式.docx》由会员分享,可在线阅读,更多相关《C语言经典知识详解超好Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
,p[i]);
//*(p+i)等价于p[i];
i++;
}
\n"
);
i=0;
p="
Second"
//这样可以方便的改变字符串的值,直接赋给指针变量
*(p+i));
charch[6]="
Third"
//以字符数组存放字符串的缺点是不如用指针那样方便的改变字符串的值
intlen=strlen(ch);
for(i=0;
i<
len;
i++)
printf("
ch[i]);
return0;
}
/*
输出结果为:
First
Second
Third
结论:
对字符串的操作有以下几个库函数:
strlen(string);
//计算字符串的有效长度
strcpy(a,b);
//将字符串b中的值复制到a中
strcat(a,b);
//将字符串b中的值连接到a的后面,其中a数组的长度要足够大
strcmp(a,b);
//比较字符串a,b的大小
7,将一个数组中的元素倒序输出实例
/*
2011年11月30日20:
21:
20
目的:
将一个数组中的元素倒置输出
inta[6]={2,9,10,55,-8,1};
intj=5;
inttemp;
while(i<
j)
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
--j;
6;
%d"
a[i]);
8二维数组的输出实例
2011年11月30日21:
11:
47
不存在多维数组,因为内存是线性一维的,n维数组可以当做每个元素是n-1维数组的一维数组
例如:
inta[3][4][5]
给数组是含有3个元素的一维数组
只不过每个元素都是4行5列的二维数组
/*//inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
inta[3][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
inti,j;
3;
for(j=0;
j<
4;
j++)
%-5d"
a[i][j]);
}*/
inti,j,k;
inta[3][4][5]={
{{1,2,3,4,5},{5,4,3,2,1},{1,2,3,4,5},{5,4,3,2,1}},
};
for(k=0;
k<
k++)
5;
{
a[k][i][j]);
}
输出结果:
12345
54321
Pressanykeytocontinue
9,return表达式
函数返回值的类型称为函数的类型,如果函数前的返回值类型和return表达式后的返回值类型不同,最终以函数名前的返回值类型为准
intfun()
return10.6;
//尽管return的值为float类型的,但是由于是intfun(),因此返回的仍为10
doublei=2.2;
i=fun();
%lf\n"
i);
10return与break的区别:
return终止被调函数,向主调函数返回表达式的值
如果表达式为空,则只终止函数,不向被调函数返回任何值
break是用来终止循环和switch的,return是用来终止函数的
#include<
inti;
同志们辛苦了!
break;
领导辛苦了!
/*输出结果为:
同志们辛苦了!
领导辛苦了!
Pressanykeytocontinue
同志们辛苦了
Pressanykeytocontinue
11c语言中没有bool(即布尔类型),但是c中用0表示false,用非0表示true
实例:
2011年12月1日10:
52:
27
判断一个数是否为素数
函数的用法
isPrime(intm)
for(i=2;
m;
if(m%i==0)
break;
if(i==m)
else
return1;
inta;
请输入一个数:
"
scanf("
%d"
&
a);
if(isPrime(a))
%d是个素数!
a);
%d不是个素数\n"
2011年12月1日21:
57:
26
判断并输出小于输入一个数内的所以素数
函数的正确使用可以提高代码的可重用性
在编写程序时尽量是一个函数的功能单一
函数是C语言中的最小单位,类是Java,C#,C++的基本单位
//判断一个数是否是素数
intisPrime(intm)
return0;
//遍历并输出n以内的素数
voidTravelse(intn)
n;
if(isPrime(i))
printf("
return;
inti,j,val;
pleaseinputval:
val);
Travelse(val);
12C语言中的库函数
doublesqrt(doublex)求的x的平方根
ingabs(intx)求x的绝对值
doublefabs(doublex)求x的绝对值
13递归
14全局变量和局部变量命名冲突的问题
在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量。
12folat和double类型的数,在计算机中不能保证可以把所有的实数都准确的保存在计算机中。
floatf=99.9;
%f\n"
f);
99.900002
因为浮点数无法准确存储,所以衍生出来两个编程问题:
有一个浮点数变量x,如何判断x的值是否是零
if(|x-0.000001|<
=0.000001)
是零
不是零
为什么循环变化的变量不能定义成浮点数
因为浮点数不能准确存储
13如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明
1.告诉编译器即将可能出现的若干个字母代表的是一个函数
2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况。
3函数声明是一个语句,末尾必须加分号
4对库函数的声明是通过#include<
库函数所在的包及包所在的文件的名字.h>
14为了控制输入错误
1>
scanf中尽量不要使用非输入控制符,尤其是不要用\n
2>
应该编写代码对用户的非法输入做适当的处理
while((ch=getchar())!
\n'
continue;
3>
使用scanf之前,最好用printf提示用户输入
15流程控制
顺序
选择
某些代码可能执行,也可能不执行,有选择的执行某些代码
If.....A
IfAelse.......
if......else..........if.......else
注意:
这三条语句都很少一条语句(都只能输出一个结果);
例程:
目的:
测试选择语句:
1if()
2elseif()//如果1不成立,执行2
.......
3elseif()//如果1,2不成立,执行3
.......
4else//如果1,2,3不成立,执行4
整个语句是一条语句,因为输出结果只有一条。
voidrank(floatscore)
if(score>
100)
做梦去吧!
elseif(score>
=90&
&
score<
=100)
优秀!
=80&
90)
良好!
=60&
80)
及格!
=0&
60)
不及格!
else
输入错误!
floatscore;
请输入你的分数:
%f"
score);
//如果此处为%d,则不管你输入多大的数字,则score得最终值均为0;
score=%f\n"
score);
//此处也和上面一样
rank(score);
循环
16C语言中对真假的处理
非零是真
零就是假
真用1表示
假用0表示
17交换两个数的三种方法
2011年12月2日19:
55:
30
测试交换一个数的三种方法
#include<
请分别输入两个整数,并且以空格分开:
%d%d"
i,&
j);
交换前两个数分别为:
i=%dj=%d\n\n"
i,j);
//第一种方法
temp=i;
i=j;
j=temp;
*/
//第二种方法
i^=j;
j^=i;
//第三种方法
i=i+j;
j=i-j;
i=i-j;
交换后两个数分别为:
i=%dj=%d\n"
17注意的问题:
问题1:
2011年12月2日23:
31:
59
测试一下判断语句
if(4>
2)
AAAA\n"
elseif(3>
BBBB\n"
CCCC\n"
在VC++6.0中的输出结果为:
AAAA
---------------------------------
总结:
if(表达式1)
A:
elseif(表达式2)
B:
elseif(表达式3)
C:
D:
即使表达式1和2都成立,也只好执行1语句。
问题2:
if(2>
5)
elseif(5>
1)
else(3>
5);
//无实际意义的语句
BBBB
CCCC
-----------------------------
分析:
虽然此程序在语法上没有错误,但是逻辑上有错误
else(3>
等价于:
else
(3>
*/
18浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数
19什么是进制?
逢n进一
把r进制转成十进制
将十进制转化为r进制
除r取余,直到商为0为止
不同进制所代表的数值之间的关系
十进制的3981转化为十六进制位F8D
十进制的3981和十六进制的F8D所代表的数字都是同一个数字
20为什么会出现自增,自减运算符
代码更精练
自增的速度更快
学习时要明白:
编程尽量屏蔽前自增和后自增的差别
自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说i++和++i单独成一个语句,不要把它作为一个完整的复合语句的一部分使用。
比如:
intm=i+++++i+i+i++;
//这样写不仅不能移值(即:
在不同的电脑上执行结果不同)不好的方式
21三目运算符
格式:
A?
B:
C等价于if(A)
B;
C:
22函数的递归
功能:
求1+1/2+1/3+.....+1/100的和。
函数的递归
如果一个函数中调用本身则称该函数为递归函数。
floatsum(intn)
floats=0;
if(n==1)
s=1;
if(n>
=2)
s=sum(n-1)+1.0/n;
//也可以写成s=sum(n-1)+1/(float)(n);
不是很好
returns;
floats=sum
(2);
s=%f\n"
s);
}
23for和while之间可以相互转换
for(1;
2;
A;
等价于
1;
while
(2)
3;
24while的用法举例
2011年12月5日12:
29:
49
判断一个数是否为回文数
intval;
intsum=0;
intm=val;
while(m)
sum=sum*10+m%10;
m/=10;
if(val==sum)
是回文数!
不是回文数!
m=121符合条件
sum=0;
sum=0*10+121%10=1;
m=12;
m=12符合条件
sum=1;
sum=1*10+12%10=12;
m=1;
3>
m=1符合条件
sum=12*10+1%10=121;
m=1/10=0;
退出循环
23
菲波拉力契序列123581321.........
intmain(void)
intf1=1;
intf2=1;
intf3;
intj;
i);
if(1==i)
f3=1;
elseif(2==i)
f3=2;
for(j=3;
=i;
f3=f1+f2;
f1=f2;
f2=f3;
%d\n"
f3);
24用scanf("
%c"
ch);
输入字符时%c之前要有空格
25选择语句switch
所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是:
(1)枚举常量(有些书中称之为枚举元素),
(2)数值常量,(3)字符常量(4)常变量,(5)宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的。
Switch后面的括号里面的“表达式”允许是任何类型但是VC中只能是Int或char
Break语句可以用于switch中,用于终止switch
25break和continue
Break如果用于循环式用来中国循环
Break如果用于switch,则是用于终止switch
Break不能直接用于if,除非if属于循环内部的一个子句(break不能直接用于if);
if(3>
//虽然处于if子句中,但是用来终止for的
哈哈!
//永远不会输出
Break只能终止距离它最近的循环。
Continue用于跳过本次循环余下的语句转去判断是否需要执行下次循环
For(1;
3)
B;
Continue;
//执行完该语句之后转去执行语句3,不会执行c,d
C;
D;
17数组指针,指针数组,字符串指针,函数指针,结构体指针,多级指针各自的含义及实例程序
1.数组指针:
指向数组首地址的指针变量(指向数组的指针)
声明格式:
类型(*P)数组名[]
例如:
char(*p)ch[];
2.指针数组:
数组中存放的都为指针变量
类型*p数组名[]
例如:
char*pch[];
3.字符串指针:
指向字符串首地址的指针变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 经典 知识 详解