迭代器模式实验(含答案)

合集下载

浙大JAVA实验题答案

浙大JAVA实验题答案

实验8 Method的使用1.程序填空题,不要改变与输入输出有关的语句;50001输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入1 个正整数n,计算 s 的前n项的和保留 4 位小数;s = 1 + 1/2 +....+ 1/n要求定义并调用函数factn计算n的阶乘;例:括号内是说明输入:2 repeat=22 n=210 n=10输出:public class Test50001 {public static void mainString args {int ri,repeat;int i,n;double s;Scanner in=new Scanner;repeat=;forri=1;ri<=repeat;ri++{n=;/-----------/s=0;for i=1;i<=n;i++s+=fact i;}}/---------------/static double fact int n {int i;double f=1;for i=1;i<=n;i++f=i;return f;}}50002输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入2个正整数a和n, 求a+aa+aaa+aa…an个a之和;要求定义并调用函数fna,n,它的功能是返回aa…an个a;例如,fn3,2的返回值是33;例:括号内是说明输入2 repeat=22 3 a=2, n=38 5 a=8, n=5输出246 2+22+22298760 8+88+888+8888+88888imponner;public class Test50002{public static void mainString args{int ri, repeat;int i, n,a;long sn;Scanner in=new Scanner;repeat=;forri=1; ri<=repeat; ri++{a=;n=;/------------/sn=0;for i=1;i<=n;i++sn+=fn a,i;}}/------------/s tatic int fn int a,int n{int s=0;forint i=1;i<=n;i++s=s10+a;return s;}}50003输入一个正整数repeat 0<repeat<10,做repeat次下列运算:读入1 个整数,统计并输出该数中2的个数;要求定义并调用函数countdigitnumber,digit,它的功能是统计整数number中数字digit的个数;例如,countdigit10090,0的返回值是3;例:括号内是说明输入:3 repeat=3-219022345543输出:count=2 -21902中有2个2count=1 有1个2count=0 345543中没有2public class Test50003{public static void mainString args{int ri, repeat;int count;long n;Scanner in=new Scanner;repeat=;forri=1; ri<=repeat; ri++{n=;/---------/n=n;count=countdigit n,2;}}/------------/static int countdigit long number,int digit{....要求定义并调用函数fibn,它的功能是返回第n项Fibonacci数;例如,fib7的返回值是13;例:括号内是说明输入:3 repeat=31 10 m=1, n=1020 100 m=20, n=1001000 6000 m=1000, n=6000输出:1 123 5 8 1到10之间的Fibonacci数21 34 55 89 20到100之间的Fibonacci数1597 2584 4181 1000到6000之间的Fibonacci数public class Test50006{public static void mainString args{int ri,repeat;int i, m, n;long f;Scanner in=new Scanner;repeat=;forri=1; ri<=repeat; ri++{m=;n=;/---------/i=1;f=1;while f<=n{if f>=m " ";i++;f=fib i;}}}/------------/sta ti c long fib int n{ //返回第n项Fibonacci数int i;long a=1,b=1,f=1;for i=3;i<=n;i++{ //从第3项开始计算f=a+b;a=b;b=f;}return f;}}50007输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入2 个正整数m和n1<=m,n<=10000,输出m 到n之间的所有完数完数就是因子和与它本身相等的数;要求定义并调用函数factorsumnumber,它的功能是返回number的因子和;例如,factorsum12的返回值是161+2+3+4+6;例:括号内是说明输入:2 repeat=220 500 m=100, n=4001 100 m=1, n=100输出:28 4961 6 28public class Test50007{public static void mainString args{int ri,repeat;int i, m, n;Scanner in=new Scanner;repeat=;forri=1;ri<=repeat;ri++{m=;n=;/---------/for i=m;i<=n;i++if i==factorsum i" ";}}/---------/static int factorsum int number{ //返回number的因子和int sum=0;if number==1sum=1;forint i=1;i<=number-1;i++if number%i==0sum+=i;return sum;}}50008输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入2 个正整数m和n1<=m,n<=1000,输出m 到n之间的所有满足各位数字的立方和等于它本身的数;要求定义并调用函数isnumber判断number的各位数字之立方和是否等于它本身;例:括号内是说明输入:2 repeat=2100 400 m=100, n=4001 100 m=1, n=100输出:153 370 371 111+555+333=153; 333+777=370; 333+777+111=3711public class Test50008{public static void mainString args{int ri,repeat;int i, m, n;Scanner in=new Scanner;repeat=;forri=1;ri<=repeat;ri++{m=;n=;/---------/for i=m;i<=n;i++if is i" ";}}/---------///判断number的各位数字之立方和是否等于它本身static boolean is int number{int sum=0,n,digit;n=number;while n>0{digit=n%10;n=n/10;sum+=digitdigitdigit;}if number==sum return true;else return false;}}50009输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入一个整数,将它逆序输出;要求定义并调用函数reversenumber,它的功能是返回number的逆序数;例如reverse12345的返回值是54321;例:括号内是说明输入4 repeat=4123456 -100 -2 99输出654321-1-299public class Test50009{public static void mainString args{int ri,repeat;long n, res;Scanner in=new Scanner;repeat=;forri=1;ri<=repeat;ri++{n=;/---------/res=reverse n;}}/---------/static long reverse long number{//返回number的逆序数int flag=1;long a=0,digit;if number<0{flag=-1;number=-number;}while number>0{digit=number%10; //分离出个位数字a=a10+digit; //形成当前的逆序数number=number/10;}return flaga;}}50011输入一个正整数repeat 0<repeat<10,做repeat次下列运算:输入三个整数a、b和c,输出其中较大的数;要求定义和调用函数maxa, b, c找出a、b中较大的数,函数形参a、b和c的类型是int;输入输出示例:括号内是说明输入3 repeat=3输入:5 8 9 a=5, b=8-1 -10 -5 a=-1, b=-101 1 1 a=1, b=1输出:max5,8,9=9max-1,-10,-5=-1max1,1,1=1public class Test50011 {public static void mainString args {int ri, repeat;int a,b,c,maximun;Scanner in = new Scanner;repeat = ;for ri = 1; ri <= repeat; ri++ {a = ;b = ;c=;/-----------------/maximun=maximuna,b,c;Sy}}/-------------------/static int maximunint a,int b,int c{int max=a;ifmax<bmax=b;ifmax<cmax=c;return max;}}。

浙大JAVA 实验题答案05answer1

浙大JAVA 实验题答案05answer1

实验5 分支结构程序的设计1.程序填空题,不要改变与输入输出有关的语句。

20004 计算旅途时间输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。

有效的时间范围是0000到2359,不需要考虑出发时间晚于到达时间的情况。

例:括号内是说明输入712 1411(出发时间是7:12,到达时间是14:11)输出The train journey time is 6 hrs 59 mins.import java.util.Scanner;public class Test20004 {public static void main(String[] args) {Scanner in=new Scanner(System.in);int time1, time2, hours, mins;time1=in.nextInt();time2=in.nextInt();/*------------------*//*计算两个时间之间的小时数和分钟数*/hours=time2/100-time1/100;mins=time2%100-time1%100;/*当计算得到的分钟数为负数时进行调整*/hours=mins>0?hours:hours-1;mins=mins>0?mins:mins+60;//或:if(mins<0){hours-=1;mins+=60;}System.out.println("The train journey time is "+hours+" hrs "+ mins+" mins.");}}30001 显示两级成绩输入一个正整数repeat (0<repeat<10),做repeat次下列运算:输入一个学生的数学成绩,如果它低于60,输出“Fail”,否则,输出“Pass”。

2021高中信息技术Python操作考试题(6套含答案)

2021高中信息技术Python操作考试题(6套含答案)

2021高中信息技术Python操作考试题(6套含答案)本文档包含了2021年高中信息技术Python操作考试题的六套试卷以及答案。

以下是每套试卷的简要概述:试卷一题目一请编写一个Python程序,要求用户输入一个整数,然后输出该整数的平方。

题目二请编写一个Python程序,要求用户输入一个字符串,然后输出该字符串的长度。

题目三请编写一个Python程序,要求用户输入一个列表,然后输出列表中的最大值和最小值。

题目四请编写一个Python程序,要求用户输入一个正整数,然后判断该数是否为质数,并输出判断结果。

题目五请编写一个Python程序,要求用户输入一个字符串,然后将字符串按照字母顺序进行排序,并输出排序后的结果。

答案题目一的答案:[代码实现]num = int(input("请输入一个整数:"))result = num ** 2print("该整数的平方是:", result)题目二的答案:[代码实现]string = input("请输入一个字符串:")length = len(string)print("该字符串的长度是:", length)题目三的答案:[代码实现]lst = input("请输入一个列表(以空格分隔各个元素):").split() lst = list(map(int, lst))max_value = max(lst)min_value = min(lst)print("该列表的最大值是:", max_value)print("该列表的最小值是:", min_value)题目四的答案:[代码实现]num = int(input("请输入一个正整数:"))is_prime = Truefor i in range(2, num):if num % i == 0:is_prime = Falsebreakif is_prime:print(num, "是质数")else:print(num, "不是质数")题目五的答案:[代码实现]string = input("请输入一个字符串:")sorted_string = ''.join(sorted(string))print("排序后的字符串是:", sorted_string)试卷二题目一请编写一个Python程序,要求用户输入一个正整数n,然后输出1到n之间所有偶数的和。

Iterator与Iterable(迭代器模式)

Iterator与Iterable(迭代器模式)

Iterator与Iterable(迭代器模式)1、引⾔在Java中,我们可以对List集合进⾏如下⼏种⽅式的遍历:List<Integer> list = new ArrayList<>();// 法⼀:普通for循环for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + ",");}//法⼆:迭代器遍历Iterator it = list.iterator();while (it.hasNext()) {System.out.print(it.next() + ",");}// for each遍历for (Integer i : list) {System.out.print(i + ",");}// 后⾯两种⽅式涉及到Java中的Iterator和Iterable对象2、两者关系看Iterable和Iterator所处包位置,Collection接⼝必须继承ng.Iterable接⼝。

Iterator为Java中的迭代器对象,是能够对List这样的集合进⾏迭代遍历的底层依赖。

Iterable接⼝⾥定义了返回Iterator的⽅法,相当于对Iterator的封装,同时实现了Iterable接⼝的类可以⽀持for each循环。

JDK中 Iterator 接⼝源码:public interface Iterator<E> {boolean hasNext(); // 检查序列中是否还有元素E next(); // 获取序列中下⼀个元素default void remove() { // 将迭代器新返回的元素删除throw new UnsupportedOperationException("remove");}// 1.8新增的Iterator接⼝中的默认⽅法,对集合中*剩余*的元素进⾏操作,直到元素完毕或者抛出异常;注意为“剩余”,即迭代中还剩余的部分 default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}}集合类都实现了这个接⼝, Iterator 是迭代器最简单的实现,使⽤Iterator iter = list.iterator()就实现了迭代器(见上⾯引⾔的使⽤)Iterable接⼝的源码:public interface Iterable<T> {Iterator<T> iterator(); // ⽅法iterator()返回了⼀个Iterator对象(各具体类返回的类型也不同)// 1.8新加的⽅法,对每个元素执⾏特有操作,可使⽤Lambda表达式default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}// 1.8新⽅法,可分割迭代器,⽤于并⾏遍历元素default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);}}for each实现:为Java语法糖,也是依赖Iterator迭代器,编译器⾃动转化for (Integer i : list);for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){i = (Integer)iterator.next();}3、为什么这样设计这⾥是使⽤到了设计模式中的迭代器模式为什么⽤Iterator实现遍历?(为什么使⽤迭代器模式)⽤于遍历集合类的标准访问⽅法,它可以把访问逻辑从不同类型的集合类中抽象出来,从⽽避免向客户端暴露集合的内部结构(其他索引遍历需要知道集合内部结构,且更换集合时需要重写遍历⽅法);⽀持以不同的⽅式遍历⼀个聚合对象;简化了聚合类;在同⼀个聚合上可以有多个遍历;便于增加迭代器类和新的聚合类。

奥鹏东北大学21年12月考试软件设计模式X考核作业 参考答案

奥鹏东北大学21年12月考试软件设计模式X考核作业 参考答案

东北大学继续教育学院软件设计模式X 试卷(作业考核线上2) A 卷(共7 页)1.常用的基本设计模式可分为(A)A.创建型、结构型和行为型B.对象型、结构型和行为型C.过程型、结构型和行为型D.抽象型、接口型和实现型2.对以下开闭原则的描述错误的是(A)A.开闭原则与“对可变性的封装原则”没有相似性B.找到个系统的可变元素,将它封装起来,叫开闭原则C.对修改关闭,是其原则之一D.从抽象层导出一个或多个新具体类可以改变系统的行为,是其原则之一3. “不要和陌生人说话”是(D)原则的通俗表述。

A.接口隔离B.里氏替换C.依赖倒置D.迪米特4.当创建一个具体的对象而又不希望指定具体的类时,可以使用(D)A.结构型B.创建型C.行为型D.以上都可以5.以下(O是利用一个对象,快速地生成一批对象。

A.抽象工厂(AbStraCt Factory)模式B.原型(PrototyPe)模式C.合成(COmPOSite)模式D.桥接(Bridge)模式6.以下(B )用来描述建造者(Builder )。

A.定义一个用于创建对象的接口,让子类决定实例化哪一个类B.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示C.保证一个类仅有一个实例,并提供一个访问它的全周访问点D.运用共享技术有效地支持大量细粒度的对象7.以下(C )用来描述工厂方法(Factory Method)模式。

A.提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类8.表示一个作用于某对象结构中的各元素的操作。

它使用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作C.定义一个用于创建对象的接口,让子类决定实例化哪一个类。

该模式使一个类的实例化延迟到其子类D.定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

本模式使得算法可独立于使用它的客户而变化8.对象适配器模式是(A )原则的典型应用。

A.将一个类的接口转换成客户希望的另外一个接口,本模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。

python二级考试试题4及答案

python二级考试试题4及答案

python二级考试试题4及答案1. 题目:请解释Python中的列表推导式,并给出一个使用列表推导式生成一个包含1到10的平方数的列表的示例代码。

答案:列表推导式是Python中的一种简洁的构建列表的方法,它允许开发者通过一个表达式来创建列表。

列表推导式通常用于从旧的列表中创建新的列表,或者通过一定的条件筛选元素。

以下是一个使用列表推导式生成1到10的平方数列表的示例代码:```pythonsquares = [x2 for x in range(1, 11)]```2. 题目:描述Python中装饰器的作用,并提供一个简单的装饰器示例。

答案:装饰器是Python中一个非常重要的概念,它允许用户在不修改原有函数代码的情况下,增加函数的额外功能。

装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。

以下是一个简单的装饰器示例,该装饰器用于打印函数执行前后的时间:```pythonimport timedef timer(func):def wrapper(*args, kwargs):start_time = time.time()result = func(*args, kwargs)end_time = time.time()print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")return resultreturn wrapper@timerdef example_function():time.sleep(2)print("Function executed.")```3. 题目:解释Python中的生成器是什么,并提供一个生成器函数的示例。

答案:生成器是Python中一种特殊的迭代器,它允许开发者使用更少的内存来处理大型数据集。

C#设计模式系列:迭代器模式(Iterator)

C#设计模式系列:迭代器模式(Iterator)

C#设计模式系列:迭代器模式(Iterator) 迭代器模式把对象的职责分离,职责分离可以最⼤限度减少彼此之间的耦合程度,从⽽建⽴⼀个松耦合的对象。

职责分离的要点是对被分离的职责进⾏封装,并以抽象的⽅式建⽴彼此之间的关系。

1、迭代器模式简介1.1>、定义 迭代器模式提供⼀种⽅法可以顺序访问聚合对象中各个元素,但⼜不暴露该对象的内部表⽰。

1.2>、使⽤频率 ⾼2、迭代器模式结构2.1>、结构图2.2>、参与者 迭代器模式参与者: ◊ Iterator:迭代器定义访问和遍历元素的接⼝ ◊ ConcreteIterator ° 具体迭代器实现迭代器接⼝ ° 对该聚合遍历时跟踪当前位置 ◊ Aggregate:聚合定义创建Iterator对象的接⼝ ◊ ConcreteAggregate:具体聚合,实现相应迭代器的接⼝,返回具体迭代器的⼀个适当的实例。

在迭代器模式中,ConcreteAggregate通过Aggregate定义的接⼝得到Iterator,并且这是⼀个ConcreteIterator,该ConcreteIterator具体实现了对ConcreteAggregate的访问与遍历的⽅法。

通过ConcreteIterator可以访问并使⽤集合中的元素。

3、迭代器模式结构实现 Iterator.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public abstract class Iterator{public abstract object First();public abstract object Next();public abstract bool IsDone();public abstract object CurrentItem();}} Aggregate.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public abstract class Aggregate{public abstract Iterator CreateIterator();}} ConcreteAggregate.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace DesignPatterns.IteratorPattern.Structural{public class ConcreteAggregate : Aggregate{private ArrayList _items = new ArrayList();public override Iterator CreateIterator(){return new ConcreteIterator(this);}public int Count{get { return _items.Count; }}public object this[int index]{get { return _items[index]; }set { _items.Insert(index, value); }}}} ConcreteIterator.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public class ConcreteIterator : Iterator{private ConcreteAggregate _aggregate;private int _current = 0;public ConcreteIterator(ConcreteAggregate aggregate) {this._aggregate = aggregate;}public override object First(){return _aggregate[0];}public override object Next(){object ret = null;if (_current < _aggregate.Count - 1){ret = _aggregate[++_current];}return ret;}public override object CurrentItem(){return _aggregate[_current];}public override bool IsDone(){return _current >= _aggregate.Count;}}} Program.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using DesignPatterns.IteratorPattern.Structural;namespace DesignPatterns.IteratorPattern{class Program{static void Main(string[] args){ConcreteAggregate a = new ConcreteAggregate();a[0] = "Item A";a[1] = "Item B";a[2] = "Item C";a[3] = "Item D";ConcreteIterator i = new ConcreteIterator(a);Console.WriteLine("Iterating over collection:");object item = i.First();while (item != null){Console.WriteLine(item);item = i.Next();}}}} 运⾏输出:Iterating over collection:Item AItem BItem CItem D请按任意键继续. . .4、迭代器模式实践应⽤ 在迭代器模式的设计中,有两种具体的实现⽅式,分别为外禀迭代器和内禀迭代器。

raptor实验参考答案

raptor实验参考答案

raptor实验参考答案Raptor实验参考答案在计算机科学领域,Raptor是一种流程图工具,用于可视化算法和程序的设计过程。

它提供了一种直观和简洁的方式来描述和分析问题,并通过图形化表示来帮助程序员更好地理解和编写代码。

在学习和教学中,Raptor经常被用于教授算法和程序设计的基本概念。

本文将提供一些Raptor实验的参考答案,希望能对初学者有所帮助。

实验一:计算两个数的和算法描述:1. 输入两个整数num1和num2;2. 计算它们的和sum = num1 + num2;3. 输出sum。

Raptor流程图:```输入 num1输入 num2sum = num1 + num2输出 sum```实验二:计算斐波那契数列算法描述:1. 输入一个正整数n;2. 初始化变量a和b为0和1;3. 循环n次,每次计算a和b的和,并将结果赋给a,将b的值赋给a;4. 输出a作为斐波那契数列的第n项。

Raptor流程图:```输入 na = 0b = 1循环 n 次temp = aa = a + bb = temp输出 a```实验三:查找数组中的最大值算法描述:1. 输入一个整数数组arr;2. 初始化变量max为数组的第一个元素arr[0];3. 遍历数组,如果当前元素大于max,则将其赋给max;4. 输出max作为数组的最大值。

Raptor流程图:```输入 arrmax = arr[0]遍历数组如果 arr[i] > maxmax = arr[i]输出 max```实验四:判断一个数是否为素数算法描述:1. 输入一个正整数num;2. 初始化变量isPrime为true;3. 循环遍历从2到num的所有数字,如果存在能整除num的数字,则将isPrime置为false;4. 输出isPrime作为num是否为素数的判断结果。

Raptor流程图:```输入 numisPrime = true循环遍历 2 到 num如果 num 能被当前数字整除isPrime = false输出 isPrime```通过以上实验参考答案,我们可以看到Raptor作为一种流程图工具,能够帮助我们更好地理解和设计算法和程序。

设计模式考试复习题(含答案)

设计模式考试复习题(含答案)

一、1. 设计模式一般用来解决什么样的问题: A.同一问题的不同表相2. 下列属于面向对象基本原则的是: C.里氏代换3. Open-Close原则的含义是一个软件实体:A.应当对扩展开放,对修改关闭.4. 当我们想创建一个具体的对象而又不希望指定具体的类时,使用(A)模式。

A.创建型5. 要依赖于抽象不要依赖于具体。

即针对接口编程不要针对实现编程:(D)依赖倒转原则6. 依据设计模式思想,程序开发中应优先使用的是( A )关系实现复用。

A, 委派7. 设计模式的两大主题是( D ) D.系统复用与系统扩展8. 单体模式中,两个基本要点(AB)和单体类自己提供单例A .构造函数私有 B.唯一实例9. 下列模式中,属于行为模式的是( B ) B观察者10. “不要和陌生人说话”是( D )原则的通俗表述 D.迪米特1. 软件体系结构是指一个系统的有目的的设计和规划,这个设计规划既不描述活动,也不描述系统怎样开发,它只描述系统的组成元素及其相互的交互协作。

2.一个UML模型只描述了一个系统要做什么,它并没告诉我们系统是怎么做。

3.接口是可以在整个模型中反复使用的一组行为,是一个没有属性而只有方法的类。

4.多重性指的是,某个类有多个对象可以和另一个类的一对象关联。

5.当一个类的对象可以充当多种角色时,自身关联就可能发生。

6.在泛化关系中,子类可以替代父类。

后前者出现的可以相同地方。

反过来却不成立。

7.最通常的依赖关系是一个类操作的形构中用到了另一个类的定义。

8.组成是强类型的聚集,因为聚集中的每个部分体只能属于一个整体。

9.实现的符号和继承的符号有相似之处,两者的唯一差别是实现关系用虚线表示,继承关系用实线表示。

10. 设计模式中应优先使用对象组合而不是类继承。

1.适配器模式属于创建型模式结构型( F )2.在设计模式中,“效果”只是指“原因和结果”( T )3.设计模式使代码编制不能真正工程化( T )4.面向对象语言编程中的异常处理,可以理解为责任链模式(T )5.反模式就是反对在软件开发过程中使用设计模式分析:反模式用来解决问题的带有共性的不良方法(F )1.什么是设计模式?设计模式目标是什么?答:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

《Spark编程基础及项目实践》课后习题及答案2

《Spark编程基础及项目实践》课后习题及答案2

第二章习题答案实训代码完整程序如下:文件studentinfo.txt的内容如图1所示,注意在Windows平台下将studentinfo.txt保存为UTF-8的格式。

图1 学生信息在Linux的/usr/local/project目录下创建文件studentinfo.txt,使用命令“touch studentinfo.txt”。

执行命令“vim studentinfo.txt”对文件进行编辑,按“i”进入编辑模式,输入图2-40所示内容,按“Esc”退出编辑状态,再执行命令“:wq”进行保存并退出。

在/usr/local/project目录下创建文件StudentInfo.scala,输入内容如下:import scala.io._import util.control.Breaks._object StudentInfo {var arrInfo:Array[String] = nulldef main(args: Array[String]) {//将/usr/local/project/studentinfo.txt的文件内容读入到数组中//一行为一个元素val lines = for(line <-Source.fromFile("/usr/local/project/studentinfo.txt").getLines) yield linearrInfo = lines.toArrayvar flag = trueshow()while(flag){print("请输入选择序号:")val choice = StdIn.readLine()breakable{if(!isIntByRegex(choice)) {//如果输入不是数字,则跳出本次循环println("请输入正确的序号")break}choice.toInt match {case 1 => {var maleCnt = count("男")println("三个班级共有男生" + maleCnt +"人")}case 2 => {var femalCnt = count("女")println("三个班级共有女生" + femalCnt +"人")}case 3 => {print("输入学号:")val studentId = StdIn.readLine()var mark = falsebreakable{for(i <- 0 until arrInfo.length){var info = arrInfo(i)val arr : Array[String] = info.split("\t")if(arr(1)== studentId){mark = trueprintln("班级\t学号\t姓名\t性别\t年龄\t籍贯\t电话")println(info)break //找到了学号,就跳出breakable,终止循环}}}if(!mark){println("查无此人")}}case 4 => {//按班级进行分组print("输入班级序号:")val classId = StdIn.readLine()println("班级\t学号\t姓名\t性别\t年龄\t籍贯\t电话")/*** 将arrInfo数组使用groupBy函数按照班级序号进行分组* 先将数组中的每个元素按照"\t"进行分割* 提取出分割后的第一个元素(即班级序号)* 按照班级序号进行分组,返回一个Map[String,Array[String]]类型 * 将返回值赋值给mapArr*/val mapArr = arrInfo.groupBy(x => x.split("\t")(0))for(maparr <- mapArr(classId)) println(maparr)}case 5 => {flag = falseprintln("再见!")}case _ => println("输入错误,请重新输入")}}}}//使用正则表达式判断字符串s是否为数字def isIntByRegex(s : String) = {val pattern = """^(\d+)$""".rs match {case pattern(_*) => truecase _ => false}}//展示功能页面def show() = {println("**************************************") println("1. 统计男生人数")println("2. 统计女生人数")println("3. 输入学号,打印出学生信息")println("4. 输入班级序号,打印出班级学生信息列表")println("5. 退出")println("**************************************") }//根据指定的信息统计人数def count(param: String): Int = {var sum = 0for(info <- arrInfo; if info.contains(param)){sum += 1}sum}}运行结果如图2-50所示。

2022年3月Python基础等级考试真题解析(含答案和代码)

2022年3月Python基础等级考试真题解析(含答案和代码)

2022年3月Python基础等级考试真题解析(含答案和代码)2022年3月Python基础等级考试真题解析(含答案和代码)本文档旨在对2022年3月Python基础等级考试的真题进行详细解析,包括题目、答案和代码。

我们将尽力提供清晰、准确的解析,以帮助考生更好地理解和掌握Python基础知识。

题目1:编写一个Python函数,用于计算两个数的最大公约数(GCD)。

解析本题考查对基础数学知识的掌握以及Python函数的编写能力。

计算两个数的最大公约数(GCD)是一个常见的编程问题,可以使用欧几里得算法进行解决。

答案def gcd(a, b):while b:a, b = b, a % breturn a代码解析上述代码定义了一个名为`gcd`的函数,用于计算两个数的最大公约数。

该函数使用了欧几里得算法,通过不断取余数的方式,直到余数为0,此时的除数即为最大公约数。

题目2:编写一个Python函数,用于计算两个数的乘积。

解析本题考查Python函数的编写能力以及对基础数学知识的掌握。

计算两个数的乘积是一个简单的编程问题,可以直接使用乘法运算符进行计算。

答案def multiply(a, b):return a * b代码解析上述代码定义了一个名为`multiply`的函数,用于计算两个数的乘积。

该函数使用了乘法运算符,直接返回两个数的乘积。

题目3:编写一个Python函数,用于判断一个数是否为质数。

解析本题考查对基础数学知识的掌握以及Python函数的编写能力。

判断一个数是否为质数是一个常见的编程问题,可以通过遍历所有小于该数的正整数,判断是否有除1和本身之外的因数。

答案def is_prime(n):if n <= 1:return Falsefor i in range(2, n):if n % i == 0:return Falsereturn True代码解析上述代码定义了一个名为`is_prime`的函数,用于判断一个数是否为质数。

最新java2实用教程实验代码及答案

最新java2实用教程实验代码及答案

上机实践1 初识JA V A (3)实验1一个简单的应用程序 (3)实验2一个简单的J A V A A PPLET程序 (3)实验3联合编译 (4)上机实践2 基本数据类型与控制语句 (5)实验1输出希腊字母表 (5)实验2回文数 (6)实验3猜数字游戏 (8)上机实践3 类与对象 (9)实验1三角形、梯形和圆形的类封装 (9)实验2实例成员与类成员 (12)实验3使用PACKAGE语句与IMPORT语句 (14)上机实践4 继承与接口 (16)实验1继承 (16)实验2上转型对象 (19)实验3接口回调 (21)上机实践5 字符串、时间与数字 (23)实验1S TRING类的常用方法 (23)实验2比较日期的大小 (24)实验3处理大整数 (25)上机实践6 组件及事件处理 (26)实验1算术测试 (26)实验2信号灯 (29)实验3布局与日历 (31)上机实践7 组件及事件处理2 (35)实验1方程求根 (35)实验2字体对话框 (38)实验3英语单词拼写训练 (41)上机实践8 多线程 (45)实验1汉字打字练习 (45)实验2旋转的行星 (47)实验3双线程接力 (51)上机实践9 输入输出流 (54)实验1学读汉字 (54)实验2统计英文单词字 (57)实验2读取Z IP文件 (61)上机实践10 JAV A 中的网络编程 (62)实验1读取服务器端文件 (62)实验2使用套接字读取服务器端对象 (64)实验3基于UDP的图像传输 (67)上机实践11 数据结构 (71)实验1扫雷小游戏 (71)实验2排序与查找 (76)实验3使用T REE S ET排序 (77)上机实践12 JAV A SWING (79)实验1JL AYERED P ANE分层窗格 (79)实验2使用表格显示日历 (80)实验3多文档界面(MDI) (83)上机实践1 初识Java实验1 一个简单的应用程序1.答案:【代码1】:System.out.println("你好,很高兴学习Java") ;【代码2】:System.out.println("We are students") ;2.模板代码Hello.javapublic class Hello{public static void main (String args[ ]){【代码1】//命令行窗口输出"你好,很高兴学习Java"A a=new A();a.fA();}}class A{void fA(){【代码2】//命令行窗口输出"We are students"}}实验2 一个简单的Java Applet程序1.答案:【代码1】:g.drawString("这是一个Java Applet 程序",10,30);【代码2】:g.drawString("我改变了字体",20,50);2.模板代码FirstApplet.javaimport java.applet.*;import java.awt.*;public class FirstApplet extends Applet{public void paint(Graphics g){g.setColor(Color.blue);【代码1】//在Java Applet中绘制一行文字:“这是一个Java Applet 程序”g.setColor(Color.red);g.setFont(new Font("宋体",Font.BOLD,36));【代码2】//在Java Applet中绘制一行文字:“我改变了字体”}}实验3 联合编译1.答案:【代码1】:System.out.println("你好,只需编译我");【代码2】:System.out.println("I am A");【代码3】:System.out.println("I am B");【代码4】:System.out.println("I am C");2.模板代码模板1:Hello.javapublic class MainClass{public static void main (String args[ ]){【代码1】 //命令行窗口输出"你好,只需编译我"A a=new A();a.fA();B b=new B();b.fB();}}模板2 :A.javapublic class A{void fA(){【代码2】 //命令行窗口输出"I am A"}}模板3 :B.javapublic class B{void fB(){【代码3】 //命令行窗口输出"I am B"}}模板4 :C.javapublic class C{void fC(){【代码4】 //命令行窗口输出"I am C"}}上机实践2 基本数据类型与控制语句实验1 输出希腊字母表1.答案:【代码1】:startPosition=(int)cStart;【代码2】:endPosition=(int)cEnd ;【代码3】:c=(char)i;2.模板代码GreekAlphabet.javapublic class GreekAlphabet{public static void main (String args[ ]){int startPosition=0,endPosition=0;char cStart='α',cEnd='ω';【代码1】//cStart做int型转换据运算,并将结果赋值给startPosition【代码2】//cEnd做int型转换运算,并将结果赋值给endPositionSystem.out.println("希腊字母\'α\'在unicode表中的顺序位置:"+(int)c);System.out.println("希腊字母表:");for(int i=startPosition;i<=endPosition;i++){char c='\0';【代码3】//i做char型转换运算,并将结果赋值给cSystem.out.print(" "+c);if((i-startPosition+1)%10==0)System.out.println("");}}}实验2 回文数1.答案:【代码1】:number<=99999&&number>=1【代码2】:d5=number/10000;【代码3】:d4=number%10000/1000;【代码4】:d3=number%1000/100;【代码5】:d5!=0【代码6】:d1==d5&&d2==d4【代码7】:d4!=0【代码8】:d1==d4&&d2==d3【代码9】:d3!=0【代码10】:d1==d32.模板代码Number.javaimport javax.swing.JOptionPane;public class Number{public static void main(String args[]){int number=0,d5,d4,d3,d2,d1;String str=JOptionPane.showInputDialog("输入一个1至99999之间的数");number=Integer.parseInt(str);if(【代码1】) //判断number在1至99999之间的条件{【代码2】//计算number的最高位(万位)d5【代码3】//计算number的千位d4【代码4】//计算number的百位d3d2=number%100/10;d1=number%10;if(【代码5】) //判断number是5位数的条件{System.out.println(number+"是5位数");if(【代码6】) //判断number是回文数的条件{System.out.println(number+"是回文数");}else{System.out.println(number+"不是回文数");}}else if(【代码7】) //判断number是4位数的条件{System.out.println(number+"是4位数");if(【代码8】) //判断number是回文数的条件码{System.out.println(number+"是回文数");}else{System.out.println(number+"不是回文数");}}else if(【代码9】) //判断number是3位数的条件{System.out.println(number+"是3位数");if(【代码10】) //判断number是回文数的条件{System.out.println(number+"是回文数");}else{System.out.println(number+"不是回文数");}}else if(d2!=0){System.out.println(number+"是2位数");if(d1==d2){System.out.println(number+"是回文数");}else{System.out.println(number+"不是回文数");}}else if(d1!=0){System.out.println(number+"是1位数");System.out.println(number+"是回文数");}}else{System.out.printf("\n%d不在1至99999之间",number);}}}实验3 猜数字游戏1.答案:【代码1】:yourGuess!=realNumber【代码2】:yourGuess>realNumber【代码3】:yourGuess<realNumber2.模板代码GuessNumber.javaimport javax.swing.JOptionPane;public class GuessNumber{public static void main (String args[ ]){System.out.println("给你一个1至100之间的整数,请猜测这个数");int realNumber=(int)(Math.random()*100)+1;int yourGuess=0;String str=JOptionPane.showInputDialog("输入您的猜测:");yourGuess=Integer.parseInt(str);while(【代码1】) //循环条件{if(【代码2】) //条件代码{str=JOptionPane.showInputDialog("猜大了,再输入你的猜测:");yourGuess=Integer.parseInt(str);}else if(【代码3】) //条件代码{str=JOptionPane.showInputDialog("猜小了,再输入你的猜测:");yourGuess=Integer.parseInt(str);}}System.out.println("猜对了!");}}上机实践3 类与对象实验1 三角形、梯形和圆形的类封装1.答案:【代码1】:sideA=a;sideB=b;sideC=c;【代码2】:a+b>c&&a+c>b&&c+b>a【代码3】:boo=true;【代码4】:boo=false;【代码5】:if(boo){length=sideA+sideB+sideC;return length;}else{System.out.println("不是一个三角形,不能计算周长");return 0;}【代码6】:sideA=a;sideB=b;sideC=c;【代码7】:a+b>c&&a+c>b&&c+b>a【代码8】:boo=true;【代码9】:boo=false;【代码10】:above=a;bottom=b;height=h;【代码11】:area=(above+bottom)/2*height;return area;【代码12】:radius=r;【代码13】:return 3.14*radius*radius;【代码14】:return 3.14*2*radius;【代码15】:circle=new Circle(10);【代码16】:trangle=new Trangle(3,4,5);【代码17】:lader=new Lader(3,4,10);【代码18】:length=circle.getLength();【代码19】:area=circle.getArea();【代码20】:length=trangle.getLength();【代码21】:area=trangle.getArea();【代码22】:area=lader.getArea();【代码23】:trangle.setABC(12,34,1);【代码24】:area=trangle.getArea();【代码25】:length=trangle.getLength();2.模板代码AreaAndLength.javaclass Trangle{double sideA,sideB,sideC,area,length;boolean boo;public Trangle(double a,double b,double c){【代码1】//参数a,b,c分别赋值给sideA,sideB,sideCif(【代码2】) //a,b,c构成三角形的条件表达式{【代码3】//给boo赋值。

设计模式实验一

设计模式实验一

设计模式实验一1.单例模式使用单例模式设计一个多文档窗口(注:在Java AWT/Swing 开发中可使用JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如图1所示。

图1 多文档窗口示意图2.适配器模式现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。

现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch 的方法适配到DataOperation接口中。

绘制类图并编程实现。

3.模板方法模式对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我们定义了connDB()、openDB()、useDB()、closeDB()四个方法分别对应这四个步骤。

对于不同类型的数据库(如SQL Server和Oracle),其操作步骤都一致,只是连接数据库的步骤connDB()方法有所区别,现使用模板方法模式对其进行设计。

4.迭代器模式某商品管理系统的商品名称存储在一个字符串数组中,现需要自定义一个双向迭代器(MyIterator)实现对该商品名称数组的双向(前向和后向)遍历。

绘制类图并编程实现。

5.工厂方法模式某系统日志记录器要求支持多种日志记录方式,如文件记录(FileLog)、数据库记录(DatabaseLog)等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。

6.原型模式在某OA系统中,用户可以创建工作周报,由于某些岗位每周工作存在重复性,因此可以通过复制原有工作周报并进行局部修改来快速新建工作周报。

小甲鱼Python第021讲函数:lambda表达式课后测试题及参考答案

小甲鱼Python第021讲函数:lambda表达式课后测试题及参考答案

⼩甲鱼Python第021讲函数:lambda表达式课后测试题及参考答案笔记:1、lambda表达式的作⽤:1)Python写⼀些执⾏脚本时,使⽤lambda就可以省下定义函数的过程,使⽤lambda就可以使得代码更加精简。

2)有时候我们个函数起个名字也是⽐较头疼的问题(对于⼀些⽐较抽象并且整个程序执⾏下来只需要调⽤⼀两次的函数),使⽤lambda就不需要考虑命名问题。

3)简化代码的可读性,使⽤lambda函数可以省去这样的步骤。

2、两个重要的BIF1)filter(function or None,iterable):两个参数为函数和可迭代的序列,函数定义了过滤的规则,默认过滤出真的部分。

2)map(function or None,iterable):同filter()的两个参数相同,这个内置函数的作⽤是:将序列的每⼀个元素作为函数的参数进⾏运算加⼯,直到可迭代序列的每个元素都加⼯完毕,返回所有加⼯后的元素构成的新序列。

强⼤的map()后边可以接受多个序列作为参数的。

测试题:0. 请使⽤lambda表达式将下边函数转变为匿名函数?1def fun_A(x,y=3):2return x*y>>> lambda x,y=3:x*y1. 请将下边的匿名函数转变为普通的屌丝函数?1lambda x:x if x%2 else None>>>1def fun(x):2if x % 2 :3 return x4else:5 return None2. 感受⼀下使⽤匿名函数后给你的编程⽣活带来的变化?1)Python写⼀些执⾏脚本时,使⽤lambda就可以省下定义函数的过程,⽐如说我们只是需要写⼀个简单的脚本来管理服务器时间,我们就不需要专门定义⼀个函数然后再写调⽤,使⽤lambda就可以使得代码更加精简。

2)对于⼀些⽐较抽象并且整个程序执⾏下来只需要调⽤⼀两次的函数,有时候我们个函数起个名字也是⽐较头疼的问题,使⽤lambda就不需要考虑命名问题。

迭代器模式实验(含答案)

迭代器模式实验(含答案)

迭代器模式实验(含答案)课程名称:软件体系结构与设计迭代器(Iterator)模式实验⼀、实验⽬的1. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深对迭代器模式的了解;4. 提⾼对迭代器模式的运⽤;5. 将该模式运⽤但实际的⽣活中。

⼆、实验容1. 阅读和查看资料了解迭代器模式的概念和功能;2. 将有关代理模式的迭代器模式理解透彻并运⾏;3. 举例说明⽣活中的⼀个可以使⽤迭代器模式的例⼦;4. 熟悉迭代器模式的扩展,迭代器模式是⽐较有⽤途的⼀种模式,⽽且变种较多,应⽤场合覆盖从⼩结构到整个系统的⼤结构。

三、实验环境Windows7 、Java虚拟机、MyEclipse 环境下运⾏代码。

四、实验设计原理迭代器(Iterator)模式,⼜叫做游标(Cursor)模式。

它提供⼀种⽅法顺序访问⼀个聚合对象(或容器对象:container)中各个元素, ⽽⼜不需暴露该对象的部。

聚合:表⽰⼀组对象的组合结构,⽐如JAVA中的数组,集合等从定义可见,迭代器模式是为容器⽽⽣。

很明显,对容器对象的访问必然涉及到遍历算法。

你可以⼀股脑的将遍历⽅法塞到容器对象中去;或者根本不去提供什么遍历算法,让使⽤容器的⼈⾃⼰去实现去吧。

这两种情况好像都能够解决问题。

然⽽在前⼀种情况,容器承受了过多的功能,它不仅要负责⾃⼰“容器”的元素维护(添加、删除等等),⽽且还要提供遍历⾃⾝的接⼝;⽽且由于遍历状态保存的问题,不能对同⼀个容器对象同时进⾏多个遍历。

第⼆种⽅式倒是省事,却⼜将容器的部细节暴露⽆遗。

⽽迭代器模式的出现,很好的解决了上⾯两种情况的弊端。

迭代器模式的类图如下图所⽰:类图解读:从结构上可以看出,迭代器模式在客户与容器之间加⼊了迭代器⾓⾊。

迭代器⾓⾊的加⼊,就可以很好的避免容器部细节的暴露,⽽且也使得设计符号“单⼀职责原则”。

注意,在迭代器模式中,具体迭代器⾓⾊和具体容器⾓⾊是耦合在⼀起的——遍历算法是与容器的部细节紧密相关的。

组合,外观,迭代器模式案例实验报告

组合,外观,迭代器模式案例实验报告
}
System.out.println(s+name);
}
@Override
public void lineOfDuty() {
// TODO Auto-generated method stub
System.out.println(name+"负责管理公司财务收支");
}
}
package Combination;
// TODO Auto-generated method stub
Vector v =new Vector<>();
v.add(3);
v.add(6);
v.add(9);
v.add(12);
v.add(15);
v.add(18);
v.add(21);
v.add(24);
v.add(27);
Enumeration<Vector> e=v.elements();
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
}
}
public void remove(Company c) {
// TODO Auto-generated method stub
children.remove(c);
}
public void display(int depth) {

34桥接模式及41迭代器模式作业答案.doc

34桥接模式及41迭代器模式作业答案.doc

34桥接模式可以在不同操作系统平台(如Windows 、Linux> UNIX 等) MPEG 、RMVB 、AVI 、WMV 等常见视频格式。

现使用桥接图4J0跨平台视旗播放器实例类图2、现欲实现一个图像浏览系统,要求该系统能够显示BMP 、JPEG 和GIF 三种格式的文件, 并J=L 能够在Windows 和Linux 两种操作系统上运行。

系统首先将BMP 、JPEG 和GIF 三种格 式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。

系统必须具有较好的扩展性以支 持新的文件格式和操作系统。

为满足上述需求并减少所需生成的子类数目,采用桥接设计模 式,请画出类图。

act Method二pUytSWiQ WeNan巴WMVFileUrMrtVBrsWn■ dxocSe (Strtnq oRType. String ・e 科ame):心<:xType. S<wg fiteNime) : voidf vf : VWeofUe,ptoy(Stnngvf) : VOW :vo<»1、开发一个跨平台视频播放器, 上播放多种格式的视频文件,如 模式设计该播放器。

1、在例4.1屮增加一个迭代器,按照斜对角线迭代便利矩阵。

请画出类图2、某商店管理系统的商品名称存储在一个字符串数组川,现需要自定义一个双向迭代器 (Myiterator)实现对该商品名称数组的双向(前后向)遍历,请绘制类图。

答:AbstractProductLiat______________ ____ ’{abstract}•_procluctsName : String。

* AbstractProductList (StringQ~productsName) * getProductsName () : Strlng() * getltorator (): Abstrnctitorator * PeductList (String productsName)仙嗣唤⑹ ♦ generator ()+ next () + isLast () ♦ previous () ♦ isFirst ()♦gotNextltom () ♦ QotPr«viou«ltmn() : StringMyiterator StringU int int♦ Myttnrator (AbstractProductt mt list) ♦ next () : void♦ isLast () : tkxvMAn ♦ previous () void ♦IsFirst ()botWano-Abstracttterator:void:boolean :void :boolea n :StringproductsNiinw -Indoxl ・ ii )dex2ProductLIst♦getNaxtltem() : Strg ♦getPreviousKem () _______ : Stnng图5-16 lO名称連历实。

Java类和List集合迭代器遍历练习题

Java类和List集合迭代器遍历练习题

Java类和List集合迭代器遍历练习题1. 创建班级类(Classes),具有两个属性:班级⼈数,班级名称;创建学⽣类(Student),具有三个属性:学⽣姓名,学号,所在班级(Classes 类型对象),所有属性都通过构造⽅法赋值,并具有相应存取器⽅法。

在测试类中,创建存储Student类型的List,并向其添加⼗个学⽣的信息,通过迭代器,迭代该List,并将学⽣所在班级名称打印到控制台。

import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.ListIterator;//定义⼀个班级类class Classes{private int count;private String name;//构造⽅法public Classes(int count, String name) {super();this.count = count; = name;}//getter/setter⽅法public int getCount() {return count;}public void setCount(int count) {this.count = count;}public String getName() {return name;}public void setName(String name) { = name;}}//定义⼀个学⽣类class Student {private String name;private String id;private Classes classes;public Student(String name, String id, Classes classes) { = name;this.id = id;this.classes = classes;}public String getName() {return name;}public void setName(String name) { = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}}public class Test1_06 {public static void main(String[] args) {List list = new ArrayList ();Classes cla = new Classes(10, "java0421"); //⽣成班级for (int i = 0; i < 10; i++) { //循环10遍Student s = new Student(""+i, i+"", cla); //⽣成学⽣ list.add(s); //添加学⽣}//通过迭代器,迭代该list集合for(ListIterator it = list.listIterator();it.hasNext();) {Object obj = it.next();if (obj instanceof Student) {Student s = (Student) obj;System.out.println(s.getClasses().getName());}}}}。

python实验列表操作题目及答案

python实验列表操作题目及答案

1. (简答题) 编写程序,输入一个包含若干整数的列表,输出一个新列表,新列表中奇数在前偶数在后,并且奇数之间相对顺序不变,偶数之间的相对顺序也不变。

# 获取原始列表num_list = input(请输入一个包含若干整数的列表,各个数字之间用空格分隔).split()# 将原始列表中的数字转换为整数num_list = [int(num) for num in num_list]# 将奇数和偶数分别存储在两个列表中odd_list = []even_list = []for num in num_listif num % 2 == 1odd_list.append(num)elseeven_list.append(num)# 将奇数和偶数列表合并,并输出结果new_list = odd_list + even_listprint(处理后的列表为, new_list)2. (简答题) 编写程序,对用户输入的英文字符串中出现的英文字母进行提取(不区分大小写,重复字母只记一次),并将提取的结果按照字母顺序表升序排列后输出。

例如:输入“i miss you ”输出:“i,m,o,,s,u,y”# 获取用户输入的英文字符串string = input(请输入一个英文字符串)# 将字符串转换为小写并去除空格string = string.lower().replace( , )# 将字符串中的英文字母存储在一个集合中,并将集合转换为列表并排序char_list = sorted(list(set(filter(str.isalpha, string))))# 将列表中的字母用逗号连接,并输出结果result = ,.join(char_list)print(提取的结果为, result)3. (简答题) 微软产品一般都有一个25位的、用于区分每份微软产品的产品序列号。

产品序列号由5组被“-”分隔开,由字母、数字混合编制的字符串组成,每组由5个字符串组成。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称:软件体系结构与设计迭代器(Iterator)模式实验一、实验目的1. 掌握迭代器模式的概念;2. 掌握迭代器模式的功能;3. 加深对迭代器模式的了解;4. 提高对迭代器模式的运用;5. 将该模式运用但实际的生活中。

二、实验内容1. 阅读和查看资料了解迭代器模式的概念和功能;2. 将有关代理模式的迭代器模式理解透彻并运行;3. 举例说明生活中的一个可以使用迭代器模式的例子;4. 熟悉迭代器模式的扩展,迭代器模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。

三、实验环境Windows7 、Java虚拟机、MyEclipse 环境下运行代码。

四、实验设计原理迭代器(Iterator)模式,又叫做游标(Cursor)模式。

它提供一种方法顺序访问一个聚合对象(或容器对象:container)中各个元素, 而又不需暴露该对象的内部。

聚合:表示一组对象的组合结构,比如JAVA中的数组,集合等从定义可见,迭代器模式是为容器而生。

很明显,对容器对象的访问必然涉及到遍历算法。

你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。

这两种情况好像都能够解决问题。

然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。

第二种方式倒是省事,却又将容器的内部细节暴露无遗。

而迭代器模式的出现,很好的解决了上面两种情况的弊端。

迭代器模式的类图如下图所示:类图解读:从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。

迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符号“单一职责原则”。

注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。

为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。

这被称为多态迭代。

迭代器模式所涉及的角色有:参与者:•迭代器角色(Iterator):定义访问和遍历元素的接口。

•具体迭代器角色(Concrete Iterator):关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的迭代,并负责管理记录遍历中的当前位置。

•聚集对象抽象角色(Aggregate):负责提供创建具体迭代器角色的接口。

•具体聚集对象角色(Concrete Aggreate):持有一个对象的集合,实现创建具体迭代器角色的接口,返回集合遍历所依赖的一个迭代器。

●一个迭代器模式例子:●20世纪80年代的黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,如果你想换台的话,需要亲自用手去旋转换台的按钮,每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。

还要移动电视机上面那两根可以前后左右移动变长变短的天线。

随着科技的飞速发展,越来越高级的电视机相继出现,那种古老的电视机几乎看不到了。

与那时的电视机相比,现今的电视机给我们带来的最大便利之一就是增加了电视机遥控器,我们在进行开机、关机、换台、改变音量等操作时都无须直接操作电视机,可以通过遥控器来间接实现。

我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。

遥控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。

电视机遥控器和电视机示意图如图1所示:●●在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(Aggregate Classes),对应的对象称为聚合对象。

为了更加方便地操作这些聚合对象,同时可以很灵活地为聚合对象增加不同的遍历方法,我们也需要类似电视机遥控器一样的角色,可以访问一个聚合对象中的元素但又不需要暴露它的内部结构。

本章我们将要学习的迭代器模式将为聚合对象提供一个遥控器,通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式。

●迭代器模式的作用:●迭代器模式能够遍历一组聚合对象,不需要了解其内部结构还能提供不同的遍历方法。

●就是分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”,另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。

五、迭代器模式示例性代码首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。

它只有一个方法GetIterator()让子类去实现,用来获得一个迭代器对象。

1///<summary>23///抽象聚集45///</summary>67public interface IList89 {10 IIterator GetIterator();11 }抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取出来。

通常会有MoveNext()、CurrentItem()、Fisrt()、Next()等几个方法让子类去实现。

1///<summary>23///抽象迭代器45///</summary>67public interface IIterator8 {9bool MoveNext();1011 Object CurrentItem();13void First();1415void Next();16 }具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加上Length属性和GetElement()方法是为了便于访问聚集中的数据。

1///<summary>23///具体聚集45///</summary>67public class ConcreteList : IList8 {9int[] list;1011public ConcreteList()1213 {14 list = new int[] { 1,2,3,4,5};15 }17public IIterator GetIterator()1819 {20return new ConcreteIterator(this);21 }2223public int Length2425 {26get { return list.Length; }27 }2829public int GetElement(int index)3031 {32return list[index];33 }34 }具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。

1/**////<summary>23///具体迭代器45///</summary>67public class ConcreteIterator : IIterator89 {10private ConcreteList list;1112private int index;1314public ConcreteIterator(ConcreteList list) 1516 {17this.list = list;1819 index = 0;20 }2122public bool MoveNext()2324 {25if (index < list.Length)2627return true;2829else3031return false;32 }3334public Object CurrentItem()3536 {37return list.GetElement(index) ;38 }3940public void First()4142 {43 index = 0;44 }46public void Next()4748 {49if (index < list.Length)5051 {52 index++;53 }54 }55 }简单的客户端程序调用:1/**////<summary>23///客户端程序45///</summary>67class Program89 {10static void Main(string[] args)12 {13 IIterator iterator;1415 IList list = new ConcreteList();1617 iterator = list.GetIterator();1819while (iterator.MoveNext())2021 {22int i = (int)iterator.CurrentItem();23 Console.WriteLine(i.ToString()); 2425 iterator.Next();26 }2728 Console.Read();2930 }3132 }Iterator实现要点:1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

题目:假设某软件公司Z为某超市开发了一套销售管理系统,在对该系统进行分析和设计时,Z公司开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,Z公司开发人员设计了一个抽象的数据聚合类AbstractObjectList,而将存储商品和客户登记的类作为其子类。

AbstractObjectList类结构如下图所示。

在上图中,IList类型的对象objects用于存储数据,AbstractObjectList类的方法说明如下表所示:AbstractObjectList类的子类ProductList和CustomerList分别用于存储商品数据和客户数据。

请用迭代器模式编程实现。

代码:import java.util.*;//抽象聚合类abstract class AbstractObjectList {protected List<Object> objects = new ArrayList<Object>();}public void addObject(Object obj) {this.objects.add(obj);}public void removeObject(Object obj) {this.objects.remove(obj);}return this.objects;}//声明创建迭代器对象的抽象工厂方法public abstract AbstractIterator createIterator(); }//商品数据类:具体聚合类class ProductList extends AbstractObjectList {super(products);}//实现创建迭代器对象的具体工厂方法public AbstractIterator createIterator() {return new ProductIterator(this);}}//客户数据类:具体聚合类class CustomerList extends AbstractObjectList {super(customers);}//实现创建迭代器对象的具体工厂方法public AbstractIterator createIterator() {return new CustomerIterator(this);}}//抽象迭代器interface AbstractIterator {public void next(); //移至下一个元素public boolean isLast(); //判断是否为最后一个元素public void previous(); //移至上一个元素public boolean isFirst(); //判断是否为第一个元素public Object getNextItem(); //获取下一个元素public Object getPreviousItem(); //获取上一个元素}//商品迭代器:具体迭代器class ProductIterator implements AbstractIterator {private int cursor1; //定义一个游标,用于记录正向遍历的位置private int cursor2; //定义一个游标,用于记录逆向遍历的位置public ProductIterator(ProductList list) {this.productList = list;this.products = list.getObjects(); //获取集合对象cursor1 = 0; //设置正向遍历游标的初始值cursor2 = products.size() -1; //设置逆向遍历游标的初始值}public void next() {if(cursor1 < products.size()) {cursor1++;}}public boolean isLast() {return (cursor1 == products.size());}public void previous() {if (cursor2 > -1) {cursor2--;}}public boolean isFirst() {return (cursor2 == -1);}public Object getNextItem() {return products.get(cursor1);}public Object getPreviousItem() {return products.get(cursor2);}}//客户迭代器:具体迭代器class CustomerIterator implements AbstractIterator {private int cursor1; //定义一个游标,用于记录正向遍历的位置private int cursor2; //定义一个游标,用于记录逆向遍历的位置public CustomerIterator(CustomerList list) {this.customerList = list;this.customers = list.getObjects(); //获取集合对象cursor1 = 0; //设置正向遍历游标的初始值cursor2 = customers.size() -1; //设置逆向遍历游标的初始值}public void next() {if(cursor1 < customers.size()) {cursor1++;}}public boolean isLast() {return (cursor1 == customers.size());}public void previous() {if (cursor2 > -1) {cursor2--;}}public boolean isFirst() {return (cursor2 == -1);}public Object getNextItem() {return customers.get(cursor1);}public Object getPreviousItem() {return customers.get(cursor2);}}public class Iterator {public static void main(String args[]) {List<String> products = new ArrayList<String>();products.add("农夫山泉");products.add("百岁山");products.add("康师傅");products.add("旺仔");products.add("统一");AbstractObjectList list;AbstractIterator iterator;list = new ProductList(products); //创建聚合对象iterator = list.createIterator(); //创建迭代器对象System.out.println("***************商品数据***************");System.out.println("正向遍历:");while(!iterator.isLast()) {System.out.print(iterator.getNextItem() + ",");iterator.next();}System.out.println();System.out.println("逆向遍历:");while(!iterator.isFirst()) {System.out.print(iterator.getPreviousItem() + ",");iterator.previous();}List<String> customers = new ArrayList<String>(); customers.add("张三");customers.add("李四");customers.add("王五");customers.add("赵六");AbstractObjectList list1;AbstractIterator iterator1;list1 = new ProductList(customers); //创建聚合对象iterator1 = list1.createIterator(); //创建迭代器对象System.out.println();System.out.println("***************客户数据***************");System.out.println("正向遍历:");while(!iterator1.isLast()) {System.out.print(iterator1.getNextItem() + ",");iterator1.next();}System.out.println();System.out.println("逆向遍历:");while(!iterator1.isFirst()) {System.out.print(iterator1.getPreviousItem() + ",");iterator1.previous();}}}。

相关文档
最新文档