C语⾔基础知识及其⼏种常⽤的语句
1.1 软件,程序与计算机语⾔
软件是为完成某些特定功能⽽编制的⼀个到多个程序⽂件的集合。
程序是计算机指令的序列,编制程序的⼯作就是为计算机编制指令序列。
⼈和计算机交流也要⽤⼈和计算机都容易接受和理解的语⾔,这就是计算机语⾔。
1.2 程序语⾔的发展
1.2.1 机器语⾔
计算机的机器语⾔都是由0和1组成,计算机的所有数据都是由0和1组成。
1.2.2 汇编语⾔
汇编语⾔是⽤符号来表⽰这些固定的⼆进制指令的语⾔。
1.2.3 ⾼级语⾔
⾼级语⾔总是尽量接近"⾼级动物”的⾃然语⾔和思维⽅式。
1.3 软件开发的基本⽅法与步骤
1.分析问题,建⽴数据模型。
2.确定数据结构和算法。
3.编织程序。
4.调试程序。
1.3.1 算法
通常计算机算法分为两⼤类:数值运算算法和⾮数值运算算法。
数值运算是对问题求数值解,⾮数值运算包括⾮常⼴泛的领域。数值运算有确定的数学模型,⼀般都有⽐较成熟的算法。⾮数值运算的种类繁多,要求不⼀。
算法的基本特征(有穷性,确定性,有效性,有零个或多个输⼊,有⼀个或多个输出。
算法的表⽰—流程图(对给定算法的⼀种图形解法,流程图⼜称为框图,它⽤规定的⼀系列图形,流程线及⽂字说明来表⽰算法中的基本操作和控制流程,其优点是形象直观,简单易懂,便于修改和交流。)
流程图包括起⽌框,输⼊/输出框,处理框,判断框,注释框,流程框,连接点。
1.3.2 编码实现
创建⼀个C语⾔程序的步骤:
1.编写源代码
2.将源代码编译成⽬标代码。
3.链接⽬标代码成为可执⾏程序
源代码
将源程序的代码指令存储,计算机采⽤两种不同格式存储⽂件,分别是⽂本格式和⼆进制格式。
⽂本⽂件包括ASCII码字符集的符号。ASCII字符集包括了字母表的⼤⼩写字母。还包括了从0-9的数和
⼀些标点符号。⼆进制⽂件是由⼆进制数组成。
当编写程序的时候,我们将源代码存储到⽂本⽂件中,程序员通常会将多个源代码的⽂本⽂件创建⼀个程序。通过很短时间的编译和链接过程,⽂本⽂件中的源代码被转化成⼆进制指令存储到⼆进制⽂件中。
编译源代码
计算机不能执⾏源代码,我们要编写编译器或翻译器,这样,就可以将程序从⾼级语⾔程序转化成⼆进制代码,也就是机器语⾔。
链接
当链接起将程序链接成可执⾏的形式时,它⽤多个库来链接⽬标程序。库是⼀些预先编译好的函数的集合。这些函数可能完成⼀项或多项任务。
1.3.3 调试程序
程序中最易出现的⼏种不同类型错误是
语法错误
逻辑错误
开发错误
运⾏时错误
2.1编程语⾔概述
学习⼀门新语⾔的惟⼀途径就是使⽤它来编程。对于初学者来说,编写的第⼀个程序⼏乎都是相同的,即在屏幕上显⽰“Hello, world”,专业说法为打印“Hello, world”。
【例1-1】打印 Hello, world。
1. /* 第⼀个C语⾔程序
2. 打印 Hello, world */
3. #include<stdio.h> //包含头⽂件stdio.h
4. int main(){ // 主函数
5. printf("Hello, word\n"); // 打印字符串
6. return 0; // 返回0,表⽰程序正确运⾏
7. }
尽管这个程序很简单,但对初学者来说,它仍然可能成为⼀⼤障碍,因为要实现这个⽬的,⾸先要编写代码,然后编译、链接并运⾏,最后看到输出结果。掌握了这些操作细节以后,其它事情就⽐较容易了。
关于编译和链接将在下⼀节说明,这⾥先对程序进⾏解释:
第1⾏包含标准库⽂件,include称为⽂件包含命令,扩展名为.h的⽂件称为头⽂件。
第2⾏定义名为main的函数,它不接受参数值;main函数的语句都被括在花括号中;int为main函数返回值类型。
第3⾏打印“Hello, world”,main函数调⽤库函数printf以显⽰字符序列。
第4⾏表⽰main函数的返回值为0,return让函数返回⼀个值。
第5⾏结束main函数,花括弧必须成对出现。
位于“/* */”中和“//”后⾯的内容为注释,⽤来对程序进⾏说明;注释在编译时会被⾃动忽略。
⼀个C语⾔程序,⽆论其⼤⼩,都是由函数和变量组成的。
函数具有某些特定功能,能执⾏特定操作;函数中包含⼀些语句,以说明操作的过程。变量则⽤于存储计算过程中使⽤的值。
在本例中,函数的名字为main。通常情况下,函数的命名没有限制,但main是⼀个特殊的函数名,每个程序都从main函数的起点开始执⾏,这意味着每个程序都必须在某个位置包含⼀个main函数。
main函数通常会调⽤其它函数来帮助完成某些⼯作,被调⽤的函数可以是我们⾃⼰编写的,也可以来⾃于函数库。上述程序段中的第⼀⾏语句#include <stdio.h>⽤于告诉编译器在本程序中包含标准输⼊/输出库。许多C语⾔源程序的开始处都包含这⼀⾏语句。我们将在后续章节对标准库进⾏详细介绍。
函数之间进⾏数据交换的⼀种⽅法是调⽤函数向被调⽤函数提供⼀个值(称为参数)列表。函数名后⾯的⼀对圆括号将参数列表括起来。在本例中,main函数不需要任何参数,因此⽤空参数表( )表⽰。
函数中的语句⽤⼀对花括号{}括起来。本例中的main函数包含下⾯两条语句:
1. printf("Hello, word\n");
2. return 0;
调⽤函数时,只需要使⽤函数名加上⽤圆括号括起来的参数表即可。上⾯这条语句将"hello, world\n"作为参数调⽤printf函数。printf是⼀个⽤于打印输出的库函数,在此处,它打印双引号中间的字符串。
⽤双引号括起来的字符序列称为字符串或字符串常量,如"hello, world\n"就是⼀个字符串。⽬前我们仅使⽤字符串作为printf及其它函数的参数。
在C语⾔中,字符序列\n表⽰换⾏符,在打印中遇到它时,输出打印将换⾏,从下⼀⾏的左端⾏⾸开始。如果去掉字符串中的\n(这是个值得⼀做的练习),即使输出打印完成后也不会换⾏。在printf函数的参数中,只能⽤\n表⽰换⾏符。如果⽤程序的换⾏代替,例如:
printf("Hello, word
");
C编译器将会产⽣⼀条错误信息。
printf函数永远不会⾃动换⾏,这样我们可以多次调⽤该函数以分阶段得到⼀个长的输出⾏。上⾯给出的第⼀个程序也可以改写成下列形式:1. #include<stdio.h>
int main(){
printf("Hello, ");
printf("word");
printf("\n");
return 0;
}
这段程序与前⾯的程序的输出相同。
2.2 基本数据类型
所谓数据类型是按被定义变量的性质,表⽰形式,占据存储空间的多少,构造特点来划分的。在C语⾔中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四⼤类。
数据类型说明:
数据类型说明
基本数据类型基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是⾃我说明的。
基础c语言代码构造数据类型构造数据类型是根据已定义的⼀个或多个数据类型⽤构造的⽅法来定义的。也就是说,⼀个构造类型的值可以分解成若⼲个“成员”或“元素”。每个“成员”都是⼀个基本数据类型或⼜是⼀个构造类型。在C语⾔中,构造类型有以下⼏种:数组类型、结构体类型、共⽤体(联合)类型。
指针类型指针是⼀种特殊的,同时⼜是具有重要作⽤的数据类型。其值⽤来表⽰某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为⼀谈。
空类型在调⽤函数值时,通常应向调⽤者返回⼀个函数值。这个返回的函数值是具有⼀定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为:
int max(int a,int b);
其中“int ”类型说明符即表⽰该函数的返回值为整型量。⼜如在例题中,使⽤了库函数sin,由于系统规定其函数返回值为双精度浮点型,因此在赋值语句s=sin (x);中,s也必须是双精度浮点型,以便与sin函数的返回值⼀致。所以在说明部分,把s说明为双精度浮点型。但是,也有⼀类函数,调⽤后并不需要向调⽤者返回函数值,这种函数可以定义为“空类型”。其类型说明符为void。在后⾯函数中还要详细介绍。
2.3 数据类型转换
⾃动转换
⾃动转换发⽣在不同数据类型的量混合运算时,由编译系统⾃动完成。⾃动转换遵循以下规则:
1. 若参与运算量的类型不同,则先转换成同⼀类型,然后进⾏运算。
2. 转换按数据长度增加的⽅向进⾏,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进⾏运算。
3. 所有的浮点运算都是以双精度进⾏的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
4. char型和short型参与运算时,必须先转换成int型。
5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度⽐左边长
时,将丢失⼀部分数据,这样会降低精度,丢失的部分按四舍五⼊向前舍⼊。
下图表⽰了类型⾃动转换的规则。
【例2-1】⾃动数据类型转换
1. #include<stdio.h>
int main(){
float PI=3.14159;
int s,r=5;
s=r*r*PI;
printf("s=%d\n",s);
return 0;
}
本例程序中,PI为实型;s,r为整型。在执⾏s=r*r*PI语句时,r和PI都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了⼩数部分。
强制类型转换
强制类型转换是通过类型转换运算来实现的。其⼀般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表⽰的类型。
例如:
1. (float) a; /* 把a转换为实型 */
2. (int)(x+y); /* 把x+y的结果转换为整型 */
在使⽤强制转换时应注意以下问题:
类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
⽆论是强制转换或是⾃动转换,都只是为了本次运算的需要⽽对变量的数据长度进⾏的临时性转换,⽽不改变数据说明时对该变量定义的类型。
【例2-2】强制数据类型转换
1. #include<stdio.h>
int main(void){
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
return 0;
}
本例表明,f虽强制转为int型,但只在运算中起作⽤,是临时的,⽽f本⾝的类型并不改变。因此,(int)f的值为 5(删去了⼩数)⽽f的值仍为5.75。
2.4 运算符的分类
运算符不仅具有不同的优先级,还有不同的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是⾃左向右进⾏运算还是⾃右
向左进⾏运算。
C语⾔的运算符可分为以下⼏类:
运算符说明
算术运算符⽤于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、⾃增(++)、⾃减(--)共七种。
关系运算符⽤于⽐较运算。包括⼤于(>)、⼩于(<)、等于(==)、⼤于等于(>=)、⼩于等于(<=)和不等于(!=)六种。
逻辑运算符⽤于逻辑运算。包括与(&&)、或(||)、⾮(!)三种。
位操作运算符参与运算的量,按⼆进制位进⾏运算。包括位与(&)、位或(|)、位⾮(~)、位异或(^)、左移(<<)、右移(>>)六种。
赋值运算符⽤于赋值运算,分为简单赋值(=)、复合算术赋值(+=, -=, *=, /=, %=)和复合位运算赋值(&=, |=, ^=, >>=, <<=)三类共⼗⼀种。条件运算符这是⼀个三⽬运算符,⽤于条件求值(?:)。
逗号运算符⽤于把若⼲表达式组合成⼀个表达式(,)。
指针运算符⽤于取内容(*)和取地址(&)⼆种运算。
求字节数运算符⽤于计算数据类型所占的字节数(sizeof)。
特殊运算符有括号(),下标[],成员(->,.)等⼏种。
表达式是由常量、变量、函数和运算符组合起来的式⼦。⼀个表达式有⼀个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进⾏。单个的常量、变量、函数可以看作是表达式的特例。
3.1 顺序结构的设计实例
例【3-1】输⼊三⾓形的三边长,求三⾓形⾯积。
已知三⾓形的三边长a、b、c,则该三⾓形的⾯积公式为:
area=( s(s-a)(s-b)(s-c) )1/2
其中s = (a+b+c)/2。
源程序如下:
1. #include <stdio.h>
#include <math.h>
int main(void){
float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);
printf("area=%7.2f\n",area);
return0;
}
【例4.15】求ax2+bx+c=0⽅程的根,a、b、c由键盘输⼊,设b2-4ac>0。
源程序如下:
1. #include <stdio.h>
#include <math.h>
int main(void){
float a,b,c,disc,x1,x2,p,q;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;x2=p-q;
printf("\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
return0;
}
3.2 if语句的使⽤
⽤if语句可以构成分⽀结构。它根据给定的条件进⾏判断,以决定执⾏某个分⽀程序段。C语⾔的if语句有三种基本形式。
语句的三种形式
1) 第⼀种形式为基本形式:if
if(表达式) 语句
其语义是:如果表达式的值为真,则执⾏其后的语句,否则不执⾏该语句。
【例3-3】
1. #include <stdio.h>
int main(void){
int a,b,max;
printf("\n input two numbers: ");
scanf("%d%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d",max);
return0;
}
本例程序中,输⼊两个数a、b。把a先赋予变量max,再⽤if语句判别max和b的⼤⼩,如max⼩于b,则把b赋予max。因此max中总是⼤数,最后输出max的值。
2) 第⼆种形式为: if-else
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执⾏语句1,否则执⾏语句2 。
【例3-4】
1. #include <stdio.h>
int main(void){
int a, b;
printf("input two numbers: ");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论