C语言(第12章)
C语言课件第12章 位运算
1.
位运算规则: 位运算规则: A 0 0 1 1 B 0 1 0 1 A&B 0 0 0 1 A|B 0 1 1 1 A^B 0 1 1 0 ~a 1 1 0 0
例12.1 若 a=(15)10=(00001111)2, a=(15) b=(80)10=(01010000)10 则: a&b = 0000 0000, a|b = 0101 1111, a^b =01011111 , ~a = 1111 0000
/*设 a 为待处理的数据,转换成二进制为00001000, /*设 为待处理的数据,转换成二进制为00001000, b用来保存将a的高4位清0后的结果*/ 用来保存将a的高4位清0后的结果* main() { unsigned char a,b,c; a=8; b=a&0x0f; c=b|0xa0; /*c用于保存最终结果*/ b=a&0x0f; c=b|0xa0; /*c用于保存最终结果 用于保存最终结果* printf("%x" printf("%x",c); }
4)左移,右移运算实现将一个数的各个二进制位向左,向 4)左移,右移运算实现将一个数的各个二进制位向左,向 右移若干位. 左移:将一个数的各个二进制位左移若干位,高位左移 左移:将一个数的各个二进制位左移若干位, 后舍弃,低位补0 后舍弃,低位补0 . 若定义: 若定义: int a=8; 即a= 0000 1000 0010 0000 0000 右移:将一个数的各个二进制位右移若个位,低位右移 右移:将一个数的各个二进制位右移若个位, 后舍弃, 还是补1 后舍弃,高位补 0还是补1,要区别有符号数还是无符号 无符号数高位补0 有符号数高位补原符号位. 数:无符号数高位补0,有符号数高位补原符号位. 若定义 unsigned int a=8; 即 00001000, a=8; 00001000, 则语句 a=a>>2 ;将 a 的各二进制位右移 2 位,空出的 高位补 0.结果为: 0000 0010 , 则语句a=a<<2; 则语句a=a<<2;
第12章 关系数据库提供的应用程序接口
12.1 ODBC 12.2 OLE DB 12.3 ADO
第12章 关系数据库提供的应用程序接口 本章重点介绍了ODBC(Open Database Connectivity, 开放数据库互连)的特点、体系结构、ODBC DSN的创建 过程,以及UDA(Universal Data Access,一致数据访问) 技术的两层标准接口OLE DB和ADO。 OLE DB是系统级的编程接口,它定义了一组COM接口, 这组接口封装各种数据库系统的访问操作,为数据处理方 和数据提供方建立了标准。OLE DB还提供了一组标准的 服务组件,用于提供查询、缓存、数据更新、事务处理等 操作。 ADO是应用层级的编程接口。它利用OLE DB 提供的 COM接口来访问数据,因此它适合于C/S(客户/服务器) 系统和基于Web的应用,尤其在一些脚本语言中进行数据 库访问操作是ADO主要优势。
下面对ADO的各个对象进行讨论。 (1)Connection对象。利用Connection对象可以实现与 数据源建立连接。 (2)Command对象。Command对象代表一个操作命令, 主要是通过调用其各种方法来执行针对数据源的有关 操作。 (3)Recordset对象。Recordset对象代表一个表的记录 集或命令执行的结果,在记录集中,总有一个当前记 录。记录集是ADO管理数据的基本对象,它是一种表 状结构,每一行对应一个记录(Record),每一列对 应一个域(Field)。Recordset对象也可通过游标对记 录进行访问,在ADO中,游标分为四种: ① 静态游标。提供对数据集的一个静态拷贝,允许各 种移动操作,包括前移、后移等等,但其他用户所做 的操作反映不出来。
图12.5 “ODBC 数据源管理器”对话框
第12章 对C语言的进一步讨论
第十二章对C语言的进一步讨论一、选择题1:Cmain()函数的参数通常是两个,第一个必须是int型,第二个必须是字符串的指针。
2:D程序的含义表明将输入的参数命令行看作字符串,将第2,4个字符串即(abcd h3)的字符个数相加,存放到len中,输出。
3:DInt*f()表示返回值是指针的函数4 :DA,B,C选项正确,D选项中,f是指向函数的指针不能这样调用5:B函数的递归调用分为直接地归调用和间接递归调用两种,其中间接递归调用自己的称为间接递归调用6:C这是函数递归调用:Fun(7)调用后等价于7-fun(5),又去调用fun(5),fun(5)又相当于5-fun(3)这时程序相当于计算7-(5-fun(3)),即7-5+fun(3), 又去调用fun(3),fun(3)又相当于3-fun(1),程序相当于计算7-5+3-fun(1),结果为2。
7:A这是函数递归调用:x的输入值为10,调用fun(10),相当于以下过程:fun(10)=10+fun(9);10+fun(9)=10+9+fun(8)10+9+fun(8)= 10+9+8+fun(7)10+9+8+fun(7)= 10+9+8+7+fun(6)10+9+8+7+fun(6)= 10+9+8+7+6+fun(5)..........10+9+8+7+6+5+4+3+2+fun(1)= 10+9+8+7+6+5+4+3+2+1;结果为558:DA项:预处理命令不一定要放在程序开头,B:一行只能有一条预处理命令。
C 宏名可以小写,但一般用大写进行区别,D正骨俄9:Cf(x)为代参数的宏,f(8)相当于8*8,f(4)相当于4*4,同样f(4+4)相当于4+4*4+4,f(2+2) 相当于2+2*2+2所以结果是4,3.10:AF(X,Y) 为代参数的宏,F(a++,b++)相当于(a++)*(b++),结果为1211:M1+M2相当于(N*3)+(N*2),而N相当于5所以结果为25。
数据结构C语言版严蔚敏清华大学出版社课件第十二章 .ppt
“批处理”,就是将这两个文件“合”为 一个新的主文件。具体操作相当于 “归并两个有序表”。
2020/1/21
16
但有两点不同:
(1)对于事务文件中的每个操作 首先要判别其“合法性”
(2)事务文件中可能存在多个操 作是对主文件中同一个记录 进行的
2020/1/21
17
批处理的时间分析:
假设主文件中含有n个记录,事 务文件中含有m个记录,则对事务文 件进行排序的时间复杂度为
插入:当查找不成功时,将记录插入 在相应的基桶或溢出桶内;
删除:对被删记录作特殊标记。
2020/1/21
48
4. 优点:记录随机存放,不需要进行排
序;插入、删除方便,存取速 度快;节省存储空间,不需要 索引区。
缺点:不能进行顺序存取;在经过多 次插入和删除操作之后,需进 行“重组文件”的操作。
2020/1/21
35
3.文件重组
在经过多次的插入和删除操作之 后,大量的记录进入文件的“溢出 区”,而“基本存储区”中出现很 多已被删去的记录空间,此时的文 件结构很不合理。因此,对ISAM文 件, 需要周期地进行重整。
2020/1/21
36
4.柱面索引的位置
ISAM文件占有多个柱面,其柱 面索引本身占有一个柱面,为使 “磁头”的平均移动距离最小,柱 面索引应设在数据文件所占全部柱 面的中间位置上。
… ...
索引集
B+树 顺序集
...
...
... 数据集
2020/1/21
控制区域
控制区间
39
2. 控制区间是用户进行一次存取的 逻辑单位,可看成是一个逻辑磁道。 但它的实际大小和物理磁道无关。
《C语言程序设计》(第2版)苏小红-13章 12
2021/7/31
40/60
struct sample {
short i; char ch; float f; };
union sample {
short i; char ch; float f; };
2021/7/31
共用体
【例12.8】
printf("%d\n", sizeof(struct sample));
Before function call:1999/04/23 After function call:2000/05/22
指针作函数形参 实参必须为地址值
2021/7/31
33/60
struct date
{
int year; int month;
结构体变量
int day; };
作函数返回值
struct date Func(struct date p)
2021/7/31
【例12.3】利用 结构体数组计 算每个学生的 平均分
25/60
结构体指针的定义和初始化
如何定义指向结构体变量的指针?
pt STUDENT stu1; STUDENT *pt; pt = &stu1;
等价于
STUDENT *pt = &stu1;
stu1 成员1 成员2 成员3 成员4
i ch
f
8个字节
printf("%d\n", sizeof(union sample));
0x0037b00
cfih
4个字节 41/60
共用体
sizeof(union number)取决于占空间最多的那个成员 变量
同一内存单元在每一瞬时只能存放其中一种类型的成员 起作用的成员是最后一次存放的成员,不能作为函数参数 不能进行比较操作,只能对第一个成员初始化
第12章 文件操作-按行读写文件
第12章文件操作——按行读写文件
⏹int puts(const char *s);
将字符串s写入标准输出流stdout,并在其后添加一个换行符
⏹按字符串(行)写文件
int fputs(const char *s, FILE *fp);
将字符串s写入fp所指的文件中
与puts()相同的是:若出现写入错误,则返回EOF,否则返回一个非负数 与puts()不同的是:它不会自动添加换行符,除非字符串本身含有换行符
⏹char*gets(char *s);
从标准输入流stdin读取字符串,读到换行符时停止
⏹按字符串(行)读文件
char*fgets(char *s, int n, FILE *fp);
从fp所指的文件中读取字符串,最多读n-1个字符
当读到回车换行符、文件末尾,或读满n-1个字符时,函数返回该字符串的首地址 用fgets(buf, sizeof(buf), stdin)代替gets(buf)更安全
⏹char*gets(char *s);
⏹char*fgets(char *s, int n, FILE *fp);
讨论
下面左侧的程序中将gets(str)修改为fgets(str,sizeof(str),fp)后,再重新运行右侧的程序,则输出结果将会在输出的Hello world和program is over.之间增加一个空行,这是为什么?请说明其原因。
c第12章 上 机 实 验ppt课件
精品课件
2
实验一 C程序的运行环境
一、实验目的
1. 了解在计算机上如何录入、编辑、编译、连接和运行一个C程序。 2. 通过设计和调试简单的C程序,初步了解C程序的特点。 二、实验内容
1. 确保计算机操作系统中已安装了Turbo C。 2. 启动Turbo C。 (1) 将操作方式转入到MS-DOS方式。 (2) 假 设 Turbo C所在的目录为 C:\tc, 则 调用 Turbo C的 命 令 一般 为
(4) 2. 程序修改题
(5) 3. 程序编写题
(4) (1) 用选择法对10个整数作排序。10个整数用scanf函数
输入。
(5) (2) 编写连接两个字符串的程序。
精品课件
8
实验七 函 数
一、实验目的 1. 掌握定义函数的方法。 2. 掌握函数实参与形参的对应关系,以及“值传递”的方式。 3. 掌握函数的嵌套调用和递归调用的方法。 4. 掌握用“Project”菜单管理多个源程序文件的方法
C:\tc\tc,执行此命令后屏幕上将出现Turbo C的工作环境。 3. 熟悉Turbo C集成环境。
了解Turbo C界面的组成,各菜单命令、各功能键的作用。下面将详 细介绍各菜单命令及相应功能键的作用。
4. 编辑及运行一个简单的C源程序。 5. 重新开始编辑和运行另一个程序。 6. 人为地制造一些语法错误。 7. 独立完成教材第一章思考与练习中的第四大题。 8. 退出Turbo C环境。
不同类型数据间的混合运算规律。 4. 进一步掌握C语言简单程序设计的几个步骤。
二、实验内容 输入程序(教材p238),编译、运行、分析。
精品课件
4
实验三 顺序结构程序设计
一、实验目的 1. 掌握各种类型数据的输入输出方法,能正确运用各种格式字符。 2. 掌握C语言中顺序结构程序的设计方法,为以后作好准备。
C语言12文件
©2006-8 North University of China
11
中北大学计算机系基础教研室
格式化I/O:fprintf与fscanf
函数原型: fprintf(文件指针,格式字符串,输出表列) fscanf(文件指针,格式字符串,地址表列) 功能:按格式对文件进行I/O操作 返值:成功,返回I/O的个数;出错或文件尾,返回EOF
C语言程序设计
第12章 文件
中北大学计算机系基础教研室
§12.1 C文件概述
文件:存储在外部介质上数据的集合,是操作系 统数据管理的单位 文件分类 使用数据文件的目的
1、数据文件的改动不引起程序的改动——程序与数据分离 按文件的逻辑结构: 2、不同程序可以访问同一数据文件中的数据——数据共享 记录文件:由具有一定结构的记录组成(定长和不定长) 3、能长期保存程序运行的中间数据或结果数据 流式文件:由一个个字符(字节)数据顺序组成
14
©2006-8 North University of China
中北大学计算机系基础教研室
fseek函数
函数原型:int fseek(FILE *fp,long offset,int whence) 功能:改变文件位置指针的位置 返值:成功,返回0;失败,返回非0值 起始点 位移量(以起始点为基点,移动的字节数) 文件开始 SEEK_SET 0 文件指针 >0 向后移动 文件当前位置 SEEK_CUR 1 <0 向前移动 文件末尾 SEEK_END 2
输入文件缓冲区
程序数据区 a 输出文件缓冲区
©2006-8 North University of China
fclose
7
中北大学计算机系基础教研室
C21第12章 位运算
位操作符
C语言提供的位操作符有按位与&、按位或|、按位异或 语言提供的位操作符有按位与& 按位或|、按位异或 |、 ^、取反~、左移<<和右移>>。 取反~ 左移<<和右移>>。 <<和右移>> 位操作符的操作数仅限整型(字符型), 位操作符的操作数仅限整型(字符型), 为简明下面示例中位操作符的操作数多为字符型。 为简明下面示例中位操作符的操作数多为字符型。
结构体中的结构体
结构体struct bitfield虽然有三个整型成员a,b,c,但 虽然有三个整型成员a,b,c, 结构体struct bitfield虽然有三个整型成员a,b,c,但 它们存储空间的长度只有2 它们存储空间的长度只有2位、4位和2位。 位和2 特别强调,整型成员a 特别强调,整型成员a、b、c虽然位数不多,但仍为有 虽然位数不多, 符号数, 符号数,即a、c的取值范围为-2至1,b的取值范围为-8至 的取值范围为的取值范围为7。
新编C语言程序设计教程
清华大学出版社
周二强
zeq@ 软件学院
计算机科学与工程系
配套视频: 配套视频: 博客: 博客:/stunt
第12章 位运算 12章
12. 12.1 位操作符
12.1.1 按位与操作符& 12.1.2 按位或操作符| 12.1.3 异或操作符^ 12.1.4 取反操作符~ 12.1.5 左移操作符<< 12.1.6 右移操作符>>
12. 12.2 位运算示例 12. 12.3 位段
位运算
位运算是指按二进制位进行的运算, 位运算是指按二进制位进行的运算,实际上就是直接对整数 在内存中的二进制位进行操作。 在内存中的二进制位进行操作。 考虑这样的问题:编程控制编号为0 考虑这样的问题:编程控制编号为0至7的八盏灯的开关。 的八盏灯的开关。 可以定义一个长度为8的短整型数组变量a。 可以定义一个长度为8的短整型数组变量a 可以定义一个无符号的字符型变量c 可以定义一个无符号的字符型变量c。 如果c的值为128( 0000), ),则 号灯亮,其余灯灭; 如果c的值为128(1000 0000),则7号灯亮,其余灯灭;为 128 192时 0000), ),则 号和7号灯亮,其余的灭。 192时(1100 0000),则6号和7号灯亮,其余的灭。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。
《程序设计基础(C语言)》实验指导书
《程序设计基础(C语言)》目录第1 章概述 (1)1.1 课程简介 (1)1.2 实验环境选择 (1)第 2 章实验要求 (1)2.1 实验过程要求 (1)2.2 考核及评分标准 (1)第 3 章实验内容 (2)3.1 实验1 熟悉C语言运行环境 (2)3.2 实验2 数据类型 (3)3.3 实验3 运算符和表达式 (4)3.4 实验4 顺序结构及输入和输出 (6)3.5 实验5 选择结构 (7)3.6 实验6 循环结构 (9)3.7 实验7 数组(1) (11)3.8 实验8 数组(2) (12)3.9 实验9 字符串及其操作 (13)3.10 实验10 函数 (14)3.11 实验11 结构体 (15)3.12 实验12 指针 (16)第 1 章概述1.1 课程简介《程序设计基础(C语言)》是软件工程各专业或其它相近专业学生的公共职业基础课,是软件类各专业的入门课程,直接影响学生后继职业技术课程的学习及可持续发展能力的培养。
通过本书,学习基本的程序设计概念和程序设计方法,学会使用C语言解决实际问题,进行初级的程序设计。
1.2 实验环境选择VC++6.0第 2 章实验要求2.1 实验过程要求本课程中,实验者必须服从指导教师和实验室工作人员的安排,遵守纪律与实验制度,爱护设备及卫生。
在指定的实验时间内,必须到机房内实验,其余时间可自行设计和分析。
本课程所涉及的程序代码,都要求有较高的可读性和效率,多文件表示。
2.2 考核及评分标准若实验者在指定上机时间三次不到课,取消考核资格。
请假,必须提前出具正式假条,不接受事后假条。
如果发现抄袭、篡改、伪造实验数据,或实验报告和设计报告雷同,涉及的所有学生的该课程成绩计为0 分。
本课程采用结构化评分,主要由指导教师灵活处理,可以是考勤等。
第 3 章实验内容3.1 实验1 熟悉C语言运行环境一、实验目的1.了解什么是C语言2.熟悉C语言程序开发环境二、实验内容和步骤1.大学生涯的第一个程序1)运行Microsoft Visual Studio 2008或者VC6.02)创建项目,选择win32控制台应用程序或者空项目,项目名为MyFirstApp3)新建项目,选择C++源文件,文件名为HelloWorld4)在程序编辑窗口,输入如下代码#include <stdio.h>/* 主程序*/void main(){printf("hello world\n");}5)执行程序,Ctrl+F56)观察输出结果,并记录2.修改程序1)增加语句,观察输出结果是否不同printf("hello world\n");printf("world is me\n");2)删除输出字符串中的“\n”,观察输出结果是否不同printf("hello world\n");3)进行换行输出,观察输出结果是否不同printf("hello, ");printf("world");printf("\n");4)将上个程序块中的printf("\n");去掉,观察输出结果是否不同3.用自己的语言,描述下对C语言程序的第一印象4.简单描述下,第二步骤中,输出结果相同与不同的原因;以及“\n”的用途3.2 实验2 数据类型一、实验目的1.掌握变量的命名规则和定义2.掌握C语言程序中的各种数据类型并使用它们二、实验内容和步骤1.定义3个变量numInt、numFloat、charInfo,他们的类型分别为整型,单精度类型,字符型;并分别初始化为2,2.0和‘A’,最后输出这三个变量的值。
STC单片机C语言程序设计 第12章 STC单片机C语言数组
一维数组的定义和操作
-- 一维数组初始化
出现Watch 1界面。在该界面中,单击Enter expression,然后 输入a;在下一行又出现Enter expression,然后输入b;按照类 似的方法输入c
一维数组的定义和操作
-- 一维数组初始化
分别单击a、b和c前面的+号,展开数组。可以看到各个数组的数 据元素的值。此外,在该图中可以看到下面的信息: 1a 右侧给出 D:0x22 信息,表示数组存放在单片机内部数据区起 始地址为0x22的区域; 2b 右侧给出 D:0x39 信息,表示数组存放在单片机内部数据区起 始地址为0x39的区域; 3c 右侧给出 D:0x3D 信息,表示数组存放在单片机内部数据区起 始地址为0x3D的区域。
STC单片机C语言数组
主 讲:何宾 Email:hebin@
2016.03
一维数组的定义和操作
--一维数组的定义
一维数组的定义格式为:
类型说明符 数组名[常量表达式];
其中,类型说明符是任意一种基本数据类型或者构造数据类型。数 组名是用户定义的数组标识符。[]内的常量表达式表示数据元素的 个数,也称为数组的长度。比如: int a[10]
一维数组的定义和操作
-- 一维数组初始化
TMOD = 0x20; TCON = 0x69; TH1 = 0xF3;
printf("please input data of a[8]\n"); //打印提示输入a[8]数组数据元素 for(i=0;i<8;i++) //循环语句 scanf("%d,",&a[i]); //通过索引号和scanf语句,得到每个数据 printf("\nplease input string of str[40]\n"); //打印输入字符数组数据信息 gets(str,40); //调用gets函数,输入字符数组的值
C语言与程序设计ppt-第12章递归
第12章 递 归
华中科技大学计算机学院 卢萍
华中科技大学计算机学院C语言课
2021/4/25
程组
1
本章讲授内容
递归(recursion)是一项非常重要的编 程技巧,可以使程序变得简洁和清晰,是 许多复杂算法的基础。本章介绍 递归、递归函数的概念; 递归的执行过程; 典型问题的递归函数设计; 分治法与快速排序; 回溯法; 递归在动态规划等算法中的应用。
12
【例12.3】 设计一个求解汉诺塔问题的算法。
这是一个典型的用递归方法求解的问题。要移动n个 盘子,可先考虑如何移动n 1个盘子。分解为以下3 个步骤:
(1)把A上的n-1个盘子借助C移到B。 (2)把A上剩下的盘子(即最大的那个)移到C。 (3)把B上的n-1个盘子借助A移到C。 其中,第(1)步和第(3)步又可用同样的3步继
2021/4/25
华中科技大学计算机学院C语言课程组
2
12.1 递归概述
递归是一种函数在其定义中直接或间接调用 自己的编程技巧。递归策略只需少量代码就 可描述出解题过程所需要的多次重复计算, 十分简单且易于理解。
递归调用:函数直接调用自己或通过另一函 数间接调用自己的函数调用方式
递归函数:在函数定义中含有递归调用的函 数
续分解,依次分解下去,盘子数目n每次减少1,直 至n为1结束。这显然是一个递归过程,递归结束条 件是n为1。
2021/4/25
华中科技大学计算机学院C语言课程组
13
函数move(n,a,b,c)
为了更清楚地描述算法,可以定义一个函数 move(n,a,b,c)。该函数的功能是:将n个盘 子从木桩a上借助木桩b移动到木桩c上。算法 的第(1)步和第(3)步的实现都是递归调 用,分别为move(n-1,a,c,b)和move(n1,b,a,c)。
c语言程序设计何钦铭颜晖第12章文件
第12章文件【练习12-1】读出例12-1学生成绩文件内容,输出最高分和最低分及相应的学号和姓名。
解答:#include<>#include<>struct student{long num;char stname[20];int score;};int main(void){FILE *fp;int i,max,min,j=0,k=0;struct student students[5];if((fp=fopen("","r"))==NULL) {printf("File open error!\n");exit(0);}fscanf(fp,"%ld%s%d",&students[0].num,students[0].stname,&students[0] .score);max=min=students[0].score;for(i=1;i<=4;i++){fscanf(fp,"%ld%s%d",&students[i].num,students[i].stname,&students[i]. score);if(max<students[i].score){max=students[i].score;j=i;}if(min>students[i].score){min=students[i].score;k=i;}}printf("Maxscore: %d,num:%d,name:%s\n",students[j].score,students[j].num,&studen ts[j].stname);printf("Minscore: %d,num:%d,name:%s\n",students[k].score,students[k].num,&studen ts[k].stname);if(fclose(fp)){printf("Can not close the file!\n");exit(0);}return 0;}【练习12-2】请使用例8-9答电码加密函数对民吗字符串进行加密,改写例12-2。
c语言程序设计第三版谭浩强第十二章位运算
29
程序如下: 运行情况如下: #include <stdio.h> a=157653,n=3 void main() 15765 3 { unsigned a,b,c; 75765 int n; scanf(“a=%o,n=%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; 运行开始时输入八进制数157653 157653, 运行开始时输入八进制数157653, printf(“%o\n%o”,a,c); 即二进制数1101111110101011 即二进制数1101111110101011 } 循环右移3位后得二进制数0111101111110101 循环右移3位后得二进制数0111101111110101 即八进制数75765 即八进制数75765
14
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b =b∧a;”相当于b=b∧(a∧b)。 ② 再执行第三个赋值语句: a=a∧b。由于a的 值等于(a∧b),b的值等于(b∧a∧b), 因此,相当于a=a∧b∧b∧a∧b,即a的值等 于a∧a∧b∧b∧b,等于b。 a得到b原来的值。
9
应用:按位或运算常用来对一个数据的某 些位定值为1。例如:如果想使一个数a 的低4位改为1,只需将a与017进行 按位或运算即可。 例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。
10
12.1.3“异或”运算符( 12.1.3“异或”运算符(∧)
异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假) 异号则结果为1(真)
5
按位与的用途: 按位与的用途: (1) 清零
c语言从入门到精通__第12章
12.1.1 指针与数组
&grade[3]=&grade[0] + 3 * 4 上面表达式的含义是gradep[3]的地址等于grade[0]地址加上12。写成以下 的通式: 数组中下标为N元素的地址 = 数组的首地址 + N * sizeof(DataType) 例如: int grade[5]; /*定义array为包含5个整型数据的数组*/ int *p; /*定义p为指向整型变量的指针变量*/ p=&grade[0];
12.1.2 数组名作为指针
每个创建的数组,数组名就成为编译器为这 个数组所创建的指针常量名称,存储的是数 组第一个元素的起始地址,也是我们所说的 数组首地址。这样,我们就有多了一种获取 数组元素地址的手段。如【范例12-1】中 代码“p=&grade[0];”就可以改写为 “p=grade;”。
例如:输入字符串“abcdefgabcdeabc”,输出的 结果应该是“3 3 3 2 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0”
12.2 指针与字符串
12.2.1 12.2.2 12.2.3 12.2.4 使用指针创建字符串 使用指针处理字符串 指针的指针 指针数组和数组指针
指针与数组 指针与字符串 综合应用——报数游戏 跟我上机
第12章
指针的深入研究——指针进阶
指针与数组 指针与字符串 综合应用——报数游戏 跟我上机
12.1 指针与数组
12.1.1 12.1.2 12.1.3 12.1.4 指针与数组 数组名作为指针 指针与多维数组 指针与数组参数
12.1.1 指针与数组
12.2.1 使用指针创建字符串
C语言程序设计(李圣良)章 (12)
实验指导 任务二
(1) 调试下面求解一元二次方程的程序,按要求输入数据
多次运行程序,写出每次的运行结果。
# include <stdio.h> # include <math.h> main() { float a,b,c,d,x1,x2,p,q;
printf("a,b,c="); scanf("%f%f%f",&a,&b,&c); d=b*b-4*a*c; if (d>=0) { x1=(-b+sqrt(d))/(2*a);
实验指导
实验内容
任务一
(1) 调试下面,用相应格式输出各种类型数据的程序,写
出运行结果。
# include <stdio.h>
main()
{
int a=98; float x=1234.567; char ch='H';
printf("%d\n",a);
printf("%c\n",a);
printf("%f\n",x);
实验指导
实验内容
任务一 调试如下程序,输入三个数,输出最大数。写出程序的运 行结果,思考每次程序运行的流程。
实验指导
# include <stdio.h>
main()
{
int a,b,c;
printf("a,b,c=");
scanf("%d%d%d",&a,&b,&c);
if (a>b)
if (a>c)
实验指导 (2) 上面的程序无论输入什么数据,输出面积结果都是 0.00。将对应公式的赋值语句改为“s=1.0/2*(a+b)*h; ”就 会得到正确的结果,请解释原因。修改程序后,调试正确并求 上底为1.2、下底为4.8、高为3.6的梯形的面积,写出运行结 果。 原因:
C语言程序设计教程(第二版)
例如12.5 用fread()函数和fwrite()函数修改【例12.4】。
#include "stdio.h" #define SIZE 3 struct student { int num; char name[10]; int score; }std[SIZE]; main( ) { int i;
exit(0); } for(i=0;i<10;i+=2) { fread(&d[i],4,1,fp);
printf("%8.2f\n", d[i]); fseek(fp,4L,1);/*将位置指针移到离当前位置4个字节处 */ } fclose(fp); }
12.5 文件的定位
12.5.3 ftell()函数 ftell(文件指针); 功能:获得文件位置指针的当前位置。fte11()函数
exit(0); } ch=getchar(); while(ch!=’$’) { fputc(ch,fout);/*将字符变量ch的值输出到文件中*/ putchar(ch); /* 将字符变量ch的值输出到屏幕*/
ch=getchar( ); } fclose(fout);/* 关闭文件*/ }
第12章 文件
C语言文件。 文件类型指针。
打开、关闭和检测文件
文件的输入和输出 文件的定位
12.1、C语言文件
文件: 存储在外部介质上的、可由计算机识别的 一组相关数据的集合。
C程序文件,是一个字符序列。
按文件中数据的组织形式(即代码存放形式)可分为
两种文件:
ASCII文本文件:采用ACSII代码存储方式,每个字符占 一个字节,存储其对应的ASCII码. 二进制文件:采用C规定的内存数据的存储方式
c语言程序设计教程第七道第十二章课后练习题
目录习题7 (1)选择题 (1)2.程序填空题 (3)习题8 (5)1.填空题 (5)习题9 (9)选择题 (9)程序填空题 (12)习题10 (13)选择题 (13)习题11 (15)选择题 (15)程序填空题 (18)习题12 (20)选择题 (20)程序填空题 (22)习题7选择题(1)在C语言中,引用数组元素时,其数组下标的数据类型允许是(C)。
A.整型常量B.整型表达式C.整型常量或整型表达式D.任何类型表达式(2)若有说明:int a[0];则对数组元素的正确引用是(D)。
A.a[10];B.a[3.5]C.a(5)D.a[10-10](3)设有数组定义:char array[]=”china”;则数组array所占的空间为(C)。
A.4个字节 B.5个字节 C.6个字节 D.7个字节(4)若二维数组a有m列,则在a[i][j]的元素个数为(B)A.J*m+IB.i*m+jC.i*m+j-1D.i*m+j+1(5)若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是(B)。
A.2 B.3 C.4 D.无确定值(6)以下不正确的定义语句是(B)。
A.double x[5]={2.0,4.0,6.0,8.0,10.0};B. int y[5]={0,1,3,5,7,9};C. char c1[]={‘1’,’2’,’3’,’4’,’5’};D. char c2[]={‘\x10’,’\xa’,’\x8’};(7)以下不能对二维数组a进行正确的初始化的语句是(C)。
A. int a[2][3]={0};B. int a[][3]={{1,2},{0}};C. int a[2][3]={{1,2},{3,4},{5,6}};D. int a[][3]={1,2,3,4,5,6};(8)以下能对二维数组a进行正确初始化的语句是(B)。
A. int a[2][]={{1,0,1},{5,2,3}};B. int a[][3]={{1,2,3},{4,5,6}};C. int a[2][4]={{1,2,3},{4,5},{6}};D. int a[][3]={{1,0,1},{ },{1,1}}; \\D中间初始值不存在,{}的初始化是错误的(9)以下不能正确的字符串赋初值的语句是(A)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件、卡片文件、磁带文件等。计算机以这些设备为 对象进行输人输出时,对这些设备的处理方法统一按 ‚文件‛处理。
§12.1 文件系统概述
文件可以从不同的角度进行分类: 按文件所依附的介质来分:有卡片文件、纸带 文件、磁带文件、磁盘文件等。 按文件的内容区分:有源程序、目标文件、可 执行程序文件、数据文件等。 按文件中数据的组织形式区分:数据文件可分 为字符代码文件(也称字符文件或文本文件或 正文文件)和二进制文件。
数据区
a
文件输入 缓冲区
磁盘文 件
数据区
a
文件输出 缓冲区
磁盘文 件
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
设置输入输出缓冲区目的是:减少对磁盘的实际读
写次数,提高输入输出操作的效率。磁盘访问最小 只能以扇区为单位,且其读写速度远远低于读写内 存的速度。 缓冲文件系统自动为文件设置所需的缓冲区,缓冲 区的大小随机器和操作系统而异。
文件的关闭(fclose函数)
关闭文件用fclose函数:
int fclose(FILE *文件指针变量);
功能: 通知系统,将此指针指向的文件关闭,释放 相应的文件信息区(结构体变量)。 返回值: 调用成功时返回0, 发生错误时返回EOF (EOF 是一个符号常量,在stdio.h中定义为-1)
文件(FILE)类型指针
定义文针变量名;
例如: FILE *fpl,*fp2,*fp3;
上例定义了三个指针变量fpl,fp2,fp3,它们都是指 向FILE类型结构体数据的指针变量,但此时它们还未 具体指向哪一个结构体变量;FILE类型的结构体变量 在执行打开文件的函数时才生成,并由该函数返回其 起始地址,并在执行关闭文件的函数后释放。
FILE *fopen(char *filename, char *mode);
文件使用方式 函数返回值为文件指针, 文件名 指向FILE结构体类型变 量的起始地址
文件的打开(fopen函数)
文件打开方式 方式\格式 只读 只写 追加 读/写 读/写 追加
上加一个‚+”符号。其区别是由 存在的文件末尾补加新的数据。 ‚ r+”时则可对该文件执行读操作, 用‚ a+”方式则可以在追补数 单一的读或写的方式扩展为又能 r rb在读完数据后,可以向该文件写 以上是 ANSI C 的规定。它能够处理字 为输入打开 据后再读人这些数据。 读又能写的方式。 符文件和二进制文件。但有些 C。 语言的 “ w+”则是建立一个新文件, 入数据 ( 更新文件 ) w wb 为输出新建 缓冲文件系统不具备以上全部功能, 可以对它写人数据,然后又 因此在用到有关这些方式时请注意查 可以读人这些数据。 a ab 向文件尾增补 阅所用C语言系统的说明书或上机试一 下即可。 r+ rb+ 为读/写打开(不存在时出错)
文件(FILE)类型指针
FILE类型的结构体变量不用变量名来标识,而要设置 一个指向该结构体变量的指针变量(文件指针),通过它 来访问该结构体变量。 文件指针是缓冲文件系统的一个很重要的概念,只有 通过文件指针才能调用相应的文件。
fp1-> 文件1 的 信息区(结 构体变量) fp2-> 文件2 的 信息区(结 构体变量) fp3-> 文件3 的 信息区(结 构体变量)
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
标准I/O提供4种读写文件的方法,C语言中相对应的函 数是: 读写一个字符: 用fgetc和fputc函数; 读写一个字符串: 用fgets和fputs函数; 格式化读写: 用fscanf和fprintf函数; 按‚记录‛读写: 用fread和fwfite函数。 系统I/O(非缓冲系统)不提供前面3种功能的函数,只提 供第4种函数: 按‚记录‛读写:用read和write函数。
输入一个字符串
输出一个字符串 按指定格式输入若干变量的值 按指定格式输出若干数据
文件(FILE)类型指针
要调用一个文件,需要有以下的信息:文件当前的读写位 置;与该文件对应的内存缓冲区的地址;缓冲区中未被处 理的字符数;文件操作方式等。 缓冲文件系统为每一文件开辟一个‚文件信息区‛,用来 FILE的定义在stdio.h头文件 存放以上这些信息。这个‚文件信息区‛在内存中,是一 中,由系统事先指定的。它的 个结构体变量。这个结构体变量是由系统定义的,用户不 定义 (包括结构体中成员名、 请注意, FILE 不是结构体 必自己再去定义。其形式为: 成员个数、成员作用等 )在不 变量名,它是用 typedef typedef struct 同的C版本中不同。 定义的新类型名。 { ...... (结构体成员项,用来存放文件信息) } FILE;
字符文件与二进制文件
字符代码文件是指文件的内容是由一个一个字符组成的, 每一个字符用一个代码表示,一般用ASCII代码。例如一 个实数136.56,共有6个字符,如果按字符代码形式 (ASCII码)输出到磁盘上,一个字符占一个字节,故共占6 个字节。 二进制文件是指以数据在内存中存储形式原样输出到磁盘 上去,例如136.56在内存中以浮点形式存储,占4个字节, 而不是6个字节。若以二进制形式输出此数,就将该4个字 节按原来在内存的存储形式送到磁盘上去。不管一个实数 数值多大,都占4个字节。
文件的关闭(fclose函数)
文件关闭后,保存该文件信息的结构体变量被清 除,原来的指针变量不再指向该文件,此后也就 不可以通过此指针来访问该文件。 如果是执行写操作后用fclose关闭文件,则系统会 先将输出文件缓冲区的内容(不论缓冲区是否已满) 都输出给文件,然后再关闭文件。这样可以防止 丢失本来应写到文件上的数据。 如果不关闭文件而直接使程序停止运行,这时就 会丢失缓冲区中还未写人文件的信息。因此必须 注意:文件用完后必须关闭。
文件的打开(fopen函数)
常用下面的方法打开一个文件: if ( (fp= fopen("file1","r") ) = = NULL) { printf("无法打开该文件\n"); exit (0); } exit是一个函数,其作用是关闭 在main函数中也可用以下方式: 所有文件,使程序结束,并返回 操作系统,同时把括弧中的值传 一般情况下, exit(0)表示正常退 if ( (fp= fopen("file1","r") ) = = NULL) 送给操作系统。 出。如果括弧内为非零值,则表 示程序是出错后退出的。也可以 { printf("无法打开该文件 \n"); 使括弧内空缺,即exit( )。 return; }
第十二章 文 件
到目前为止我们设计的程序只能从键盘输入 数据,将处理结果显示在屏幕上,程序结束 后这些数据都无法存留; 实际应用中,常需要输入大量的数据,处理 的结果也需要存留下来,以便查询; 文件是存储在外部介质上的数据集合,C语言 可以从文件中读取数据处理,也可以将内存 中的处理结果(数据)写到文件中。
文本
用‚ a”方式则可以向一个原已 后面 6种方式是在前 二进制 说明 6种方式基础 用‚r”时只能对该文件读,而用
w+ a+
wb+ ab+
为读/写新建(已存在时出错) 为读/写打开/新建(指向末尾)
文件的打开(fopen函数)
调用fopen函数后,fopen函数有一个返回值。 如果打开文件操作成功,它是一个地址值,指向被打 文件名 开文件的文件信息区(结构体变量)的起始地址。 使用方法 操作 简而言之,在打开一个文件时,程序要通 C程序 系统 如果在执行打开操作时失败 ( 例如用‚r”方式打开一个 知fopen函数三个方面的信息: 不存在的文件 ),则函数返回值是一个NULL指针(即地 ①要打开哪一个文件,以‚文件名‛指出; 址值为0 ,它是一个无效的指向 )。 指向文件的指针 ②对文件的使用方式 (字符串 ); fopen函数的返回值应当立即赋给一个文件类型指针变量 ③函数的返回值赋给哪一个指针变量,或 者说,让哪一个指针变量指向该文件。 (例如前面定义的 fpl,fp2,或fp3等),以便以后能通过该 指针变量来访问此文件,否则此函数返回值就会丢失而导 致程序中无法对此文件进行操作。
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
表12.1 标准I/O函数与终端I/O函数对照 标准I/O函数 fgetc fputc 终端I/O函数 getchar putchar 输入一个字符 输出一个字符 作用
fgets
fputs fscanf fprintf
gets
puts scanf printf
非缓冲(低层)文件系统:
非缓冲系统直接依赖于操作系统,通过操作系统的
功能直接对文件进行操作。所以它称为‚系统输入 输出‛或‚低层输入输出‛系统。 非缓冲区文件系统不自动设置缓冲区,而要由用户 自己根据需要设置。
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
这两种文件系统分别使用不同的输入输出函数。其各 自的特点如下: 缓冲文件系统:由系统代替用户做了许多事情,功 能强、使用方便。 非缓冲文件系统:通过操作系统的功能直接对文件 进行操作,依赖于操作系统,编程序时需要人们熟 悉操作系统,编程难度大一些,但它的执行效率高, 节省内存。 为方便起见,一般把缓冲文件系统输入输出称为标准 输入输出(标准I/O),非缓冲文件系统的输入输出称为 系统级输入输出(系统I/O)。
§12.2 文件的打开与关闭