1、软件技术基础,主讲:白玉,课程要求,共48学时 课内上机10学时 作业 期末,软件工程 数据库数据结构 计算机网络操作系统 多媒体,软件技术基础,软件工程 :软件研制的全过程 数据结构 :计算机软件的基础知识 操作系统 :计算机系统的核心软件,软件技术基础,再看 C语言,32个关键字:(由系统定义,不能重作其它定义) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static
2、 struct switch typedef unsigned union void volatile while,9种控制语句: if( )else for( ) while( ) dowhile( ) continue break switch goto return,34种运算符: 算术运算符:+ - * / % + - 关系运算符: = != 逻辑运算符:! & | 位运算符 : | & 赋值运算符:= 及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节数 :sizeof 强制类型转换:(类型) 分量运算符:. - 下标运算符: 其它 :( ) -,C程序格式和结构
3、特点 例1.1 第一个程序 Hello,World!,/* example1.1 The first C Program*/ #include main() printf(“Hello,World!”); ,输出: Hello,World!,例1.2,/* example1.1 calculate the sum of a and b*/ #include /* This is the main program */ main() int a,b,sum;a=10;b=24;sum=add(a,b);printf(”sum= %dn“,sum); /* This function calcul
4、ates the sum of x and y */ int add(int x,int y) int z;z=x+y;return(z); ,运行结果: sum=34,数据类型,数据类型总是按照它在计算机内所占据的空间大小定义和区分的。 从最基本的概念上说,计算机可以支持的数据类型为:整数(二进制) 任何其他的数据类型,都是由整数表示和运算获得的。,C中的基本数据类型,1字节: ( unsigned ) char ( 0-255 )/( -128 127 ) 2字节: ( unsinged ) short ( 0-65535)/( -32768 - 32767) 4字节: ( unsinge
5、d ) long ( 0 4292967295 ) / ( -2147483648 - 2147483647),C中的基本数据类型,integer: int int所占据的字节数不定,与操作系统有关: 16位的操作系统,sizeof( int ) = 2; 32位的操作系统,sizeof( int ) = 4;,C中的基本数据类型,浮点。总是采用小数+指数的方法来表示,无法精确表示一个浮点数。 4字节,float 1位符号,8位指数,23位尾数 8字节,double 1位符号,11位指数,52位尾数,C中的扩展数据类型_数组,由若干个相同类型的数据组成的数据集。把若干个逻辑上有关联的同类型的变
6、量组织在一起(数组变量) int a5; a = 0x2000,a4,a3,a0,a1,a2,0x2000,0x2002,C中的扩展数据类型_数组,特征 由多个数据元素构成,且数据有序; 数组的每个元素都属于同一个数据类型。 作为变量使用,数据元素在内存中是按顺序连续存放的。 具有整体性,每个数组要用一个统一的标识符标识(数组名)。 数组名就是数组在内存中占用的地址;,字符串,字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符; 字符串只能用字符数组来处理,没有字符串变量。字符串在内存中存放时,系统将自动在字符串的末尾添加一个字符串的结束标记0 (
7、空字符),碰到第一个0就认为字符串处理结束。,字符串,char szName21; strcpy( szName, “NJTU”); strlen( szName ) = 4; 占据了5个存贮空间 szName0 = N szName1 = J szName2 = T szName3 = U szName4 = 0,N,J,T,U,0,x,szName,C中的扩展数据类型_结构体,逻辑上关联,但数据类型不同的变量,组织在一起。struct 结构类型名 类型标识符 成员名;:类型标识符 成员名;,C中的扩展数据类型_结构体,struct student char acStdID10;char s
8、zName21;char sex;unsigned char ucAge;unsigned short ausScoree20;char szAddr31;,acStdID10,ausScore20,ucAge,sex,szName21,szAddr31,C中的扩展数据类型_结构体,struct Student stStud, *pstStud;stStud.ucAge = 21;stStud.ausScr2 = 84;printf( “%s”, pstStud-szName );,C中的扩展数据类型_结构体,定义的是一种新的数据类型,而不是一个新的变量。 一个结构内的变量名不能相同。但不同的
9、结构内的变量可以相同。 结构内可以套结构。 成员名可以与程序中的变量名相同,二者代表不同的对象 对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量; 作为输入输出,不可以整体使用,作为函数调用中,可以整体使用,C中的扩展数据类型_枚举,enum Sex male, female ; enum Sex a; a = male; OK a = 1; OK a = 5; X,实际上,枚举被定义为整数类型,int 且若没有特别说明,从定义的第一个位置开始,依次用0,1, 表示.,C中的扩展数据类型_共用体,union A Char c; Int i; float f; ; union A a
10、; a.c = a; a.i = ? a.f = ?,a,数据类型定义typedef,typedef int A; 在正常的变量说明语句前加typedef,表示定义了一种新的数据类型,该数据类型就是变量名。 A a int a; typedef struct Student Student; Student stWang;,数据类型定义typedef,typedef int A10; A b; A a5;,a09,a01,a00,a49,a40,a19,a10,C中的数据类型_指针,指针就是地址,一个变量的地址称为该变量的指针。 如果有一个变量专门用来存放另一个变量的地址(即指针),称为指针变
11、量。 int a, *p; p = *p = 10,p=0x2000,a = 10,0x2000,0x1000,C中的数据类型_指针和数组,int a10, *p; a就是数组的第一个元素的地址; p = a; / p = p和a就完全相同,因此p也可以看作是一个数组。a2 *( p+2 ) *(a + 2),C中的数据类型,基本类型整型:int (unsigned)( short, long) 字符:char 实型:单精度(float)/双精度(double) 枚举:enum 构造类型 数组 结构体struct 共用体union 指针 空类型,变量及其作用域,局部变量 定义在一个复合语句中;
12、“” 作用范围在该复合语句中; 全局变量 定义在函数之外; 作用范围从定义位置开始的之后的函数,应用程序的组织方法,整个应用程序由多个文件构成; 每个文件由多个函数构成; 有且仅有一个主函数,它是整个应用程序的入口: int main( int agrc, char *argv ) 函数可以多级调用; 函数定义: 函数类型 函数名(参数列表);,应用程序的组织方法,应用程序-|-头文件(.h)-|-头文件1.h| |-头文件2.h| | | |-头文件m.h|-源文件(.c)-|-源文件1.c| -源文件2.c| |-源文件n.c,基本控制语句,A,B,P,A,B,A,P,顺序,选择,循环,基
13、本控制语句,赋值语句,函数调用语句,复合语句,实现顺序结构的语句,实现选择结构的语句,实现循环结构的语句,if语句,switch语句,while语句,do-while语句,for语句,基本控制语句_选择,if( P ) A; else B; ,P,A,B,基本控制语句_选择,if( P ) A; ,A,P,基本控制语句_选择,if( P1 ) A; else if ( P2 ) B; else C ,B,A,P1,P2,C,基本控制语句_选择,Switch (exp ) case 值1:语句1;break;case 值2:语句1;break;default:语句n+1; ,exp,语句n+1,
14、语句2,语句1,基本控制语句_循环,while( P ) A; ,A,P,基本控制语句_循环,do A; while( P );,A,P,基本控制语句_循环,for( B; P; C) A; ,B,P,C,A,函数分类 从用户角度 标准函数(库函数):由系统提供 用户自定义函数 从函数形式 无参函数 有参函数,使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件,函数,函数的定义 一般格式,函数的返回值 返回语句 形式: return(表达式);或 return 表达式;或 return; 功能:使程序控制从被调用函数
15、返回到调用函数中,同时把返值带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数,函数的调用 调用形式函数名(实参表); 说明: 实参与形参个数相等,类型一致,按顺序一一对应 实参表求值顺序,因系统而定(Turbo C 自右向左),函数参数及其传递方式 形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者,main() int a,b,c;scanf(“%d,%d“, ,
16、说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,函数参数及其传递方式 形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,例 计算x的立方,#include float cube(float x) return(x*x*x); main() float a, product;printf(“Please input value of a:“);scanf(“%f“, ,x,1.2,1.2
17、,1.728,参数传递方式值传递方式 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递,例 交换两个数,/*ch7_2.c*/ #include main() int x=7,y=11;printf(“x=%d,ty=%dn“,x,y);printf(“swapped:n“);swap(x,y);printf(“x=%d,ty=%dn“,x,y); swap(int a,int b) int temp;temp=a; a=b; b=temp; ,地址传递方式:函数调用时,将数据的存储地
18、址作为参数传递给形参 特点: 形参与实参占用同样的存储单元 “双向”传递 实参和形参必须是地址常量或变量,/*ch9_3.c*/ swap(p1,p2) int *p1,*p2; int p;p=*p1;*p1=*p2;*p2=p; main() int a,b;scanf(“%d,%d“, ,例 交换两个数,数组作为函数参数 数组元素作函数实参值传递,数组名作函数参数 地址传递 在主调函数与被调函数分别定义数组,且类型应一致 形参数组大小(多维数组第一维)可不指定 形参数组名是地址变量,例 求学生的平均成绩,#include float average(int stu10, int n);v
19、oid main() int score10, i;float av;printf(“Input 10 scores:n“);for( i=0; i10; i+ )scanf(“%d“, ,float average(int stu10, int n) int i;float av,total=0;for( i=0; in; i+ )total += stui;av = total/n;return av;,实参用数组名,形参用数组定义, int stu ,例:一元二次方程的根,写函数,求一元二次方程的根。 问题: 系数不同,函数的根也不相同,如何把函数执行的情况和函数的根同时表达出来?,例:
20、一元二次方程的根,函数定义: int Root( float a, float b, float c,float *x1, float *x2 ); ax2 + bx + c = 0; 返回int型变量: -1, a = 0, 非法输入; 0,两个相等的实根;x1 = x2 1,两个不等的实根;x1, x2 2,一对复根; x1 i x2,函数返回值,数据结构中要用的宏,#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2,指针,C程序设计中使用
21、指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值,指针变量 指针变量与其所指向的变量之间的关系,指针变量的定义 一般形式: 存储类型 数据类型 *指针名;,合法标识符,指针变量本身的存储类型,指针的目标变量的数据类型,表示定义指针变量 不是*运算符,例 int *p1,*p2;float *q ;static char *name;,注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋
22、值,指针变量的初始化 一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量, 不是赋给目标变量,例 int i;int *p=,变量必须已说明过 类型应一致,例 int i;int *p=,用已初始化指针变量作初值,例 main( ) int i=10;int *p;*p=i;printf(“%d”,*p);,危险!,例 main( ) int i=10,k;int *p;p=,指针变量必须先赋值,再使用,零指针与空类型指针 零指针:(空指针) 定义:指针变量值为零 表示: int * p=0;,p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义,#defin
23、e NULL 0 int *p=NULL:,p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较,例 int *p;while(p!=NULL) .,void *类型指针 表示: void *p; 使用时要进行强制类型转换,例 char *p1;void *p2;p1=(char *)p2;p2=(void *)p1;,表示不指定p是指向哪一种 类型数据的指针变量,例 指针的概念,main() int a;int *pa= ,运行结果: a:10 *pa:10 &a:f86(hex) pa:f86(hex) &pa:f88(hex),例 输入两个数,并使其从大到
24、小输出,main() int *p1,*p2,*p,a,b;scanf(“%d,%d“, ,运行结果:a=5,b=9max=9,min=5,5,2006,9,2008,2006,2008,2006,指针变量作为函数参数地址传递 特点:共享内存,“双向”传递,swap(int x,int y) int temp;temp=x;x=y;y=temp; main() int a,b;scanf(“%d,%d“, ,例 将数从大到小输出,5,9,5,5,9,COPY,值传递,运行结果:5, 9,swap(int *p1, int *p2) int p;p=*p1;*p1=*p2;*p2=p; main
25、() int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“, ,5,9,2000,2002,5,9,COPY,5,例 将数从大到小输出,运行结果:9,5,地址传递,swap(int *p1, int *p2) int *p;*p=*p1;*p1=*p2;*p2=*p; main() int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“, ,运行结果:9,9,编译警告! 结果不对!,int x; int *p=,例 将数从大到小输出,5,9,2000,2002,9,9,COPY,假设2000,指针变量在使用前 必
26、须赋值!,/*ch9_32.c*/ swap(int x,int y) int t;t=x; x=y; y=t; main() int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“, ,运行结果:5,9,例 将数从大到小输出,值传递,5,9,2000,2002,COPY,5,5,9,运行结果:5,9,例 将数从大到小输出,swap(int *p1, int *p2) int *p;p=p1;p1=p2;p2=p; main() int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“, ,5,9,2000,2002,COPY,2000,地址传递,2000,2002,