输入个学生的某门课程的成绩打印出低于平均分的同学的.ppt
《输入个学生的某门课程的成绩打印出低于平均分的同学的.ppt》由会员分享,可在线阅读,更多相关《输入个学生的某门课程的成绩打印出低于平均分的同学的.ppt(65页珍藏版)》请在三一办公上搜索。
1、,为什么要使用数组,下面我们引进一种新的数据类型数组,应用数组类型解决上述问题,程序就会变得十分简单。应用数组的程序段如下:tot:=0;tot表示总分for i:=1 to 50 do begin循环读入每一个学生的成绩,并累加它到总分 read(ai);tot:=tot+ai;end;ave:=tot/50;计算平均分for i:=1 to 50 doif aiave then writeln(i,ai);如果第i个同学成绩小于平均分,则输出,数组类型定义:type 类型标识符=array下标类型1,下标类型2,of 元素类型;其中下标类型必须是有序的(整型、字符型、布尔型、枚举型、子界型
2、等)逗号隔开的下标类型个数表示数组的维数。一维数组在编程中多用于描述线性关系,如一组数,一组成绩等。二维数组在编程中多用于描述二维关系,如地图,棋盘、迷宫等。,数组由具有固定数目的相同类型的元素按一定的顺序排列而成。,一维数组的定义,格式:type 类型标识符=array下标类型 of 元素类型;var 数组名:类型标识符;如:type data=array1.50 of integer;var a,b:data;注意:数组类型和数组变量是两个不同的概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型而是数组变量。如上定义,在程序中data不能在执行部分中出现。也可以将数组类型定义和变
3、量定义合并在一起:var 数组名:array下标类型 of 元素类型;如:var a,b:array1.50 of integer;,在说明部分定义了一个数组变量之后,pascal 编译程序就为所定义的数组在内存空间开辟一串地址连续的存储单元。数组中的各个元素就共用一个数组名(即该数组变量名),它们之间是通过下标不同以示区别的。对数组的操作归根到底就是对数组元素的操作。,说明:score数组共有50个元素,在内存中,这50个数组元素共占用50个连续的存储单元,每个存储单元中只能存储一个整数,占用2个字节的存储空间,因此整个数组共占用100个字节的存储空间。第一个元素对应的存储单元的起始地址称为
4、数组首地址。若设这个首地址为loc(score1),则数组中元素i的内存地址loc(scorei)可按下式计算:loc(scorei)=loc(score1)+(i-1)*2 例如:loc(score10)=loc(score1)+18,首地址,score1 score2 score3 score50,数组名代表的并不是一个变量,而是一批变量,因而,不能直接整个数组读入,而是要逐个数组元素读入,通常用循环结构来完成这一功能。for i:=1 to 10 do read(ai);从键盘读入数组元素的值;最常用的方法for i:=1 to 10 do ai:=i;数组元素a1到a10的值分别为1到
5、10;数据赋初值for i:=1 to 10 do ai:=0;数组元素清0;最常用的数据初始化的方法for i:=1 to 10 do ai:=random(100);随机产生10个100以内的数,赋给各数组元素,数组元素的输入,和数组元素的输入相同,数组元素的输出也不能由一个write语句直接完成。同样要逐个数组元素输出。通常也用循环结构来完成这一功能:for i:=1 to 10 do write(ai,);数组元素之间用空格分隔writeln;,数组元素的输出,vara:array 1.10 of integer;i,s:integer;begin for i:=1 to 10 do
6、read(ai);for i:=10 downto 1 do write(ai,);writeln;s:=0;for i:=1 to 10 do s:=s+ai;writeln(s=,s);end.,从键盘输入10个数,将这10个数逆序输出,并求这10个数的和,输出这个和。,1、读入一个含有n个元素的整型数组,请找出其中值最大的一个数组元素,并指出它的下标。,分析:设置二个变量max和k,先将第一个元素的值存入max,并将其下标存入k,然后从第二个元素开始逐个与max比较,如果max的值比当前元素的值小,则把max的值变成当前元素的值,并记录其下标于k中。这样当所有元素都与max比较完后,ma
7、x中的值即是所有元素中的最大值,k中的值便是其下标。,var i,k,n,max:integer;a:array 1.100 of integer;begin readln(n);for i:=1 to n do read(ai);readln;max:=a1;();for i:=()do if()then begin();k:=i;end;writeln(max=a,k,=,max);end.,k:=1,2 to n,maxai,max:=ai,2、将数组a中的各元素按颠倒的次序重放后再输出。(约定:在操作时,只能借助于一个临时存储单元而不得另外开辟数组),分析:假设数组a有n个整型元素,则
8、a1的值最终要存放在an中,反之an的值最终要存放在a1中,通过交换二者的赋值可实现这一目的。类似地,a2应与an-1交换,a3应与an-2交换,,直到每对要交换的元素对的值都交换过为止。程序中使用变量i和j存放当前要交换赋值的两个数组元素的下标,开始时,i=1,j=n,每交换赋值一次,则i增加1,同时j减少1,当ij时,交换结束。,var i,j,n,temp:integer;a:array 1.100 of integer;begin readln(n);for i:=1 to n do read(ai);i:=1;j:=n;while()do begin temp:=ai;ai:=aj;
9、();();()end;for i:=1 to n do write(ai,);end.,ij,aj:=temp,i:=i+1,j:=j-1,3、读入一个十进制自然数,要求将其转换成二进制数后输出。,分析:将十进数转换成二进制数,一般采用除二取余法。如果用一个数组b来存放二进制数,可以依次把所得的余数存入b0、b1、bn,最后按bn、bn-1、b1、b0的顺序输出这些余数,就得到了所求的二进制数。,例如:,余数:,0,输出结果为:11001,0,1,0,1,1,var i,j,n:longint;b:array 0.31 of 0.1;begin readln(n);write(n,=();i
10、:=0;while()do begin();i:=i+1;指定下一个余数的存放位置 n:=n div 2 产生的商将作为新的被除数 end;for j:=()do write(bj);writeln()2)end.,n0,bi:=n mod 2,i-1 downto 0,4、输入一串字符,字符个数不超过100,且以“.”结束,请判断它们是否构成回文。若是回文,则输出Yes,否则输出No。,分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符(存入数组letter中),并统计这串字符的长度,然后首尾字符比较,若相等则取下一对字符再比较
11、,就可以判断出是否为回文。,varletter:array1.100of char;i,j:0.100;ch:char;begin read(ch);();while ch.do begini:=i+1;();read(ch)end;,();while(ji)and()do begin i:=i-1;j:=j+1;end;if()then writeln(Yes)else writeln(No);end.,i:=0,letteri:=ch,j:=1,(letterj=letteri),j=i,5、输入一个以.结束的字符串,统计并输出其中各小写字母出现的次数。,分析:引入一个下标类型为字符子界的
12、数组num,用于存放字符串中各小写字母出现的次数。例如用numa记录字母a出现的次数。开始时应将num的每个元素置成0,当读入一个ch后,若ch是小写字母,则让numch加1。,var num:arraya.z of integer;ch:char;begin for ch:=a to z do();read(ch);while ch.do begin if()then numch:=numch+1;();end;for ch:=()do if numch 0 then writeln(ch,numch);end.,numch:=0,(ch=a)and(ch=z),a to z,read(ch
13、),6、某宾馆有一百个房间,从 1100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间作”相反处理”,第三个服务员把所有编号是3的倍数的房间再作”相反处理”,以后每个服务员都是如此。当第100个服务员来过后,问有哪几扇门是打开的。(所谓的“相反处理”指:原来开着的门关上,原来关着的门打开。),分析:可设置一个表示门是开的还是关的标志数组,另外由于有固定的循环次数,可用for循环。,const n=100;var a:array1.n of();i,j:integer;begin for i:=1 to n do ai:=true;for i:=2 to n
14、do for j:=()do if()then aj:=not(aj);for i:=1 to n do if()then write(i:5);end.,boolean,i to n,j mod i=0,ai=true,7、用筛法求100以内的素数。如:20以内的素数为2、3、5、7、11、13、17、19。,分析:素数是除了1和它本身以外没有其它约数的数。用筛法求素数的方法是:用质数筛去合数。从第一个素数2开始,把它的倍数去掉(置为0)。这样2以后的第一个非0数就一定也是素数,把它的倍数也删了,重复这个删数过程,直到在所找到的素数之后再也找不到一个非0数为止。最后把所有非0数输出。,var
15、 a:array 1.100 of integer;i,j,k:integer;begin for i:=1 to 100 do ai:=i;a1:=0;i:=2;1不是素数 while i=100 do begin k:=i;while k=100 do begin k:=k+i;();end;();while ai=0 do();查找接下来的第一个非0数 end;for i:=1 to 100 do if()then write(ai,);end.,ak:=0,i:=i+1,i:=i+1,ai0,8、有一个有N个不同整数的数列:例如N=4时,有4个不同整数的数列为17,4,16,5。数列中
16、的第1个数17,比它后面的三个数都大,则称数17的逆数为3;数列中的第2个数4,比它后面的数都小,则称数4的逆数为0;同时记数列中全部逆数的和称为数列的逆数。如数列17,4,16,5的逆数为:3+0+1+0=4 程序要求:当给出N个不同整数的数列后,求出此数列的逆数。,分析:为求得上面问题的解,设置数组a:array1.n of integer和逆数计数器s,然后用一个二重循环求出数列的逆数。,const n=10;var i,j,s:integer;a:array1.nof integer;begin s:=0;for i:=1 to n do read(ai);for i:=1 to()d
17、o for j:=()do if aiaj then();writeln(s=,s)end.,n-1,i+1 to n,s:=s+1,9、输入n个整数a1、a2、ak、ak+1、an,对其进行平移处理后,按ak+1、ak+2、an、a1、a2、ak的顺序输出,其中k是小于n的常数。,解题思路:将n个整数输入到整型数组a中,重复k次下列步骤,完成平移操作;将a1中的值保存到临时单元t中;将a2-an中的值顺序左移一个位置;将临时单元t中的值存到an中.步骤是个循环过程,操作时要先把a2中的值移到a1中,然后把a3中的值移到a2中,最后把an中的值移到an-1中,不可倒过来,否则会把a1-an中的
18、内容都变成an中的值。,const n=8;k=4;var a:array1.n of integer;i,j,t:integer;begin for i:=1 to n do read(ai);for i:=()do begin t:=a1;for j:=2 to n do();()end;for j:=1 to n do write(aj,);end.,1 to k,aj-1:=aj,an:=t,10、已知一个数组中的元素按非递减有序排列。下列程序的功能是删除数组中多余的值相同的元素,请完善程序。,var i,j,n:integer;a:array1.100of integer;begin
19、 read(n);for i:=1 to n do read(ai);();while i=n-1 do if()then i:=i+1,else begin for j:=()do aj-1:=aj;();end;for i:=1 to n do write(ai:2);end.,i:=1,aiai+1,i+2 to n,n:=n-1,11、约瑟夫问题:设有n个人编号分别为1n,围坐在一个圆桌周围。现从第一个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,如此重复,直到所有人都出列为止。输入n和m,求出出列的顺序表。例如当n8,m5时,出列的顺序表是:5
20、2 8 7 1 4 6 3。,var a:array1.10 of boolean;i,j,s,n,m:integer;begin readln(n,m);for i:=1 to n do ai:=true;i:=0;j:=0;s:=0;repeat i:=i+1;if in then();if ai then begin();if s=m then begin();write(i:4);();j:=j+1;end;end;until();end.,i:=1,s:=s+1,ai:=false,s:=0,j=n,提示:程序中i表示人的编号,j表示已出列的人数,s表示当前所报的数字,布尔数组ai用
21、来标记第i个人有没有出列。,12、给定一串整数数列,求出所有的递增和递减子序列的数目。如数列7、2、6、9、8、3、5、2、1可分为(7,2),(2,6,9),(9,8,3),(3,5),(5,2,1)共5个子序列,答案就是5。我们称2,9,3,5为转折元素。,提示:本题的关键在于转折元素的判定。程序中用数组ai来存放一串整数数列,当(ai-ai-1)*(ai+1-ai)0时,我们可以认为出现了一个转折元素。程序中用dz和dj两个计数器来分别统计递增数列和递减数列的个数。最后输出dz+dj的值。,const n=9;var a:array1.nof integer;i,dz,dj:intege
22、r;begin for i:=1 to n do read(ai);dz:=0;dj:=0;if()then dz:=1 else dj:=1;for i:=2 to n-1 do begin if()then begin if ai+1ai then();end;end;writeln(total=,dz+dj);end.,a2a1,(ai-ai-1)*(ai+1-ai)0,dj:=dj+1,dz:=dz+1,13、精确计算n的阶乘n!(n大于小于50)解题思路:因为49!已超出longint类型的表示范围,所以不能用longint类型来表示n!(也不能用实数类型,因为实数运算有误差)。可以
23、用一个一维数组来表示这个大数,数组中每个元素只存放一个数字。因为50!小于10的100次方,所以数组下标类型用子界1.100。下图所示的是大数3628800在数组中的存储方法。,0,0,8,8,2,6,3,1 2 99 100,const max=100;数组最大下标 n=20;计算20!var a:array1.max of 0.9;存放大数 i,j,k,x:integer;begin k:=max;ak:=1;初值为1 for i:=2 to n do 每次将保存在ak-amax中的大数乘上一个i begin x:=0;来自低位的进位 for j:=max downto k do,begi
24、n x:=x+aj*i;aj:=();x:=();end;while x0 do 处理最后一位进位 begin();ak:=x mod 10;x:=x div 10;end end;for i:=()do write(ai:1)end.,x mod 10,x div 10,k:=k-1,k to max,max,乘7,0,4,0,5,例14、输入十个整数,把这十个数按由小到大的顺序排列。(选择排序)分析:一组整数放在a1,a2,an-1,an中,先将a1与其后的各元素依次比较,凡比它小的,则与之交换,比较结束后,则a1中存放的是最小的数;然后将a2与其后各元素再依次比较,凡比它小的,则与之交换
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 输入 学生 课程 成绩 打印 低于 平均 同学
链接地址:https://www.31ppt.com/p-5382114.html