第八章c语言解析
合集下载
C语言课件:第八章 函数
所有函数都是平行的,相互独立不能嵌套,但可以相 互调用。 C 函数分标准函数(库函数)和自定义函数。 C 函数本身分有参函数和无参函数。
2
8.2 函数定义的一般形式
1.无参函数的定义形式 类型标识符 函数名( ) { 说明部分 ; 语句; } 2.有参函数的定义形式 类型标识符 函数名(形式参数表) 形式参数说明; { 说明部分 ; 语句; }
例: 用函数调用实现字符串的复制。 void copy_string(from , to) char from[ ], to[ ]; 声明形参from, to为字符数组 { int i = 0 ; while ( from[i] != „\0‟ ) { to[i] = from[i]; i++ ; } to[i] = „\0‟ ; 运行结果: string_a = I am a teacher. } 实参以数组名将数组a, b的起 string_b = I am a teacher. 始地址传递给形参 from 和 to main( ) {char a[ ] = “I am a teacher.” ; char b[ ] = “you are a student.” ; copy_string(a, b); printf( “string_a = %s\nstring_b = %s\n”,a,b); }
7
若函数中没有return语句,则该函数被调用后也会带 回不确定的值。如: { int a, b, c ; a = printstar( ); 均为处理字符串的函数 且均没有 return 语句。 b = print_message( ); c = printstar( ); printf(“%d,%d,%d\n”,a,b,c); } 输出的a, b, c的值将是各个被处理的字符串的长度。
C语言程序设计第8章 函数简明教程PPT课件
8.1 函数的概念与定义
程序运行情况如下: Enter a and b:10 20
The max is 20
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
(2)函数名类似于其它的标识符,其命名规则也与其它 标识符相同。 (3)形式参数列表(formal parameter list)用来描述 函数所需要的参数个数及其类型,它的基本形式为: (类型名1 参数名1, 类型名2 参数名2, …, 类型名n 参 数名n) 如上例中的(int x, int y)。函数的参数是函数与它的主 调函数之间发生数据交换的一个通道,即被调函数通过参 数的方式建立起它与主调函数之间所需的信息交换的一种 途径。如果函数没有形式参数,则在定义时括号内可以为 空,但最好写上void。
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
函数Max()的返回值由函数体中的return语句获得。 函数也可以没有返回值类型,此时,我们最好把没有返 回值类型的函数定义成void类型,这时,函数体中的 return语句可以不写,也可以只写上return语句: return; 。
C程序的这种组成结构,反映了一种结构化程序设计的思想。 一个程序可以分解为多个模块,每个模块可以实现一定的功能。 如果一个模块过于复杂,就可以进行再分解,直到分解出来的 模块足够简单,可以方便实现为止。这种结构化的程序设计思 想,体现出一种“分而治之”(devided and conquer)的哲 学理念,也是我们日常处理事情的一种典型方法。
程序设计者,只在库函数不能满足需要的时候,才需要自己 来创建所需要的函数(自定义函数)。读者学完本章之后, 就应该能自定义一些自己所需要的函数并能正确使用它们, 当然也要学会正确使用系统提供的大量的标准库函数。有 关库函数的详细情况和使用方法可以参考附录和其它相关 资料。
C程序设计教程第8章
图8-4 例题8.4的执行结果
8.2.3 按位“取反”运算符(~)
按位取反运算符“~”为单目(元)运算符。作用是 将一个二进制数按位取反,即将0变1,1变0。
例如,将char类型的数据22,进行取反,结果为233。
~ 00010110 (22) 11101001 (233)
【例8.5】把输入的数据进行取反操作。
x= 00010110 x<<3 10110000
(22) (176)
8.2.5 “左移”运算符(<<)
【例8.7】把输入的数据进行左移操作。 程序的第一次运行过程及结果如下:
图8-7 例题8.7的第一次执行结果
8.2.5 “左移”运算符(<<)
第二次运行过程及结果如下:
图8-8 例题8.7的第二次执行结果
unsigned int
unsigned int
char d;
float e;
}bitdata;
b:2; c:3;
8.3.1 位段的定义
上述结构体中,第一个成员是整型变量,占2个字节; 后面两个位段b和c占1个字节;再后面是一个字符型和一 个浮点型变量,各占1个字节和4个字节。 在位段的使用过程中需要注意的是,定义位段只能用 int和unsigned int,不能用其它类型。
但是不能取一个位段的地址,例如下面的用法是不合 法的:
&bitdata.c 因为地址是以字节为单位的,无法指向位。 位段在控制中非常有用,可以使用户方便、灵活的对
字节中的位进行操作。并且位段的使用使几个数据放 在同一个字节中,节省了存储空间。
8.4 位运算应用举例
【例8.10】设计一个程序,取出一个整数的第3~5位。 第一种实现方法:
8.2.3 按位“取反”运算符(~)
按位取反运算符“~”为单目(元)运算符。作用是 将一个二进制数按位取反,即将0变1,1变0。
例如,将char类型的数据22,进行取反,结果为233。
~ 00010110 (22) 11101001 (233)
【例8.5】把输入的数据进行取反操作。
x= 00010110 x<<3 10110000
(22) (176)
8.2.5 “左移”运算符(<<)
【例8.7】把输入的数据进行左移操作。 程序的第一次运行过程及结果如下:
图8-7 例题8.7的第一次执行结果
8.2.5 “左移”运算符(<<)
第二次运行过程及结果如下:
图8-8 例题8.7的第二次执行结果
unsigned int
unsigned int
char d;
float e;
}bitdata;
b:2; c:3;
8.3.1 位段的定义
上述结构体中,第一个成员是整型变量,占2个字节; 后面两个位段b和c占1个字节;再后面是一个字符型和一 个浮点型变量,各占1个字节和4个字节。 在位段的使用过程中需要注意的是,定义位段只能用 int和unsigned int,不能用其它类型。
但是不能取一个位段的地址,例如下面的用法是不合 法的:
&bitdata.c 因为地址是以字节为单位的,无法指向位。 位段在控制中非常有用,可以使用户方便、灵活的对
字节中的位进行操作。并且位段的使用使几个数据放 在同一个字节中,节省了存储空间。
8.4 位运算应用举例
【例8.10】设计一个程序,取出一个整数的第3~5位。 第一种实现方法:
C语言第8章的课件
p1
i1
p1
&i1
10
&i1
p2
i2
p2
&i2
20
&i2
运行
i1 20 i2 10
21
注意
*p1表达式表示指针变量p1指向的对象。在访问指针变量 指向对象前,指针变量必需已指向明确。
如:float *pa,a; *pa=3.14; /*错误,因为pa尚未指向任何变量*/ pa=&a; *pa=3.14;/*给pa指向变量赋值*/
运行
18
几个指针应用的例子
main()
{ int *p1,*p2,i1,i2;
scanf("%d,%d",&i1,&i2);
p1=&i1;
p2=&i2;
printf("%d,%d\n",*p1,*p2);
p2=p1;
printf("%d,%d\n",*p1,*p2);
}
p1
i1
p1
&i1
10
&i1
指针实际上是对存储单元地址的一种形 象化描述。指针即地址。
4
程序中的变量表示命名了的存储区域。不 同类型变量其存储区域字节单元数不一样。
变量名表示该存储区域的别名。变量值是 该存储区域中存储的数据。变量地址是该存储 区域的首地址。
变量地址可通过对变量名进行取地址运算 得到。如:&a得到变量a的地址。
C语言中指针变量也有类型。指针变量 的类型是指指针变量指向对象的类型,即指 针变量存储的指针所表示的对象的类型。
指针变量定义格式:
类型标识符 * 指针变量名; 12
《C程序设计》第8章 善于利用指针
下面都是合法的定义和初始化:
float *pointer_3; char *pointer_4; int a,b; int *pointer_1=&a,*pointer_2=&b;
pointer_3=2000; 错误 pointer_1=&a; *pointer_1=&a; 正确 错误 错误 pointer_3=&a;
p1
p
&a &b
a 5 9 b
#include <stdio.h> int main() &b &a { int *p1,*p2,*p,a,b; printf(“integer numbers:"); p2 scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(a<b) { p=p1; p1=p2; p2=p; } printf(“a=%d,b=%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2); return 0; }
#include <stdio.h> int main() 定义两个指针变量 { int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; 直接输出变量a和b的值 使pointer_1指向a 使pointer_2指向b pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”,*pointer_1,*pointer_2); return 0; 间接输出变量a和b的值 }
p1
float *pointer_3; char *pointer_4; int a,b; int *pointer_1=&a,*pointer_2=&b;
pointer_3=2000; 错误 pointer_1=&a; *pointer_1=&a; 正确 错误 错误 pointer_3=&a;
p1
p
&a &b
a 5 9 b
#include <stdio.h> int main() &b &a { int *p1,*p2,*p,a,b; printf(“integer numbers:"); p2 scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(a<b) { p=p1; p1=p2; p2=p; } printf(“a=%d,b=%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2); return 0; }
#include <stdio.h> int main() 定义两个指针变量 { int a=100,b=10; int *pointer_1, *pointer_2; pointer_1=&a; 直接输出变量a和b的值 使pointer_1指向a 使pointer_2指向b pointer_2=&b; printf(“a=%d,b=%d\n”,a,b); printf(“*pointer_1=%d,*pointer_2= %d\n”,*pointer_1,*pointer_2); return 0; 间接输出变量a和b的值 }
p1
C语言 第八章.用户自定义数据类型
printf("%c,%c\n",u2.c[0],u2.c[1]); }
u2占2个字节
例:以下程序输出结果是?
union example { struct { int x,y; e.b e.a e.in.x }in; e.in int a; e.in.y int b; }e; void main() { e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d",e.in.x,e.in.y); }
内存低地址 01100001 00001010
字符变量c占1个字节
整型变量i占2个字节 单精度实型变量f占4个字节
u1.i=10;
例:以下程序输出结果是?
union u_type { char c[2]; u1
p
内存高地址 内存低地址 ‘a’ ‘b’ c1 c2 c[1] c[0] u1占2个字节 内存高地址 内存低地址 ‘A’ ‘B’ ‘a’ ‘b’ c1 c2 c[1] c[0]
{"0208103322","lisi",19,'M'},{"0208103323","lili",20,'F'}, {"0208103324","xulin",21,'M'}};
学号(number) 姓名(name) 年龄(age) 性别(sex)
stu[0] stu[1] stu[2] stu[3]
char name[8];
int age; char sex;
定义结构体类 sizeof(stu) 型的同时创建 =? 结构体数组
u2占2个字节
例:以下程序输出结果是?
union example { struct { int x,y; e.b e.a e.in.x }in; e.in int a; e.in.y int b; }e; void main() { e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d",e.in.x,e.in.y); }
内存低地址 01100001 00001010
字符变量c占1个字节
整型变量i占2个字节 单精度实型变量f占4个字节
u1.i=10;
例:以下程序输出结果是?
union u_type { char c[2]; u1
p
内存高地址 内存低地址 ‘a’ ‘b’ c1 c2 c[1] c[0] u1占2个字节 内存高地址 内存低地址 ‘A’ ‘B’ ‘a’ ‘b’ c1 c2 c[1] c[0]
{"0208103322","lisi",19,'M'},{"0208103323","lili",20,'F'}, {"0208103324","xulin",21,'M'}};
学号(number) 姓名(name) 年龄(age) 性别(sex)
stu[0] stu[1] stu[2] stu[3]
char name[8];
int age; char sex;
定义结构体类 sizeof(stu) 型的同时创建 =? 结构体数组
《C语言第八章》PPT课件
精选PPT
7
8.2 指针变量
8.2.3 指针变量的引用
– 变量的数据访问形式
普通变量:变量名—变量存储的数据 指针变量:*变量名—指向存储单元存储的数据
– 定义时:*p表示为指针;使用时*p表示指针指向的数据
– 变量的地址访问形式
普通变量:&变量名—存储数据的首地址 指针变量:变量名—指向的存储单元
精选PPT
9
8.2 指针变量
8.2.3 指针变量的引用
– 指针和变量的几个换算关系:
对于变量,有:名称=数据、&名称=地址 对于指针,有:名称=地址、*名称=指向的数据ຫໍສະໝຸດ 若有定义:int a, *p 则:
– &a、p 是同一类型数据,为地址 –a、*p 是同一类型数据,为整型数据
一般情况下,使用p=&a的形式,让指针与变量关联, 使用*p的形式,访问指向的数据
– 指针变量:
存放指针的变量,称之为指针变量
– 指针变量里面存放的是指针,也就是地址
– 为什么使用指针
更方便、更主动的操作数据、构建数据结构
精选PPT
2
8.1 什么是指针
学习指针的几点建议
– 弄明白存放在内存中的数据是如何访问的
这是学习指针的基础
– 清晰的记住指针和变量的几个关系:
指针的内容,指针指向的内容等等
– 一般情况下,不要将地址值直接赋给指针变量
精选PPT
8
8.2 指针变量
8.2.3 指针变量的引用
– 一般情况下,不能将地址值直接赋给变量
若有 int a,*p; 则:&a=1000
p=2000是错误的
– 指针不会单独使用,常和其他普通变量关联在 一起使用
C语言课件第八章
例 有参函数 int max(int x,int y) { int z;
z=x>y?x:y; return(z); }
传统风格:
函数类型 函数名(形参表) 形参类型说明
{ 说明部分 语句部分
}
例 有参函数(传统风格) int max(x,y) int x,y; { int z;
z=x>y?x:y; return(z); }
{ int temp; temp=x; x=y; y=temp;
或
return;
}
功能:使程序控制从被调用函数返回到调用函数中, 同时把返回值带给调用函数
说明:
函数中可有多个return语句
若无return语句,遇}时,自动返回调用函数,返回的是一
个不确定的值
若函数类型与return语句中表达式值的类型不一致,按前
float fac(int k) { float t=1; int i;
件中所调用的函数进行了声明,则在各函数中不必再说明。 ▪ 若函数返值是char或int型,系统自动按int型处理
void main() { float add(float a,float b);
float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f",c); } float add(float x, float y) { float z; z=x+y; return(z); }
例 空函数 dummy( ) {}
函数体为空
▪ 8.2.2 有参函数定义 的一般格式
函数返回值类 型
缺省int型 无返回值void
高树芳C语言程序设计--第八章
30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数
C语言-第八章
说明: 1、一个源程序文件由一个或多个函数组成。但是只能够有一个 主函数(main()),可以有多个子函数。 2、C程序的执行总是从main函数开始,调用其他函数后返回 main函数,在main函数中结束整个程序的运行。 3、所有函数都是平行的,即在定义时是相互独立的,一个函数 并不从属于另一个函数,即函数不能够嵌套定义。函数间可以相互 调用,但不能调用main函数。
⑴ 格式
类型说明符 函数名() { 声明部分 语句 }
⑵ 说明: a 类型说明符指该函数执行完毕后返回来的值,如strcmp函数返 回的是一个整型数据,那strcmp函数在系统库中应该是int型。 b 函数名是我们所定义函数的名字,要符合标识符的命名规则。 c 声明部分和语句是该函数完成所须功能的语句,根据用户的 需求而设计。 d 无参函数一般是没有返值的,可以不写类型说明符。但是不 写时系统默认的是int型。所以为了明确指明不返值,应定义为void 型,即void表示空类型。 (exp8_4) e 在定义函数时,在 “函数名()”后是没有分号的。
运行结果: 0
8.2 函数定义的一般形式 一、函数的分类: 1、从用户角度看: 标准函数(库函数):scanf()、putchar()等; 用户自己定义的函数:printstar()等; 2、从函数的形式看: 无参函数:clrscr()、print_message()等; 有参函数:gets(数组名)、strcmp(字符串1,字符串2)等。 gets( ) strcmp( 1 2) 二、函数的定义: 1、无参函数的定义: 无参函数指在函数的括号内()没有任何的参数。
函数在主调之前定义(exp8_13) main() float max(float x,float y) { { float a,b,c; float z; float max(float x,float y); z=x>y? x:y; scanf("%f,%f",&a,&b); return z; c=max(a,b); } printf("the max is %f\n",c); main() } { float max(float x,float y) float a,b,c; { scanf("%f,%f",&a,&b); float z; c=max(a,b); z=x>y? x:y; printf("the max is %f\n",c); return z一、概述 在以前我们所接触的程序中,都是把所有的语句写在main函数 中,所有的事情都是在main函数中完成。但是当程序的功能增多时, 这种方法写出的程序很冗长而降低可读性和编写效率。因此,我们 可以把程序中独立的功能程序段单独做为子函数独立在main函数外 面,在main 函数中调用该子函数可以完成同样的功能。
C语言程序设计(第八章)
字符读写函数fgetc()和fputc()是以字符(字节)为单位
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()
C语言第8章 指针
数据类型 *函数名(形参表) { 函数体; }
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
《C语言程序设计(第五版)》-第8章编译预处理
示例代码如下: # define SIZE 1000 … printf("SIZE");
此程序段将显示SIZE,而不是1000。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
说明:
(5)可以引用前面已经定义的宏名来定义新的宏,示例代码如 下: #define I1 30 #define I2 60 #define J I1+I2 #define K J*2+J/2+I2
其含义是用指定的宏名(即标识符)来代表其后的字符串。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
示例代码如下: #define SIZE 1000 #define PI 3.1415926 #define FORMAT "%d,%d,%d\n"
用标识符SIZE来代替字符串1000, 用标识符PI来代替字符串3.1415926, 用标识符FORMAT来代替字符串"%d,%d,%d\n", 在编译预处理时,将程序中在该命令以后出现的所有的SIZE用1000
本章教学重点:宏定义的两种形式,文件 包含的使用方法。
本章教学难点:带参数的宏定义。
C语言程序设计
第8章 编译预处理
主要内容:
8.1 宏定义 8.2 “文件包含”处理 8.3 条件编译
C语言程序设计
第8章 编译预处理
第8章 编译预处理
编译预处理是指一些行首以#开头的特殊语句。 在对程序进行通常的编译之前,必须先对程序中这 些特殊的命令进行“预处理”,即根据预处理命令, 对程序作相应的处理。
第8章 编译预处理
本章概述 本章的学习目标 主要内容
此程序段将显示SIZE,而不是1000。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
说明:
(5)可以引用前面已经定义的宏名来定义新的宏,示例代码如 下: #define I1 30 #define I2 60 #define J I1+I2 #define K J*2+J/2+I2
其含义是用指定的宏名(即标识符)来代表其后的字符串。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
示例代码如下: #define SIZE 1000 #define PI 3.1415926 #define FORMAT "%d,%d,%d\n"
用标识符SIZE来代替字符串1000, 用标识符PI来代替字符串3.1415926, 用标识符FORMAT来代替字符串"%d,%d,%d\n", 在编译预处理时,将程序中在该命令以后出现的所有的SIZE用1000
本章教学重点:宏定义的两种形式,文件 包含的使用方法。
本章教学难点:带参数的宏定义。
C语言程序设计
第8章 编译预处理
主要内容:
8.1 宏定义 8.2 “文件包含”处理 8.3 条件编译
C语言程序设计
第8章 编译预处理
第8章 编译预处理
编译预处理是指一些行首以#开头的特殊语句。 在对程序进行通常的编译之前,必须先对程序中这 些特殊的命令进行“预处理”,即根据预处理命令, 对程序作相应的处理。
第8章 编译预处理
本章概述 本章的学习目标 主要内容
数据结构(C语言)第八章 排序
直接插入排序过程
0 21 1 25 2 49 3 4 25* 16 5 08 temp
i=1
0 21
21
1 25
25 25
2 49
49 49
3 4 25* 16
25* 16 25* 16
5 08
08 08
temp 25
i=2
21
49
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
希尔排序 (Shell Sort)
基本思想设待排序对象序列有 n 个对象, 首 先取一个整数 gap < n 作为间隔, 将全部对 象分为 gap 个子序列, 所有距离为 gap 的对 象放在同一个子序列中, 在每一个子序列中 分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划 分和排序工作。直到最后取 gap == 1, 将所 有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。
第八章 排序
概述
插入排序
交换排序 选择排序 归并排序 基数排序 各种内排方法比较
概 述
排序: 将一个数据元素的任意序列,重新
排列成一个按关键字有序的序列。
数据表(datalist): 它是待排序数据对象的
有限集合。
主关键字(key): 数据对象有多个属性域,
即多个数据成员组成, 其中有一个属性域可用 来区分对象, 作为排序依据,称为关键字。也 称为关键字。
直接插入排序 (Insert Sort)
基本思想 当插入第i (i 1) 个对象时, 前面的 R[0], R[1], …, R[i-1]已经排好序。这时, 用 R[i]的关键字与R[i-1], R[i-2], …的关键字顺 序进行比较, 找到插入位臵即将R[i]插入, 原 来位臵上的对象向后顺移。
c语言第八章 函数
教学进程
8.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
C语言程序设计_2 第8章 数组
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}} a[3][3]={{1 },{4 },{7
.2). 按行连续赋值 把数组元素顺序赋值。例如: 把数组元素顺序赋值。例如:
int a[5][3]={1,2,3,4,5,6,7,8,9} a[5][3]={1
通常写为如下矩阵形式,比较直观: 通常写为如下矩阵形式,比较直观:
二维数组存储是按行排列的, 二维数组存储是按行排列的, 即放完一行之后顺次放入第二 行。
8.2.2 二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为: 二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标1][下标 数组名[下标1][下标2] 下标2
其中下标应为整型常量或整型表达式。例如: 其中下标应为整型常量或整型表达式。例如:
8.2 二维数组
只有一个下标的数组称为一维数组, 只有一个下标的数组称为一维数组,其数组 元素称为单下标变量。 元素称为单下标变量。有多个下标的数组称为 多维数组, 其数组元素称为多下标变量。 多维数组, 其数组元素称为多下标变量。 最 常用的是二维数组, 常用的是二维数组,更高维数的数组与二维数 组相似。 组相似。
8.1.2 数组元素的表示方法
数组元素是数组的基本单元,它是一种变量,其标识方法为 数组元素是数组的基本单元, 它是一种变量, 数组名后跟一个下标。下标指定元素在数组中的顺序号。 数组名后跟一个下标。下标指定元素在数组中的顺序号。数组元 素的一般形式为: 素的一般形式为:
数组名[下标] 数组名[下标]
例如,单独使用一个下标变量: 例如,单独使用一个下标变量:
int a[10]; a[10] a[7]=6; a[7]=6
《c语言程序设计教学资料》第8章---数组
printf(“%d”, a[i]);
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
C语言,第8章 数组(字符数组)
第8章 数组
(字符数组)
内 容 提 要
• • • • • • • •
•
• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:
•
例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出
(字符数组)
内 容 提 要
• • • • • • • •
•
• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:
•
例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出
C语言 第八章 结构体
共用体
3)直接定义联合变量 union {
int i;
float f; }num; 说明:(1)共用体变量的所有成员占有同一段内存,所占内存空 间是其成员中字节数最大的成员占有的字节数。
(2)共用体变量中可以定义许多不同类型的成员,但同一时刻只
有一个成员的数据有效。
共用体
4.共用体变量初始化 初始化时,只能对第一个成员的数据类型初始化。 例:union data num={10}; 正确 union data num={10,25.4}; 错误
结构体变量
方法三:定义结构体类型的同时定义结构体变量,省略结构体类型名
struct DATE{ int year; int month; int day;}; struct {
long int number;
char name[8]; int age;
char *sex;
struct DATE birthday; }stu1,stu2;
数据类型
数据类型
成员名1;
成员名2;
//成员表
……
};
结构体类型
2.结构体类型的定义: 说明: (1) struct是关键字,标识一个结构体类型定义的开头 (2)“结构体类型名”是表示该结构体类型的名称的标识符,可
类比int、char
(3)“成员表”是构成结构体类型的成份,由一个或多个成员构
成,每个成员有自己的成员名。各成员数据类型可以不同,既可以
枚举类型
3.枚举变量定义
方式一:类型和变量分开定义 enum WEEKDAY{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义枚举类型 enum WEEKDAY w;//定义枚举变量w
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(p1=data;p1<data+8-1;p1++)
for(p2=p1+1;p2<data+8;p2++)
if(*p1<*p2){temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=data;i<8;i++,p1++)printf("%6d",*p1);
puts(c);
}
2、以下程序从键盘输入10个不相同的数到数组 a 中,再输入一个数到 x 中,在 a 中查找与 x 值相同的元素所在的位置,填空完善该程序。。
#include <stdio.h>
void main( )
{
int a[11],x,i;
printf("Input 10 integers:\n");
第八章 指 针
-习题答案
1
★选择题。
1、若函数 f 定义如下:
void f(char *d,char *s);
{while(*d++=*s++);}
函数 f 的功能是( )。
A. 串比较 B. 串复制 C. 求串长 D. 串反向
答
1、B 2、B 3、D
2
★写出下列程序的运行结果。
1、void main( )
{
int a,*p1,*p2;
a=10;
p1=&a;
p2=p1;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
*p1=11;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
}
2、若输入字符串 program 时,写出下列程序输出结果:
#include <stdio.h>
void main( )
{
char str[80];
void prochar(char *st,char ch);
if(max!=0)
{ t=*(p+0);
*(p+0)=*(p+max);
*(p+max)=t;
}
for(p=a;p<a+8;p++)printf("%d\t",*p);
getch();
}
9
输入 n 个整数排序并输出。要求将排序单独写成一个函数,n 个整数在主函数中输入,排序结果在主函数中输出,用指针实现。【仍有问题】
2、有定义 int arr[10]={0,1,2,3,4,5,6,7,8,9}, *p, i=2; 若执行语句:
p=arr;
pritnf("%d",*(p+i));
输出结果为( )。
A. 0 B. 2 C. 3 D. 1
答
main( )
{
int a[8],i,*p,max,min,t;
max=min=0;
p=a;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",&a[i]);
for(i=1;i<8; i++)
{
if(____②____)c[k]=*p;
else c[k]=*q;
p++; ______③______; k++;
} /*本题教材有误,少了此处的右大括号*/
if(*p!=0)strcat(c,p);
else strcat(c,q);
int fun(char *p);
main( )
{
int i=0;
char ch,str[80];
printf("Input string end by.: \n") ;
while((ch=getchar())!='.')
str[i++]=ch;
if(*p>='a'&&*p<='z'&&flag==1){*p-=32;flag=0;}
p++;
}
}
【解法二】
#include"stdio.h"
main( )
{
int flag=1;
char ch;
printf("Input string end by.: \n") ;
【提示】
答
#include"string.h"
main( )
{
char s[80],*pstr=s,chdel;
printf("Input source string:");
gets(pstr);
printf("Character you want delete:");
2、① i<11 ② &a[i] ③ i- -; ④ i>0
4
编写函数 fun,函数的功能是,从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如,程序执行时输入字符串为 turbo c and borland c++,从键盘输入字符 n,则输出后变为 turbo c ad borlad c++。如果输入的字符在字符串中不存在,则字符串照原样输出。
if(_____④_____)printf("%6d's position is:%3d\n",x,i);
else printf("%6d Not be found!\n",x); /*bee应为be,教材有误,小case*/
}
答
1、① *p!='\0'&&*q!='\0' ② *p>*q ③ q++
【提示】
答
#include"stdio.h"
#include"string.h"
main( )
{
int data[80],i,*p1,*p2,temp;
p1=data;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",p1++);
str[i++]='.'; str[i]='\0';
fun(str);
puts(str);
getch();
}
int fun(char *p)
{
int flag=1;
while(*p!='\0')
{
if(*p==' ')flag=1;
*str='\0';
}
答
1、
The Value is 10||10||10
The Value is 11||11||11
2、ss
3
★填空题
1、下面程序完成从键盘输入两个字符串 a 和 b ,再将 a 和 b 的对应位置字符中的较大者存放在数组 c 中,填空完善该程序。
getch();
}
7
从键盘输入一个字符串,编写一个函数,将此字符串中从第 m 个字符开始的 n 个字符复制成另一个字符串。
答
#include"string.h"
#include"stdio.h"
main( )
{
char str1[80],str2[80];
答
#include"stdio.h"
if (*c==' mp;&*c<='z'&&*c>='a')*c-=32;
return 0;
}
}
6
从键盘输入 8 个数,用选择法按由大到小的顺序排列并输出,要求用指针实现。
scanf("%s",str);
prochar(str,'r');
puts(str);
}
void prochar(char *str,char ch)
{
char *p;
for(p=str;*p!='\0';p++)
if(*p==ch){*str=*p;(*str)++;str++;}
#include <stdio.h>
#include <string.h>
void main( )
{
int k=0;
char a[80],b[80],c[80]={'\0'},*p,*q;
p=a; q=b;
gets(a); gets(b);
while(_____①_____)
if(s[i]!=ch)
for(p2=p1+1;p2<data+8;p2++)
if(*p1<*p2){temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=data;i<8;i++,p1++)printf("%6d",*p1);
puts(c);
}
2、以下程序从键盘输入10个不相同的数到数组 a 中,再输入一个数到 x 中,在 a 中查找与 x 值相同的元素所在的位置,填空完善该程序。。
#include <stdio.h>
void main( )
{
int a[11],x,i;
printf("Input 10 integers:\n");
第八章 指 针
-习题答案
1
★选择题。
1、若函数 f 定义如下:
void f(char *d,char *s);
{while(*d++=*s++);}
函数 f 的功能是( )。
A. 串比较 B. 串复制 C. 求串长 D. 串反向
答
1、B 2、B 3、D
2
★写出下列程序的运行结果。
1、void main( )
{
int a,*p1,*p2;
a=10;
p1=&a;
p2=p1;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
*p1=11;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
}
2、若输入字符串 program 时,写出下列程序输出结果:
#include <stdio.h>
void main( )
{
char str[80];
void prochar(char *st,char ch);
if(max!=0)
{ t=*(p+0);
*(p+0)=*(p+max);
*(p+max)=t;
}
for(p=a;p<a+8;p++)printf("%d\t",*p);
getch();
}
9
输入 n 个整数排序并输出。要求将排序单独写成一个函数,n 个整数在主函数中输入,排序结果在主函数中输出,用指针实现。【仍有问题】
2、有定义 int arr[10]={0,1,2,3,4,5,6,7,8,9}, *p, i=2; 若执行语句:
p=arr;
pritnf("%d",*(p+i));
输出结果为( )。
A. 0 B. 2 C. 3 D. 1
答
main( )
{
int a[8],i,*p,max,min,t;
max=min=0;
p=a;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",&a[i]);
for(i=1;i<8; i++)
{
if(____②____)c[k]=*p;
else c[k]=*q;
p++; ______③______; k++;
} /*本题教材有误,少了此处的右大括号*/
if(*p!=0)strcat(c,p);
else strcat(c,q);
int fun(char *p);
main( )
{
int i=0;
char ch,str[80];
printf("Input string end by.: \n") ;
while((ch=getchar())!='.')
str[i++]=ch;
if(*p>='a'&&*p<='z'&&flag==1){*p-=32;flag=0;}
p++;
}
}
【解法二】
#include"stdio.h"
main( )
{
int flag=1;
char ch;
printf("Input string end by.: \n") ;
【提示】
答
#include"string.h"
main( )
{
char s[80],*pstr=s,chdel;
printf("Input source string:");
gets(pstr);
printf("Character you want delete:");
2、① i<11 ② &a[i] ③ i- -; ④ i>0
4
编写函数 fun,函数的功能是,从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如,程序执行时输入字符串为 turbo c and borland c++,从键盘输入字符 n,则输出后变为 turbo c ad borlad c++。如果输入的字符在字符串中不存在,则字符串照原样输出。
if(_____④_____)printf("%6d's position is:%3d\n",x,i);
else printf("%6d Not be found!\n",x); /*bee应为be,教材有误,小case*/
}
答
1、① *p!='\0'&&*q!='\0' ② *p>*q ③ q++
【提示】
答
#include"stdio.h"
#include"string.h"
main( )
{
int data[80],i,*p1,*p2,temp;
p1=data;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",p1++);
str[i++]='.'; str[i]='\0';
fun(str);
puts(str);
getch();
}
int fun(char *p)
{
int flag=1;
while(*p!='\0')
{
if(*p==' ')flag=1;
*str='\0';
}
答
1、
The Value is 10||10||10
The Value is 11||11||11
2、ss
3
★填空题
1、下面程序完成从键盘输入两个字符串 a 和 b ,再将 a 和 b 的对应位置字符中的较大者存放在数组 c 中,填空完善该程序。
getch();
}
7
从键盘输入一个字符串,编写一个函数,将此字符串中从第 m 个字符开始的 n 个字符复制成另一个字符串。
答
#include"string.h"
#include"stdio.h"
main( )
{
char str1[80],str2[80];
答
#include"stdio.h"
if (*c==' mp;&*c<='z'&&*c>='a')*c-=32;
return 0;
}
}
6
从键盘输入 8 个数,用选择法按由大到小的顺序排列并输出,要求用指针实现。
scanf("%s",str);
prochar(str,'r');
puts(str);
}
void prochar(char *str,char ch)
{
char *p;
for(p=str;*p!='\0';p++)
if(*p==ch){*str=*p;(*str)++;str++;}
#include <stdio.h>
#include <string.h>
void main( )
{
int k=0;
char a[80],b[80],c[80]={'\0'},*p,*q;
p=a; q=b;
gets(a); gets(b);
while(_____①_____)
if(s[i]!=ch)