资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第七七章章 数组数组2012/02/25第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7.2一维数组的定义与引用7.3 二维数组的定义与引用7.4 字符数组的定义与引用7.5 数组及数组元素做函数的参数7.6 编程举例7.7 习题第七章第七章 数组数组7.1 7.1 成组数据处理问题实例及解决方法成组数据处理问题实例及解决方法7.2一维数组的定义与引用7.3 二维数组的定义与引用7.4 字符数组的定义与引用7.5 数组及数组元素做函数的参数7.6 编程举例7.7 习题7.1 7.1 成组数据处理问题实例及解决方法成组数据处理问题实例及解决方法日常中经常遇到大量的成组数据问题。如:需要对某班某门课的成绩进行排序,找出不及格的学生,统计各分数段的人数,找出最高分、最低分及其它分析计算工作。看下面的例题:例例7.1 7.1 2010061120100611班班有有1010人人,“大大学学计计算算机机基基础础”课课程程的的期期末末考考试试成绩为:成绩为:9090,8080,9595,5656,6565,4747,9393,8282,7575,6161。求最高分。求最高分。7.1 7.1 成组数据处理问题实例及解决方法成组数据处理问题实例及解决方法求解方案:求解方案:(1 1)先设第)先设第1 1个人的成绩为最高,将其值存入到变量个人的成绩为最高,将其值存入到变量maxmax中。中。(2 2)用用第第2 2个个人人的的成成绩绩与与maxmax比比较较,若若大大于于maxmax的的值值,则则用用该该值值更更新新maxmax。(3 3)再再用用下下一一人人的的成成绩绩与与maxmax比比较较,若若大大于于maxmax的的值值,则则用用该该值值更新更新maxmax。(4 4)以此方法类推,直到所有人的成绩都处理完毕。)以此方法类推,直到所有人的成绩都处理完毕。(5 5)此时)此时maxmax的值即为最高分。的值即为最高分。分分析析上上述述方方案案,第第(1 1)至至第第(4 4)步步有有重重复复的的部部分分,算算法法实实现现时时可考虑使用循环来完成。比较的部分可以用分支来实现。可考虑使用循环来完成。比较的部分可以用分支来实现。7.1 7.1 成组数据处理问题实例及解决方法成组数据处理问题实例及解决方法例例7.2 7.2 在在例例7.17.1的的基基础础上上,求求完完最最高高分分后后再再求求2010061120100611班班“大大学学计计算算机基础机基础”不及格的人数。不及格的人数。求解方案:求解方案:(1 1)用变量)用变量countcount表示不及格人数,并将表示不及格人数,并将countcount清清0 0。(2 2)用第)用第1 1个人的成绩与个人的成绩与6060作比较。若小于作比较。若小于6060,则执行,则执行count=count+1count=count+1。(3 3)再用下一个人的成绩与)再用下一个人的成绩与6060作比较。若小于作比较。若小于6060,则执行,则执行count=count+1count=count+1。(4 4)以此方法类推,直到所有人的成绩都处理完毕。)以此方法类推,直到所有人的成绩都处理完毕。(5 5)此时)此时countcount的值即为不及格人数。的值即为不及格人数。分分析析上上述述方方案案,第第(2 2)至至第第(4 4)步步有有重重复复的的部部分分,算算法法实实现现时时可可考考虑虑使使用用循循环来完成。比较的部分可以用分支来实现。环来完成。比较的部分可以用分支来实现。第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7 7.2.2一维数一维数组的定义与引用组的定义与引用7.3 二维数组的定义与引用7.4 字符数组的定义与引用7.5 数组及数组元素做函数的参数7.6 编程举例7.7 习题7.2 7.2 一维数组的定义与引用一维数组的定义与引用定义定义一维数组的语法格式:一维数组的语法格式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ;说明:说明: 类型说明符指定数组中每个元素的数据类型。类型说明符指定数组中每个元素的数据类型。 数组名的命名规则与变量名的命名规则相同。数组名的命名规则与变量名的命名规则相同。 常量表达式指定数组包含元素的个数,即数组长度。常量表达式指定数组包含元素的个数,即数组长度。 数组元素的下标从数组元素的下标从0 0开始排序。开始排序。 数组名代表数组首元素的存储地址。数组名代表数组首元素的存储地址。例如:例如:int a5; int a5; / /* *定义整形数组定义整形数组a a,共有,共有5 5个元素:个元素:a0a0,a1a1,a2a2,a3a3,a4*/a4*/7.2.1 7.2.1 一维数组的定义一维数组的定义7.2 7.2 一维数组的定义与引用一维数组的定义与引用7.2.2 7.2.2 一维数一维数组组元素的引用元素的引用数组元素的引用格式:数组元素的引用格式:数组名数组名 下标下标 说说明:明:1 1、对对数组只能引用数组数组只能引用数组元素元素;2 2、下标下标可以是整型常量或整型可以是整型常量或整型表达式表达式;3 3、数组数组元素可当作变量编程。元素可当作变量编程。7.2 7.2 一维数组的定义与引用一维数组的定义与引用7.2.2 7.2.2 一维数一维数组组元素的引用元素的引用# include void main()int a10,i; /*定义有定义有10个元素的整型数组个元素的整型数组a用来代表自用来代表自 然数然数*/ /*变量变量i作数组的下标作数组的下标*/ for(i=0;i10;i+) /*为数组元素赋值为数组元素赋值*/ ai=i+1; /*注意元素下标与元素值的对照关系:注意元素下标与元素值的对照关系:*/ for(i=0;i10;i+) /*输出每个元素的值输出每个元素的值*/ printf(%4d,ai); /*用用%4d指定输出的宽度为指定输出的宽度为4*/例例7.3 7.3 用有用有1010个元素的数组代表前个元素的数组代表前1010个自然数并输出。输出时每个数个自然数并输出。输出时每个数的宽度为的宽度为4 4。7.2 7.2 一维数组的定义与引用一维数组的定义与引用7.2.3 7.2.3 一维数一维数组组的初始化的初始化定义数组时可以对数组元素进行初始化定义数组时可以对数组元素进行初始化。 对全部元素赋初值。如:对全部元素赋初值。如:int a3=1,2,3;int a3=1,2,3; /*/*初值个数与数组元素的个数相等初值个数与数组元素的个数相等*/*/int a3;int a3;a a0=1;a1=2;a2=3;0=1;a1=2;a2=3; 给数组前面的部分元素赋初值给数组前面的部分元素赋初值。例如:。例如:i int nt a5=1,2,3;a5=1,2,3;/*/*初值个数与数组元素的个数不等,初值个数与数组元素的个数不等,5 5个元素,个元素,3 3个初值个初值*/*/int a5;int a5;a a0=1;a1=2;a2=3;0=1;a1=2;a2=3;/*/*前前3 3个元素被赋指定初值个元素被赋指定初值*/*/a a3=0;a4=0;3=0;a4=0;/*/*后后2 2个元素初值为个元素初值为0*/0*/ 在定义的同时给全部元素赋初值这种情况下,在定义的同时给全部元素赋初值这种情况下,可以省略数组长度。例如:可以省略数组长度。例如:int a3=1,2,3;int a3=1,2,3;/ /* *初值个数与数组元素的个数相等初值个数与数组元素的个数相等*/*/int a =1,2,3;int a =1,2,3;7.2 7.2 一维数组的定义与引用一维数组的定义与引用7.2.3 7.2.3 一维数一维数组组的初始化的初始化例例7.4 7.4 求斐波那契数列的前求斐波那契数列的前2020项,存入数组中并输出,每行项,存入数组中并输出,每行5 5个数,个数,每个数占每个数占8 8列列。分分析:析: 从从题目的要求上粗略看来,与前面章节中用循环的方式求斐波题目的要求上粗略看来,与前面章节中用循环的方式求斐波那契数列没有太大的差别。编程时定义一个存放数列的数组。编写那契数列没有太大的差别。编程时定义一个存放数列的数组。编写2 2个循环,用第个循环,用第1 1个循环计算数列每一项的值病存入数组,用第个循环计算数列每一项的值病存入数组,用第2 2个个循环输出。循环输出。7.2 7.2 一维数组的定义与引用一维数组的定义与引用7.2.3 7.2.3 一维数一维数组组的初始化的初始化# include void main()int a20=1,1,i; /*定义整型数组存储斐波那契数列定义整型数组存储斐波那契数列*/*前前2个数不用计算,在数组定义时直接给出个数不用计算,在数组定义时直接给出*/ clrscr(); /*此函数是库函数,功能是清屏此函数是库函数,功能是清屏*/ for(i=2;i20;i+) /*从第从第3个数开始计算每一个数个数开始计算每一个数*/ ai=ai-1+ai-2; for(i=0;i20;i+) /*输出每个元素的值输出每个元素的值*/ if(i%5=0) /*控制控制5个数一行个数一行*/ printf(n); printf(%8d,ai); 第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7.2一维数组的定义与引用7 7.3 .3 二二维数组的定义与引用维数组的定义与引用7.4 字符数组的定义与引用7.5 数组及数组元素做函数的参数7.6 编程举例7.7 习题7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.1 7.3.1 二维数组的定义二维数组的定义定义二维数组的语法格式定义二维数组的语法格式:类类型型说明符说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22;说明:说明: 常量表达式常量表达式1 1指定第一维的长度,常量表达式指定第一维的长度,常量表达式2 2指定第二维的长度。指定第二维的长度。 二二维维数数组组元元素素在在内内存存中中占占用用连连续续的的存存储储空空间间,按按行行存存放放,即即先先存存第第1 1行的各元素再存第行的各元素再存第2 2行的各元素。行的各元素。 可可以以从从两两个个角角度度去去看看二二维维数数组组:一一是是二二维维数数组组由由元元素素组组成成,另另一一是是二二维维数数组组由由行行组组成成。按按第第二二种种观观点点二二维维数数组组是是一一种种特特殊殊的的一一维维数数组组,其其每每个元素又是一个一维数组。个元素又是一个一维数组。7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.2 7.3.2 二维数组元素的引用二维数组元素的引用二维数组元素的引用格式:二维数组元素的引用格式:数数组名组名 下标下标11下标下标2 2 例例:7.5 7.5 定定义义一一个个2 2行行3 3列列的的二二维维数数组组,第第1 1行行的的值值为为1 1、2 2、3 3,第第2 2行的值为行的值为4 4、5 5、6 6,并按矩阵的方式输出。,并按矩阵的方式输出。程程序序由由两两个个部部分分组组成成。第第一一部部分分构构造造数数组组。由由于于各各元元素素的的值值由由规规律律,可可由由行行列列号号计计算算出出来来:元元素素值值= =行行号号*3+*3+列列号号+1+1。用用一一个个双双重重循循环环遍遍历历数数组组元元素素,外外层层循循环环变变量量i i代代表表行行号号,内内层层循循环环变变量量j j代代表表列列号号。第第二二部部分分输输出出数数组组。同同样样用用双双重重循循环环完完成成。外外层层循循环环每每执执行行一一次次输输出出一一个个回回车车,就会实现矩阵的效果。就会实现矩阵的效果。7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.2 7.3.2 二维数组元素的引用二维数组元素的引用# include void main()int a23,i,j; /*定义定义23的数组,的数组,i代表行号,代表行号,j代表列号代表列号*/ clrscr(); for(i=0;i2;i+) /*构造数组元素的值构造数组元素的值*/ for(j=0;j3;j+) aij=i*3+j+1; for(i=0;i2;i+) /*输出数组输出数组*/ for(j=0;j3;j+) printf(%4d,aij); printf(n); /*每行元素输出完成后输出一个回车每行元素输出完成后输出一个回车*/ 7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化定义二维数组的同时可进行初始化。定义二维数组的同时可进行初始化。 可分行对二维数组赋初值。例如:可分行对二维数组赋初值。例如:int a23=1,2,3,4,5,6;int a23=1,2,3,4,5,6; /*/*外层花括号包含外层花括号包含2 2套子花括号,套子花括号,*/*/ /* *第第1 1套子花括号代表第套子花括号代表第1 1行的值,行的值,*/*/ /* *第第2 2套花括号代表第套花括号代表第2 2行的值行的值*/*/int a23;int a23;a a00=1;a01=2;a02=300=1;a01=2;a02=3; ;a1a10=4;a11=5;a12=6;0=4;a11=5;a12=6; 可将所有数据写在一套花括号中,按顺序给各可将所有数据写在一套花括号中,按顺序给各元素赋值。例如:元素赋值。例如:int a23=1,2,3,4,5,6; int a23=1,2,3,4,5,6; / /* *与前一种方法等价与前一种方法等价*/*/7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化 可对部分元素赋初值。例如:可对部分元素赋初值。例如:int a33=1,4,5; int a33=1,4,5; /*/*中间的空的中间的空的1 1套子花括号,套子花括号,/*/*/ /* *表示对应行无值表示对应行无值*/*/int a33;int a33;a a00=1;a20=4;a21=5;00=1;a20=4;a21=5;未未被赋值的元素初值为被赋值的元素初值为0 0。 在定义的同时给全部元素赋初值这种在定义的同时给全部元素赋初值这种情况下,可以省略数组第一维的长度。情况下,可以省略数组第一维的长度。例如:例如:int a3=1,2,3,4,5,6;int a3=1,2,3,4,5,6;int a23=1,2,3,4,5,6;int a23=1,2,3,4,5,6;7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化例例7.6 7.6 数组数组a a的值为的值为,将其转置后存于数组,将其转置后存于数组b b中,使中,使b b的的值为值为。7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化# include void main()int a23=1,2,3,4,5,6,b32,i,j; /*定义定义a,b两个数组两个数组*/ clrscr(); for(i=0;i2;i+) /*i代表代表a中的行号中的行号*/ for(j=0;j3;j+) /*j代表代表a中的列号中的列号*/ bji=aij; /*a中的中的i行行j列变为列变为b中的中的j行行i列列*/ for(i=0;i3;i+) /*输出转换后的结果输出转换后的结果*/ for(j=0;j2;j+) printf(%4d,bij); printf(n); /*每行后输出回车换行每行后输出回车换行*/ 7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化 例例7.7 7.7 将矩阵将矩阵a a进行自身转置,转换前进行自身转置,转换前a a的值为的值为,转换后,转换后a a的的值为值为。7.3 7.3 二维数组的定义与引用二维数组的定义与引用7.3.3 7.3.3 二二维数组维数组的初始化的初始化# include void main()int a33=1,2,3,4,5,6,7,8,9,i,j,x; /*x用作互换的中间变量用作互换的中间变量*/ clrscr(); for(i=0;i3;i+) /*以下三角为主进行遍历以下三角为主进行遍历*/ for(j=0;ji;j+) x=aij; /*互换对称元素互换对称元素*/ aij=aji; aji=x; for(i=0;i3;i+) /*输出结果输出结果*/ for(j=0;j3;j+) printf(%4d,aij); printf(n); /*每行后换一新行每行后换一新行*/ 第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7.2一维数组的定义与引用7.3 二维数组的定义与引用7 7.4 .4 字符数组的定义与引用字符数组的定义与引用7.5 数组及数组元素做函数的参数7.6 编程举例7.7 习题7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.1 7.4.1 字符字符数组数组的初始化的初始化 对全部元素赋初值。例如:对全部元素赋初值。例如:char c5=char c5=a,b,c,d,ea,b,c,d,e;/*/*初值个数与数组元素的个数相等初值个数与数组元素的个数相等*/*/char c5;c0=a;c1=b;c2=c;c3=d;c4=e;7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.1 7.4.1 字符字符数组数组的初始化的初始化 给数组前面的部分元素赋初值给数组前面的部分元素赋初值。例例如如:char c5=char c5=a,b,ca,b,c;/ /* *初值个数与数组元素的个数不等,初值个数与数组元素的个数不等,5 5个元素,个元素,3 3个初值个初值*/*/int a5; int a5; c c0=a; 0=a; / /* *前前3 3个元素被赋指定初值个元素被赋指定初值*/*/c c1=b;1=b;c c2=c;2=c;a a3=0;a4=03=0;a4=0; ; /*/*后后2 2个元素初值为个元素初值为0*/0*/7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.1 7.4.1 字符字符数组数组的初始化的初始化 在定义的同时给全部元素赋初值在定义的同时给全部元素赋初值这种情况下,可以省略数组长度。这种情况下,可以省略数组长度。例例如:如:char c5=a,b,c,d,e;/ /* *初值个数与数组元素的个数相等初值个数与数组元素的个数相等*/*/char c=char c= a,b,c,d,ea,b,c,d,e;7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.2 7.4.2 字符串和字符串结束标志字符串和字符串结束标志在在语语言言中中没没有有专专门门的的字字符符串串变变量量,通通常常用用一一个个字字符符数数组组来来存存放放一一个个字字符符串串。前前面面介介绍绍字字符符串串常常量量时时,已已说说明明字字符符串串总总是是以以00作作为为串串的的结结束束符符。因因此此当当把把一一个个字字符符串串存存入入一一个个数数组组时时,也也把把结结束束符符00存存入入数数组组,并并以以此此作作为为该该字字符符串串是是否否结结束束的的标标志志。有有了了00标标志志后后,就就不不必必再再用用字字符符数数组组的的长长度度来来判判断断字字符符串的长度了。串的长度了。7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.2 7.4.2 字符串和字符串结束标志字符串和字符串结束标志语言允许用字符串的方式对数组作初始化赋值。例如语言允许用字符串的方式对数组作初始化赋值。例如:7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.3 7.4.3 字符数组的输入输出字符数组的输入输出在采用字符串方式后,字符数组的输入输出将变得简单方便。在采用字符串方式后,字符数组的输入输出将变得简单方便。可用两种方式进行输入输出。可用两种方式进行输入输出。 %c%c格式,每次输入输出格式,每次输入输出一个字符一个字符。 %s %s格式,每次输入输出格式,每次输入输出一个串一个串。说明:说明: 用用%s%s格式输出时,输出项用格式输出时,输出项用数组名数组名。例如:。例如:char c=C program;char c=C program;p printf(”rintf(”s”,cs”,c);); 用用%s%s格式输出时,输出字符不包含结束符格式输出时,输出字符不包含结束符00。 用用%s%s格式输出时,输出时从第一个字符开始,到格式输出时,输出时从第一个字符开始,到00为止。为止。 用用%s%s格式输入时,可输入格式输入时,可输入一个字符串一个字符串。输入项用。输入项用数组名数组名。例如:。例如:char c10;char c10;s scanfcanf(”%(”%s”,cs”,c););7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.4 7.4.4 字符串处理函数字符串处理函数1 1)字符串输出函数)字符串输出函数 putsputs语语法格式:法格式:puts(puts(字符数组名字符数组名) )功功能:能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。例例7.8 7.8 定义一个字符数组并输出。定义一个字符数组并输出。# # include include v void main()oid main() char c110=A, B, 0, C, D, E, F, 0, G, H;char c110=A, B, 0, C, D, E, F, 0, G, H; char c2=My name is :char c2=My name is :nZhangnZhang Ling; Ling; puts(c1);puts(c1); puts(c2);puts(c2); 语语言言提提供供了了丰丰富富的的字字符符串串处处理理函函数数,大大致致可可分分为为字字符符串串的的输输入入、输输出出、合合并并、修修改改、比比较较、转转换换、复复制制、搜搜索索几几类类。使使用用这这些些函函数数可可大大大大减减轻轻编编程程的的负负担担。用用于于输输入入输输出出的的字字符符串串函函数数,在在使使用用前前应应包包含含头头文文件件 stdio.hstdio.h ,使使用用其其它它字字符符串函数则应包含头文件串函数则应包含头文件 string.hstring.h 。7.4 7.4 字符数组的定义与引用字符数组的定义与引用2 2)字符串输入函数)字符串输入函数getsgets语语法格式:法格式:gets(gets(字符数组名字符数组名) )功功能:能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。字符数组的首地址。用该函数可以接受包含空格的串。输入时按回车结束。用该函数可以接受包含空格的串。输入时按回车结束。例例7.9 7.9 先输入一个串,再输出它。先输入一个串,再输出它。# include # include v void main()oid main() char char stst15;15; clrscrclrscr();(); printf(Please input a string:n);printf(Please input a string:n); gets(gets(stst);); printf(The printf(The resualtresualt string is:n); string is:n);p puts(uts(stst);); 7.4 7.4 字符数组的定义与引用字符数组的定义与引用3 3)字符串连接函数)字符串连接函数strcatstrcat语语法格式:法格式:strcatstrcat( (字符数组名字符数组名1 1,字符数组名,字符数组名2)2)功功能:能:把字符数组把字符数组2 2中的字符串连接到字符数组中的字符串连接到字符数组1 1中字符串的后面,并删去字符串中字符串的后面,并删去字符串1 1后的后的串标志串标志”0”0”。本函数返回值是字符数组。本函数返回值是字符数组1 1的首地址。的首地址。例例7.10 7.10 输入一个人名,连接上前缀后输出。输入一个人名,连接上前缀后输出。# include # include v void main()oid main() char st130=My name is ;char st130=My name is ; int int st210;st210; clrscrclrscr();(); printf(Please input your name:n);printf(Please input your name:n); gets(st2);gets(st2); strcatstrcat(st1,st2);(st1,st2);p printf(The rintf(The resualtresualt string is:n); string is:n); puts(st1);puts(st1); 7.4 7.4 字符数组的定义与引用字符数组的定义与引用4 4)字符串拷贝函数)字符串拷贝函数strcpystrcpy语语法格式:法格式:strcpystrcpy( (字符数组名字符数组名1 1,字符数组名,字符数组名2)2)功功能:能:把字符数组把字符数组2 2中的字符串拷贝到字符数组中的字符串拷贝到字符数组1 1中。串结束标志中。串结束标志”0”0”也一同也一同拷贝。字符数名拷贝。字符数名2 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。个字符数组。例例7.11 7.11 拷贝一个串后输出。拷贝一个串后输出。# include # include v void main()oid main() char st115 =”0123456789abcd”,st2=C Language;char st115 =”0123456789abcd”,st2=C Language; clrscrclrscr();(); strcpystrcpy(st1,st2);(st1,st2); puts(st1);puts(st1); 7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.4 7.4.4 字符串处理函数字符串处理函数5 5)字符串比较函数)字符串比较函数strcmpstrcmp语语法格式:法格式:strcmpstrcmp( (字符数组名字符数组名1 1,字符数组名,字符数组名2)2)功功能:能:按照按照ASCIIASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。果。 字符串字符串1 1字符串字符串2 2,返回值,返回值0 0; 字符串字符串22字符串字符串2 2,返回值,返回值00; 字符串字符串11字符串字符串2 2,返回值,返回值00。本函数也可用于比较本函数也可用于比较两个字符串常量两个字符串常量,或比较,或比较数组和字符串常量数组和字符串常量。7.4 7.4 字符数组的定义与引用字符数组的定义与引用7.4.4 7.4.4 字符串处理函数字符串处理函数例例7.12 输入一个串,并与串输入一个串,并与串”C Language”进行比较。进行比较。# include # include void main()int k; char st115,st2=C Language; clrscr(); printf(input a string:n); gets(st1); k=strcmp(st1,st2); if(k=0) printf(st1=st2n); if(k0) printf(st1st2n); if(k0) printf(st1st2n);7.4 7.4 字符数组的定义与引用字符数组的定义与引用6)测字符串长度函数)测字符串长度函数strlen语语法格式:法格式:strlen(字符数组名字符数组名)功功能:能:测字符串的实际长度测字符串的实际长度(不含字符串结束标志不含字符串结束标志0),并作为函数返回值。,并作为函数返回值。例例7.13 求一个串的长度求一个串的长度# include # include void main()int k;char st=C language; clrscr(); k=strlen(st); printf(The lenth of the string is %dn,k);第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7.2一维数组的定义与引用7.3 二维数组的定义与引用7.4 字符数组的定义与引用7 7.5 .5 数组及数组元素做函数的参数数组及数组元素做函数的参数7.6 编程举例7.7 习题7.5 7.5 数组及数组元素做函数的参数数组及数组元素做函数的参数7.5.1 7.5.1 数组元素做函数的参数数组元素做函数的参数数数组组元元素素可可以以充充当当函函数数的的实实参参,用用法法与与作作用用与与普普通通变变量量相相同。函数发生调用时,将同。函数发生调用时,将实参数组元素实参数组元素的值传递给的值传递给形参形参。例例7.14 7.14 利用函数求两数组元素的最大值。利用函数求两数组元素的最大值。7.5 7.5 数组及数组元素做函数的参数数组及数组元素做函数的参数# include # include i int nt fmaxfmax(int (int x,intx,int y) y) /*/*函数的定义与前述方法相同函数的定义与前述方法相同*/*/ int z; int z; if(xy)if(xy) z=x; z=x; else else z=y; z=y; return z;return z; v void main()oid main() int a2=3,5; int a2=3,5; /* /*定义一个有定义一个有2 2个元素的数组个元素的数组*/*/ int max;int max; max=max=fmaxfmax(a0,a1); (a0,a1); /* /*调用时,用数组元素做实参调用时,用数组元素做实参*/*/ printf(The max = %printf(The max = %d,maxd,max);); 7.5 7.5 数组及数组元素做函数的参数数组及数组元素做函数的参数7.5.2 7.5.2 数组做函数的参数数组做函数的参数数数组组做做函函数数参参数数即即可可以以充充当当实实参参,也也可可以以充充当当形形参参。函函数数发发生生调调用用时时,传传递递给给形形参参数数组组的的是是实实参参数数组组首首元元素素的的地地址址,使使得得形形参参数数组组与与实实参参数数组组占占据据相相同同的的内内存存单单元元。可可以以认认为为,形形参参数数组组与与实实参参数数组组为为同同一一数数组组,形形参参数数组组名名为为实实参参数数组组的的别别名名。在在子子函函数数中中对对形形参参数数组组的的改改变相当于改变了实参数组。变相当于改变了实参数组。数组充当实参的语法格式:数组充当实参的语法格式:数组名数组名数组充当形参的语法格式:数组充当形参的语法格式:类型说明符类型说明符 数组名数组名 7.5 7.5 数组及数组元素做函数的参数数组及数组元素做函数的参数例例7.15 7.15 利用函数对数组元素做乘利用函数对数组元素做乘2 2计算。计算。# include # include v void farr(int x) oid farr(int x) /*/*定义形参数组定义形参数组*/*/ int i;int i; for(i=0;i3;i+) for(i=0;i3;i+) /*/*在子函数中改变形参数组的值在子函数中改变形参数组的值*/*/ xi*=2; xi*=2; void main()void main() int a3=1,3,5; int a3=1,3,5; /*/*定义一个有定义一个有3 3个元素的数组个元素的数组*/*/ int i;int i; printf(printf(DiaoDiao yongyong hanhan shushu qianqian:n);:n); for(i=0;i3;i+) for(i=0;i3;i+) /*/*调用函数前输出一遍调用函数前输出一遍a a数组数组*/*/ printf(%4d,ai); printf(%4d,ai);f farr(a); arr(a); /*/*用数组做实参用数组做实参*/*/p printf(n rintf(n DiaoDiao yongyong hanhan shushu houhou:n);:n);f for(i=0;i3;i+) or(i=0;i3;i+) /*/*调用函数后再输出一遍调用函数后再输出一遍a a数组数组*/*/ printf(%4d,ai); printf(%4d,ai); 第七章第七章 数组数组7.1 成组数据处理问题实例及解决方法7.2一维数组的定义与引用7.3 二维数组的定义与引用7.4 字符数组的定义与引用7.5 数组及数组元素做函数的参数7 7.6 .6 编程举例编程举例7.7 习题7.6 7.6 编程举例编程举例例例7.16 7.16 求求斐波那契数列斐波那契数列前前2020项中第项中第1 1,5 5,9 9,1313,1717项的和。项的和。 分析:分析: 若若仅仅计算斐波那契数列前若干项的值,那么用数组或用仅仅计算斐波那契数列前若干项的值,那么用数组或用循环都可以。若想对数列中的数进行进一步的计算,则循环都可以。若想对数列中的数进行进一步的计算,则2 2种方法的效种方法的效率是完全不同的。若用循环解本题需要记住当前计算到了第几项,率是完全不同的。若用循环解本题需要记住当前计算到了第几项,还要判断是否是被求和项,非常麻烦。若用数组解本题可考虑用两还要判断是否是被求和项,非常麻烦。若用数组解本题可考虑用两个循环。第个循环。第1 1个循环计算数列的每一项,第个循环计算数列的每一项,第2 2个循环求和。个循环求和。7.6 7.6 编程举例编程举例# include void main()int a20=1,1,i,s=0;/*变量量s表示和,定表示和,定义时直接直接赋初初值清零清零*/ clrscr(); for(i=2;i20;i+)/*计算数列各算数列各项*/ ai=ai-1+ai-2; for(i=0;i20;i+) if(i+1=1|i+1=5|i+1=9|i+1=13|i+1=17/*判断当前判断当前项是否是否为求和求和项*/ s+=ai; printf(s=%d,s);7.6 7.6 编程举例编程举例例例7.17 7.17 从键盘接收任意从键盘接收任意1010个整数存入数组,并最小数及其下标位置。个整数存入数组,并最小数及其下标位置。分析:分析: 设设计计程程序序时时,可可以以考考虑虑采采用用循循环环完完成成对对数数组组的的遍遍历历。设设计计2 2个个变量:用变量:用valuevalue存放最小数的值,存放最小数的值,pospos存放下标位置。存放下标位置。 valuevalue的的初初值值为为数数组组首首元元素素,pospos的的初初值值为为0 0。从从下下标标为为1 1的的元元素素开始遍历数组时,若某元素的值比开始遍历数组时,若某元素的值比valuevalue还小,则更新还小,则更新valuevalue和和pospos的值。的值。程序分成程序分成3 3个部分:第个部分:第1 1部分输入部分输入1010个数据;第个数据;第2 2部分计算;第部分计算;第3 3部分输出。部分输出。7.6 7.6 编程举例编程举例# include void main()int a10;/*定定义有有10个元素的数个元素的数组*/ int i,value,pos; /*i做循做循环变量量*/ for(i=0;i10;i+)/*输入入10个初始数据个初始数据*/ scanf(%d,&ai); value=a0;/*为value和和pos赋初初值*/ pos=0;for(i=1;i10;i+)/*从下从下标为1的元素开始遍的元素开始遍历数数组*/ if(aivalue)/*若找到新的最小若找到新的最小值,则更新更新value和和pos的的值*/ value=ai; pos=i; printf(value=%d,pos=%d,value,pos);/*输出出结果果*/7.6 7.6 编程举例编程举例请思考:变量请思考:变量valuevalue和和pospos有什么关系?编程时是否可以省有什么关系?编程时是否可以省略变量略变量valuevalue。若可以,请改写程序。若可以,请改写程序。例例7.18 将有将有10个元素的数个元素的数组的最小的最小值与首元素互与首元素互换位置。位置。# include void main()int a10;/*定定义有有10个元素的数个元素的数组*/ int i,value,pos;/*i做循做循环变量量*/int x;/*x做互做互换中中间变量量*/ for(i=0;i10;i+)/*输入入10个初始数据个初始数据*/ scanf(%d,&ai); printf(n yuan shi shu zhu:n);/*输出原始数据出原始数据*/ for(i=0;i10;i+) printf(%4d,ai); value=a0;/*为value和和pos赋初初值*/ pos=0;for(i=1;i10;i+)/*从下从下标为1的元素开始遍的元素开始遍历数数组*/ if(aivalue)/*若找到新的最小若找到新的最小值,则更新更新value和和pos的的值*/ value=ai; pos=i; x=a0;/*互互换两数的位置两数的位置*/ a0=apos; apos=x;printf(n zui hou jie guo:n);/*输出最后出最后结果果*/ for(i=0;i10;i+) printf(%4d,ai);请思考:思考:语句句a0=apos;可否改可否改为a0=value;?为什么?如果不要什么?如果不要x做互做互换的中的中间变量,是否可以完成互量,是否可以完成互换?若?若可以可以请改写程序。改写程序。7.6 7.6 编程举例编程举例例例7.19 从从键盘接收任意接收任意10个整数,用个整数,用选择排序法升序排列后排序法升序排列后输出。出。选择排序法的基本思想是:将一组数中最小的数调整到最前面(升序)。选择排序法的基本思想是:将一组数中最小的数调整到最前面(升序)。设有设有n n个数,算法具体实现过程如下:个数,算法具体实现过程如下: 设第设第1 1个数最小,用变量个数最小,用变量k k记录其位置;记录其位置; 用用k k所在位置的数与第所在位置的数与第2 2个数比,若第个数比,若第2 2个数小,则个数小,则k k记录新的最小数的位置,否则不变;记录新的最小数的位置,否则不变; 以此类推;以此类推; 用用k k所所在在位位置置的的数数与与第第n n个个数数比比,若若第第n n个个数数小小,则则k k记记录录新新的的最最小小数数的的位位置置,否否则则不不变变;互互换换k k所在位置的数与第所在位置的数与第1 1个数。经过上述步骤后完成个数。经过上述步骤后完成1 1遍扫描,最小的数被调整到了最前面;遍扫描,最小的数被调整到了最前面; 对剩余的对剩余的n-1n-1个数进行个数进行至至步的第步的第2 2遍扫描。第遍扫描。第2 2小数被调整到了第小数被调整到了第2 2的位置;的位置; 以此类推;以此类推; 进行进行n-1n-1遍扫描后,只剩遍扫描后,只剩1 1个数即最大的数,不用再比,排序完成。个数即最大的数,不用再比,排序完成。将将程程序序分分成成3 3个个部部分分:第第1 1部部分分输输入入1010个个任任意意整整数数;第第2 2部部分分进进行行排排序序;第第3 3部部分分输输出出排排序序后后的的结果。结果。7.6 7.6 编程举例编程举例# include void main()int a10,i,j,x,k;/*变量量k表示当前最小数的位置表示当前最小数的位置*/ clrscr(); for(i=0;i10;i+)/*读入入10个数个数*/ scanf(%d,&ai); for(j=0;j=8;j+)/*变量量j控制比控制比较的遍数,的遍数,*/*且表示每且表示每1遍最小数的最遍最小数的最终位置位置*/ k=j;/*设第第1个数最小个数最小*/ for(i=j+1;i=9;i+)/*从下一个数开始找新的最小数从下一个数开始找新的最小数*/ if(aiak)k=i; x=ak;/*调整最小数的位置整最小数的位置*/ ak=aj; aj=x; for(i=0;i10;i+)/*输出出*/ printf(%5d,ai);7.6 7.6 编程举例编程举例例:例:7.20 7.20 从键盘接收任意从键盘接收任意1010个整数,用插入排序法升序排列后输出。个整数,用插入排序法升序排列后输出。插入排序法的基本思想是:将一个数插入到升序数列的所有比它大的数前面后,数列仍然插入排序法的基本思想是:将一个数插入到升序数列的所有比它大的数前面后,数列仍然有序有序(升序)。升序)。设有设有n n个数,算法具体实现过程如下:个数,算法具体实现过程如下: 只有只有1 1个数时,数列是升序的;个数时,数列是升序的; 2 2个数与第个数与第1 1个数比,若第个数比,若第2 2个数不小于第个数不小于第1 1个数,排列顺序不变,否则互换两数,完成个数,排列顺序不变,否则互换两数,完成1 1遍排序;遍排序; 设有设有n-1n-1个数已升序排好;个数已升序排好; 第第n n个数与第个数与第n-1n-1个数比,若不小于第个数比,若不小于第n-1n-1个数,排列顺序不变,本遍排序完成,否则互换两数;个数,排列顺序不变,本遍排序完成,否则互换两数; 再与其前面的数(即第再与其前面的数(即第n-2n-2个数)比,若不小于,则排列顺序不变,本遍排序完成,否则互换个数)比,若不小于,则排列顺序不变,本遍排序完成,否则互换两数;两数; 以此类推,直至第以此类推,直至第1 1个数处理完为止,排序完成。个数处理完为止,排序完成。将程序分成将程序分成3 3个部分:第个部分:第1 1部分输入部分输入1010个任意整数;第个任意整数;第2 2部分进行排序;第部分进行排序;第3 3部分输出排序后的结果。部分输出排序后的结果。7.6 7.6 编程举例编程举例# include void main()int a10,i,j,x;/*变量量x用于存放被插入的数用于存放被插入的数*/ clrscr(); for(i=0;i10;i+)/*输入入*/ scanf(%d,&ai); for(j=1;j=0)/*当当还有没比完的数有没比完的数时*/ if(ai+1=ai) break;/*不小于前一数不小于前一数时,结束本遍排序束本遍排序*/x=ai;/*与前一数互与前一数互换*/ai=ai+1;ai+1=x; i-; for(i=0;irlr,表示没找到,查找结束;,表示没找到,查找结束; 计算中间位置计算中间位置m=(m=(l+rl+r)/2)/2; m m位置的数与目标数相比;位置的数与目标数相比; 若相等表示找到该数,查找结束;若相等表示找到该数,查找结束; 若大于目标数,修改右边界位置,若大于目标数,修改右边界位置,r=m-1r=m-1,转第,转第步继续;步继续; 若小于目标数,修改左边界位置,若小于目标数,修改左边界位置,l=m+1l=m+1,转第,转第步继续。步继续。7.6 7.6 编程举例编程举例# include # include v void main()oid main() int a10=1,3,5,7,12,14,16,27,45,99,int a10=1,3,5,7,12,14,16,27,45,99,l,r,m,xl,r,m,x; ;/*/*变量变量x x用于存放目标数用于存放目标数*/*/ clrscrclrscr();(); printf(Please input a numbern);printf(Please input a numbern);/*/*输入前做一个提示输入前做一个提示*/*/ scanfscanf(%(%d,&xd,&x);); l=0l=0; ; /*/*置左右边界的初值置左右边界的初值*/*/ r=9;r=9; while(l=r)while(l=r)/*/*满足满足l=rlxf(amx) )/*/*大于目标数,修改右边界大于目标数,修改右边界*/*/r r=m-1;=m-1;i if(amx)f(amr)f(lr)p printf(“Not found.nrintf(“Not found.n”);”);/*/*范围为空,表示找不到范围为空,表示找不到*/*/ 7.6 7.6 编程举例编程举例例:例:7.22 7.22 将数组中元素的值按逆序重新存放。将数组中元素的值按逆序重新存放。 逆序逆序存放时,原序排第存放时,原序排第1 1的数现在排最后,原序排最后的数现在的数现在排最后,原序排最后的数现在排第排第1 1,即将数组中的数与按中间轴对称的数进行互换。,即将数组中的数与按中间轴对称的数进行互换。 进行进行互换时要注意元素的个数。可以以中间轴左侧的元素作基准互换时要注意元素的个数。可以以中间轴左侧的元素作基准进行遍历,将其与对称元素进行互换。编程时注意中间轴的位置。若数组进行遍历,将其与对称元素进行互换。编程时注意中间轴的位置。若数组a a有有1010的数,下标从的数,下标从0 0开始,中间轴在开始,中间轴在a4a4,a5a5之间,遍历时左侧元素下之间,遍历时左侧元素下标从标从0 0遍历到遍历到4 4。若数组。若数组a a有有9 9的数,下标从的数,下标从0 0开始,中间轴是开始,中间轴是a4a4,遍历时,遍历时左侧元素下标从左侧元素下标从0 0遍历到遍历到3 3。写循环时循环变量的终值小于表达式。写循环时循环变量的终值小于表达式“数组长数组长度度/2/2”即可。还要注意对称元素的下标之间的关系:对称元素下标之和即可。还要注意对称元素的下标之间的关系:对称元素下标之和= =数组长度数组长度-1-1。即下标为。即下标为i i的元素,其对称的元素下标为数组长度的元素,其对称的元素下标为数组长度-1-i-1-i。7.6 7.6 编程举例编程举例# include void main()int a10,i,x;/*变量量x用作互用作互换时的中的中间变量量*/ clrscr(); for(i=0;i10;i+) /*输入数入数组元素的元素的值*/ scanf(%d,&ai); for(i=0;i10/2;i+)/*以中以中间轴左左侧的元素作基准的元素作基准进行遍行遍历*/ x=ai;/*互互换对称元素称元素*/ ai=a10-1-i; a10-1-i=x; for(i=0;i10;i+)/*输出出结果果*/ printf(%5d,ai);7.6 7.6 编程举例编程举例例例7.23 7.23 从键盘输入一从键盘输入一3 34 4的矩阵的值,并求出最大元素及其位置。的矩阵的值,并求出最大元素及其位置。写程序时,预设下标为写程序时,预设下标为0000的元素为最大值。遍历数组元素时每的元素为最大值。遍历数组元素时每一数都与当前最大值相比,比最大值大时,更新所存的数据。一数都与当前最大值相比,比最大值大时,更新所存的数据。7.6 7.6 编程举例编程举例# include void main()int a34,i,j,x,l,r; /*变量量x存放最大存放最大值,l存放行号,存放行号,r存放列号存放列号*/ clrscr(); for(i=0;i3;i+) for(j=0;j4;j+) scanf(%d,&aij); /*读入数入数组*/ x=a00;/*设a00为最大最大值*/ l=r=0;/*记录下下标*/ for(i=0;i3;i+)/*遍遍历数数组*/ for(j=0;jx)/*找到新的最大找到新的最大值时,更新原,更新原值*/ x=aij; l=i; r=j; printf(Max number is %d,posation is %d,%dn,x,l,r); /*输出出结果果*/7.6 7.6 编程举例编程举例例例7.24 7.24 用函数完成例用函数完成例7.17.1和例和例7.27.2。分析:分析: 在在主函数中实现数据的输入和输出。用主函数中实现数据的输入和输出。用fmaxfmax函数求最高分。用函数求最高分。用fcountfcount函函数求不及格人数。为数求不及格人数。为fmaxfmax函数设计另两个形参:函数设计另两个形参:arrarr和和n n。arrarr用来接收用来接收从主函数传来的学生成绩。从主函数传来的学生成绩。n n用来存数组元素的个数,也即学生数。在主函用来存数组元素的个数,也即学生数。在主函数中函数调用作为表达式直接输出。数中函数调用作为表达式直接输出。主函数只有主函数只有3 3条语句,统计计算分别由子函数来完成,使得程序清晰,更好条语句,统计计算分别由子函数来完成,使得程序清晰,更好地体现了模块化程序设计的思想。地体现了模块化程序设计的思想。# include int fmax(int arr,int n)/*定定义形参数形参数组*/int max,i; max=arr0;/*设首元素首元素为最大最大值的初的初值*/ for(i=1;imax) max=arri; return max;/*返回返回计算算结果果*/int fcount(int arr,int n)int count,i;count=0;/*设count的初的初值为0*/for(i=0;in;i+)/*统计不及格人数不及格人数*/ if(arri60) count+; return count;/*返回返回计算算结果果*/void main() int a10= 90,80,95,56,65,47,93,82,75,61;/*预置数置数组初初值*/ printf(n zui gao fen wei:%d,fmax(a,10);/*将函数将函数调用做表达式,直接用做表达式,直接输出出*/printf(n bu ji ge ren shu wei :%d,fcount(a,10);7.6 7.6 编程举例编程举例例例7.25 7.25 输入五个国家的名称按字母顺序排列输出。输入五个国家的名称按字母顺序排列输出。国国家家名名是是字字符符串串,5 5个个国国家家名名应应用用一一个个二二维维字字符符数数组组来来表表示示。此此题题相相当当于于对对5 5个个字字符符进进行行升升序序排排序序。排排序序时时用用strcmpstrcmp函函数数比比较较各各串的大小。用选择排序法排序串的大小。用选择排序法排序# include # include /*使用使用strcmp函数函数须加上加上头文件文件string.h*/void main()char st20,cs520;/*定定义二二维数数组存放存放5个国家名,个国家名,*/*一一维数数组作作临时数数组*/ int i,j,p; clrscr(); printf(input countrys name:n); for(i=0;i5;i+) /*输入入5个名字个名字*/ gets(csi); for(i=0;i4;i+) /*用用选择法排序法排序*/ p=i;strcpy(st,csi); for(j=i+1;j5;j+) if(strcmp(csj,st)0) p=j; strcpy(st,csj); if(p!=i) strcpy(st,csi); strcpy(csi,csp); strcpy(csp,st); printf(The resualt is:n); for(i=0;i5;i+) /*输出出结果果*/ puts(csi);
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号