第八章 C#高级编程
C语言 第八章

p
printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2);}
三、指针变量作为函数参数 作用:将一个变量的地址传送到另一个函数中。 作用:将一个变量的地址传送到另一个函数中。 例1:编写实现两个数的交换的函数 : swap(int *p1, int *p2) *p2) void swap(int *p1, int swap(int x,int y) {{ int temp; 定义为*temp? ? int temp; 定义为 { int temp; temp=*p1; temp=x; temp=*p1; *p1=*p2; x=y; *p1=*p2; y=temp; } *p2=temp; } *p2=temp; } main() main() main() { int a,b,*p1,*p2; { int a,b; { int a,b p1=&a;p2=&b; scanf("%d,%d",&a,&b); scanf(“%d%d”,&a,&b); scanf(“%d%d”,p1,p2); swap(a,b); swap(&a,&b); swap(p1,p2); printf("\n%d,%d\n",a,b); printf("%d, %d\n",a,b); printf("%d, %d\n",a,b); }} }
个字节的问题) 个字节的问题)
二、指针变量的引用 “&”(地址运算符 取变量的存储地址。如:&a求变量 的地址。 地址运算符) 取变量的存储地址。 地址运算符 求变量a的地址 求变量 的地址。 “*” (引用运算符 取指针所指向变量的内容。&与*优先级相同, 引用运算符) 取指针所指向变量的内容。 与 优先级相同 引用运算符 优先级相同, 但按自右至左的结合方向。 但按自右至左的结合方向。 例如: 例如:int i=3,*p; p=&i;
c语言第8章 编译预处理及位运算习题答案

编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
《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二级 第8章 指针

1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。
因此B选项正确。
3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。
因此C选项正确。
4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。
《C程序设计》(第三版)第8章 函数(嵌套及递归调用)

递归算法必须有结束递归条件,否则会产生死机现象! 递归算法必须有结束递归条件,否则会产生死机现象!
11
2.递归函数的执行过程
【例】编一递归函数求n!。 编一递归函数求 。
思路:以求 的阶乘为例 的阶乘为例: 思路:以求4的阶乘为例 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 , , , , 。 递归结束条件: 递归结束条件:当n=1或n=0时,n!=1。 或 时 。 递归公式: 递归公式:
2
(4)函数fun的功能是计算x2-2x+6,主函数中将调用fun函数计算: (4)函数 函数fun的功能是计算 2x+6,主函数中将调用fun函数计算 的功能是计算x 函数计算: y1=(x+8)2-2(x+8)+6 y2=sin2x-2sinx+6 请填空。 请填空。 #include<math.h> fun(double x) double ; main() { double x,y1,y2; scanf(“%lf”,&x); x+8 y1=fun( ); sin(x) ); y2=fun( printf(“y1=%lf,y2=%lf\ printf(“y1=%lf,y2=%lf\n”,y1,y2); } double fun(double x) { return (x*x-2*x+6); } (x*x3
高树芳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.读字符函数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.2.1 文件的打开与关闭
2. 文件关闭函数fclose() 文件一旦使用完毕,为避免文件数据丢失等错误的发生, 可用文件关闭函数将其关闭。 函数调用的一般形式是: fclose(文件指针); 例如: fclose(fp); 正常完成关闭文件操作时,fclose()函数返回值为0, 如果返回非零值则表示有错误发生。
检查各种输入输出函数对文件进行读写时是否 出错,返回值为0表示未出错,否则表示有错。
8.2.2 文件检测与定位
2.文件的定位函数 在文件内部有一个位置指针,用来指向文件中当前被读写 的字节。 在文件打开时,该指针总是指向文件的第一个字节。 它不同于文件指针,文件指针是指向整个文件的,须在 程序中定义说明,只要不重新赋值,文件指针的值是不变的。 文件内部的位置指针是指示文件内部的当前读写位置, 比如每读写一次,该指针均会向后移动,它不需在程序中定 义说明,而是由系统自动设置的。
在stdio.h中定义了两个文件操作过程中经常用到的符号常量
8.2 文件操作
另外 在stdio.h中定义了两个文件操作过程中经常用到的符号常量 NULL:表示空指针,值为0 EOF: 表示文件末尾,值为-1 通过文件指针就可以完成对文件的操作 文件操作的过程一般有如下步骤:
1. 说明一个文件指针; 2. 通过文件名打开文件,并为文件指针赋值; 3. 通过文件指针对文件进行存取(即读或写操作) ; 4. 关闭文件。
8.2.1 文件的打开与关闭
1. 文件打开函数fopen()
文件在进行读写操作之前要先打开,使用完毕要关闭
所谓打开文件,实际上是建立文件的各种信息,并使 文件指针指向该文件,以便进行其它操作。 fopen()函数用来打开一个文件,其调用的一般形式为:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
关键字 new
相同字段
new
//要求 new 访问修饰符
隐藏继承成员
//将执行派生类的变量
将输出派生类中的 val
13
class Student { public virtual void StuInfo() { Console.WriteLine(“此方法显示学生信息"); }} class ExpStudent: Student { public override void StuInfo() { base.StuInfo(); Console.WriteLine(“此方法重写 base 方法"); }}
4
private Barking() { // 定义 } private Wagging_Tail() { } }
继承 C# 中的类
多重继承
public class Graduate: Student, Employee { // 成员变量 // 成员函数 }
允许多重接口实现
5
public class Student:Person Person 基类 派生类 { private string _school; _name; 调用的基类成员 private uint _eng; _age; 无法实现 GetInfo() 和 public uint _math; privatevoid GetInfo() DispInfo() 方法 { private uint _sci; Console.WriteLine("请输入您的姓名和年龄"); public void Console.ReadLine(); _name = GetMarks() { _age = uint.Parse(Console.ReadLine()); } Console.WriteLine(“请输入学校名称"); public void DispInfo() _school = Console.ReadLine(); { Console.WriteLine("请分别输入英语、数学和自然科学的分数。"); static void Main(string[] args) _eng = uint.Parse(Console.ReadLine()); Console.WriteLine("尊敬的 {0},您的年龄为 {1} ", _name, _age); { } _math = uint.Parse(Console.ReadLine()); Student objStudent = new Student(); } _sci = uint.Parse(Console.ReadLine()); objStudent.GetInfo(); Console.WriteLine(“所得总分为:{0}",_eng+_math+_sci); objStudent.DispInfo(); } objStudent.GetMarks(); }
using System; namespace Example_1 { 抽象类 – 不能实例化 abstract class ABC { public abstract void AFunc(); public void BFunc() { Console.WriteLine(“这是一个非抽象方法!"); } } 派生类 – 重写方法 class Derv : ABC { public override void AFunc() { static void Main(string[] args) Console.WriteLine(“这是一个抽象方法! "); { } } Derv objB = new Derv();
演示
10
关键字 override
Class Base { // 成员变量
Class Derived int basevar; : Base {
基类
派生类 base 方法的新实现
// 成员函数 // 成员变量
int derivedvars; GetInfo() // 成员函数
{
override GetInfo()
9
public class Person { public string _name; public uint _age; public Person(string name, uint age) { this._name args) static void Main(string[]= name; this._age = age; { Console.WriteLine(_name); //构造 Student Console.WriteLine(_age); public class Student:Person }Student objStudent = new Student("XYZ", 45, 001); { 还将调用 Base 构造函数 } private uint _id; } public Student(string name, uint age, uint id):base(name, age) { this._id = id; Console.WriteLine(_id); } }
3
Derived …….
继承 2-2
Class Animal { // 成员变量 int eyes, nose; Animal() {
基类 继承的层次结构示例
动物
基类 派生类
Class Dog : Animal { // 成员变量
狗
}
eyes = 2; nose = 1;
// 成员函数
马
派生类
Pet_Animal() { // 定义 } }
// 成员变量
// 成员函数 int derivedvars;
抽象方法
abstract void base_fun1(parameters); // 成员函数
override // 无法实现void Base_fun1(parameters) {
……. // 实际实现 }
} ...
必须重写 重写
16
static void Main(string[] args) { ExpStudent objStudent = new ExpStudent(); objStudent.StuInfo(); Student objSuper = objStudent; objSuper.StuInfo(); }
}
演示
6
基类 public class Person Student:Person public class UnderGraduate:Student { { 派生类 private string _schoolname; private string _name; public void Check() private uint _engscore; private uint _age; { private uint _mathscore; public void GetInfo() Console.WriteLine("要上升一级,要求总分不低于 private uint _sciscore; { 150 "); private uint _totscore; Console.WriteLine("请输入您的姓名和年龄"); if(this.GetMarks() >=150) public uint GetMarks() = Console.ReadLine(); _name Console.WriteLine(“pass"); { _age = uint.Parse(Console.ReadLine()); else } Console.WriteLine(“请输入学校名称"); Console.WriteLine(“not pass"); public void DislayInfo() _schoolname = Console.ReadLine(); } { Console.WriteLine("请输入英语、数学和自然科学的分数。 "); } public static void Main(string[] args) _engscore = uint.Parse(Console.ReadLine()); Console.WriteLine("尊敬的 {0},您的年龄为 {1}", { _mathscore = uint.Parse(Console.ReadLine()); _name, _age); UnderGraduate objUnderGraduate = new UnderGraduate(); _sciscore = uint.Parse(Console.ReadLine()); } objUnderGraduate.GetInfo(); _totscore = _engscore + _mathscore + _sciscore; } objUnderGraduate.DisplayInfo(); Console.WriteLine("所得总分为:{0} ",_totscore); objUnderGraduate.Check(); return _totscore; } }}
ZJWCHC
第八章
C#高级编程 高级编程
目标
理解继承 在C# 中使用继承 在C#中使用接口 中使用接口 在C#中使用方法的重写 中使用方法的重写 理解属性及其不同的类型、 理解属性及其不同的类型、实现 理解和使用索引器 实现委托 定义和触发事件
2
继承 2-1
基类 Class Base { // 成员变量
Class Derived int basevar; : Base {