C语言程序设计8

合集下载

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

C语言程序设计 项目八

C语言程序设计 项目八

2. fread()函数、fwrite()函数 函数、 函数 函数
将一组数据,如一个数组元素,一个结构变量的值等一次性读写,其输入输 出函数是二进制形式输入输出的函数,在输入输出中不必进行数据的转换,输入 输出速度相对较快。 读写数据块函数调用的一般形式为: 读写数据块函数调用的一般形式为: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 说明: buffer:对于fread()来说,指的是 读入数据的存放地址; 对于fwrite来说,是要输出数 据的地址。 size读写数据时,每笔数据的大小 count: 读写数据的笔数 fp: 文件指针
for(i=0;i<10;i++,pp++) fscanf(fp,"%s%d%d%d%f",pp->name,&pp>math,&pp->englist,&pp->chinese,&pp->avg);
fread(yy,sizeof(struct stu),10,fp);
【例8-2】从键盘中输入10个学生的姓名及数学、英语、语文三门课的成绩,计算每个同 学的平均分,然后将此10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中。 printf("请输入十个学生的数据\n"); 程序如下: /*输入十个同学的姓名、成绩并计算每个 输入十个同学的姓名、 输入十个同学的姓名 分析:编写此题的思路是: #include "stdio.h" 同学的平均分*/ 同学的平均分 #include "process.h" (1)需要定义一个结构体数组,用于存放10个同学的姓名、三门课的成绩及平均分; for(i=0;i<10;i++,pp++) /*定义结构体 定义结构体*/ 定义结构体 (2)在键盘上读入10个同学的姓名、三门课的成绩,然后计算每个同学的平均分; 打开件aa.txt {scanf("%s%d%d%d",pp->name,&ppstruct stu 输入的数据如下: (3)将10个同学的姓名、三门课的成绩及平均分写入到文本文件aa.txt中; >math,&pp->english,&pp->chinese); {char name[10]; pp->avg=(pp->math+pp->englist+ppint math,english,chinese; >chinese)/3.0;} float avg;} pp=student; main() /*将十个同学的姓名、三门课成绩、平均 将十个同学的姓名、三门课成绩、 将十个同学的姓名 {stu student[10],*pp; 分写入到文件aa.txt中*/ 分写入到文件 中 FILE *fp; for(i=0;i<10;i++,pp++) int i; fprintf(fp,"%s %d %d %d %.1f\n",pppp=student; >name,pp->math,pp->english,pp/*以写入的形式打开文件 以写入的形式打开文件aa.txt*/ 以写入的形式打开文件 >chinese,pp->avg); if((fp=fopen("aa.txt","w"))==NULL) fclose(fp); //关闭文件 {printf("打不开文件\n"); } exit(1); }

C语言程序设计-第8章 练习题

C语言程序设计-第8章  练习题

一、单项选择题题目1标准输出设备显示器的文件流标识符是()。

a. stdinb. stdoutc. stderrd. stdio题目2表示文件结束符的符号常量EOF的值为()。

a. 0b. -1c. 1d. 127题目3假定一个磁盘数据文件占用n个字节的存储空间,则按字节进行编址的范围是()。

a. 1˜(n-1)b. 0˜(n-1)c. 0˜nd. 1˜n题目4在C语言中,为只写操作打开一个文本文件的方式为()。

b. "w"c. "r"d. "a"题目5在C语言中,文本文件的打开方式共有()。

a. 6b. 9c. 12d. 3题目6在C语言中,为读和写操作打开一个二进制文件,若文件不存在则自动建立空文件的打开方式为()。

a. "ab+"b. "w+"c. "rb+"d. "wb+"题目7从一个文本文件中读取以换行符结束的一个字符串的系统函数为()。

a. fgets()b. fputc()d. fputs()题目8向一个文本文件中写入一个字符的系统函数为()。

a. fputs()b. fputc()c. fgetc()d. fgets()题目9向一个二进制文件中写入数据的系统函数为()。

a. fputc()b. fwrite()c. fread()d. fputs()题目10从一个二进制文件中读取数据的系统函数为fread(),它的参数有()。

a. 2个b. 4个c. 3个d. 5个二、判断题题目11一个磁盘数据文件的文件名由文件主名和扩展名所组成,其中间用圆点分开。

对错题目12当向字符文件输出一个换行符时,实际将输出的是回车符或换行符。

对错题目13C语言系统中提供一个用来描述文件属性的类型标识符为FILE。

对错题目14在数据文件打开方式字符串中,字符r、w和a具有确定的含义,分别代表读、写和追加方式。

C语言程序设计第8单元

C语言程序设计第8单元

二维数组的地址
【例8.9】使用指针变量输出二维数组元素 #include<stdio.h> main() { int a[2][3]={{1,2,3},{4,5,6}},*p;
for(p=a[0];p<a[0]+6;p++) { if((p-a[0])%3==0)printf("\n");
printf("%2d",*p); } }
0x62fe3a
0x62fe3b
0x62fe3c
数组指针的运算
对于指针变量p,可以做以下运算: p++,p--,p+i, p-i, p+=i, p-= i等。
#include <stdio.h> main() { int a[]={1,3,6,7,9,12};
int x,*p=&a[2]; x=(*--p)++; printf("x=%d\n",x); printf("a[1]=%d\n",a[1]); }
0x62fe50
二维数组的地址
#include <stdio.h>
main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,a1是1,1行2指}};针
printf("%x,%x,%x\n",a,a+1,a+2); printf("%x,%x,%x\n",*a,*(a+1),*(a+2)); *a是列指针
二维数组的地址
二维数组名是数组的首地址,二维数组名的基类型不是数组元素类 型,而是一维数组类型,因此,二维数组名a是一个行指针。

高树芳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语言程序设计(第3版)-参考答案 (8)

C语言程序设计(第3版)-参考答案 (8)

参考答案第 8 章字符、字符数组与字符串一、选择题二、编程题略。

习题一、选择题(1)char类型的变量存储时占据( A )个字节。

A)1 B)2 C)4 D)8 (2)以下选项中,不合法字符常量的是( C )。

A)'\\ ' B)'\xbb' C)'\019' D)'c' (3)已定义变量char c,( C )不能正确地给该变量赋值。

A)c=97 B)c='A' C)c=''B'' D)c='A'+6 (4)以下关于输入输出格式说明符的说法正确的是( A )。

A)%c是char数据的输入输出格式符B)%d是char数据的输入输出格式符C)%s是char数据的输入输出格式符D)%f是char数据的输入输出格式符(5)已知数字字符'0'的ASCII值为48。

以下程序运行后的输出结果是( B )。

#include<stdio.h>void main(){ char a='4',b='5';b=b+2;printf("%c,",b);printf("%d",b-a);}A)5,4 B)7,3 C)5,1 D)4,5 (6)以下选项中,( B )是正确的字符串。

A)'hello' B)"hello " C)hello D)'h' (7)以下语句中,( D )能够正确定义字符数组并存入字符串。

A)char str[]={'\064'}; B)char str="kx43";C)char str=''; D)char str[]="\0";(8)已有定义char a[]="xyz",b[]={'x','y','z'};,以下叙述中正确的是( C )。

C语言程序设计基础 第8章 数据文件处理技术

C语言程序设计基础 第8章 数据文件处理技术

offset为long型的位移量,以ptname为基准,移动 的字节数。
函数返回值:成功移动返回0,否则返回非0。
10. 函数fseek-例 【例1】 fseek (fp, 40L, SEEK_SET); 表示:将当前位置移到离文件头40个字节处。 【例2】 fseek(fp, 20L, SEEK_CUR); 表示:将当前位置移到离当前位置20个字节处。 【例3】 fseek(fp, -30L, SEEK_END);
文件不能打开时,函数 fopen()将返回空指针值 NULL。 程序应考虑到文件不能正常打开的极端情况,应用以下形式 的代码描述打开一个文件的要求: if ((fp = fopen(fname, "r")) == NULL) { printf("不能打开文件 %s。\n", fname); return; }
fputc()和fgetc()函数-例2
【例2】将一个文件中的数据复制到另一个文件中。 #include <stdio.h>
void main()
{ FILE *in, *out; char ch, infile[40], outfile[40]; gets (infile); if (( in = fopen(infile, "r")) == NULL) { printf ("不能打开源文件 %s\n", infile); scanf ("%*c"); return; } /* 起暂停作用 */
12. 成批读数据函数fread() 形式指向的文件读入count*size个字节,存入buffer。 函数返回值:读取成功返回count值,否则返回0。
说明:常用于二进制文件的读。

C语言程序设计 第3版 第8章 函数

C语言程序设计 第3版 第8章 函数

s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、位运算符和位运算
• 位运算符还可与赋值运算符相结合,进行 位运算赋值操作。如: a&=b 等价于 a=a&b a>>=b 等价于 a=a>>b
• 注意:位运算时的数据类型为char/int,分 析时要化为二进制形式,但在程序中书写 及输出结果时仍为char/int。
位运算符的使用
• 按位与 & (均为1时方为1)
结果:~a=-4,~b=-11
位运算符的应用
• 左移运算 << a<<n 将a中各位向左移n位,右端补0,高位溢出丢弃。 例: a= a<<n (可写为a<<=n),相当于a×2n(高位未溢出 【例五】以下程序的运行结果是 。 时) main()
{ unsigned int a=0x3ef,b; b=a<<2; printf("%x,%x\n",a,b); } A)3ef,fb B) 3ef,fbc C) fbc,3ef D) fbc,fbc 结果:B
位运算符的使用
• 按位取反 ~ (各位反转)
【例四】 计算 ~ a: main( ) 补码: 11111100 { 原码: 10000100 char a=3; ~ b: int b=10; 补码:11110101 printf(“~a=%d,~b=%d\n",~a,~b); 原码:10001011 }
高级语言程序设计
第八章 位运算
计算机基础教研室
本章主要内容
• C语言既是一种高级语言,广泛应用于应用 软件的开发和程序设计,同时又是一种低 级语言,可以用于系统软件的开发和程序 设计,如自动控制系统中的过程控制、参 数检测、数据通讯等控制程序,都可以综 合利用C语言中的指针操作、位运算和位段 技术来实现。 • 本章介绍位运算的基本形式和常用运算符, 并简要介绍位段的概念。位运算的深入学 习,应该在《计算机原理》和《汇编语言 程序设计》课程中进行。
Enter a and b: 20,30 a | b=30
计算
| 00100000 (a) 00110000 (b) 00110000 00010010 (a) 00100000 (b) 00110010
|
Enter a and b: 12,20 a | b=32
位运算符的使用
• 按位异或 ^ (二者相异方为1)
【例一】 main( ) { unsigned char a,b; printf(―Enter a and b:‖); scanf(―%o,%o‖,&a,&b); printf(―a&b=%o\n‖,a&b); }
Enter a and b: 20,30 a&b=20
计算
00010000 (a) & 00011000 (b) 00010000 00001010 (a) & 00010000 (b) 00000000
Enter a and b: 12,20 a&b=0
位运算符的使用
• 按位或 | (均为0时方为0)
【例二】 main( ) { unsigned char a,b; printf(―Enter a and b:‖); scanf(―%o,%o‖,&a,&b); printf(―a | b=%o\n‖,a|b); }
计算
结果:12,96
பைடு நூலகம்
位运算符的应用
• 右移运算 >>
a>>n 将a中各位右移n位,溢出则舍弃。 左端—— a为正数时(符号位为0),填0; a为负数时(符号位为1),填0或填1与系统有关 填0(逻辑右移) 填1(算术右移) TC使用算术右移
位运算符的应用
• 右移运算 >>
【例七】以下程序的运行结果是 main() { int a=9,b=-9; printf("%d,%d",a>>2,b>>2); } 。
【例三】以下程序的功能是将a数据的低4位取反。 #include <stdio.h> 计算 main() { 00111001 (a) unsigned char a=0x39, b= ; ^ 00001111 (b) a=a^b; 00110110 printf("%x\n", a); }
答案:0x0f
结果:2,-3
(-9的补码 :1111111111110111, 右移后为1111111111111101)。
应用示例
① 从整数a最右端 第m个位置开始 取该位开始右 面n位 。 算法如下: b=a>>(m-n+1) c=~(~0<<n) d=b&c 注:位自右向 左从0开始编号
应用示例
② 将一个整数
a循环右移n位。 算法如下: b=a<<(16-n) c=a>>n c=c|b
二、位段
• C语言允许在一个结构体中以位为单位来指 定其成员所占内存长度。这种以位为单位 的成员称为“位段”。
struct data { int i; unsigned int a:3; unsigned int b:5; unsigned int :3; unsigned int c:2; unsigned int :0; unsigned int d:3; unsigned int :0; float f; };
示例
/*非位段*/ /*占3位*/ /*占5位*/ /*无名位段——不可用*/ /*占2位*/ /*到下一字节起始处*/ /*占3位*/ /*到下一字节起始处*/ /*非位段*/
位运算符的应用
• 左移运算 <<
【例六】以下程序的运行结果是 。 已知:0x1f5为1 1111 0101 main() 且:∵a为1100 { ∴a<<3为1100000 int a=12,b; 111110101 b=0x1f5 & a<<3; & 001100000 printf("%d,%d\n",a,b); 001100000 = 96 }
• 教学目的与要求
–了解位运算的基本形式和常用运算符 –了解位段的概念 –掌握常用的位运算(按位与、按位或、按位取反) –了解位运算的应用(左移、右移)
• 重点与难点
– 常用位运算的计算
一、位运算符和位运算
• 位运算概述
所谓“位运算”,是指按二进制位进行运算。 位运算的特点:运算按二进制逐位进行—— 没有借位和进位。 位运算量:整型(int,short,unsiged,long)/ 字符型(以补码/ASCII码形式存储),不可 为实型。 位运算符:P319 表12.1 & | ^ ~ << >>
相关文档
最新文档