C语言程序设计-第八章ppt课件
C语言程序设计 第8章PPT课件
float xpoint(x1,x2) float x1,2)-x2*f(x1))
}
/(f(x2)-f(x1));
else
return (y);
x2=x; }while (fabs(y)>=0.0001);
}
return (x);
}
/*1. 从以上函数可知,所有函数均是独立的 */
3、在所有函数定义之前,文件的开头,已经作
了函数声明。
§8.5 函数的嵌套调用
函数的嵌套调用:在一个函数的函数体内调
用另一个函数。
x( )
printf( )
y( ) scanf( )
getchar( ) max( )
在函数的嵌套调用中,函数的执行采取后调用先返回的原则。 即最内层的函数调用最先返回函数值,由内到外依次返回。
x2
2. 连接f(x1)和f(x2),交x轴于
x点,则
x=[x1*f(x2)-x2*f(x1)]/[f(x2)-f(x1)]
f(x1)
f(x)
3. 求f(x)
4. 若f(x)与f(x1)同号,则(x,x2)有根,此时将x作为x1
若f(x)与f(x2)同号,则(x,x1)有根,此时将x作为x2
5. 重复2~4的步骤,直至f(x)<某个值,视精度要求而定
在main的开头声明函数原型。
printf("sum is %f",c);
}
float add(float x, float y) /*定义add函数 */
{ float z;
z = x + y;
return z; }
不需要函数声明的情况 1、返回值为整型的函数。 2、被调用函数的定义出现在主调用函数之前。
11803_谭浩强《C程序设计》课件第8章PPT课件
如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。
谭浩强《C程序设计》课件第8章-讲义
8.1.2 面向对象程序设计的特点
传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的,一 个函数可以使用任何一组数据,而一组数据又能被 多个函数所使用(见图8.3)。
图8.3
面向对象程序设计采取的是另外一种思路。它面对 的是一个个对象。实际上,每一组数据都是有特定 的用途的,是某种操作的对象。也就是说,一组操 作调用一组数据。
程序设计者的任务包括两个方面: 一是设计所需的
各种类和对象,即决定把哪些数据和操作封装在一 起;二是考虑怎样向有关对象发送消息,以完成所 需的任务。这时他如同一个总调度,不断地向各个 对象发出命令,让这些对象活动起来(或者说激活这 些对象),完成自己职责范围内的工作。各个对象的 操作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法是十分有效 的,它能大大降低程序设计人员的工作难度,减少 出错机会。
精品
谭浩强《C程序设计》课 第8章
第8章 类和对象
8.1 面向对象程序设计方法概述 8.2 类的声明和对象的定义 8.3 类的成员函数 8.4 对象成员的引用 8.5 类的封装性和信息隐蔽 8.6 类和对象的简单应用举例
8.1 面向对象程序设计方法概述
到目前为止,我们介绍的是C++在面向过程的程序设 计中的应用。对于规模比较小的程序,编程者可以 直接编写出一个面向过程的程序,详细地描述每一 瞬时的数据结构及对其的操作过程。但是当程序规 模较大时,就显得力不从心了。C++就是为了解决编 写大程序过程中的困难而产生的。
高树芳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程序设计第8章
指针是C语言中一种特殊的数据类型,用于存储内存地址。
通过指针,可以间接访问和操作内存中的数据。
指针提供了一种灵活且高效的数据访问方式,是C语言的重要特性之一。
01指针变量用于存储内存地址,其类型指明了所指向数据的类型。
02定义指针变量时需指定类型,如int *p表示p是一个指向整型数据的指针。
03指针变量可以进行赋值、比较、算术运算等操作。
数组名是一个常量指针,指向数组的首个元素。
指针与数组在内存中的表示方式相似,因此可以相互转换。
通过指针可以遍历数组,访问数组中的每个元素。
使用指针访问数组可以提高程序的灵活性和效率。
指针与数组03可以对指针进行加减整数操作,以改变指针所指向的内存地址。
例如,`ptr` 或`ptr--` 分别使指针向后或向前移动一个元素的位置。
指针与整数的加减运算通过使用间接引用运算符`*`,可以访问指针所指向的值。
例如,`*ptr` 表示获取`ptr` 所指向的值。
指针的间接引用可以对两个指针进行相减操作,得到它们之间相差的元素个数。
例如,`ptr2 -ptr1` 返回两个指针之间相差的元素个数。
指针的算术比较指针的比较可以使用关系运算符`==`、`!=`、`<`、`>`、`<=`、`>=`对指针进行比较,判断它们是否相等或相对大小。
空指针的判断可以使用`NULL`或`0`来表示空指针,通过比较可以判断一个指针是否为空。
指针的赋值可以使用赋值运算符`=` 将一个指针的值赋给另一个指针,使它们指向相同的内存地址。
例如,`ptr2 = ptr1;`。
指针的初始化在定义指针变量时,可以对其进行初始化,使其指向一个特定的内存地址或空值。
例如,`int *ptr = NULL;` 或`int *ptr = &var;`。
指针的复制可以使用赋值运算符将一个指针的值复制给另一个指针,使它们具有相同的值。
例如,`ptr2 = ptr1;` 之后,`ptr2` 和`ptr1` 将指向相同的内存地址。
C语言程序设计第8章 数组精选文档PPT课件
8/49
8.1一维数组的定义和初始化
【例8.2】编程实现显示用户输入的月份(不包括 闰年的月份)拥有的天数
2020/11/18
9/49
8.1一维数组的定义和初始化
下标越界是大忌! –编译程序不检查是否越界 –下标越界,将访问数组以外的空间 –那里的数据是未知的,不受我们掌控,可能带
2需020/知11/1道8 数组每行列数才能从起始地址开始正确读出数组元1素5/49
二维数组实例
【例8.4】从键盘输入某年某月(包括闰年),编程输出该年 的该月拥有的天数
2020/11/18
16/49
8.3向函数传递一维数组
传递整个数组给另一个函数,可 将数组的首地址作为参数传过去 – 用数组名作函数参数 – 只复制一个地址自然比复制全部数
变量c和a的值因数组越界而被悄悄破坏了
2020/11/18
11/49
8.2二维数组的定义和初始化
一维数组
– 用一个下标确定各元素在数组中的顺序 – 可用排列成一行的元素组来表示
如 int a[5];
二维数组 –用两个下标确定各元素在数组中的顺序 –可用排列成i行,j列的元素组来表示
如 int b[2][3];
short
2020/11/18
14/49
二维数组的存储结构
存放顺序:按行存放
先顺序存放第0行元素,再存放第1行元素
short int a[2][3];
a[0][0] a[0][1]
a[0][0] a[0][1] a[0][2] a[0]
a[1] a[1][0] a[1][1] a[1][2]
C语言程序设计(第八章)
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
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章PPT课件
textBox1.Text = "这是我的第一个ActiveX控件!"; }
——在编写代码的过程中,也可以像调试窗体应用程序那样调试 控件程序,也可以运行控件程序,以观看其显示的效果。
8.1 一个简单ActiveX控件的开发 C#程序设计教程——蒙祖强编著
第8章
ActiveX控件和自定 义组件开发
本章内容
8.1 一个简单ActiveX控件的开发 8.2 ActiveX控件 8.3 自定义组件
8.1 一个简单ActiveX控件的开发 C#程序设计教程——蒙祖强编著
8.1.1 创建ActiveX控件程序
ActiveX控件可以简单理解为能够实现特定功能的“成品”控件。
(2)单击【确定】按钮,创建名为MyFirstActiveX的ActiveX控 件 程 序 。 然 后 在 打 开 的 界 面 中 添 加 一 个 Buttion 控 件 和 一 个 TextBox控件,并进行适当的设置:
8.1 一个简单ActiveX控件的开发 C#程序设计教程——蒙祖强编著
8.1.1 创建ActiveX控件程序 (3)在设计界面中双击【我的控件】按钮,进入该按钮的事件 处理函数,并编写相应代码,结果如下:
ActiveX控件可以用各种编程语言来开发,如C、C++,也包 括.NET中的C#、等。ActiveX控件通常以dll或ocx文件的形 式存在,它不能独立运行,必须依赖于其他程序,相应的这些程序 称为ActiveX控件宿主程序。
宿主程序在使用控件和组件时,不需要编译,只需要按照既定的格 式说明进行调用即可。这与使用函数或类不同。在使用函数或类时, 需要将它们的代码加入到程序中相应的位置,并在编译后才能调用。
四川大学《c语言程序设计》课件-第8章 结构体与共用体
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
基于8位单片机的C语言程序设计(第二版) 第八章PPT课件
整体概述
概况一
点击此处输入相关文本内容 点击此处输入相关文本内容
概况二
点击此处输入相关文本内容 点击此处输入相关文本内容
概况三
点击此处输入相关文本内容 点击此处输入相关文本内容
❖ 【本章知识架构】
12.08.2020
3
❖ 【本章教学目标和要求】
❖ 了解中断的基本概念,包括中断请求、中断允许和屏蔽 ❖ 熟悉MCS-51单片机的中断源、中断请求 ❖ 熟悉MCS-51单片机的中断优先级、中断允许和屏蔽、中断
响应 ❖ 熟悉MCS-51单片机的中断程序编写 ❖ 读懂MCS-51单片机的中断实例程序
12.08.2020
4
8.1中断的基本概念
❖ 中断是计算机中很重要的一个概念,中断系统也是
MCS-51单片机的重要组成部分。实时控制、故障 处理往往通过中断来实现,计算机与外部设备之间
的信息传递常常采用中断处理方式。什么是中断?
❖ 1. 外部中断INT0和INT1
❖ 外部中断源INT0和INT1的中断请求信号通过MCS-
51单片机的并口引脚P3.2和P3.3的输入,主要用于
自动控制实时处理、单片机掉电和设备故障处理。
12.08.2020
10
❖ 外部中断请求INT0和INT1有两种触发方式:电平触 发及跳变(边沿)触发。这两种触发方式可以通过 特殊功能寄存器TCON来选择。特殊功能寄存器 TCON除在定时计数器中使用外(其高4位用于定时 计数器控制,后面介绍),低4位用于外部中断控 制,形式如图8-1所示。
12.08为.202高0 电平。
13
❖ 2.定时/计数器T0和T1中断
❖ 当定时/计数器T0或T1溢出时,由硬件置TF0(或 TF1)为“1”。向CPU发送中断请求,当CPU响应 中断后,将由硬件自动清除TF0(或TF1)。
《C语言程序设计》电子课件 第8章课件
Your site here
重
8.2结构体类型及其变量的定义
庆
电
子
工 程
1.定义结构体变量的三种方法
职 业
①先定义结构体类型,再定
学
义结构体变量
院
num
name
sex age score
struct stu
计
20070101 李文华
男
18
92.5
{
算
机
int num;
学 院
char name[20];
计
main()
算 机
{ pstu=&boy1;
学
printf("Number=%d\nName=%s\n",boy1.num,);
院
printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);
printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);
}
Your site here
重 庆
8.3结构体数组
电
子 工
1.结构体数组的定义
程
职 业
struct stu
学
{
院
定义了一个结构体数组 boy,共有5个元素,
int num;
boy[0]~boy[4],每
char *name;
计
个数组元素都具有
char sex;
算 机
struct stu的结构形式。 float score;
学 院
{104,"Cheng ling",'F',87},
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
…
直接对a的访问,就是访问此数组的首地址
a[8]
a[9]
4/49
2018/11/17
8.1一维数组的定义和初始化
一维数组的定义
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];
int a[10];
数组大小必须是值为正的常量,不能为变量 a[1] – 一旦定义,不能改变大小
数组大小最好用宏来定义,以适应未来可能 a[7] 的变化
C语言程序设 计-第八章
本章学习内容
对数组名特殊含义的理解 数组类型,数组的定义和初始化 向函数传递一维数组和二维数组 排序、查找、求最大最小值等常用算法
2018/11/17
2/49
为什么使用数组(Array)?
【例8.1】要读入10人的成绩,然后求平均成绩
需定义10个不同名整型变量,需要使用多个scanf()
• 方法2:通过循环赋值 int i; for (i=0;i<4;i++) { b[i] = a[i]; } 8/49
8.1一维数组的定义和初始化
【例8.2】编程实现显示用户输入的月份(不包括 闰年的月份)拥有的天数
2018/11/17
9/49
8.1一维数组的定义和初始化
下标越界是大忌!
–编译程序不检查是否越界 –下标越界,将访问数组以外的空间 –那里的数据是未知的,不受我们掌控,可能带
1 4 6 0
2 5 0 0
3 0 0 0
结果:5, 0, 0
【例】若int a[ ][3]={1, 2, 3, 4, 5, 6, 7}, 则a数组的第一维大小是多少?
2018/11/17
1 2 3 4 5 6 7 0 0 13/49
数组的数据类型和存储类型
根据数组的数据类型,为每一元素安排相同长度的存储单元 根据数组的存储类型,将其安排在内存的动态存储区、静态 存储区或寄存器区 用sizeof(a)来获得数组a所占字节数
3/49
2018/11/17
8.1一维数组的定义和初始化
一维数组的定义 int a[10];
a[0]
数组首地址
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];
基类型
下标从0开始
a[1] a[7]
定义一个有10个int型元素的数组
– 系统在内存分配连续的10个int空间给此数组
a[0]
…
#define SIZE 10
a[8]
a[9]
5/49
int a[SIZE];
2018/11/17
8.1一维数组的定义和初始化
数组定义后的初值仍然是随机数 一般需要我们来初始化
int a[5] = { 12, 34, 56 ,78 ,9 }; int a[5] = { 0 }; int a[] = { 11, 22, 33, 44, 55 };
int score1,score2,…score10; scanf("%d",&score1); scanf("%d",&score2); ......
而用数组,可共用一个scanf()并利用循环语句读取
int score[10],i; for (i=0; i<10; i++) { scanf("%d",&score[i]); } 保存大量 同类型的 相关数据
a[1][0] a[1][1] a[1][2]
2018/11/17 15/49 需知道数组每行列数才能从起始地址开始正确读出数组元素
二维数组实例
【例8.4】从键盘输入某年某月(包括闰年),编程输出该年 的该月拥有的天数
2018/11/17
16/49
short
2018/11/17
14/49
二维数组的存储结构
存放顺序:按行存放
先顺序存放第0行元素,再存放第1行元素
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1]
short int
a[0] a[1]
a[2][3];
a[0][0] a[0][1] a[0][2]
a[1][2]7/Leabharlann 9如何使两个数组的值相等?
main() { int a[4] = {1,2,3,4}, b[4]; b = a; } 原因: 数组名表示数组的首地址, 其值不可改变! 解决方法 • 方法1:逐个元素赋值 b[0]=a[0]; b[1]=a[1]; b[2]=a[2]; b[3]=a[3];
2018/11/17
2018/11/17
6/49
8.1一维数组的定义和初始化
数组的引用
数组名 [下标]
数组下标(index)都是从0开始
使用a[0]、a[1]、a[2]、……、a[9]这样的形式
访问每个元素 下标既可是常量,也可是整型表达式,允许快速 随机访问,如a[i]
–可以像使用普通变量一样使用它们
2018/11/17
如 int b[2][3];
n维数组 –用n个下标来确定各元素在数组中的顺序
如 int c[3][2][4];
–n≥3时,维数组无法在平面上表示其各元素的位置 b[0][0] b[0][1] a[0] a[1] a[2] a[3] a[4] b[1][0] b[1][1] 2018/11/17
64 68 6c
运行程序或单步执行观察变量变化情况可以看到, 变量c和a的值因数组越界而被悄悄破坏了 2018/11/17
11/49
8.2二维数组的定义和初始化
一维数组 – 用一个下标确定各元素在数组中的顺序 – 可用排列成一行的元素组来表示
如 int a[5];
二维数组 –用两个下标确定各元素在数组中的顺序 –可用排列成i行,j列的元素组来表示
来严重后果
2018/11/17
10/49
【例8.3】当下标值小于0或超过数组长度时
会出现什么情况?
b[0]
b[1] b[2] b[3]
0 1 2 3 4 5 6 7 8 9 10 2 11 1
40
44
48 4c 50
b[4]
b[5] b[6] b[7] b[8] b[9] c a
54
58 5c
60
b[0][2]
b[1][2] 12/49
二维数组的初始化
【例】以下程序的运行结果是什么? int main() { int a[][3]={{1,2,3},{4,5},{6},{0}}; printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]); return 0; }