第八章 C#解析XML
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章 指针
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语言11结构体与共用体
struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)
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()函数用来打开一个文件,其调用的一般形式为:
C语言第8章 指针
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
《C语言程序设计(第五版)》-第8章编译预处理
此程序段将显示SIZE,而不是1000。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
说明:
(5)可以引用前面已经定义的宏名来定义新的宏,示例代码如 下: #define I1 30 #define I2 60 #define J I1+I2 #define K J*2+J/2+I2
其含义是用指定的宏名(即标识符)来代表其后的字符串。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
示例代码如下: #define SIZE 1000 #define PI 3.1415926 #define FORMAT "%d,%d,%d\n"
用标识符SIZE来代替字符串1000, 用标识符PI来代替字符串3.1415926, 用标识符FORMAT来代替字符串"%d,%d,%d\n", 在编译预处理时,将程序中在该命令以后出现的所有的SIZE用1000
本章教学重点:宏定义的两种形式,文件 包含的使用方法。
本章教学难点:带参数的宏定义。
C语言程序设计
第8章 编译预处理
主要内容:
8.1 宏定义 8.2 “文件包含”处理 8.3 条件编译
C语言程序设计
第8章 编译预处理
第8章 编译预处理
编译预处理是指一些行首以#开头的特殊语句。 在对程序进行通常的编译之前,必须先对程序中这 些特殊的命令进行“预处理”,即根据预处理命令, 对程序作相应的处理。
第8章 编译预处理
本章概述 本章的学习目标 主要内容
第八章 碳卤键的化学
8.1 碳卤键的性质
热稳定性-均裂
CH3-X: 451.9(F);351.8(Cl);292.9(Br);221.8(I); CH3CH2-X: 444.1(F);340.7(Cl);288.7(Br);225.9(I);
反应性-异裂
偶极矩(Debye): 1.82(F);1.94(Cl);1.79(Br);1.64(I); 键长(pm): 139 (F);176 (Cl);194 (Br);214 (I); 卤代烃与亲核试剂的反应活性大小顺序通常为: RF<RCl<RBr<RI
C2H5OH 25oC C3H7OC2H5 91% CH3CH CH2 9%
CH3CH2CH2Br + C2H5O-
CH3 CH3CH CH2Br + C2H5OCH3 C2H5OH 25oC CH3CH CH2OC2H5 40% CH3C CH3 CH2 60%
(B)叔卤代烃一般倾向于发生消除反应,只有在溶剂解的 条件下,才会发生单分子亲核取代反应。
OH
I2
红磷
三氯化磷不适合制备伯氯代烷,五氯化磷则可以。该方法 主要用于溴代烷和碘代烷的制备,氯代烷用二氯亚砜可以 更方便的制备。且上述方法合成时不会发生重排。
(3)醇与亚硫酰氯(或二氯亚砜)的作用
R CH2 OH SOCl2 Cl + SO2 + HCl
R
CH2
(4)卤素的置换 主要用于伯碘代烷的制备。
R'CH CHCH2CHR Br H2 Pt or Pd R'CH2CH2CH2CH2R
8.4 卤代烯烃或芳烃
8.4.1 卤代烯烃的分类和性质
C2H5O > HO- > C6H5O > CH COO3
《C语言程序设计》教材习题答案第8章
一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。
7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。
例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。
《C语言程序设计》课后习题答案第八章
8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。
void main(){ int Mgy(int x,int y);int Mgb(int z);int a,b,mgy,mgb;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);mgy=Mgy(a,b);mgb=Mgb(a,b,mgy);printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);}int Mgy(int x,int y){ int r,temp;if(x<y){ temp=x;x=y;y=temp;}while(x%y!=0){ r=x%y;x=y;y=r;}return y;}int Mgb(int x,int y,int z){ return (x*y/z);}8.2 求方程ax²+bx+c=0的根,用三个函数分别求当b²-4ac大于零、等于零和小于零时的根,8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。
#include<math.h>void main(){ int Isprime(int a);int m,temp=0;printf("请输入一个数:\n");scanf("%d",&m);temp=Isprime(m);if(temp==0) printf("%d不是素数。
\n",m);else printf("%d是素数。
\n",m);}int Isprime(int a){ int i,k,flag;if(a==0||a==1) flag=0;else{ k=sqrt(a);for(i=2;i<=k;i++)if(a%i==0) flag=0; }return flag; }8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格空8.9编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符8.10 写一个函数,输入一行字符,将此字符串中最长的单词输出。
数据结构(C语言)第八章 排序
直接插入排序过程
0 21 1 25 2 49 3 4 25* 16 5 08 temp
i=1
0 21
21
1 25
25 25
2 49
49 49
3 4 25* 16
25* 16 25* 16
5 08
08 08
temp 25
i=2
21
49
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
希尔排序 (Shell Sort)
基本思想设待排序对象序列有 n 个对象, 首 先取一个整数 gap < n 作为间隔, 将全部对 象分为 gap 个子序列, 所有距离为 gap 的对 象放在同一个子序列中, 在每一个子序列中 分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划 分和排序工作。直到最后取 gap == 1, 将所 有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。
第八章 排序
概述
插入排序
交换排序 选择排序 归并排序 基数排序 各种内排方法比较
概 述
排序: 将一个数据元素的任意序列,重新
排列成一个按关键字有序的序列。
数据表(datalist): 它是待排序数据对象的
有限集合。
主关键字(key): 数据对象有多个属性域,
即多个数据成员组成, 其中有一个属性域可用 来区分对象, 作为排序依据,称为关键字。也 称为关键字。
直接插入排序 (Insert Sort)
基本思想 当插入第i (i 1) 个对象时, 前面的 R[0], R[1], …, R[i-1]已经排好序。这时, 用 R[i]的关键字与R[i-1], R[i-2], …的关键字顺 序进行比较, 找到插入位臵即将R[i]插入, 原 来位臵上的对象向后顺移。
第八章 函数1函数概述
第八章函数8、1 函数概述1、C语言的函数:C语言的函数是子程序的总称,包括函数和过程。
(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。
C语言函数可以分为库函数、用户自定义函数。
库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。
2、C语言的程序由函数组成,函数是C语言程序的基本单位。
前面章节介绍的所有程序都是由一个主函数main组成的。
程序的所有操作都在主函数中完成。
事实上,C语言程序可以包含一个main函数,也可以包含一个main函数和若干个其它函数。
C语言程序的结构如图所示。
在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。
如果不考虑函数的功能和逻辑,其它函数没有主从关系,可以相互调用。
所有函数都可以调用库函数。
程序的总体功能通过函数的调用来实现。
3、使用函数的意义(补充)有些同学提出,我只用一个main函数就可以编程,为什么这么复杂,还要将程序分解到函数,还要掌握这么多概念,太麻烦了?我们说对于小程序可以这样做,但是对于一个有一定规模的程序这样做就不合适了。
使用函数的几个原因:(1)使用函数可以控制任务的规模一般应用程序都具有较大的规模。
例如:一个齿轮误差分析软件系统的源程序行数要数千行。
一个传动链计算机辅助设计系统的源程序行数5万多行。
使用函数可以将程序划分为若干功能相对独立的模块,这些模块还可以再划分为更小的模块,直到各个模块达到程序员所能够控制的规模。
然后程序员再进行各个模块的编制。
因为各个模块功能相对独立,步骤有限,所以流程容易控制,程序容易编制,修改。
一般一个模块的规模控制在源程序60行以内(但是也不必教条化)。
(2)使用函数可以控制变量的作用范围变量在整个模块范围内全局有效,如果将一个程序全部写在main()函数内,大家可以想象,变量可以在main函数内任何位置不加控制地被修改。
c语言第八章 函数
教学进程
8.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
C语言程序设计_2 第8章 数组
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}} a[3][3]={{1 },{4 },{7
.2). 按行连续赋值 把数组元素顺序赋值。例如: 把数组元素顺序赋值。例如:
int a[5][3]={1,2,3,4,5,6,7,8,9} a[5][3]={1
通常写为如下矩阵形式,比较直观: 通常写为如下矩阵形式,比较直观:
二维数组存储是按行排列的, 二维数组存储是按行排列的, 即放完一行之后顺次放入第二 行。
8.2.2 二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为: 二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标1][下标 数组名[下标1][下标2] 下标2
其中下标应为整型常量或整型表达式。例如: 其中下标应为整型常量或整型表达式。例如:
8.2 二维数组
只有一个下标的数组称为一维数组, 只有一个下标的数组称为一维数组,其数组 元素称为单下标变量。 元素称为单下标变量。有多个下标的数组称为 多维数组, 其数组元素称为多下标变量。 多维数组, 其数组元素称为多下标变量。 最 常用的是二维数组, 常用的是二维数组,更高维数的数组与二维数 组相似。 组相似。
8.1.2 数组元素的表示方法
数组元素是数组的基本单元,它是一种变量,其标识方法为 数组元素是数组的基本单元, 它是一种变量, 数组名后跟一个下标。下标指定元素在数组中的顺序号。 数组名后跟一个下标。下标指定元素在数组中的顺序号。数组元 素的一般形式为: 素的一般形式为:
数组名[下标] 数组名[下标]
例如,单独使用一个下标变量: 例如,单独使用一个下标变量:
int a[10]; a[10] a[7]=6; a[7]=6
高等有机第八章碳氧重键的亲核加成反应
2014-12-28
1
当羰基进行加成反应时,一般是带有负电
荷或具有未共用电子对的基团或分子(亲核试
剂)先进攻羰基碳原子,然后是带正电荷的部
分(亲电试剂)加到羰基氧原子上。由于决定整
个反应速率的是第一步,即亲核的一步,所以
称为亲核加成反应( nucleophilic addition )。
2014-12-28
Ph Ph
C=O
2014-12-28
7
CH3CHO
PhCHO
HCN
OH H C CN CH3
OH H C CN Ph
K>104
K=210
HCN
2014-12-28
8
例如:按亲核加成反应的活泼顺序排列:
A. ClCH 2CHO B. CH2=CHCHO C. CH3CH2CHO D. BrCH 2CHO
2014-12-28
29
2. Claisen 酯缩合反应及相关反应
两个酯分子至少有一个酯分子是含有α-氢
在强碱的作用下,相互缩合成β-羰基酯
2
-OC2H5 CH3COC2H5
O
O CH3CCH2COC2H5
O
反应机理: 第一步
O CH3 COEt
2014-12-28
NaOC2H5 C2H5OH
O CH2 COEt
甜菜碱
Ph3P
氧磷环丁烷
R R2
2014-12-28
1
R3 C C R4
17
+ Ph3P O
3. Wittig试剂的应用
(1)合成醛
O + Ph3P CHOCH3
H+
CHOCH3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.1 C#读写XML的几种方式
C# XML解析方法之DOM:
DOM的好处在于它允许编辑和更新XML文档,可以 随机访问文档中的数据,可以使用XPath查询。但是, DOM的缺点在于它需要一次性的加载整个文档到内 存中,对于大型的文档,这会造成资源问题。 在.NET中使用XML DOM分析器(XMLDocument) 实现DOM模型。
CurrentElement=(XmlElement)IE.Current;-- 此 处 要 把 类 型 为 object 的 Current转为Xmlelement MessageBox.Show(CurrentElement.OuterXm: 1) 用XmlDocument对象并用XML填充其 2) 确定要插入的位置并定位到此位置 3) 创建节点(其实也可为:Element、Attribute、Text、 Comment、CDATA或Processing &Instruction) 4) 再在XmlDocment对象中添加节点 ( 注 意 : 添 加 节 点 只 有 三 种 方 法 而 已 。 AppendChild() 、 InsertBefore()还有InsertAfter();)
RemoveChild(); RemoveAttribute();
RemoveAll();
8.2 DOM
六、加载和保存XML文档 使用Load()方法和Save()方法来对XML文档进行 加载和保存,这个功能的代码如下所示:
xmlDocument.Load( XMLFileName );
xmlDocument.Save( XMLFileName );
8.1 C#读写XML的几种方式
XML解析方法之“推”模型:
“推”模型也就是常说的SAX,SAX是一种靠事件 驱动的模型。它每发现一个节点就用“推”模型引发 一个事件,而我们必须编写这些事件的处理程序,很 麻烦。
8.1 C#读写XML的几种方式
C# XML解析方法之“拉”模型:
.NET中使用的是基于“拉”模型的实现方案。 “拉”模型在 遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引 发事件,允许我们以编程的方式访问文档,这大大的提高了灵 活性,“拉”模型可以选择性的处理节点。在.NET中,“拉” 模型通过XML阅读器(XMLTextReader类)来实现的。该类提供 Xml文件读取的功能,它可以验证文档是否格式良好,如果不 是 格 式 良 好 的 Xml 文 档 , 该 类 在 读 取 过 程 中 将 会 抛 出 XmlException异常。任何时候在内存中只有当前节点,但它是 只读的,向前的,不能在文档中执行向后导航操作。
8.2 DOM
//方法一 //XmlNodeList el=n.ChildNodes; 得到n的所有子节点集 //方法二 //XmlNodeList el=n.SelectNodes("book"); //方法三 //XmlElement rootEle=doc.DocumentElement; //XmlNodeList el=rootEle.GetElementsByTagName("book");
8.1 C#读写XML的几种方式
SAX提供了一种对XML文档进行顺序访问的模式,这是一种 快速读写XML数据的方式。SAX接口是事件驱动的,当使用 SAX分析器对XML文档进行分析时,就会触发一系列事件, 并激活相应的事件处理函数,从而完成对XML文档的访问。 SAX处理XML的方式与DOM不同。SAX解析器不是将DOM树 解析和表现为输出,它是基于事件的,所以在XML被解析时, 事件被发送给引擎。SAX可以在文档的开始接收事件,也可 以接收文档中的元素。使用这些事件可以构建一种结构。因 为SAX没有把XML文档完全地加载到内存中,所以需要的系 统资源较少,是一个分析大型XML文档的高效API。缺点是编 写SAX比编写DOM复杂,这因为首先必须实现通知接口并维 护状态,其次SAX不允许对文档进行随机访问,也没有提供 像DOM那样的修改功能。
8.2 DOM
二 、 再 声 明 一 XmlElement 变 量 对 象 并 用 doc.DocumentElement来赋值(得到XML文件的 根元素不是根节点)
XmlElement root=doc.DocumentElement();
8.2 DOM
三、查找节点再进行相应的操作:
1) 查找单个节点可有两种方法,一种是:用Get系列方 法 , 如 GetFirstChild(), 另 一 种 方 法 是 SelectSingleNode(“相应的XPath字符串”); 2) 也 可 查 找 节 点 集 有 两 个 对 象 XmlNodeList 与 XmlNamedNodeMap,共五种方法:前者用得比较多, 而后者是处理无序节点集多处理Xml片段
(三):创建其他类型的节点
XmlDocument.CreateComment()方法进行注释节点 XmlDocument.CreateCDataSection() XmlDocument.CreateProcessingInstruction()
8.2 DOM
五、修改和删除节点 ReplaceChild(); SetAttribute();
8.1 C#读写XML的几种方式
SAX和DOM在实现过程中,分别侧重于不同的方面以满足不 同的应用需求。DOM为开发基于XML的应用系统提供了便利。 它通过一种随机访问机制,使得应用程序利用该接口可以在 任何时候访问XML文档中的任何一部分数据,也可以对XML 文档中的数据进行插入、删除、修改、移动等操作。在DOM 中,文档的逻辑结构类似一棵树。文档、文档中的根、元素、 元素内容、属性、属性值等都是以对象模型的形式表示的。 DOM的优点在于它在内存中保存文档的整个模型。这使得能 以任何顺序访问XML元素。然而,对于大型文档来说,这样 做可能不方便。因为它可能会用尽内存,或者当系统达到了 它的极限时,机器的性能将会慢下来。
//方法四 //XmlNodeList el=doc.GetElementsByTagName("book"); //方法五 //略
8.2 DOM
3)、可用以下三种方法来循环处理节点集
方法一: foreach(XmlElement ele in el) { MessageBox.Show(ele.OuterXml); } 方法二: for(int i=0;i<el.count;i++) { MessageBox.Show(el[i].OuterXml); }
XmlAttribute
表示一个XML 文档中的一个 元素的属性
XmlNodeList
表示一个XML文档 中的节点的列表
8.2 DOM
用C#来处理DOM主要的几个步骤如下:
一、先声明一XmlDocument对象并装载XML文件或片 段;
XmlDocument doc=new XmlDocument(); --不要忘记了导入System.Xml哦 doc.load("test.xml"); --doc.loadXml("<book>abc</book>");
8.2 DOM
(一):创建元素节点
XmlElement elem=doc.CreateElement("price"); XmlElement(对象).InnerText(); XmlNode(对象).CreateTextNode();
(二):为元素节点设置属性
SetAttribute()此方法是有则改,无则创.
8.2 DOM
下图阐述了Application和DOM交互的过程:
8.2 DOM
DOM既然是在内存中创建树型结构视图进而提 供编程接口,那我们就以下面这个XML片段来 说 明 DOM 是 如 何 创 建 树 型 结 构 的 :
<parent> <child id=”123”>text here</child> </parent>
8.2 DOM
方法三:
System.Collections.IEnumerator IE=doc.GetElementsByTagName(“book”).GetEnumerator(); --由上面的GetEnumerator(); 返回 Collections.IEnumerator 对象 XmlElement CurrentElement; while(IE.MoveNext()) {
8.1 C#读写XML的几种方式
比较而言,DOM和SAX各有自己的应用场合。 DOM适用于处理下面的问题:解析比较小的 XML文件;需要对文档进行修改;需要随机对 文档进行访问。 SAX适于处理下面的问题:对大型文档进行处 理;只需要文档的部分内容;只需要从文档中 得到特定信息。
8.1 C#读写XML的几种方式
8.2 DOM
如果用DOM加载以上文档,它将在内存中创建的树 型结构如下图:
8.2 DOM
.NET DOM的继承结构:
8.2 DOM
类 名 描 述 类 名 描 述
XmlDocument
表示一个XML DOM 文档的类
XmlElement
表示一个XML 文档中的元素
XmlNode
表示一个XML 文档中的节点
8.2 DOM
DOM的全称是Document Object Model(文档对象模 型),它是来自W3C的官方标准,它允许按照W3C标 准W3C DOM Level1和W3C DOM Level2的规范所定义 的规则,通过编程来读取,操纵和修改XML文档。 DOM的工作方式是:首先将XML文档一次性的装入内 存,然后根据文档中定义的元素和属性在内存中创建 一个“树型结构”也就是一个文档对象模型,这里的 含义其实是把文档对象化,文档中每个节点对应着模 型中一个对象,而我们都知道对象提供编程接口,所 以在Application中我们正是使用这组对象来访问XML 文档进而操作XML文档,