C语言讲义第12章
c语言学习c语言课件第12章
1. 读字符串函数fgets
C提供读字符串的函数原型在stdio.h头文件中,其函数形式为 :
char *fgets(char *str,int num,FILE *fp)
unsigned char *curp; /*文件读写位置*/
unsigned istemp;
/*临时文件,指示器*/
short token;
/*用于有效性的检查*/
} FILE;
在操作文件以前,应先定义文件类型的指针,定义 的一般格式:
FILE *指针变量标识符
例如:
FILE *fp1,*fp2;
例如:
ch=fgetc(fp);/*从fp指向的文件中读取一个字符送入ch 变量中*/
2. 写字符函数fputc
fputc()函数的原型为:
int fputc(int ch,FILE *fp)
功能:将字符ch的值写入所指定文件的当前位置处,并将文件 指针后移一位。fputc()函数的返回值是所写入字符的值,出 错时返回EOF。
2)标准输出文件——stdout:指向终端输出(一 般为显示器)。
3)标准错误文件——stderr:指向终端标准错误 输出(一般为显示器)。
12.2.2 文件的关闭──fclose()函数 1.用法: int fclose(FILE *文件指针); 2.功能:关闭“文件指针”所指向的文件。如果 正常关闭了文件,则函数返回值为0;否则,返回值 为非0。 例如,fclose(fp);/*关闭fp所指向的文件*/
文件命名规则,遵循操作系统的约定。 2.文件分类 可以从不同的角度对文件进行分类: (1)根据文件的内容,可分为程序文件和数据文 件,程序文件又可分为源文件、目标文件和可执行文件 。 (2)根据文件的组织形式,可分为顺序存取文件 和随机存取文件。
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;
C语言讲义第12章.ppt
fwrite(内存地址,长度,次数,文件指针);
float x;
fread ( &x , sizeof(float), 1, fp);
fwrite( &x , 4 , 1 , fp);
19
若有以下的定义和说明
#include”stdio.h” struct std { char num[6];
char name[8]; float mark[4]; } a[30]; FILE *fp;
文件尾部,此时可以进行追加或读操作。
10
如果是二进制文件,则在方式后加“b”。
如果不能正确完成文件的打开操作,函数fopen将返 回错误信息,即返回空指针值NULL。
if ( (fp=fopen (“file1.C”, “r” ) )= =NULL) { printf(“cannot open this file\n”);
main( )
printf(“%d,%f\n” ,_r_.n_u_m__,_r_.t_o_t_a_l _);
{ FILE *f;
f=fopen( “bin.dat”, “rb”); }
reout(f);
}
fanf 函数 是格式化的读写函数,与printf和scanf相仿,但 其读写对象不是终端而是磁盘文件。 fprintf(文件指针,格式字符串,输出列表); fscanf(文件指针,格式字符串,输入列表);
设文件中以二进制形式存有10个班的学生 数据, 且已正确打开,文件指针定位于文件 开头,若要从文件中读30个学生的数据放入 ss数组中,以下不能实现此功能的语句是
A) for (i=0;i<30;i++) fread(&a[i], sizeof(struct std), 1L, fp);
C语言第十二章
说明:高位左移后溢出,舍弃不起作用。
左移后被溢出舍弃的高位中若不包含1, 则左移1位相当于该数乘以2,则左移n位相当 于该数乘以2n。
右 移 运 算 符 ( >> )
右移运算符“>>”是双目运算符。其功能是把 “>> ”左边的运算数的各二进位全部右移若干位, “>>”运算符右边的数指定移动的位数。
即: 0&0=0; 0&1=0; 1&0=0; 1&1=1
例如:9&5可写算式如下: 00001001 &00000101 00000001 (9的二进制补码) (5的二进制补码) (1的二进制补码)
可见9&5=1。
(1)清零。
按位与的用途:
(2)取一个数中某些指定位。 (3)保留某些位。
如果想将一个单元清零,即使其全部二进制位 为0,只要找一个二进制数,让原来的数中为1的 位,新数中相应位为0,然后使二者进行&运算, 即可达到清零目的。若想取指定的某些位或保留某 些位,只要让这些位与1进行与运算即可。
例如:设 a=15,则 a>>2 表示把000001111右移为00000011(十进制3)。如图: 00 00 00 00 00 00 11 11 00 00 00 00 00 00 00 11
说明:右移有两种:逻辑右移和算术右移,
逻辑右移:不论高位是0还是1,右移时高位补0。 算术右移:对于有符号数,在右移时,符号位将随同移动。当为正 数时,最高位补0,而为负数时,符号位为1,最高位补1。 右移时是算术右移还是逻辑右移,取决于编译系统的规定。 Turbo C和很多系统规定为补1。
——————————
(9的二进制补码) (5的二进制补码) (1的二进制补码)
c第12章
12种文件的使用方式
文件使 用方式 含义 解 释 “rt+” 读写 打开一个文本文件,允许读和写 打开一个文本文件, “wt+” 读写 打开或建立一个文本文件,允许读和写 打开或建立一个文本文件, 打开一个文本文件,允许读,或在文件末追 打开一个文本文件,允许读, “at+” 读写 加数据 “rb+” 读写 打开一个二进制文件,允许读和写 打开一个二进制文件, “wb+” 读写 打开或建立一个二进制文件,允许读和写 打开或建立一个二进制文件, “ab+” 读写
5/15/2011 20
12.3 文件的读/写操作
对文件的读和写是最常用的文件操作。在 C语言中提供了多种文件读写的函数 (1) 字符读写函数: fgetc和fputc (2) 字符串读写函数: fgets和fputs (3) 数据块读写函数: fread和fwrite (4) 格式化读写函数 fscanf和fprintf 使用以上函数都要求包含头文件stdio.h,详 见附录2
2. 文件关闭函数(fclose函数) 文件使用完毕,应及时使用文件关闭函数把文件 关闭,避免文件的数据丢失等错误。ANSI C规定 用fclose 函数来关闭文件,其调用的一般形式为 fclose ( 文件指针 ); ; 例如,fclose ( fp ); 若打开文件时把指针赋值给了fp,现在通过fp关 闭该文件,则执行该命令后fp不再指向该文件 正常完成关闭文件操作时,fclose 函数返回值为0。 如返回非零值则表示有错误发生,可以用ferror函 数来测试该返回值
00111001
5/15/2011
7
文件的输入/输出
C语言本身没有专用于输入、输出的语句 为了统一标准,ANSI C把文件和输入、输 出功能作为标准库的一部分,以提高程序 的可移植性 标准库将所有与输入、输出有关的机制都 统一到文件的概念中,定义了一些与输入、 输出有关的数据结构,提供了一组与输入、 输出有关的函数
C语言第十二讲
文件输入输出使用一般文件, 文件输入输出使用一般文件,也可调用对应库函 一般文件 数实现,只是要人工定义文件指针、打开文件及 数实现,只是要人工定义文件指针、 关闭文件。 关闭文件。如:
fp=fpoen( FILE *fp; fp=fpoen( ) fgetc(fp fp) fgets(fp fp) fscanf(fp fp) fread(fp fp) fgetc(fp) fgets(fp) fscanf(fp) fread(fp) fputc(fp fp) fputs(fp fprintf(fp fwrite(fp fp) fp) fp) fputc(fp) fputs(fp) fprintf(fp) fwrite(fp) fclose(fp fp) fclose(fp)
文件写函数
(c,文件指针 文件指针) fputc(c,文件指针):将一个字符写入指定的文件 )比较 与putc( c )比较
缓冲区指针,数据项尺寸,数据项数,文件指针) fwrite(缓冲区指针,数据项尺寸,数据项数,文件指针) :将一组数据写到指定的文件中
fprintf(文件指针,格式控制,输出表) 格式控制,输出表)
标准文件和一般文件
其实C 其实C语言将各种输入输出设备当作文件来 对待,如终端设备规定为三个标准文件: 对待,如终端设备规定为三个标准文件:
标准输入文件(键盘):stdin 标准输入文件(键盘):stdin ): 文件指针 标准输出文件(屏幕): ):stdout 标准输出文件(屏幕):stdout 标准出错信息文件 :stderr 标准文件在启动系统时自动打开, 标准文件在启动系统时自动打开,并自动分配文 件缓冲区和文件指针,退出系统时自动关闭。 件缓冲区和文件指针,退出系统时自动关闭。
《新概念C语言能力教程》第12章位运算
• 分析:用异或操作改变某位的状态以控制相关灯的明灭,使用左移操作构造 操作数。
例12-3 把一个整数32位中的高16位和低16位互换。
12.3 位段
• C语言允许在一个结构型中以位为单位指定其成员实际存储空间的长度,结 构型中指定了存储长度的成员就是所谓的位段。
• 结构型struct bitfield虽然有三个内部成员a,b,c,但它们存储空间的长度只有 2位、4位和2位。内部成员a、b、c虽然位数不多,但仍为int型,有符号数 ,即a和c的取值范围为-2至1,b的取值范围为-8至7。
• 位段的类型只能为整型(有符号,无符号及字符型)
12.1.3 异或操作符^
• 异或操作符^也称xor操作符。异或操作符^将参与运算的两个操作数以二进制 位为单位进行“异或”运算。
• “异或”运算可理解为“判断是否不同(为异)”的运算。异或运算时,如 果两个二进制位上的数相同,则运算结果的此位为0(表示否,不为异); 如果两个二进制位上的数不同,则运算结果的此位为1(表示是,为异)。
12.1.6 右移操作符>>
• 右移操作符与左移操作符类似,表达式a >> n求值时,会将a的二进制位全 部右移n位,右端移出的n位被舍弃。根据左端移入数的不同,右移操作分为 “逻辑右移”和“算术右移”两种。
• 逻辑右移时,无论a为何类型,左端均移入n个0; • 算术右移时,如果a为非负数,则左端移入n个0;如果a为负数,则左端移入
• 左移操作符<<的常用形式为:a << n • 其中,a和n均为整数,求值时a的二进制位全部左移n位,右端补n个0,舍
弃左端移出的n位。显然n的取值范围通常为1至sizeof(a) * 8。 • 在位运算中,左移操作符常用于构造操作数。 • 无符号字符型变量c的值为165,需点亮第6号灯,可以用如下表达式c |= 1
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.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章PPT教学课件
printf("input a to creat(########.###):"); gets(); if ((fp=fopen(,"wb"))==NULL)
如果正常关闭了文件,则函数返回值为0; 否则,返回值为非0(-1)。
2020/12/09
9
12.3 文件的读写操作
文件打开之后,就可以对它进行读与写的操作了。
12.3.1 读/写一个字符 12.3.3 读/写一个数据块 12.3.2 读/写一个字符串 12.3.4 格式化读/写 12.3.5 读/写函数的选用原则
第12章 文 件
程序运行时,数据一般都存放在内存中。当程序运行结 束后,存放在内存中的数据被释放。
如需长期保存程序运行所需的原始数据,或程序运行产 生的结果,就必须将数据以文件形式存储到外部存储介质上。
12.1 C语言文件概述 12.2 文件的操作步骤 12.3 文件的读写操作 12.4 位置指针与文件定位 12.5 出错检测
p.310
二、打开文件──fopen()函数 以某种使用方式打开文件
p.311
if( (fp=fopen(“文件名”,“使用方式”)) ==NULL)
{ printf("can not open this file\n");
exit(0);
}
正常返回DOS
2020/12/09
7
文件的使用方式: “r” 以只读方式打开已有文本文件 “w” 以只写方式打开新文本文件 “a” 以只写方式打开已有文本文件,追加数据到末尾 “r+”、”w+”、”a+” 以读写方式打开ASCII文件
2020/12/09
1
c语言12
struct numST { int num; struct numST *next; };
// 结构声明
// 整型数 // numST结构指针
4
// 被调用函数insert(),两个形参分别表示链表和待插入的结点 void insert (struct numST **phead, struct numST *p) { // 函数体开始 struct numST *q,*r; // 定义结构指针q,r if ((*phead)==null) // 第一种情况,链表为空 { *phead = p; // 链表头指向p return; // 完成插入操作,返回 } else // 链表不为空 { // 第二种情况,p结点num值小于链表头结点的num值 if ( (*phead)->num > p->num ) { // 将p结点插到链表头部 p->next = *phead;// 将p的next指针指向链表头(*phead) *phead = p; // 将链表头赋值为p return; // 返回 5 }
head
5
10 15 null
该链表的头结点由head所指向。
10
3、构造一个结点p,在p结点的数据域放12,再插入 链表 (1)p=(struct numST*) malloc(LEN); (2)p->num=12;; (3)p->next=null; 4、调用insert函数来插入p结点。 语句为 insert(&head,p); 意思是以将p插入到以head为队头的链表中。但这 里在调用时,不是用head作为实参,而是用&head 作为实参,属于传址调用,而非传值调用。
也就是说如果从键盘输入数据来建立二叉树第一个数据就是这棵树的根的数据之后再输入的数据每一个都要与根中的数据作比较以便确定该数据所在接点的插入位置
C语言第12章
Turbo C提供了一个自动检测显示器硬件的函数, 其调用格式 为: void far detectgraph(int *gdriver, *gmode); 其中gdriver和gmode的意义见表12.5。
【例12-3】自动进行硬件测试后进行图形初始化。 - #include <graphics.h> main() { int gdriver, gmode; detectgraph(&gdriver, &gmode); /*自动测试硬件*/ printf("the graphics driver is %d, mode is %d\n", gdriver, gmode); /*输出测试结果*/ getch(); initgraph(&gdriver, &gmode, "c:\\tc"); /* 根据测试结果初始化 图形*/ bar3d(10, 10, 130, 250, 20, 1); getch(); closegraph(); return 0; }
但某位为1时 表示相应的键已按,或相应的控制功能已有效, 但某位为 时,表示相应的键已按,或相应的控制功能已有效,如选参数 CMD为2,则有:key=bioskey(2)。 若key 值为 值为0x09,则表示右边的 为 ,则有: 。 ,则表示右边的Shift键 键 被按,同时又按Alt键 被按,同时又按 键。
第12章 C语言图形介绍 12章
Turbo C 提供了非常丰富的图形函数以实现图形程序设 计,所有图形函数的原型均在graphics.h中,本章主要介绍 键盘、鼠标、光标等的控制,主要的图形函数的功能、使 用方法,并用实例加以解释。本章的内容供有志于编写实 用系统的读者参考,在实际编写此类程序时可能还需要查 阅相关手册
第12章C语言
第12章运算符重载12.1 什么是运算符重载在第10章中曾介绍过函数重载,已经接触到重载(overloading)这个名词。
所谓重载,就是重新赋予新的含义。
函数重载就是对一个已有的函数赋予新的含义,使之实现新的功能。
因此,同一个函数名就可以代表多个不同功能的函数,也就是一名多用。
运算符也可以重载。
运算符重载的概念,其实并不陌生,只是此前没有做进一步的讲解。
如“+”加法运算符,在C语言中已经用的很多了。
在C++中,若对数值型数据进行“+、-、*、/”等操作,可写出如下程序int a,b,c;c=a+b; //对整型变量执行算术的加法运算。
float f1,f2,f3;f3=f1+f2; //对实型变量执行算术的加法运算。
从中可以看出,运算符“+”既可以实现整型变量的加法,又可以实现实型变量的加法。
这说明运算符“+”具有双重功能,它能够根据表达式中运算符两侧的数据类型自动调整该类型所需的数据操作方法。
这样,就可以将同一运算符用于不同的数据类型上实现功能相同的操作。
这就是C++中的运算符重载。
编译系统已经为基本数据类型定义(重载)了一些运算符。
如为数值型数据,定义有“+、-、*、/”等运算符;为关系运算定义了“>、>=、<、<=、!=、==”等运算符;为系统输入输出定义了“>>、<<”操作符。
但对于用户自定义的结构体及类只定义了赋值运算符“=”、成员访问运算符“.”和指针运算符“->”这三种运算符。
换句话说,编译系统在语法中赋予了这些运算符或操作符相应的功能。
编译源程序时,系统遇到什么操作符就执行什么操作。
若用户要对自定义类型数据进行算术、关系、或其他运算,就不能使用这些未加定义(重载)的运算符或操作符,如以下自定义类型数据的“+”运算。
struct fraction //定义表示分数(fraction)的结构体,为完成如(1/2)+(2/3)+(1/3)的加法{int numerator; //分子int denominator; //分母};fraction num1,num2,num3;num3= num1+ num2; //试图执行两个分数的加法运算,编译错误error C2676:num1= num3- num2; //试图执行两个分数的减法运算,编译错误error C2676:编译时提示error C2676:binary '+' : 'struct main::fraction' does not define this operator or a con- version to a type acceptable to the predefined operator错误。
C语言第十二章.ppt
int endangle, int xradius,int yradius);
12.1.5 封闭图形的填充
❖填充模式设置 void far setfillstyle(int pattern, int color); void far setfillpattern(char * upattern,int color); void far getfillpattern(char * upattern); void far getfillsetings(struct fillsettingstype far * fillinfo);
void far moverel(int dx, int dy); 移动游标从当前位置(x, y)移动到 (x+dx, y+dy)的位置, 移动过程中不画点。
❖画点函数 void far putpixel(int x, int y, int color); int far getpixel(int x, int y);
void far initgraph(int far *gdriver,
int far *gmode, char *path); 其中,gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所在的目录路径。其值参见 表12-1
void far detectgraph(int *gdriver, *gmode); 自动检测显示器硬件的函数, 用gdriver= DETECT 语句 进行初始化。
返回当前背景颜色值。
int far getcolor(void);
C语言程序设计 chapter12 文件PPT课件
11
高级语言程序设计
第12章 文件
2. 文件的三种基本使用方式
只读方式:为读(输入)文本文件打开文件。若文件
不存在,返回NULL。
只写方式:为写(输出)文本文件打开文件。若文件
不存在,则建立一个新文件;若文件已存在,
则清空文件。
追加方式:为写(输出)文本文件打开文件。若文件
高级语言程序设计
第12
高级语言程序设计
第12章 文件
存储到内存的各种类型的数据,当程序运 行结束, 这些数据随之消失, 下次再运行还要重 新输入。
用文件可以将输入或输出数据有组织的长 期保存在磁盘中。数据可以做到一次输入,反 复使用,提高输入输出效率。
“文件”是指一组相关数据的集合。每个 文件均有一个名称, 即文件名,可以唯一标识 一个文件。
定义文件指针的一般形式为:
FILE *指针变量标识符;
8
高级语言程序设计
第12章 文件
12. 2 文件的打开与关闭
其中FILE是由系统定义的一个结构体类型,该类
型的结构体中含文件相关信息。
typedef struct
{ sho在rtCle语ve言l; 中,无论对/*磁缓盘冲区文“件满还/是空”设程度*/
} 若ex文it(0件);打开成功,为该文件分配一个文件缓冲 区1. 和检一查个以F只IL读E方类式型打变开量文,件返名回为 一 个 FILE 类 型 指 针;“e:\\soft\\tc\\stu.txt ”的文件是否成功。
2.若e文xi件t函打数开的失作败用,:返结回束程NU序L的L。执行,并将实参0
文件名:需要打开的文件名称(字符串)。
文件使用方式:是具有特定含义的符号。