聪明人的游戏 上课稿第18课
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
及时充电(集合类型)
具有某些共同特征的元素构成的一个集体,叫做集合。集合中必须是由具有 同一类型的一组数据所组成,集合中成员的类型称为这个集合的基类型。 集合的定义和变量说明 1、定义集合类型 type 标识符=set of <基类型>; 说明:集合的基类型必须是有序类型,如整型、字符型、布尔型,但不能是实型 或其他构造类型;同时基类型的数据不得超过255. 集合的值放在一对方括号中,各元素用逗号隔开,与排列顺序无关。因 此[2,5,8]与[5,8,2]的值相等。没有任何元素的集合是空集,用[]表示。如果集合元 素是连续的可用子界表示,如[1,2,3,4,5,6,7,8]可表示为[1..8] 2、集合的赋值 <集合变量名>:=<集合表达式>;
探索奥秘 小明刚输入一长串字符,你能帮他统计出其中数字、字母和其他字符的个数吗?
Program P1_18_2; var letter: set of char; digit: set of ‘0’..‘9’; ch:char; id,il,io:integer; begin letter:=[‘a’..’z’,’A’..’Z’]; digit:=[‘0’..’9’]; id:=0; il:=0;io:=0; repeat readln(ch); if ch in letter then il:=il+1; else if ch in digit then id:=id+1; else io:=io+1; until ch=‘.’; writeln(‘letter:’,il,’digit:’,id,’other:’,io); end.
Program P1_18_1; var xm1: set of char; xm2: set of char; ch:char; countts,countjs:integer; begin xm1:=[‘a’..’c’];xm2:=[‘d’..’f’]; countts:=0; countjs:=0; repeat readln(ch); if ch in xm1 then countts:=countts+1; if ch in xm2 then countjs:=countjs+1; until ch=‘.’; writeln(countts,countjs); end.
展示实力(编写程序) 统计一个字符串中大写字母、小写字母和数字的个数。 统计输入的一串字符中有多少个元音字母?(a,e,i,o,u)
集合的几种运算
一、集合的交、并、差运算 设两个集合a:=[1,2,4,6]和b:=[4,6,7,8] 1、并运算符为”+”,取两个集合不重复的元素。a+b的结果[1,2,4,6,7,8] 2、交运算符为”*”,取两个集合公共元素。a*b的结果[4,6 ] 3、并运算符为”-”,取在a中但不在b中的元素。a-b的结果[1,2] 二、集合的比较 1、相等:表示形式a=b。当两个集合中元素个数相等,每个元素相同则相等。 2、不等:表示形式a<>b。 3、包含:a>=b 表示a集合包含b集合中的所有元素; a<=b 表示a集合是b集合的子集。 三、集合的测试运算:检测某个数据是否在集合中,在集合中为true,否则为false。 如: 6 in [6,2,1]结果为true,2 in[1,3]结果为false.
报名参加比赛
一年一度的校运会又开始了,你能帮忙统计报名参加田赛和 径赛各有多少人吗?
比赛项目小档案 项目 跳高 跳远 铅球 跨栏 短跑 接力
代号 a b c d e f
统计参加田赛和径赛的人数
分析:田径比赛项目分为田赛和径赛两类。一般以时间来计算成绩的项目 为径赛,其余为田赛。我们可以先设定田赛和径赛所包含的项目,然后在 读入每个项目时就判断属于哪类比赛并作出统计。
思考:如果要将上例找到的素数按从小到大顺序输出,怎么修改程序?
展示实力(阅读程序) var s:set of 1:15; i:integer; begin i:=1; s:=[]; while i<=15 do begin s:=s+[i]; i:=i+2; end; for i:=1 to 5 do if I in s then writeln(I,’,’); end. var s1,s2,s3:set of 0..9; i:0..9; begin s1:=[0..9]; s2:=[1,3,5,7]; s3:=s1-s2; for i:=0 to 9 do if i in s3 then write(i,3);
Pascal中无专门的语句来进行集合的输入输出,而只能通过集合的赋值与运算来完成。 下面语句能是集合ch1,age和ch2获得相关元素。 ch1:=[1,3]; age:[4..50];ch2=[5]+ch1; 而集合的输出需要借助测试运算,把集合基类型的所有值从头到位测试一遍,若这个值 在集合中则打印输出。 for chart:=‘a’ to ‘f ’ do if chart in ch then writeln(chart:4); 上面语句功能是测试集合ch中是否有字母a~f,有则输出。
思考:你能否不用集合,改用case语句实现?
探索奥秘
用筛选法求200以Байду номын сангаас的素数。
Program P1_18_3; const =200; var s,p: set of 2..n; nxt,j,t:byte; begin s:=[2..200]; p:=[]; nxt:=2; t:=0; repeat readln(ch); while no (nxt in s) do nxt:=succ(nxt); p:=p+[nxt]; j:=nxt; while j<=n do begin s:=s-[j]; inc(j,nxt); end; if nxt in p then begin inc(t); write(nxt:6); if t mod 6=0 then writeln end; until s=[]; end.