C语言程序设计
一、 C语言的特点
C语言是美国的Dennis Ritchie在1972年设计发明的。它由早期的编程语言BCPL(B语言)发展演变而来。C语言之所以发展迅速,成为最受欢迎的语言之一,主要因为它具有强大的功能。归纳起来,C语言具有下列特点:
1.C语言是“中级语言”
把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2.C语言是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便地调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3.C语言功能齐全
C语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外C语言也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。
4.C语言适用范围广
C语言还有一个突出的优点就是适合多种操作系统,如DOS、Windows、UNIX,也适用于多种机型。
二、 C语言的编辑环境
C-Free是一款C/C++集成开发环境(IDE)。C-Free中集成了C/C++代码解析器,能够实时解析代码,并且在编写的过程中给出智能的提示。完善的工程/工程组管理使你能够方便的管理自己的代码。
三、 C语言的编辑环境
1、 创建C语言文件
创建一个文件p1-1.c,保存到c:\c-class目录下,给C语言代码一个家。
【视频文件:p1-0.flv】
c-free:
1、创建文件:[文件]->[新建]->创建了一个空白的文档
2、保存到自己的目录下,以便后期查找。[文件]->[另存为]->选择C盘下的c-class目录,如果没有就先创建,然后把文件名修改成p1-0.c,C语言文件的后缀(就是文件名那个点后面的部分)是c。
2、构建C语言框架
C语言最基本的架构
//******************程序1:C语言基础框架**************
int main(void){
int
}
//******************************************************
C语言采取函数的架构,一个名称后面一对括号称为一个函数,例如main(),就是主函数,是C语言的入口,前面的int表示这个函数返回的值是一个整型的数。{….}大括号之间的空间,是这个函数放代码的地方,大括号一定要成对出现。
函数可以这样理解,类似一个咱们学校的办公室,你想让C语言干的工作(程序完成的任务),需要很多老师完成(老师相当于代码),他们都在办公室里面(就是代码要放到大括号包括的地方)。开始办公室比较小,大家都可以在一个房间办公,后来办公室要干的事情多了(程序功能复杂了),需要设立多个部门(部门相当于函数),不同部门(函数)完成不同的功能。但是别人进来办事,只能从一个地方进来,所以这个main函数类似一个学校的公共办事大厅,进来出去都要经过这里,同时,也只能有一个,其他函数相当于学校的其他部门,可以有很多个,也可以部门下面还有部门,但是通过main()函数来调用,类似其他部门你去了没人搭理你,都要通过公共办事大厅统一派活一样。所以程序运行的时候,是从main()函数开始执行的,也一般在main()函数结束。C语言制定了这个一个规矩,咱们必须要按照这个规矩执行,要不他不给咱们干活啊。
3、C语言的一些基本规定和标识
C语言除了这个规矩,还有其他很多规定,这些规定必须要严格的执行,咱们学习C语言的过程,就是学习这些规定,在这些规定的基础上,把咱们的想法,转换成符合这些规定能完成的操作,实现咱们最终的功能,这个过程,就是程序设计的过程。为什么这些规定这么严格呢,差一点都不行呢,因为计算机实在是太笨了,一点灵活性都没有,类似你的员工,每个员工只会干一件很简单的工作,而且你必须按照他的方式来给他安排活,稍微差点他就不懂了,类似你让他过来,你必须按照事先的约定说“你到这里来”,你不能说“你过来”,这样他是不会懂的,也不会过来,他不会灵活理解你的意图。
唉,我怎么这么倒霉,带领这么一帮笨人干活呢,感觉什么也干不成啊。别灰心,every coin has two sides,你的员工还是有很多优点的,虽然笨,但是非常勤劳,干活特别快,组织纪律性特别好,一次干对了,后面会一直按照这个成功的方式干,不像很多聪明的人,每次干都玩点花样,让人感觉不靠谱。看看计算机目前能干的工作,你就知道,这些笨笨的计算机是多么的厉害,所以说笨人不一定干不成事,聪明人不一定能干事,一点不假,习惯了以后,你会喜欢计算机程序中一个个笨笨的、严格按照规矩办事的家伙的,他们真是能办成很多事,需要你按照他们的规定把他们组织起来。计算机软件开发,就是你为了实现某个任务,严格按照他们能懂的规定,给他们编写流程,类似给你的演员撰写演出的剧本或者给员工撰写工作手册之类的东西。
首先学习一些C语言的基本“规矩”,记住,严格按照这个规定,否则计算机会不懂,甚至乱干,不过别担心,如果你写的不符合规定,C语言集成编辑环境会首先检查并提醒你。
1)每个C语句以分号结束;
2)/*……*/表示注释。单行注释可以用”//”表示,注释只是给人看的,对程序不起作用。可以出现在一行中的最右侧,也可以单独成为一行。
3)C语言对大小写字母是敏感的,就是你在程序中,int 和Int是两个东西,wang和Wang也是两个变量,你在输入程序的时候要注意。
4、C语言的变量、引用和赋值
现在开始让计算机干活吧,程序的主要任务是处理数据,所以首先要给数据找个地方保存。类似楼道的信箱,你首先要申请一个信箱,然后给你的信箱起个名字。
C语言给保存数据的地方起来个学术性的名字“变量(variable)”,一个变量的空间只能保存一个数据,显然这样带来两个问题:
1) 变量要占计算机存储器(内存)的空间,数据有大有小,把变量都规定成一样大,显然不合理,所以变量要根据保存的数据大小规定合适的大小,就是变量有类型,例如短的数据(-128到127,或者字符)用char,长点的数据(-32768到32767)用int(整数Integer)。
2) 一个程序中要有很多变量,为了区分,每个变量要给他取个名字,名字随便起,可以是英文,拼音,不能是汉字,最好起的名字能看出这个变量是干什么用的。这样申请一个变量的方法就是: 类型+空格+变量的名字; 例如 int a; 就是申请了一个变量a,可以存放一个整数。
3) 一个变量存放一个数据,这样新的数据会把原来的数据覆盖了。
4) 每个变量包含两个信息,一个是里面存放的数据,另外一个是这个变量在什么地方,类似信箱的地址和里面存放的内容。
在C语言使用变量。
//******************程序2:C语言变量声明**************
int main(){
int a;
intb;
intc;
/*这是注释,主要是在程序中说明信息用的,良好的注释体现了一个优秀程序员的素质。
这是你写的第一个C语言程序,注意每一行用分号结束,分号主要不要在中文状态敲成中文的“;”了,C语言中都是英文状态,如果里面输入英文,很容易把中文状态的符号敲到程序行中,以后注意,当然在注视行中,*/
//也可以简写为int a,b,c;这样更加简洁,单行的注释,可以用两个“/”开始
}
//******************************************************
现在申请了三个变量,可以用来存放整数(就是-32768到32767之间的数)了。怎么把数放进去呢?C语言采用等号“=”,如果在a这个变量中存储50这个数,就用语句
a=50;
这种方式,注意c语言的等号是把右侧的数放到左侧变量的意思,不是相等的意思,“=”是一个动作,称为“赋值”(如果判断是否相等,例如判断a是否等于50,用“a==50”这样来判断,是两个等号)。
变量里面放上数后,直接写变量的名称,就可以取到里面的数了,也就是说变量名称就代表里面的数值。例如我们想在变量b中也放一个50,我们可以用
b=50;
也可以用
b=a;
这两个语句执行完后效果是一样的,b变量里面保存的数都是50了。
前面说过,一个变量只能放一个数据,下面的语句
a=50;
a=30;
最终的结果是变量a里面保存的数是30,这个就是变量的由来,里面的数可以变化,但是后面的数会覆盖前面的数,这个特点要记住。
同样,如果你想把a,b两个变量的数互换,采用
a=1;
b=2;
b=a;
a=b;
是无法实现的,想想为什么?
//******************程序2:C语言变量和赋值**************
int main(){
inta,b,c; //程序在计算机内存储器中申请了三个存放整数的地方,分别叫a,b,c
a=50; //把50赋值给a变量,这条语句执行完,a变量里面就存放成50了。
b=a; //变量名就代表变量里面保存的值,把a变量的值给b变量,b变量的值等于50
c=60; //把60存放到变量c变量中
c=a+b;//将a+b的值放到c中
return0; /*return 0 是让程序结束,可以不加,因为后面啥也没有了,不加也结束了,增加这个语句,可以在前面设置断点,以便好观察变量的值。*/
}
//******************************************************
5、C语言的运行、调试方法
程序编写好后,就可以运行了。程序运行就是让计算机执行你的程序,类似你的剧本写好了,让演员去表演去,或者你的工作流程写好了,让你部门的员工去执行。
在C-free编译环境中,在菜单[构建]下面的第一项就是[执行],也可以看到,直接按快捷键[F5]也可以执行。如果下面的信息显示区域显示“0个错误,0个警告”,那就表示可以执行了,会弹出一个dos界面(黑底白字的框),提示“按任意键继续……”,表示程序已经顺利执行完成了。
也许你比较失望,太快了吧,还没有看清呢,眨眼就执行完了。是的,前面说过,计算机虽然笨,不灵活,可干活那可是雷厉风行,快如闪电,而且规规矩矩,任劳任怨,让他干啥就干啥。
如果你想看看计算机执行的过程,那你可跟不上他的节奏,所以你只能让他在某个步骤上停下来,给你看看他的变量值的情况,你也可以让他走一步停一步,让你跟踪他的执行过程,这在程序的调试中非常重要。
具体的方法是在程序中,在你想停顿的语句前面的灰色区域,用鼠标点一下,就出现一个红点,表示在这里设置了一个断点,如果取消,就再点一下,红点消失。然后运行程序的时候不是从菜单的[构建]-[运行]启动程序,而是从菜单的[调试]-[开始调试]启动,程序会停到断点处,这个时候你可以观察最下面的调试栏目,显示各个变量的当前值。然后从[调试]-[进入]执行单步运行,可以在每一步观察到下面变量的值的变化。上述操作由于比较常用,最好采用快捷键方式,开始调试是[F9],单点执行是[F7]。
6、C语言的表达式和数值计算
C语言有专门的表达式可以执行各类运算,常用的是加减乘除,分别用“+,-,*,/”表示,其中乘法和除法的表示同数学中不太一样,因为数学中的“×”和“÷”键盘不好敲,程序中又经常用,所以用”*”和”/”代替。另外,还有一个比较常用,就是求余数的运算”%”,例如
5%2=1,这个运算符很有用,例如判断一个变量a是否是偶数,只要判断”a%2”是否等于0就可以了。怎么判断素数(就是只能被1和自己整除,例如7,13等)?
表达式中可以包括变量和常量,还有括号,这个跟数学中的函数计算式差不多。表达式计算完后,结果没有地方保存,需要把结果放到某个变量中保存,例如:
a=1;
b=2;
c=(a+b)*100;
表达式(a+b)*100的结果就是300,然后把结果放到c变量中保存。
7、C语言的流程控制
上述程序中,程序一行行依次向下排列,程序就按照顺序从上到下一行行执行,当然你肯定能想到,有一个指针指向当前执行的程序行,执行完后,再指向下一行,这样系统按照程序执行指针的指示执行。
但是,很多时候,程序中根据当时的情况,去执行不同的部分,例如判断重量,如果大于30公斤(超重),运费就是3元/公斤,如果小于等于30公斤(未超重),运费就是1元/公斤,给出一个货物的重量,求运费。
C语言提供了分支语句“if”来实现这个判断的功能,格式是
if(条件){
满足条件情况下执行的语句;
}else{
不满足条件情况下执行的语言;
}
条件判断一般用”>(大于),<(小于),==(等于),!=(不等于)”
例如变量a=10,那么,
if(a<20)就成立,
if(a<5)就不成立
注意判断
if(a=20)判断a是否等于20是错误的写法,在C语言中,“=“是赋值语句,是一个动作,这个句子把20赋给a变量了,正确是判断是否相等的写法是两个”=”连续写,如
if(a==20)
判断不等于是
if(a!=20)
回到上面的例子,
//******************程序3:C语言流程控制语句**************
intmain(){
int bagWeight=23; //行李重量
float unitPriceOverload=3.2; //超重的单价
float unitPriceNo=1.50; //不超重的单价
int overloadNumber=0; //超重数量
float freight=0.0; //运费
if(bagWeight>30)
freight=bagWeight*unitPriceOverload; //超重的运费
else
freight=bagWeight*unitPriceNo; //不超重的运费
return 0;
}
//******************************************************
8、C语言的循环控制
很多时候,需要重复很多次做一个工作,例如求1+2+3+…+100,一种方法:
intsum=0; //定义一个变量,一定要初始化为0
sum=1+2+3+…+100;
h还可以这样写:
sum=sum+1;
sum=sum+2;
sum=sum+3;
……
sum=sum+100;
这样你输入起来比较麻烦,关键是每一行不一样,改变一下形式,添加一个变量
intsum=0,i=1;
sum=sum+i; //相当于sum=sum+1 高手一般这样写 sum+=1;
i=i+1; //i=2 ,高手一般这样写 i++
//下面就可以把上面两个语句拷贝-粘贴100次了,
sum=sum+i;
i=i+1;
sum=sum+i;
i=i+1;
sum=sum+i;
i=i+1;
……
实际上是一个完全相同的工作,重复做了100次,这样C语言需要一个重复做同样工作的机制,首先学一种,
while(条件){
重复执行的语句;
}
当条件满足的时候(就是while的意思),执行下面的大括号中的程序块,如果条件不满足了,就跳出循环,执行后面的语句。通过控制条件的变化,就可以控制循环执行的次数。你肯定应该能想到,这些重复执行的语句里面,肯定要有改变条件的语句,否则永远重复执行循环体的语句出不来了,称为“死循环”,那可是比较糟糕的一件事情了,必须要避免。
怎么控制程序执行100次呢,可以这样,用变量i去控制,每次执行i+1,然后判断i是否还是小于等于100(i<=100),如果还满足,就一直执行,否则就结束循环,这样就不用拷贝-粘帖100次了,成了这样,
while(i<=100){
sum=sum+i;
i=i+1;
}
完整的程序如下:
intmain(){
int sum=0,i=1;
while(i<=10){
sum=sum+1;
i=i+1;
}
return 0;
}
你把i<10修改成100看看,几乎没有什么变化,可以看到,计算机虽然比较笨,但是干活的速度惊人,所以学习了循环结构后,很多的实现方法要充分利用循环结构来简化,例如解一个方程,如果已知判断一个数(保存到变量a)是否是素数(就是只能被1和自己整除),可以从2开始,一直到a-1,取模(a%i)是否为0,如果成立,就不是素数了。
9、C语言的函数
看下面的一个程序,有一个竞赛中,有4组成绩,(a1,a2),(b1,b2),(c1,c2),(d1,d2),把每个组的最好成绩取出来,分别放到a,b,c,d变量中。
int main(){
inta1=1,a2=3;
intb1=6,b2=2;
intc1=4,c2=9;
intd1=7,d2=3;
inta,b,c,d;
//第一组
if(a1>a2)
a=a1;
else
a=a2;
//第二组
if(b1>b2)
b=b1;
else
b=b2;
//第三组
if(c1>c2)
c=c1;
else
c=c2;
//第四组
if(d1>d2)
d=d1;
else
d=d2;
}
分析一下程序,可以看到,每一组的算法实际上是一样的,就是数据不一样,类似一个办公室,管人力的小组干的活完全一样,但是因为要分别管技术人员、行政人员、后勤人员、管理人员,就要配备了4组人。显然有点问题,不仅人员浪费,而且人力的这些人干活特别快,如果能重复用起来,那可以节省很多人。所以,把他们这个小组单独成一个办公室,不再main这个大厅了,然后在这个房间建一个窗口,上面放几个筐,规定好第一个筐放什么材料,第二个筐放什么材料,然后再把处理完的材料放到一个筐中,需要办理人事的,不管是技术人员,还是行政人员的材料,按照窗口的筐的规定放好,人力处理完后,把结果放到输出筐中就可以了。
按照这个思路,把比较处理独立出来,单独放到一个地方,这个称为函数,能完成某些功能,因为要为很多人干活,所以函数里面要根据送进来的数处理,这些送进来的数就称为参数,完成后的结果称为函数值,形式是这样的。
int max(int m,int n){
intp;
if(m>n)
p=m;
else
p=n;
return p;
}
这样,就可以在main函数中调用这个函数了。完整的程序如下:
//******************程序4:C语言函数**************
int main(){
inta1=1,a2=3;
intb1=6,b2=2;
intc1=4,c2=9;
intd1=7,d2=3;
int a,b,c,d;
a=max(a1,a2);
b=max(b1,b2);
c=max(c1,c2);
d=max(d1,d2);
}
int max(int m,int n){
intp;
if(m>n)
p=m;
else
p=n;
return p;
}
//******************************************************
如果一个函数,比如说这个比较大小的函数,不仅一个程序用,其他很多程序都用,比如说几十个程序都用,那要把这个函数都贴到这几十个程序中,是一个很麻烦的事情,最致命的是如果函数想改进或者优化,那要到几十个程序中去改,非常不方便。所以C语言提供了这这么一个技术,就是把函数放到一个文件中,给这个文件起个名字,例如max.h,然后在用到函数的程序的第一行,用#include “max.h” 包含进来,注意这个是预处理指令,结束不用’;”结束。
完整的程序如下:
//******************程序5:C语言函数的包含**************
max.h 文件
int max(int m,int n){
intp;
if(m>n)
p=m;
else
p=n;
return p;
}
P1-5.c
#include "max.h"
int main(){
inta1=1,a2=3;
intb1=6,b2=2;
intc1=4,c2=9;
intd1=7,d2=3;
inta,b,c,d;
a=max(a1,a2);
b=max(b1,b2);
c=max(c1,c2);
d=max(d1,d2);
}
//******************************************************
有了函数后,虽然你的编程能力不是太强大,但是其他很编写了很多很高级的函数,你只需要直接用就可以了,所以使你的程序具有强大的功能。
10、C语言的输出函数
C语言本身没有提供显示信息的语句,所以咱们的变量只能通过调试程序看看,显示变量怎么办呢?系统提供了编写好的一个函数prinf(“显示的内容”)
//******************程序6:C语言函数的显示**************
#include "stdio.h"
int main(){
printf("HelloWorld!");
}
计算机中除了数字以外,还要有一些显示的文字,单个字母称为“字符”,就是char,用单引号引起来,多个字符合起来称为字符串,用双引号引起来。例如’Y’是一个字符,”YES”是一个字符串。字符串在C语言中占据重要的位置,因为很多信息要显示,通过增加字符串,使得显示更加清楚。字符串会按原样显示。 有些键盘无法输入的字符,常用的是回车换行,用“\n”表示。
如果想显示一个变量怎么显示呢?需要给printf两个参数,第一个是字符串,显示变量的类型,例如int型变量是”%d”,第二个是要显示的变量名称。
#include "stdio.h"
int main(){
inta=5;
printf("%d",a);
}
Printf还可以让显示更清晰,就是在字符串中的合适位置,放置变量类型,就可以在这个位置,显示后面对应变量的值了,例如你想显示变量a的值是5,可以是printf(”变量a的值是%d”,a),就是让函数在“变量a的值是”后面位置,显示后面第二个参数的值,比单纯一个5清楚得多。后面一个参数也可以是表达式或者函数值。
#include "stdio.h"
int main(){
inta=5;
printf("变量a的值是%d",a);
}
printf() 函数定义在控制台头文件stdio.h中。
#include "stdio.h"
int main(){
inta=5;
printf("变量a的值是%d,a+10以后的值是%d",a,a+10);
}
11、C语言的输入函数
C语言本身也没有提供输入语句,我们前面使用的变量都是程序里面系统固定写的,不能在程序运行的时候由用户通过键盘输入进来。通过键盘输入的功能,在C语言中,是采用外部函数的方式提供,scanf(“%d”,&a),前面一个参数是要存放进来数据的变量的类型,后面一个参数是变量,只是在名称前面加一个“&”,就是取变量a地址的作用,这个是同函数内部的机制有关。
现在我们从键盘输入两个数,然后相加后输出。
//******************程序7:C语言的输入函数**************
#include "stdio.h"
int main(){
inta,b;
scanf("%d%d",&a,&b);
printf("a=%d,b=%d,a+b=%d",a,b,(a+b));
}