您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 计算机程序设计基础第10章
计算机程序设计基础基本概念程序设计中的数据基础结构化程序基础模块化程序设计基础程序设计中数据对象地址的处理方法构造类型数据处理基础字符串数据处理基础二进制位数据的处理基础文件数据处理基础程序设计的深入话题程序设计的深入话题数据类型的扩展技术特殊类型函数参数的处理技术C系统的编译预处理数据类型的扩展技术自引用结构和存储分配问题的提出应用程序处理的对象集由同种类型的对象组成;具体需要处理的对象个数不可预知;处理过程中经常进行对象的插入操作或删除操作;程序设计中应该采用的对策数据对象的动态创建;描述数据对象之间联系的描述方法;C语言中的自引用结构定义结构体构造数据类型的时候,结构体类型中的数据成员可以是该结构体类型自己的指针类对象(包括指针变量和指针数组)。这种在一个结构体类型定义中包含有该结构体类型指针类对象的结构体称为自引用结构。structtest{charch;structtest*next;};next是指针变量数据类型的扩展技术自引用结构和存储分配定义自引用结构应该注意的问题在结构体类型定义中可以包含指向自己的指针类对象,但不允许在结构体类型的定义中包含该类型的一般对象。structtest{charch;structtestnext;};自引用结构的扩展(两个结构相互引用)在应用程序的设计中如果需要两个结构体对象相互引用,可以使用自引用结构的变形,即在两个结构体类型的定义中分别包含指向对方的指针。错误!next是一般变量structA{intx;structB*pb;};structB{inty;structA*pa;};数据对象a数据对象b例10-1描述两个结构体数据对象之间的相互引用关系示例。数据类型的扩展技术自引用结构和存储分配C语言中的动态存储分配函数问题的提出程序处理的问题是:“从键盘上输入若干(要求输入字符串的行数在程序运行过程中指定)字符串行,然后将其输出到屏幕上”。则在应用程序中要处理的数据构造如图所示。...要处理的字符串的个数?每个字符串的长度?数据类型的扩展技术自引用结构和存储分配C语言中的动态存储分配函数存储分配函数malloc原型:void*malloc(unsignedintsize);功能:在主存储器中分配由size所指定大小的存储块,返回所分配存储块在存储器中起始位置(指针)。返回指针类型为void(空类型),在应用程序中应根据需要进行相应的类型转换。如果存储器中没有足够的空间分配,即当存储分配失败时返回NULL。数据类型的扩展技术自引用结构和存储分配C语言中的动态存储分配函数存储释放函数free原型:voidfree(void*ptr);功能:释放由指针变量ptr指明首地址的存储块,即将该块归还操作系统。例10-2从键盘上输入若干(要求输入字符串的行数在程序运行过程中指定)字符串行,然后将其输出到屏幕上。数据类型的扩展技术自引用结构和存储分配C语言中的动态存储分配函数重新分配存储函数realloc原型:void*realloc(void*ptr,unsignedintnewsize);功能:将以ptr值为首地址的存储块长度调整为newsize所指定的长度。分配成功时,若返回的新存储块首地址与由ptr确定的原首地址相同,则不需要进行原块内存放内容的拷贝;若返回的新存储块的首地址与ptr确定的原首地址不同,则需要将原块内存放内容的拷贝新分配的存储块中。例10-3在程序运行过程中反复输入若干字符串,再将输入的新串连接到原字符串上,当输入空行(直接按回车键)时结束输入过程。数据类型的扩展技术关键字typedef的应用typedef关键字的主要作用为已经存在的数据类型取一个新的名字(别名);根据需要构造复杂的数据类型;使用typedef为已经存在的数据类型取别名使用typedef可以为已经存在的数据类型取别名,定义别名后程序中既可以使用原类型名,也可以使用其别名。定义别名的一般形式为:typedef数据类型名别名;typedefintINTEGER;(为系统整型int类型取别名INTEGER)intj,k;等价于INTEGERj,k;typedefstructstudent{longnumber;structdatebirthday;charname[20];intage;charsex;charaddress[80];longtel;}STU;structstudent等价于STUstructstudent{longnumber;structdatebirthday;charname[20];intage;charsex;charaddress[80];longtel;};typedefstructstudentSTU;structstudent等价于STU例10-4用typedef取别名示例。数据类型的扩展技术关键字typedef的应用使用typedef构造复杂数据类型在不同的应用环境中对复杂结构数据的要求是不同的,所以使用typedef关键字构造复杂结构数据没有统一的形式,在应用程序中应该根据需要构造合适形式的数据类型。构造指定长度的字符串数据类型typedefcharString[100];String是字符串数据类型的类型名,其每个变量都可以容纳最多99个有效字符。Strings1;等价于chars1[100];例10-5用typedef构造指定长度的字符串数据类型。数据类型的扩展技术关键字typedef的应用使用typedef构造复杂数据类型构造指定行列的二维数组类型#defineN5#defineM10typedefintarr[N];typedefarrArray[M];Array是M行N列整型二维数组类型的类型名,其每个变量都是一个M行N列的整型二维数组。Arraya1;等价于inta1[M][N];例10-6用typedef构造指定行数和列数的二维数组类型。数据类型的扩展技术关键字typedef的应用使用typedef构造复杂数据类型构造指针数据类型typedefint*IP;IP是整型指针类型的类型名,其每个变量都是指向整型数据的指针变量。IPptr;等价于int*ptr;例10-7用typedef构造指针数据类型。数据类型的扩展技术关键字typedef的应用使用typedef构造复杂数据类型构造指向函数的指针数据类型typedefdouble(*FP)(float);FP是指向函数指针类型的类型名,其每个变量都是一个指向拥有一个float类型形参、返回值类型为double的函数的指针变量。FPptr;等价于double(*ptr)(floatx);例10-8用typedef构造指向函数的指针数据类型。程序设计的深入话题数据类型的扩展技术特殊类型函数参数的处理技术C系统的编译预处理特殊类型函数参数的处理技术命令行参数的处理命令行参数程序在运行时可以向程序内部传递外界的数据信息,即通过程序执行的命令行向程序中带入命令行上的参数。为了使程序运行时能从系统接收参数,C语言提供了程序在主函数中接收从命令行传递过来的实参的能力,这种参数称为命令行参数。主函数2个形式参数的意义整型参数用于记录命令行输入的参数个数,习惯上用标识符argc表示;指向字符的指针数组用于存放命令行上输入的各实参字符串的起始地址,即指针数组的每一个元素指向一个由命令行上传递而来的字符串,习惯上用标识符argv表示。voidmain(intargc,char*argv[])特殊类型函数参数的处理技术命令行参数的处理命令行参数在程序中形成的数据结构示例若有C源程序文件echo.cpp,程序中的主函数头为:voidmain(intargc,char*argv[])源程序文件编译连接后生成执行文件echo.exe执行程序时命令行为:echofile1.txtfile2.txtargv[0]argv[1]argv[2]“echo.exe”“file1.txt”“file2.txt”例10-9返回命令行上输入的参数字符串。例10-10编程序实现在指定字符串中查找并删除某一指定子字符串的功能,条件和要求如下:①查找函数的原型为:char*search(char*str1,char*str2);,编写该函数;②被处理的字符串和子字符串都从命令行输入。特殊类型函数参数的处理技术命令行参数的处理使用命令行参数时的注意点从命令行上带入的参数都是字符串,如果程序在功能上要求被带入的参数不是作为字符串使用,则需要在应用程序中进行合适的转换。例10-11编制程序实现两个整数相加的功能,要求参加操作的两个整数从命令行带入。基本思想:由于在命令行上带入的参数都是字符串,所以在程序中应该使用语言提供的字符串到整数转换函数atoi将命令行上提供的数字字符串转换为整型数据在进行处理。特殊类型函数参数的处理技术变长参数列表的处理变长参数列表的概念调用函数时实参的个数可以是不固定的,要求被调函数在设计时具有不定个数的形式参数。C程序设计语言通过在变长参数头文件stdarg.h中提供的类型定义va_list和宏va_start、va_arg以及va_end对函数的变长参数进行支持。va_list类型用来保存处理变长参数宏va_start、va_arg和va_end所需信息的一种数据类型。在变长参数处理的函数中,必须定义(声明)一个该类型的变量,才能通过这个变量访问函数变长参数列表中的参数。特殊类型函数参数的处理技术变长参数列表的处理va_start宏变长参数处理的初始化宏,其初始化的对象为已经定义的va_list类型对象,其初始化的结果供宏va_arg和va_end使用。例如,va_start(ap,x);表示用变长参数列表函数参数表中的最后一个固定参数对va_list类型对象ap进行初始化,使得对象ap能够指向第一个变化的参数。程序中宏调用va_start必须出现在宏调用va_arg之前。特殊类型函数参数的处理技术变长参数列表的处理va_arg宏访问va_list类型对象ap指向的变化参数的宏。例如,宏调用va_arg(ap,type)表示将ap指向的变化参数转换为由type指定的数据类型数据,宏调用的结果是一个type类型的数据。程序中宏调用va_arg必须出现在宏调用va_start之后。程序中宏调用va_arg必须出现在宏调用va_end之前。特殊类型函数参数的处理技术变长参数列表的处理va_end宏宏va_end结束变长参数处理,使得程序能够从用宏va_start初始化的变长参数处理过程中正常返回。结束变长参数处理时必须使用va_end(ap);对va_list类型对象ap进行撤销。程序中宏调用va_end必须出现在宏调用va_arg之后。特殊类型函数参数的处理技术变长参数列表的处理变长参数列表函数定义的一般形式[存储类型]返回值类型函数名(固定参数部分,…){函数体}函数至少要有一个固定参数;描述变化参数的省略号只能放在最后一个固定参数之后;intadd(intx,...){inttotal=x,y;va_listap;va_start(ap,x);while((y=va_arg(ap,int))!=NULL)total+=y;va_end(ap);returntotal;}指定变化参数的实际数据类型例10-12编制能够实现两个或任意多个整数相加的函数,并用相应住函数对其进行测试。例10-13编制能够实现两个或任意多个字符串连接的函数,并用相应住函数对其进行测试。程序设计的深入话题数据类型的扩展技术特殊类型函数参数的处理技术C系统的编译预处理C系统的编译预处理C系统预处理器概念C程序设计语言包含三个组成部分语言核心部分预处理器部分运行库部分预处理器的工作是在按语言的语法和语义对C源程序进行编译之前完成的,“预处理”名由此
本文标题:计算机程序设计基础第10章
链接地址:https://www.777doc.com/doc-3400226 .html