C++语言-南开大学ch4 4章 基本控制结构和导出数据类型

上传人:努力****83 文档编号:172047367 上传时间:2022-11-30 格式:PPT 页数:68 大小:939.50KB
收藏 版权申诉 举报 下载
C++语言-南开大学ch4 4章 基本控制结构和导出数据类型_第1页
第1页 / 共68页
C++语言-南开大学ch4 4章 基本控制结构和导出数据类型_第2页
第2页 / 共68页
C++语言-南开大学ch4 4章 基本控制结构和导出数据类型_第3页
第3页 / 共68页
资源描述:

《C++语言-南开大学ch4 4章 基本控制结构和导出数据类型》由会员分享,可在线阅读,更多相关《C++语言-南开大学ch4 4章 基本控制结构和导出数据类型(68页珍藏版)》请在装配图网上搜索。

1、1第第 4 4章章 基本控制结构和导出数据类型基本控制结构和导出数据类型。4.4.5 5 导出数据类型和数组导出数据类型和数组 4.4.6 6 结构类型结构类型24.4.5 5 导出类型和数组导出类型和数组 -4.4.5.1 5.1 导出类型概念导出类型概念4.4.5.2 5.2 一维数组与实例一维数组与实例4.5.3 4.5.3 多维数组与实例多维数组与实例4.5.4 4.5.4 数组与字符串数组与字符串34.4.5.1 5.1 导出类型概念导出类型概念 -在计算机所处理的数据中,最常见的,也是最需要由在计算机所处理的数据中,最常见的,也是最需要由计算机高速处理的数据是成批出现的同一类型的数

2、据,计算机高速处理的数据是成批出现的同一类型的数据,C+C+语言中把这类数据称为数组。语言中把这类数据称为数组。导出数据类型,其特点是这种类型的定义是在其它已导出数据类型,其特点是这种类型的定义是在其它已定义类型的基础上定义的,而且其运算也是确定的。定义类型的基础上定义的,而且其运算也是确定的。第四种结构类型第四种结构类型4 4.4.5.2 5.2 一维数组与实例一维数组与实例 数组数组是是同类型元素同类型元素(分量)的(分量)的有序组合体有序组合体。元素的。元素的类型可以是类型可以是C+C+语言中允许使用的任何一种数据类型语言中允许使用的任何一种数据类型(包括任何用户自定义类型)。(包括任何

3、用户自定义类型)。数组中的每个数组中的每个元素元素都有与其都有与其对应的下标对应的下标以标明该元素以标明该元素在数组中的位置。对数组元素的访问通常借助于下标来在数组中的位置。对数组元素的访问通常借助于下标来进行,元素也被称为进行,元素也被称为下标变量下标变量。每个数组元素(即下标。每个数组元素(即下标变量)都可以当作单个变量来使用。变量)都可以当作单个变量来使用。具有一个下标的数组叫做具有一个下标的数组叫做一维数组一维数组,它是由,它是由n n个同一类个同一类型数据组成的一维序列。按如下格式来说明一维数组。型数据组成的一维序列。按如下格式来说明一维数组。51 1 说明一维数组说明一维数组 =其

4、中的其中的“”用于指出数组元素的类型,用于指出数组元素的类型,也称为数组类型。也称为数组类型。“”是一个标识符,是为是一个标识符,是为数组起的名字,该名字还代表数组起的名字,该名字还代表数组首元素的地址数组首元素的地址(指指针概念针概念,在以后介绍)。方括号中的,在以后介绍)。方括号中的“”用用于指定数组的大小,它必须是一个整数或一个整型的于指定数组的大小,它必须是一个整数或一个整型的常量表达式。常量表达式。“=“=”部分可有可无,若部分可有可无,若有的话,用于为数组元素置初值;其中的有的话,用于为数组元素置初值;其中的“”由一批以逗号分割的由一批以逗号分割的常量值常量值所构成。所构成。6例如

5、:例如:intint a10 a10;说明了一个一维数组,数组名为说明了一个一维数组,数组名为a a,具有具有1010个元个元素,元素类型为素,元素类型为intint。要访问要访问a a数组的各元素(分量),数组的各元素(分量),可通过使用可通过使用下标变量下标变量a0a0,a1a1,a2a2,.,a9a9来来实现(注意,规定下标总从实现(注意,规定下标总从0 0开始)。每一个下标变量开始)。每一个下标变量aiai的作用与一个的作用与一个intint型简单变量所能起的作用相同。型简单变量所能起的作用相同。既是说,既是说,对对intint型简单变量可施加的运算与操作同样可型简单变量可施加的运算与

6、操作同样可施加到施加到intint型数组元素(分量)上型数组元素(分量)上。除整数外,下标处。除整数外,下标处还可以使用一个整型表达式,表达式的值正是要指定还可以使用一个整型表达式,表达式的值正是要指定的下标。如,的下标。如,a2a2*4+14+1,ai+1ai+1,aa1-3aa1-3都是合法都是合法的下标变量。的下标变量。7 对对a a数组元素(下标变量)进行使用:数组元素(下标变量)进行使用:intint a10,i=1;a10,i=1;a3=123;a3=123;cincina9;a9;ai-1=a3+2ai-1=a3+2*a2a2*4+1;4+1;coutcouta0=a0a0=a0

7、a9)if(a3a9)coutcouta9a9a9)”(a3a9)”进行下标变量的进行下标变量的比较比较运算等。运算等。9又如:又如:char arr120,arr280;char arr120,arr280;float fa115,fa26=1.2,35.6,-22,0.1,66,30;float fa115,fa26=1.2,35.6,-22,0.1,66,30;说明了两个说明了两个charchar型一维数组型一维数组arr1arr1与与arr2arr2,大小分大小分别为别为2020和和8080;又说明两个;又说明两个floatfloat型一维数组型一维数组fa1fa1与与fa2fa2,大

8、小分别为大小分别为1515和和6 6,且为,且为fa2fa2数组赋了初值。数组赋了初值。102 2 一维数组应用实例一维数组应用实例1 1 反序输出问题反序输出问题2 2 使用使用Eratosthenes Eratosthenes 筛法求筛法求10001000以以内的素数内的素数3 3 统计学生成绩统计学生成绩111 1 反序输出问题反序输出问题 1.1.从键盘输入从键盘输入1010个个intint型数,而后按输入的相反型数,而后按输入的相反顺序输出它们。顺序输出它们。实现方式实现方式:使用:使用intint型数组存放数据,通过下标变型数组存放数据,通过下标变化来处理这些数据化来处理这些数据

9、。例如,程序执行后的例如,程序执行后的输入输出界面输入输出界面可设计为可设计为:Input 10 integers:Input 10 integers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10-The result-The result-10 9 8 7 6 5 4 3 2 1 10 9 8 7 6 5 4 3 2 1 12程序编制程序编制:#include include void main()void main()intint a10,i;a10,i;/说明说明intint型一维数组型一维数组a acoutcoutInput 10 integers:

10、Input 10 integers:endlendl;/输入输入1010个整数,依次放入各下标变量中个整数,依次放入各下标变量中for(i=0;i10;i+)for(i=0;iai;ai;coutcout-The result-The result-=0;i-)/for(i=9;i=0;i-)/下标下标i i从从9 9起,递减变化到起,递减变化到0 0coutcoutai;ai;coutcoutendlendl;13 2 使用使用Eratosthenes 筛法求筛法求1000 以内的素数(课本以内的素数(课本p116)先将先将1 110001000放在一个放在一个数组数组sievesieve(

11、看成是一个看成是一个筛子筛子)中;首先中;首先“留下留下”2”2(第一个素数),而后把(第一个素数),而后把2 2的倍数统统的倍数统统从数组从数组sievesieve(筛子)中删去;再筛子)中删去;再“留下留下”3”3(第二个素数(第二个素数),而后把),而后把3 3的倍数统统从数组的倍数统统从数组sievesieve中删去;中删去;再往下是再往下是5,7,.5,7,.。好象是一个筛子,。好象是一个筛子,把不需要的数逐步筛去把不需要的数逐步筛去,留,留下的正是所需要的各素数。下的正是所需要的各素数。所谓所谓将某数将某数从数组从数组sievesieve(筛子)中筛子)中删去删去,本程序实现,本程

12、序实现时,是将数组中的该数时,是将数组中的该数“改写改写”为为0 0。注意注意:具体实现与:具体实现与4.4.7.47.4小节的方法有所不同。小节的方法有所不同。14 程序执行后的输出结果样式如下程序执行后的输出结果样式如下 (每输出(每输出1515个素数换一行)个素数换一行):2 3 5 7 11 13 17 19 23 29 31 37 41 43 472 3 5 7 11 13 17 19 23 29 31 37 41 43 4753 59 61 67 71 73 79 83 89 97 101 103 107 109 11353 59 61 67 71 73 79 83 89 97 1

13、01 103 107 109 113127 131 137 139 149 151 157 163 167 173 179 181 191 193 197127 131 137 139 149 151 157 163 167 173 179 181 191 193 197877 881 883 887 907 911 919 929 937 941 947 953 967 971 977877 881 883 887 907 911 919 929 937 941 947 953 967 971 977983 991 997983 991 99715具体程序:具体程序:#includeincl

14、ude void main()void main()const const intint n=1000;n=1000;intint sieven+1;sieven+1;/筛子筛子sievesievefor(for(intint j=1;jn+1;j+)j=1;jn+1;j+)sievej=j;sievej=j;/放入数据放入数据intint i=1,count=0;i=1,count=0;16while(in)while(in)i+;i+;if(sievei!=0)if(sievei!=0)/尚在筛中尚在筛中coutcoutsetw(5)sievei;setw(5)sievei;count+;

15、count+;if(count%15=0)if(count%15=0)coutcoutendlendl;/每行每行1515数数 for(intfor(int k=i;kn+1;k+=i)k=i;kn+1;k+=i)/消去倍数消去倍数sievek=0;sievek=0;/if/if /while/while coutcoutendlendl;/main/main17进一步改进,使用进一步改进,使用boolbool数组数组#includeinclude void main()void main()const const intint n=1000;n=1000;boolbool sieven+1;

16、sieven+1;/筛子筛子sievesieve for(for(intint j=1;jn+1;j+)j=1;jn+1;j+)sievej=true;sievej=true;/放入数据放入数据/sievejsievej为为truetrue意味着意味着j j在筛中在筛中intint i=1,count=0;i=1,count=0;18 while(in)while(in)i+;i+;if(sievei)if(sievei)/i/i尚在筛中尚在筛中 coutcoutsetw(5)i;setw(5)i;count+;count+;if(count%15=0)if(count%15=0)coutco

17、utendlendl;/;/每行每行1515数数 for(intfor(int k=i;kn+1;k+=i)k=i;kn+1;k+=i)/消去倍数消去倍数 sievek=false;sievek=false;/if/if /while/while coutcoutendlendl;/main/main193 3 统计学生成绩统计学生成绩 -课本课本p108p108 输入输入n n个学生的注册号和成绩,计算出平个学生的注册号和成绩,计算出平均成绩,并列出成绩最好的前均成绩,并列出成绩最好的前t t名学生的注册名学生的注册号和成绩。号和成绩。20程序执行后的输出结果式样如下程序执行后的输出结果式样

18、如下(n=6,t=3n=6,t=3时)时):Input 6 students Input 6 students Reg_NumReg_Num&Score:&Score:1001 88.51001 88.51002 911002 911003 85.51003 85.51004 93.51004 93.51005 851005 851006 961006 96Average score:89.9Average score:89.9 register-number score register-number score1 1006 96.01 1006 96.02 1004 93.52 1004

19、93.53 1002 91.03 1002 91.021程序如下:程序如下:#include void main()const int n=6;/共有共有n个学生个学生const int t=3;/欲找出前欲找出前t名最好成绩者名最好成绩者int indexn;/数组数组index,存放存放n个学生的注册号个学生的注册号float scoren;/数组数组score,存放存放n个学生的成绩个学生的成绩coutInput n students Reg_Num&Score:endl;for(int i=0;iindexiscorei;22float sum=0;/放累加和的放累加和的sum先置为先

20、置为0for(i=0;in;i+)sum+=scorei;/将将n个学生的成绩累加到个学生的成绩累加到sum上上cout.setf(ios:fixed);/设置以定点数格式输出数据设置以定点数格式输出数据cout.precision(1);/点后保留点后保留1位位cout“Average score:”sum/nendl;/输出平均成绩输出平均成绩 cout.width(25);coutregister-number score;/输出输出“题头行题头行”23/*通过通过“for(i=0;it;i+)for(i=0;it;i+)”形式的循环,形式的循环,找出找出前前t t名最好名最好成绩者,并

21、输出其注册号及成绩。成绩者,并输出其注册号及成绩。i=0i=0的循环先使的循环先使score0score0及及index0index0处被交换成为处被交换成为第一名最好成绩者的成绩及注册号,而后输出;第一名最好成绩者的成绩及注册号,而后输出;i=1i=1的的循环先使循环先使score1score1及及index1index1处被交换成为第二名最处被交换成为第二名最好成绩者的成绩及注册号,而后输出;好成绩者的成绩及注册号,而后输出;.,如此做法,如此做法,直到找出前直到找出前t t名最好成绩者,并输出它们的相关信息。名最好成绩者,并输出它们的相关信息。第第i i次的循环首先次的循环首先找出从找出

22、从scoreiscorei到数组末到数组末scoren-1scoren-1中的中的最大者最大者s s,并记录其并记录其下标下标值到值到j1j1,而后而后将最大者将最大者scorej1scorej1掉换到掉换到scoreiscorei的位置的位置上,当然还上,当然还要要将将indexj1indexj1掉换到掉换到indexiindexi的位置的位置处,以使处,以使indexiindexi总与总与scoreiscorei保持一一对应关系。保持一一对应关系。*/24for(i=0;it;i+)/找出前找出前t名最好者名最好者float s=scorei;/从从i i分量始分量始 score中的最大者

23、中的最大者sint j1=i;/j1中记录上述最大者的下标中记录上述最大者的下标ifor(int j=i+1;jn;j+)/看还有否比看还有否比s 更大的更大的 if(si)if(j1i)/若若scoreiscorei到到scoren-1scoren-1中的最大者中的最大者/并非并非scoreiscorei时,要进行交换时,要进行交换scorej1=scorei;scorej1=scorei;scorei=s;scorei=s;/使使scoreiscorei交换为最大交换为最大intint tmptmp =indexj1;/=indexj1;/交换注册号交换注册号indexj1=indexi;

24、indexj1=indexi;indexi=indexi=tmptmp;26cout.width(4);coutendli+1;/输出名次号(前输出名次号(前t名的第名的第i+1名)名)cout.width(11);coutindexi;/输出第输出第i+1名学生的注册号名学生的注册号cout.width(12);cout.precision(1);/点后保留点后保留1位位coutscorei;/输出第输出第i+1名学生的成绩名学生的成绩 /for i 循环体结束循环体结束 coutendl;/main结束结束274.4.5.3 5.3 多维数组与实例多维数组与实例 -具有具有两个下标两个下标

25、的数组叫做的数组叫做二维数组二维数组。二维数组经常用。二维数组经常用来表示来表示按行和列格式按行和列格式来存放信息的来存放信息的数据表数据表。要区分表中某。要区分表中某个特定的元素,必须指定两个下标。个特定的元素,必须指定两个下标。第一个下标第一个下标表示该元表示该元素所在的素所在的行行,而,而第二个下标第二个下标则表示该元素所在的则表示该元素所在的列列。按如下格式来按如下格式来说明二维数组说明二维数组:其中的其中的“”及及“”的含义与一维数的含义与一维数组相同。方括号中的组相同。方括号中的“”与与“”用于指定数用于指定数组的大小组的大小,它们必须是整数或整型的常量表达式。类似可它们必须是整数

26、或整型的常量表达式。类似可以说明三维、四维等二维以上的多维数组。以说明三维、四维等二维以上的多维数组。28例如:例如:intint a34 a34;说明了一个说明了一个二维数组二维数组,数组名为,数组名为a a,具有具有1212个元素个元素(3(3行行4 4列列),元素类型为,元素类型为intint。要访问要访问a a数组的各元素数组的各元素(分量分量),可通,可通过使用下述过使用下述1212个个下标变量下标变量:a00a00,a01a01,a02a02,a03a03,a10a10,a11a11,a12a12,a13a13,a20a20,a21a21,a22a22,a23a23。可以看出,与一

27、可以看出,与一维数组一样,二维数组的两个下标维数组一样,二维数组的两个下标(行下标与列下标行下标与列下标)也都也都是从是从0 0开始的。开始的。每一个每一个下标变量下标变量aijaij的作用与一个的作用与一个intint型简单变量所型简单变量所能起的作用相同能起的作用相同。既是说,对。既是说,对intint型简单变量可施加的运算型简单变量可施加的运算与操作同样可施加到与操作同样可施加到intint型数组元素即下标变量型数组元素即下标变量aijaij上。上。29例如:例如:intint a34 a34;另外,还可将上述另外,还可将上述3 3行行4 4列的二维列的二维数组数组a a看成是看成是具有

28、具有3 3个一维数组元素个一维数组元素(每个元素为一行,具有(每个元素为一行,具有4 4个个intint型数型数据)的数组,据)的数组,可使用可使用a0a0、a1a1、a2a2来表示这来表示这3 3个个一维数组。注意,一维数组。注意,a0a0、a1a1、a2a2的的“级别级别”与上与上述述1212个下标变量个下标变量aijaij的的“级别级别”完全不同。完全不同。a0a0、a1a1、a2a2的的“级别级别”为具有为具有4 4个个intint型元素的一维数型元素的一维数组组(与一维数组说明处的(与一维数组说明处的“”一样,它们代一样,它们代表表3 3个不同的地址即指针,其中个不同的地址即指针,其

29、中a0a0代表二维数组代表二维数组a a的的第一行元素的首地址第一行元素的首地址,a1a1、a2a2代表第二与第三行代表第二与第三行元素的首地址),而下标变量元素的首地址),而下标变量aijaij的的“级别级别”为为intint,它代表一个整数。它代表一个整数。30 如下的程序片段中对所说明的如下的程序片段中对所说明的a a数组的数组的 元素(下标变量)进行了使用:元素(下标变量)进行了使用:intint a34,i=1,j=1;a34,i=1,j=1;a00=123;a00=123;cincina01;a01;a23=ai-1j-1+2a23=ai-1j-1+2*ai-1j;ai-1j;co

30、utcouta23=a23a23=a23a01)if(a00a01)coutcouta01a01endlendl;31 说明了一个说明了一个intint型的型的二维数组二维数组a a;向数组向数组元素(下标变量)元素(下标变量)a00a00赋了值赋了值;通过通过cincin输入输入下标变量下标变量a01a01的值;使用下标变量的值;使用下标变量ai-1j-1ai-1j-1及及ai-1jai-1j参加参加运算运算,并将运算,并将运算结果赋值给结果赋值给a23a23(下标可以是整型表达下标可以是整型表达式);式);输出输出下标变量下标变量a23a23的值;下标变量的值;下标变量还可进行还可进行比较

31、比较运算。运算。32又如:又如:float fa11010,fa223=1.1,float fa11010,fa223=1.1,2.2,-3.3,4.4,-5.5,6.6 ;2.2,-3.3,4.4,-5.5,6.6 ;说明了两个说明了两个floatfloat型二维数组型二维数组fa1(10fa1(10行行1010列列)与与fa2(2fa2(2行行3 3列列),且为,且为fa2fa2数组赋了初值(使用给两数组赋了初值(使用给两个一维数组赋初值的形式)。也可使用如下的另个一维数组赋初值的形式)。也可使用如下的另一种格式为一种格式为fa2fa2数组赋初值数组赋初值“float fa223float

32、 fa223=1.1,2.2,-3.3,4.4,-5.5,6.6;”=1.1,2.2,-3.3,4.4,-5.5,6.6;”。33 char arr1320=12345,C+OK!,char arr1320=12345,C+OK!,I can do it!,arr21080;I can do it!,arr21080;说明了两个说明了两个charchar型二维数组型二维数组arr1arr1(3 3行行2020列)与列)与arr2arr2(1010行行8080列),并给列),并给arr1arr1数组赋了初值,从而数组赋了初值,从而使得使得arr10arr10、arr11arr11、arr12ar

33、r12都成为具有了初值都成为具有了初值的字符串(注意字符串赋初值的方法)。的字符串(注意字符串赋初值的方法)。for(intfor(int i=0;i3;i+)i=0;i3;i+)coutcoutarr1iarr1iendlendl;/一次输出一次输出“一串一串”34 上述上述forfor语句的执行将输出如下三行结果语句的执行将输出如下三行结果:1234512345C+OK!C+OK!I can do it!I can do it!同理,具有三个下标的数组叫做三维数组,具同理,具有三个下标的数组叫做三维数组,具有有n n个下标的数组叫做个下标的数组叫做n n维数组。通常,将二维以上维数组。通常

34、,将二维以上的数组统称为多维数组。实际上,多维数组中最常的数组统称为多维数组。实际上,多维数组中最常用的只是二维数组。用的只是二维数组。35多维数组应用实例多维数组应用实例1 1 二维数组简单应用二维数组简单应用2 2 二维字符数组二维字符数组3 3 画一个四叶玫瑰线图形画一个四叶玫瑰线图形361 1 二维数组简单应用二维数组简单应用 设有设有4 4行行4 4列的数组列的数组a a,其元素其元素aij=i+jaij=i+j。编程序,实现:编程序,实现:1.1.求第二行求第二行4 4元素之和;元素之和;2.2.求第三列求第三列4 4元素之平均值;元素之平均值;3.3.求最大数,最小数及主对角线求

35、最大数,最小数及主对角线4 4元素的元素的平方和。平方和。37 使程序执行后的输出结果为使程序执行后的输出结果为:0 1 2 30 1 2 3 1 2 3 4 1 2 3 4 2 3 4 5 2 3 4 5 3 4 5 6 3 4 5 6-The result-The result-sum_lin2=10sum_lin2=10ave_col3=3.5ave_col3=3.5max_elemmax_elem=6=6min_elemmin_elem=0=0sum_diagsum_diag=56=5638#include include void main()void main()intint a4

36、4,i,j;a44,i,j;for(i=0;i4;i+)/for(i=0;i4;i+)/为为a a数组赋值,并显示在屏幕上数组赋值,并显示在屏幕上for(j=0;j4;j+)for(j=0;j4;j+)aij=i+j;aij=i+j;coutcout aij;aij;coutcoutendlendl;/每每4 4数占一行数占一行 coutcout-The result-The result-endlendl;39 /1./1.求第二行求第二行4 4元素之和元素之和 /(第二行元素为第二行元素为a1j(j=0,1,2,3)a1j(j=0,1,2,3))intint sum_lin2=0;sum_

37、lin2=0;for(j=0;j4;j+)for(j=0;j4;j+)sum_lin2+=a1j;sum_lin2+=a1j;coutcoutsum_lin2=sum_lin2sum_lin2=sum_lin2endlendl;/2./2.求第三列求第三列4 4元素之平均值元素之平均值/(第三列元素为(第三列元素为ai2(i=0,1,2,3)ai2(i=0,1,2,3))intint sum_col3=0;sum_col3=0;for(i=0;i4;i+)for(i=0;i4;i+)sum_col3+=ai2;sum_col3+=ai2;coutcoutave_col3=sum_col3/4.

38、0ave_col3=sum_col3/4.0endlendl;40 /3./3.求最大数求最大数,最小数及主对角线最小数及主对角线4 4元素的平方和元素的平方和intint max_elemmax_elem=a00,=a00,min_elemmin_elem=a00,=a00,sum_diagsum_diag=0;=0;/先认为先认为a00a00为最大数为最大数max_elemmax_elem、又为最小数又为最小数min_elemmin_elemfor(i=0;i4;i+)for(i=0;i4;i+)for(j=0;j4;j+)for(j=0;j if(aijmax_elemmax_elem)

39、max_elemmax_elem=aij;=aij;if(aij if(aijmin_elemmin_elem)min_elemmin_elem=aij;=aij;if(i=j)if(i=j)sum_diagsum_diag+=aij+=aij*aij;aij;/行列下标相等时,行列下标相等时,aijaij为主对角线元素为主对角线元素 coutcoutmax_elemmax_elem=max_elemmax_elemendlendl;coutcoutmin_elemmin_elem=min_elemmin_elemendlendl;coutcoutsum_diagsum_diag=sum_di

40、agsum_diagendlendl;41 2 2 二维字符数组二维字符数组 寻找寻找若干行若干行(字符串字符串)中的最长行并进行)中的最长行并进行某些统计:从键盘输入某些统计:从键盘输入n n个字符串(每串为一个字符串(每串为一行,不超过行,不超过8080个字符,且输入时以回车结束每个字符,且输入时以回车结束每一行)先存放在一个一行)先存放在一个二维字符数组二维字符数组中。而后统中。而后统计出计出每一行中大写字母的出现次数每一行中大写字母的出现次数,并找出这,并找出这些行中的些行中的最长行最长行。42 程序执行后,屏幕显示结果可为程序执行后,屏幕显示结果可为:-Input 4 strings

41、-Input 4 strings-Hello!Hello!ABCabcABCabc.12345 67890 OK!OK!12345 67890 OK!OK!ookkookk!+*-/%-/%abcdeabcdeWe are students.NK2004.We are students.NK2004.-The result-The result-count0=4 count0=4 count1=4 count1=4 count2=0 count2=0 count3=3 count3=3maxLenLinemaxLenLine:12345 67890 OK!OK!12345 67890 OK!O

42、K!ookkookk!43数据部分概要:数据部分概要:const const intint n=4;n=4;/定义常量定义常量n n,共输入并处理共输入并处理n n行字符行字符char strn81;char strn81;/strstr为为charchar型二维数组,用于盛放输入的型二维数组,用于盛放输入的n n行字符行字符 /(每行最多放(每行最多放8080字符另加一结束符)字符另加一结束符)intint countn;countn;/使用使用countcount数组元素记录各行大写字母的出现次数数组元素记录各行大写字母的出现次数 /对应关系为:对应关系为:counticounti记录第记

43、录第i i行中的大写字母个数行中的大写字母个数 char maxLenLine81=0;char maxLenLine81=0;/盛放最长行,初始化为盛放最长行,初始化为“空空”44处理部分概述:处理部分概述:输入输入n n行字符(每行以回车为结束),依次放于一维行字符(每行以回车为结束),依次放于一维字符数组字符数组stristri 中(注意,中(注意,stristri 为二维字符数组为二维字符数组strstr的一的一行),并将记录每行大写字母出现次数的行),并将记录每行大写字母出现次数的counticounti均置为均置为0 0(作累加单元用)。(作累加单元用)。编制循环,依次编制循环,依

44、次处理处理已放在已放在str0str0、str1str1、.、strn-1strn-1中的那中的那n n行字符行字符-某行长度超过当前某行长度超过当前maxLenLinemaxLenLine之之长度时更换长度时更换maxLenLinemaxLenLine,并从头到尾寻找各行的大写字母且并从头到尾寻找各行的大写字母且将累加次数放于将累加次数放于counticounti之中。之中。输出输出统计出的各行大写字母个数,并输出最长行。统计出的各行大写字母个数,并输出最长行。45#include/use“setw”#include /use“gets”#include /use“strlen”void m

45、ain()const int n=4;/共输入并处理共输入并处理n行行char strn81,ch;/str数组,盛放数组,盛放n行字符行字符char maxLenLine81=0;/盛放最长行,初始化为盛放最长行,初始化为“空空”int countn,i,j;/counti记录第记录第i行的大写字母个数行的大写字母个数for(i=0;in;i+)counti=0;/将将count初始化(累加次数用)初始化(累加次数用)cout-Input n strings-endl;for(i=0;in;i+)/共输入共输入n行行gets(stri);/放于一维数组放于一维数组stri中中46 for(i

46、=0;i strlen(maxLenLine)strcpy(maxLenLine,stri);/更新最长行更新最长行 for(j=0;j=A&ch=Z)/若若ch为大写字母为大写字母 counti+;/次数加次数加1 /for j/for icout-The result-endl;for(i=0;in;i+)/输出每行大写字母个数输出每行大写字母个数 coutsetw(10)counti=setw(2)countiendl;coutmaxLenLine:endl;coutmaxLenLineendl;/输出最长行输出最长行 47 3 3 画一个四叶玫瑰线图形画一个四叶玫瑰线图形 -课本课本p

47、114p114实现概述:实现概述:1.1.四叶玫瑰线图形的四叶玫瑰线图形的极坐标方程极坐标方程为:为:p=ap=a*sin(2sin(2*angle)angle)其中,其中,angleangle为为极角极角,变化范围从,变化范围从0 0度到度到360360度;度;a a为常数,表示所画四叶玫瑰线图形中,为常数,表示所画四叶玫瑰线图形中,矩极点矩极点的最长距离的最长距离;p p为为极径极径,与变化范围内的极角,与变化范围内的极角angleangle有上述极有上述极坐标方程的关系。坐标方程的关系。48 2.2.在在“文本模式文本模式”的的“字符屏幕字符屏幕”上上“画图画图”的通常实现方法:的通常实

48、现方法:(1 1)将将“字符屏幕字符屏幕”与程序中的一个与程序中的一个二维字符数组二维字符数组建立建立对应关系。如,本程序的对应关系。如,本程序的roserose数组就对应于欲显示的数组就对应于欲显示的“字符字符屏幕屏幕”,其中的,其中的rose00rose00表示表示“字符屏幕字符屏幕”的的左上角点左上角点,而而roseyxroseyx则表示则表示“字符屏幕字符屏幕”的的第第y+1y+1行第行第x+1x+1列的那一列的那一个点个点(y y值即行号由上往下扩展值即行号由上往下扩展,x x值即列号由左往右扩展)。值即列号由左往右扩展)。(2 2)将二维字符数组的各元素均置为将二维字符数组的各元素

49、均置为“空空”(对应于一(对应于一个个“空白字符屏幕空白字符屏幕”)。)。(3 3)按某种计算方法(或计算公式)算出应该在按某种计算方法(或计算公式)算出应该在“字符字符屏幕屏幕”的哪些位置处的哪些位置处“画点画点”(通过往对应字符数组的某些(通过往对应字符数组的某些元素处元素处置置“*”符号符号来完成)。来完成)。(4 4)将已准备好的当前将已准备好的当前字符数组显示字符数组显示到到“字符屏幕字符屏幕”上上(在(在“字符屏幕字符屏幕”上上“画画”出出了所需了所需图形图形)。)。493 3 本例的具体实现方法本例的具体实现方法:把把360360度分为足够多的若干份(本例分为度分为足够多的若干份

50、(本例分为128128份),份),在每个在每个分定的分定的角度角度angleangle处,按照上处,按照上述的极坐标方程,述的极坐标方程,计算计算出每一个对应的函数值出每一个对应的函数值p p(即极径)即极径),从而得到平面上的,从而得到平面上的一批点一批点;将;将这批平面点对应到这批平面点对应到“字符屏幕字符屏幕”上(相应的上(相应的roserose数组中),并将数组中),并将每一个点每一个点用一个用一个字符字符“*”来表示并显示到屏幕上(来表示并显示到屏幕上(“字符屏幕字符屏幕”上的其上的其他点均显示为他点均显示为“空空”)。)。50#include include#include /us

51、e“#include /use“sin”sin”、“cos“cos”main()main()const const intint maxYmaxY=22;=22;/“/“字符屏幕字符屏幕”的最大行数(书中为的最大行数(书中为2525)const const intint maxXmaxX=70;=70;/“/“字符屏幕字符屏幕”的最大列数(书中为的最大列数(书中为8080)const float const float paipai=3.14159,a=12.0;=3.14159,a=12.0;/a /a表示所画图形中,矩极点的最长距离(书中为表示所画图形中,矩极点的最长距离(书中为16.01

52、6.0)const const intint aspect=2;aspect=2;/屏幕字符屏幕字符“高高:宽宽”为为2:12:1,生成曲线时,每点的,生成曲线时,每点的x x要乘以要乘以2 251 float angle,p;float angle,p;/angle/angle表示极角,表示极角,p p表示极径表示极径intint x,y;x,y;/x/x,y y用于表示屏幕坐标用于表示屏幕坐标char char rosemaxYmaxXrosemaxYmaxX;/roseyx /roseyx表示表示“字符屏幕字符屏幕”y+1y+1行行x+1x+1列的那一个点列的那一个点for(y=0;yf

53、or(y=0;ymaxYmaxY;y+);y+)/设置设置“空白字符屏幕空白字符屏幕”for(x=0;xfor(x=0;xmaxXmaxX;x+);x+)roseyx=;roseyx=;/各数组元素字符均置为空格各数组元素字符均置为空格const const intint nnnn=128;=128;/把把360360度分为度分为nnnn份(所画图形由份(所画图形由nnnn=128=128个点构成)个点构成)52 for(intfor(int i=0;i i=0;innnn;i+);i+)/计算计算nnnn=128=128个个“屏幕点屏幕点”angle=iangle=i*2 2*pai/nnp

54、ai/nn;/将角度化为弧度将角度化为弧度p=ap=a*sin(2sin(2*angle);angle);/算出极径算出极径p px=x=int(pint(p*cos(anglecos(angle)*aspect+24;aspect+24;/x /x坐标值坐标值 y=y=int(pint(p*sin(angle)+12;sin(angle)+12;/y /y坐标值坐标值 /算算x x时加时加2424,算,算y y时加时加1212,/是设定是设定(24,12)(24,12)为极点位置为极点位置roseyx=roseyx=*;/往往(y,x)y,x)点处放置点处放置“*”符号符号 53 /将当前字

55、符数组将当前字符数组roserose中的各字符显示到屏幕上(中的各字符显示到屏幕上(“画画”图形)图形)for(y=0;yfor(y=0;ymaxYmaxY;y+);y+)/行号变化范围,共行号变化范围,共maxYmaxY行行for(x=0;xfor(x=0;xmaxXmaxX;x+)/;x+)/列号变化范围列号变化范围,共共maxXmaxX列列coutcoutroseyx;/roseyx;/显示出显示出roserose中的各字符中的各字符coutcoutendlendl;/main/main54程序执行后的输出结果式样程序执行后的输出结果式样:*55附注:附注:(1 1)书中程序书中程序是按

56、整个屏幕为是按整个屏幕为25258080个个“点点”来进行设计与处理的,并把所画四叶玫瑰线图来进行设计与处理的,并把所画四叶玫瑰线图形中矩极点的形中矩极点的最长距离最长距离a a(常数)设常数)设为为1616。读者。读者可以可以改变这些数据改变这些数据,如按照,如按照22227070个个“点点”、并将矩极点的最长距离并将矩极点的最长距离a a设为设为1212等,而后进行运等,而后进行运行测试,行测试,观察所观察所“画画”图形的变化图形的变化,以加深对,以加深对程序功能的理解。程序功能的理解。56 (2 2)程序中在计算(程序中在计算(x x,y y)时,用到另外两个常数时,用到另外两个常数40

57、40和和13-13-算算x x时加时加4040,算,算y y时加时加1313,是因为,是因为设定(设定(4040,1313)为为“画图画图”时的时的“中心点中心点”(极点位置)(极点位置),读者,读者也可改变也可改变这两个常数,如设为这两个常数,如设为2424和和1212等来进行测试。等来进行测试。for(intfor(int i=0;i128;i+)i=0;i128;i+).x=x=int(pint(p*cos(anglecos(angle)*aspect aspect+40+40;y=y=int(pint(p*sin(angle)sin(angle)+13+13;.57 (3 3)本程序画

58、出的是本程序画出的是正弦特性正弦特性的的四叶玫瑰线四叶玫瑰线图形,用到了:图形,用到了:p=ap=a*sin(2sin(2*angle)angle)。若要画出具有若要画出具有余弦特性余弦特性的的四叶玫瑰线四叶玫瑰线图形,或准备画出具有图形,或准备画出具有正弦正弦或余弦特性或余弦特性的的三叶玫瑰线三叶玫瑰线图形的话,可使用如下的图形的话,可使用如下的计算公式:计算公式:p=ap=a*cos(2cos(2*angle)angle);p=ap=a*sin(3sin(3*angle)angle);p=ap=a*cos(3cos(3*angle)angle)。58 4.54.5.4.4 数组与字符串数组

59、与字符串字符数组字符数组的的元素为字符元素为字符。除具有一般数组。除具有一般数组的特性外,它与字符串的使用有关联。的特性外,它与字符串的使用有关联。字符串字符串在内存中的存放形式是,按串中字在内存中的存放形式是,按串中字符的排列顺序存放,符的排列顺序存放,每个字符占一个字节每个字符占一个字节,并,并在在末尾末尾添加添加00作为作为结束标记结束标记。C+C+是靠一维是靠一维字符数组来存放字符串的,一维字符数组在某字符数组来存放字符串的,一维字符数组在某些方面起到了字符串变量的作用。些方面起到了字符串变量的作用。59 但注意,一维字符数组与字符串还是有区但注意,一维字符数组与字符串还是有区别的。首

60、先,别的。首先,字符串字符串可以可以存放在字符数组中存放在字符数组中,但该字符数组中但该字符数组中必须存储一个显式的必须存储一个显式的00字符字符来作为字符串的结束标记。但反过来说,任一来作为字符串的结束标记。但反过来说,任一个字符数组不见得都是字符串,因为个字符数组不见得都是字符串,因为并不要求并不要求字符数组字符数组中必须存在中必须存在00字符字符!60例如例如:char carr6=1,2,3,4,5;char carr6=1,2,3,4,5;/carrcarr为一般性为一般性字符数组字符数组char str16=I,c,a,n;char str16=I,c,a,n;/str1/str1

61、为一般性为一般性字符数组字符数组char str26=I,c,a,n,0;char str26=I,c,a,n,0;/使使str2str2为为字符串字符串char str36=I can;char str36=I can;/str3/str3为为字符串字符串61 coutcoutcarrcarr=;=;for(intfor(int i=0;i5;i+)/i=0;i5;i+)/只输出数组前只输出数组前5 5个元素值个元素值 coutcoutcarricarri;coutcoutendlendl;coutcoutstr1=;str1=;for(i=0;i5;i+)for(i=0;i5;i+)/只输

62、出数组前只输出数组前5 5个元素值个元素值 coutcoutstr1i;str1i;coutcoutendlendl;coutcoutstr2=str2str2=str2endlendl;/;/对字符串直接输出对字符串直接输出coutcoutstr3=str3str3=str3”(“”和和“”)“”)支持对字符支持对字符串进行整体的输入与输出串进行整体的输入与输出。对字符串进行整体处理的最对字符串进行整体处理的最常用系统函数常用系统函数有:有:strlenstrlen(求求长度长度),strcatstrcat(连接连接),strcpystrcpy(拷贝拷贝),strcmpstrcmp(比较比较

63、)。各函。各函数的具体功能与使用格式见课本附录数的具体功能与使用格式见课本附录B.2B.2。使用这些函数时要。使用这些函数时要包含包含 string.hstring.h头文件头文件。634.4.6 6 结构类型结构类型 4.6.1 4.6.1 结构类型与结构变量说明结构类型与结构变量说明 4.4.6.2 6.2 结构类型引用和赋值结构类型引用和赋值 4.4.6.3 6.3 结构数组结构数组644.4.6.1 6.1 结构类型结构类型与结构变量说明与结构变量说明 structstruct 类型名:标示符类型名:标示符 成员表:成员表:;1;1;结构类型的变量说明结构类型的变量说明 structs

64、truct ;654.4.6.1 6.1 结构类型结构类型与结构变量说明与结构变量说明 structstruct Employee Employee char name20;char name20;enumenum male,femalesexmale,femalesex;float salary;float salary;char phone11;char phone11;Employee gy3,gy4=“John Smith”,male,2107.5,02223501234;664.4.6.2 6.2 结构类型引用和赋值结构类型引用和赋值n一个结构变量由若干分量组成,对结构分量的存取由圆

65、点一个结构变量由若干分量组成,对结构分量的存取由圆点运算符运算符“.”.”实现,例如,在上例中,雇员实现,例如,在上例中,雇员gy1 gy1 的姓名可表的姓名可表示为示为 gy1.name,gy1.name,其电话号码可表示为其电话号码可表示为gy1.phonegy1.phone。n还可以用赋值语句或输入语句为结构分量赋值的方法:还可以用赋值语句或输入语句为结构分量赋值的方法:gy3.name=“Tom Green”;gy3.name=“Tom Green”;gy3.sex=male;gy3.sex=male;cincin gy3.salary;gy3.salary;cincin gy3.ph

66、one;gy3.phone;无论采用哪种方法为结构分量赋值,都必须保证类型一致。无论采用哪种方法为结构分量赋值,都必须保证类型一致。nC+C+语言还允许直接对结构变量赋值,下面的赋值语句也是语言还允许直接对结构变量赋值,下面的赋值语句也是允许的:允许的:gy1=gy4;gy3=gy4;gy1=gy4;gy3=gy4;一般,数组变量不能这样一般,数组变量不能这样直接赋值。直接赋值。674.4.6.3 6.3 结构数组结构数组n结构类型的数据也可以组成数组,称为结构数组。结构数结构类型的数据也可以组成数组,称为结构数组。结构数组在许多实际应用问题中的采用非常普遍,例如,通讯录,组在许多实际应用问题中的采用非常普遍,例如,通讯录,学生成绩单,商业销售记录,人事档案,资料登记表等等。学生成绩单,商业销售记录,人事档案,资料登记表等等。structstruct Employee Employee char name20;char name20;enumenum male,femalesexmale,femalesex;float salary;float salary;char phone11;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!