C语言教程Word格式文档下载.docx
《C语言教程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言教程Word格式文档下载.docx(98页珍藏版)》请在冰点文库上搜索。
C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。
头文件的内容也可以直接写C程序中,但这是很不好的习惯。
许多初学者用了头文件,却不明其理。
在此略作说明。
1.通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
2.头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
关于头文件的内容,初学者还必须注意。
1.头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不能写语句命令。
2.可以申明函数,但不可以定义函数。
3.可以申明常量,但不可以定义变量。
4.可以“定义”一个宏函数。
宏函数很象函数,但却不是函数。
其实还是一个申明。
5.结构的定义、自定义数据类型一般也放在头文件中。
6.#include<
filename.h>
,编译系统会到C语言固定目录去引用。
#include"
filename.h"
,系统一般首先在当前目录查找,然后再去环境指定目录查找。
四、好的风格是成功的关键
版本申明、函数功能说明、注释等是C语言程序的一部分。
不养成很好的习惯则不能成为C语言高手(专业人员)。
02章C语言的变量和数据类型
掌握变量的有效范围、基本数据类型是本章的内容。
一、基本数据类型
基本数据类型只有5种,另外加上布尔型、数组、结构类型、枚举类型等都是基本类型的一种变化。
指针是一种地址操作,必须和某一种数据类型相结合才有意义。
自定义数据类型则是将以上类型进行组合变化后重新命名而已。
1.char 字符型
2.int 整型
3.float 浮点型
4.double 双精度浮点型
5.void 无类型
不同的C语言版本都扩充了许多自己的类型,这些全是基本类型的变化(主要是数据范围的变化),扩充的修饰符有2组(short和long,signed和unsigned)。
下面列出VC的基本类型及部分扩充类型,以供参考:
类型名称
字节数
其它称呼
值的范围
int
*
signed,
signedint
根据操作系统而定
unsignedint
unsigned
__int8
1
char,
signedchar
-128to127
__int16
2
short,
shortint,
signedshortint
-32,768to32,767
__int32
4
-2,147,483,648to2,147,483,647
__int64
8
none
-9,223,372,036,854,775,808to9,223,372,036,854,775,807
char
unsignedchar
0to255
short
unsignedshort
unsignedshortint
0to65,535
long
longint,
signedlongint
unsignedlong
unsignedlongint
0to4,294,967,295
enum
与int相同
float
3.4E+/-38(7digits)
double
1.7E+/-308(15digits)
longdouble
10
1.2E+/-4932(19digits)
标准ANSIC中没有布尔型,只有布尔表达式,但不同的C语言版本有可能扩充。
布尔型只有2个值“真”、“假”,数值0表示“假”,0以外数值全当作“真”处理。
二、变量定义
变量定义要注意以下几方面:
1.变量定义必须有一数据类型。
2.变量定义时可以赋初值,也可以不赋初值。
3.几个变量可以同时定义。
4.不同类型的变量赋值时,小类型的变量可以直接赋给大的,大类型的变量赋给小类型的变量时必须强制转换。
.NET的编译器做了许多防错处理,使得不强制转换也不出问题。
大家仍不可忘记类型转换,否则将来程序移植时会带来许多麻烦。
unsignedcharu_char=109;
//定义并初始化
charcharC;
//只定义不赋值
doubledoubleX=200,doubleY;
//2变量同时定义
charC=u_char;
//类型的范围相同,无须强制转换
u_char=%c\n"
u_char);
charC=%c\n"
charC);
u_char=%d\n"
charC=%d\n"
doubleY=charC;
//小类型->
大类型
charC=(char)doubleX;
//大类型->
小类型
doubleY=%e\n"
doubleY);
}
三、变量命名
C语言的变量命名是很自由的,不同的系统有各自的规则,如UNIX主张用小写并用下划线分割意思(例:
new_value)。
Windows主张大小写混写(例:
NewValue)。
中国主张尽可能用英文,而日本更喜欢用汉字的读音。
甚至不同企业的命名规则也不一样,但不管什么风格,都必须遵守C语言的几点规则。
1.不能用纯数字命名,如“123”,“849”等。
2.不能有空格和运算符,如“newvalue”,“two+three”。
3.不能用C语言的关键字(参见下表)、扩充关键字。
auto
struct
break
else
switch
case
register
typedef
extern
return
union
const
continue
for
signed
void
default
goto
sizeof
volatile
do
if
static
while
四、易忽视的地方
char型和unsignedint是同一类型,字符其实就是无符号整型,因此下面几种写法实际上是一样的。
charch1=109;
__int8x1=109;
charch2='
m'
;
unsignedintx2='
ch1=%c\n"
ch1);
//字符方式输出
ch1=%d\n"
//整型方式输出
x1=%c\n"
x1);
x1=%d\n"
ch2=%c\n"
ch2);
ch2=%d\n"
x2=%c\n"
x2);
x2=%d\n"
字符用单引号,而以后学的字符串是用双引号的。
03章字符的输入输出
前2章用到的printf()函数,是C语言中的带格式的标准输出函数。
C语言的函数都封装在不同的函数库里面,编程时要用到某个函数时,只要用include语句申明一下,被申明过的函数库中的所有函数就可以在程序的任何地方使用。
这2章要讲述的基本输入输出函数,都在stdio.h中被定义。
一、字符的输入输出『getchar(),putchar()』
函数getch()是从终端输入一个字符。
是一个字符,也就是说,该函数调用一次只能得到一个字符,想要得到若干字符,只能调用若干次。
函数putchar()是向终端输出一个字符。
这儿也是一个字符,也就是说,该函数调用一次只能输出一个字符,要输出若干字符,只能调用若干次。
charich1;
intich2,ich3;
charch1='
q'
u'
charch3='
a'
charch4='
n'
ich1=getchar();
//字符类型实际是整型,只是范围小点而已
ich2=getchar();
//所以字符赋给整数变量没有关系
ich3=getchar();
//这三句在屏幕上输入“xue”后回车
putchar(ch1);
putchar(ch2);
putchar(ch3);
putchar(ch4);
putchar(ich1);
putchar(ich2);
putchar(ich3);
putchar('
\n'
//这是回车字符
上例中调用了3次getchar()函数,输入时请注意:
1.如果正好输入3个字符后回车,则3个字符分别赋给了相应的三个变量。
2.如果输入的字符数大干3个,则多余的被会扔掉。
3.如果输入2个字符后回车,则回车符被赋给了第3个变量。
4.如果输入1个字符后回车,则第1个变量得到了这个字符,而第2个变量则得到的是回车,第3个变量还没有得到,所以系统还在继续等待你输入第3个字符。
5.如果不输入而直接敲回车,则你必须敲3次回车,3个变量全等于回车。
6.getchar()的返回值不是char,而是int。
因此当得到超出char范围的数据时要注意。
二、改进后的字符输入函数
上面这些令人不满的地方,主要是由于getchar()函数使用了键盘缓冲区,一直等到有回车时,getchar()函数才接受字符。
因此有人对此函数进行了扩充,函数名为getche(),不再使用键盘缓冲,输入的字符立即就能被接受。
这个函数不是存放在stdio.h中,而是存放在conio.h中。
上面程序如下修改便好用多了。
类似函数还有很多,如getch(),这和getche()的区别是,getch()函数在输入后并不显示在屏幕上,其它功能和getche()相同,也是定义在conio.h中。
conio.h>
ich1=getche();
//改进后的字符输入函数
ich2=getche();
ich3=getche();
三、转义字符
前面的例子中,我们已经看很多“\n”,它表示输出时显示一个回车。
回车字符是控制字符,无法输入在字符串中间。
因此,C语言用“转义字符”来代替这一类的控制字符。
%的输出并不是用“\%”表示,而是用“%%”表示,好象就这一个是特殊的。
字符形式
功 能
\0
空字符(NULL)
\n
换行
\t
横向跳格(Tab)
\v
竖向跳格(|)
\b
退格
\r
回车
\f
换页字符
\\
反斜杠"
\"
字符
\'
单引号(撇号)字符
双引号字符
\a
响铃字符
\?
问号字符
%%
百分号字符
\ddd
1~3位8进制数所代表的字符
\xhh
1~2位16进制数所代表的字符
04章附带格式的输入输出
printf()函数和scanf()函数中的f是format的缩写,这里面用到的“格式”,在C语言其它地方也有很广的应用。
一、格式输出『printf()』
前面已经说过,一个字符用%d格式就可以输出其ASCII码即字符的整数值。
用%c格式则输出这个字符。
如果用%f格式,则小数的方式输出。
intdays=360;
//“劝学网”三字的ASCII码是“C8B0”“D1A7”“CDF8”
\xC8\xB0\xD1\xA7\xCD\xF8\t小雅\n"
//显示:
劝学网{TAB}小雅
北京奥运还有:
%d天\n"
days);
\a\a"
//“嘟嘟”
//以下三行写在同一行
%s"
"
这是C语言"
教程\t"
作者:
%s\n"
"
小雅"
//360分别以整数、小数、科学计数法显示
整数:
%d\n小数:
%f\n科学:
%e\n"
days,(float)days,(double)days);
//以下控制字节长度
360用5个字节表示:
[%5d]\n"
days);
//[...]中共5字节
3.6保留2位整数2位小数:
[%5.2f]\n"
(float)days/100);
//[...]中2位整数2位小数,
//外加小数点共5字节
格式符的个数必须和逗号后面的变量或常量相同,类型也必须一致或可以直接转换。
二、常见格式符号
格式字符
类型
输出格式
c
int或
win_t
以字符方式输出。
C
用在printf()函数中时,以双字节字符显示;
用在wprintf()函数中时,以单字节字符显示。
d
以整型输出。
i
o
以八进制无符号整型输出。
u
以无符号整型输出
x
以十六进制小写输出(abcdef)。
X
以十六进制小写输出(ABCDEF)。
e
以科学计数法表示float和double型数据。
(其中e用小写)
E
(其中E用大写)
f
以小数表示float和double型数据。
g
自动地将能显示的很小或很大的数转换成%f,不能直接显示的数则转换成%e。
G
自动地将能显示的很小或很大的数转换成%f,不能直接显示的数则转换成%E。
n
Pointertointeger
Numberofcharacterssuccessfullywrittensofartothestreamorbuffer;
thisvalueisstoredintheintegerwhoseaddressisgivenastheargument.
p
Pointertovoid
内存地址,以十六进制表示。
s
String
以字符串输出。
S
用在printf()函数中时,以双字节字符串显示;
用在wprintf()函数中时,以单字节字符串显示。
三、格式输入『scanf()』
scanf()函数的功能与printf()函数正好相反,是输入数据的功能。
但对于初学者却有一难点,即所输入的数据存放到变量时,用到了地址操作。
地址操作也就是指针,是C语言的难点、重点,许多人不会C语言的根本原因就是没学会指针。
既然指针这么难,为什么C语言要使用指针呢?
C语言产生之前,前辈们都是用机器语言或汇编语言来编程,整天都是与内存地址打交道,C语言使用了指针,使得程序运行速度接近汇编语言,编程效率、实现的功能大大提高。
当今电脑硬件的飞速发展,使速度不成问题,于是Java、C#都基本废除了指针的使用。
intage;
//年龄
charname[20];
//姓名
请输入你的年龄:
"
scanf("
%d"
&
age);
//&
age表示变量age的地址
请输入你的姓名:
name);
//name单独使用就表示变量name的地址
\n姓名=%s\t年龄=%d\n"
name,age);
上例中,2个变量当作参数使用时,一个用了&
符号,一个没用,为什么呢?
原来当一个变量的类型是基本类型、或扩充基本类型时,变量的地址要用&
符号再加变量名。
其它尤其指数组,单独使用变量名,就表示该变量的地址。
关于这一点,以后讲完数组和指针后还要详细讨论。
05章if语句和switch语句
一、if语句
在计算机如此普及的今天,if语句的功能介绍就不说了。
其基本语法如下:
//写法一
if(条件表达式){
语句
//写法二
else{
//写法三
elseif(条件表达式){//elseif(条件表达式){语句}部分可重复n遍
else块只能出现在if语法的最后,且最多只能出现1次。
elseif块能出现若干次,但只能在if块的后面,不能在else块的前面。
当各块里面的语句只有一句时,括号{}可以省略。
不建议省略,因为省略后下面的语句让人容易糊涂。
//易让人看错的写法//表示的是下面的意思
if(x==1)if(x==1){
if(y==1)if(y==1)
x和y都等于1"
elseelse
我其实是y==1的else"
}
二、switch语句
switch语句完全可以用if语句代替,每一个case块的最后一句语句要有break语句,否则将运行到下一个case块中去。
还需要注意的是,switch语句只适用于基本类型的变量作条件(包括扩充基本类型)。
default块可以省略,但小雅建议您不要省略,即使不用也加上。
//基本类型的变量//假定inti;
//假定charstr[];
以下是错误的
switch(变量){switch(i){switch(str){
case表达式1:
case1:
case"
Sunday"
:
语句语句语句
break;
case表达式2:
case2:
Monday"
case表达式n:
case10:
Friday"
default:
}}}
三、(?
:
)运算符
(表达式?
值1:
值2)这是带运算符的表达式,意思是:
如果“表达式”的值为“真”,则返回“值1”,否则返回“值2”。
if是控制语句而不是运算符,也不是表达式。
y=(x==2?
100:
50);
//写成如下相同功能的if语句
if(x==2){
y=100;
y=50;
四、关于逻辑表达式
逻辑表达式又叫布尔表达式,前面章节已经说过,布尔表达式只有2个值:
TRUE和FALSE