解答集

目次

第1回

演習1-1


class Enshu1 {
    private static double discriminant(double x, double y, double z){
        return y*y-4*x*z;
    }
    public static void main(String[] arg){
	double a=1;b=2;c=3;
	Sysmtem.out.print("方程式"+a+"x^2+"+b+"x+"+c+"=0");
	System.out.println("の判別式は"+discriminant(a,b,c));
    }
}

演習1-2


class Enshu2 {
    private static double discriminant(double x, double y, double z){
        return y*y-4*x*z;
    }
    private static boolean hasRealRoots(double x, double y, double z){
        return discriminant(x,y,z)>=0;
    }
    public static void main(String[] arg){
	double a=1;b=2;c=3;
	Sysmtem.out.print("方程式"+a+"x^2+"+b+"x+"+c+"=0");
	if(hasRealRoots(a,b,c)){
	    System.out.println("は実根を持つ");
	}else{
	    System.out.println("は実根を持たない");
	}
    }
}

演習1-3


class Enshu3 {
    private static double discriminant(double x, double y, double z){
        return y*y-4*x*z;
    }
    private static int numberOfRoots(double x, double y, double z){
        if(discriminant(x,y,z)>0){
             return 2;
        }
        if(discriminant(x,y,z)==0){
             return 1;
        }
	return 0;
    }
    public static void main(String[] arg){
	double a=1;b=2;c=3;
	double d=b*b-4*a*c;
	Sysmtem.out.print("方程式"+a+"x^2+"+b+"x+"+c+"=0");
	System.out.println("の実根の数は"+numberOfRoots(a,b,c));
    }
}

第2回

演習2-1


class Ex1 {
    public static void main(String[] arg){
	double[] data={3.0,1.0,4.0,1.0,5.0,-1.0};
	double sum=0.0;
	for(int i=0; data[i]!=-1.0; i++){
	    sum += data[i];
	}
	System.out.println(sum);
    }
}

演習2-2


class Ex2 {
    private static double heron(double a, double b, double c){
	double s=(a+b+c)/2;
	return Math.sqrt(s*(s-a)*(s-b)*(s-c));
    }
    public static void main(String[] arg){
	double x,y,z;
	x=2.0;
	y=3.0;
	z=4.0;
	System.out.print("三辺の長さが "+x+", "+y+", "+z+" の三角形の面積は");
	System.out.println(heron(x,y,z));
    }
}

演習2-3


class NijiHouteishiki {
    private double a;
    private double b;
    private double c;
    public NijiHouteishiki(double a, double b, double c){
	this.a=a;
	this.b=b;
	this.c=c;
    }
    public String toString(){
	return String.format("%f x^2 %+f x %+f = 0",a,b,c);
    }
    public double discriminant(){
	return b*b-4*a*c;
    }
}
class Ex3 {
    public static void main(String[] arg){
	NijiHouteishiki f = new NijiHouteishiki(2.0,5.0,3.0);
	System.out.println(f+"の判別式の値は "+f.discriminant());
    }
}

演習2-4


class NijiHouteishiki {
    private double a;
    private double b;
    private double c;
    public NijiHouteishiki(double a, double b, double c){
	this.a=a;
	this.b=b;
	this.c=c;
    }
    public String toString(){
	return String.format("%f x^2 %+f x %+f = 0",a,b,c);
    }
    public double discriminant(){
	return b*b-4*a*c;
    }
    public boolean hasRealRoot(){
	return discriminant()>=0;
    }
}
class Ex4 {
    public static void main(String[] arg){
	NijiHouteishiki f = new NijiHouteishiki(2.0,5.0,3.0);
	System.out.print(f+"は実根を");
	if(f.hasRealRoot()){
	    System.out.println("持つ");
	}else{
	    System.out.println("持たない");
	}
    }
}

演習2-5


class NijiHouteishiki {
    private double a;
    private double b;
    private double c;
    public NijiHouteishiki(double a, double b, double c){
	this.a=a;
	this.b=b;
	this.c=c;
    }
    public String toString(){
	return String.format("%f x^2 %+f x %+f = 0",a,b,c);
    }
    public double discriminant(){
	return b*b-4*a*c;
    }
    public int numberOfRoots(){
      if(discriminant()>0){
	return 2;
      }
      if(discriminant()==0){
	return 1;
      }
      return 0;
    }
}
class Ex5 {
    public static void main(String[] arg){
	NijiHouteishiki f = new NijiHouteishiki(2.0,5.0,3.0);
	System.out.println(f+" は "+f.numberOfRoots()+" 個の実根を持つ");
    }
}

第3回

演習3-1


class Yen {
    private int value;
    public Yen(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "¥";
    }
    @Override public String toString(){
	return getSign()+value;
    }
}

演習3-2


class Dollar {
    private int value;
    public Yen(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "$";
    }
    @Override public String toString(){
	return getSign()+value;
    }
}

演習3-3


abstract class Money {
    abstract public int getValue();
    abstract public void setValue(int n);
    abstract public String getSign();
    @Override
    abstract public String toString();
}
class Yen extends Money {
    private int value;
    public Yen(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "¥";
    }
    @Override
    public String toString(){
	return getSign()+value;
    }
}
class Dollar extends Money {
    private int value;
    public Dollar(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "$";
    }
    @Override
    public String toString(){
	return getSign()+value;
    }
}

演習3-4


abstract class Money {
    abstract public int getValue();
    abstract public void setValue(int n);
    abstract public String getSign();
    @Override
    public String toString(){
	return getSign()+getValue();
    }
}
class Yen extends Money {
    private int value;
    public Yen(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "¥";
    }
}
class Dollar extends Money {
    private int value;
    public Dollar(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    public String getSign(){
	return "$";
    }
}

演習3-5


abstract class Money {
    private int value;
    public Money(int v){
	value = v;
    }
    public int getValue(){
	return value;
    }
    public void setValue(int n){
	value = n;
    }
    abstract public String getSign();
    @Override
    public String toString(){
	return getSign()+getValue();
    }
}
class Yen extends Money {
    public Yen(int v){
	super(v);
    }
    public String getSign(){
	return "¥";
    }
}
class Dollar extends Money {
    public Dollar(int v){
	super(v);
    }
    public String getSign(){
	return "$";
    }
}

第4回

演習4-1


class Ex1 {
      public static void main(String[] arg){
	String str="This is a pen.";
	System.out.println(str.length());
	System.out.println(str.toUpperCase());
	System.out.println(str.toLowerCase());
    }
}

演習4-2


import java.io.*;
class Ex {
    public static void main(String[] arg) 
	throws FileNotFoundException, IOException {
	File f = new File(arg[0]);
	FileInputStream fis = new FileInputStream(f);
	InputStreamReader isr = new InputStreamReader(fis);
	BufferedReader br = new BufferedReader(isr);
	
	String line;
	while((line = br.readLine())!=null){
	    System.out.println(line.length());
	}
	br.close();
    }
}

演習4-3


import java.io.*;
class Ex {
    public static void main(String[] arg) 
	throws FileNotFoundException, IOException {
	File f = new File(arg[0]);
	FileInputStream fis = new FileInputStream(f);
	InputStreamReader isr = new InputStreamReader(fis);
	BufferedReader br = new BufferedReader(isr);
	
	String line;
	int total=0;
	String[] data;
	while((line = br.readLine())!=null){
	    data = line.split("\\D+");
	    for(String str : data){
		try{
		    total += Integer.parseInt(str);
		}catch(NumberFormatException e){
		    // 数値として読めないものは無視
		}
	    }
	}
	System.out.println(total);
	br.close();
    }
}

演習4-4


import java.io.*;
import java.util.LinkedList;
class Ex {
    public static void main(String[] arg) 
	throws FileNotFoundException, IOException {
	File f = new File(arg[0]);
	FileInputStream fis = new FileInputStream(f);
	InputStreamReader isr = new InputStreamReader(fis);
	BufferedReader br = new BufferedReader(isr);
	
	LinkedList<String> ll = new LinkedList<String>();
	String line;
	while((line = br.readLine())!=null){
	    ll.addFirst(line);
	}
	for(String str : ll){
	    System.out.println(str);
	}
	br.close();
    }
}

演習4-5


import java.io.*;
import java.util.*;
class Ex {
    public static void main(String[] arg) 
	throws FileNotFoundException, IOException {
	File f = new File(arg[0]);
	FileInputStream fis = new FileInputStream(f);
	InputStreamReader isr = new InputStreamReader(fis);
	BufferedReader br = new BufferedReader(isr);
	
	TreeMap<String,Integer> hindo = new TreeMap<String,Integer>();
	String line;
	String[] data;
	while((line = br.readLine())!=null){
	    data = line.split("\\W+");
	    for(String str : data){
		if(str.equals("")){
		    continue;
		}
p		if(hindo.containsKey(str)){
		    hindo.put(str,hindo.get(str)+1);
		}else{
		    hindo.put(str,1);
		}
	    }
	}
	for(Map.Entry<String,Integer> m : hindo.entrySet()){
	    System.out.println(m.getKey()+": "+m.getValue());
	}
	br.close();
    }
}

第5回

演習5-1

演習5-2

与えられた文において名詞は次の通り。

  1. 売上げデータ
  2. 商品の情報
  3. 売上げ数
  4. 商品
  5. 商品コード
  6. 商品名
  7. 単価
  8. 総売上額

商品は複数存在し、また売上げも複数の商品に対してそれぞれの売上げがある。 そこで、商品とは商品コード、商品名、単価からなる情報とする。 また、売上げは商品コードと売上げ数とする。 さらに、売上げデータは売上げを複数含んでおり、また商品のあつまりの商品 データというオブジェクトも作る。

また動詞や目的語を考えると次のような関係が考えられる。

売上げデータ: 得る(商品コード) →売上げ数 売上げデータ: 総売上げを得る

第6回

演習6-1


import java.util.*;
class Seiseki {
    private HashMap<String,Integer> seisekiMap;
    public Seiseki(){
	seisekiMap = new HashMap<String,Integer>();
    }
    public Integer put(String className, Integer point){
	return seisekiMap.put(className,point);
    }
    public Integer get(String className){
	return seisekiMap.get(className);
    }
    public boolean containsKey(String className){
	return seisekiMap.containsKey(className);
    }
    public Set<Map.Entry<String,Integer>> entrySet(){
	return seisekiMap.entrySet();
    }
    public Set<String> keySet(){
	return seisekiMap.keySet();
    }
    public double getAverage(){
	int total=0;
	for(int point  : seisekiMap.values()){
	    total+=point;
	}
	return (double)total/seisekiMap.values().size();
    }
}

演習6-2


import java.util.*;
class Seiseki extends HashMap<String,Integer> {
    public double getAverage(){
	int total=0;
	for(int point  : this.values()){
	    total+=point;
	}
	return (double)total/this.values().size();
    }
}

演習6-3


import java.util.*;
class Seiseki extends HashMap<String,Integer> {
    public double getAverage(){
	int total=0;
	for(int point  : this.values()){
	    total+=point;
	}
	return (double)total/this.values().size();
    }
}
class Student implements Comparable<Student> {
    private String id;
    private Seiseki seiseki;
    public Student(){
	seiseki = new Seiseki();
    }
    public void setId(String id){
	this.id = id;
    }
    public String getId(){
	return id;
    }
    public Seiseki getSeiseki(){
	return seiseki;
    }
    public boolean equals(Student s){
	return id.equals(s.id);
    }
    @Override public int hashCode(){
	return id.hashCode();
    }
    public int compareTo(Student s){
	return id.compareTo(s.id);
    }
}

演習6-4


import java.util.*;
abstract class Comp implements Comparator<ThreeInt>{
    protected int intComp(int a1, int a2){
	if(a1<a2) return -1;
	if(a1==a2) return 0;
	return 1;
    }
}
class Third extends Comp {
    public int compare(ThreeInt t1, ThreeInt t2){
	return intComp(t1.getThird(),t2.getThird());
    }
}
class First extends Comp {
    public int compare(ThreeInt t1, ThreeInt t2){
	return intComp(t1.getFirst(),t2.getFirst());
    }
}
class Second extends Comp {
    public int compare(ThreeInt t1, ThreeInt t2){
	return intComp(t1.getSecond(),t2.getSecond());
    }
}

第7回

演習7-1

  1. まず、Status クラスのコンストラクタで、 500 のメッセージを登録する

    
        private Status(){
    	word = new HashMap<Integer,String>();
    	message = new HashMap<Integer,String>();
    	word.put(200,"Ok");
    	word.put(404,"Not Found");
    	message.put(404,"Not Found");
    	word.put(500,"Internal Error");
    	message.put(500,"Internal Error");
        }
    
  2. そして、 Message クラスのファクトリで IOException を投げずにエラーメッ セージを作成するようにする。

    
    class Message {
        public static Message getInstance(String filePath)
    //    throws IOException 
        {
    	File f = new File(filePath);
    	Message message;
    	try {
    	    message = new FileContent(f);
    	}catch(FileNotFoundException e) {
    	    message = new ErrorMessage(404);
    	}catch(IOException e) {
    	    message = new ErrorMessage(500);
    	}
    	return message;
        }
    }
    
  3. 仕上げに、main でも IOException を投げるのを止める。

    
    class Test {
        public static void main(String[] arg)
    //	throws IOException 
        {
    	Message m = Message.getInstance(arg[0]);
    	System.out.println(m);
        }
    }
    

第8回

演習8-1

  1. SimpleFrame クラスに次を付け加える。

    
        private JButton reset;
        public JButton getResetButton(){
    	return reset;
        }
    
  2. ButtonPanel のコンストラクタを書き換える

    
    	public ButtonPanel(){
    	    super();
    	    plus = new JButton("+");
    	    minus = new JButton("-");
    	    reset = new JButton("Reset");
    	    add(plus);
    	    add(minus);
    	    add(reset);
    	}
    
  3. Data クラスに Clear インナークラスを追加する。

    
        class Clear implements ActionListener {
    	public Clear(){}
    	public void actionPerformed(ActionEvent event){
    	    data=0;
    	    update();
    	}
        }
    
  4. Rei クラスの main で、下記の行を追加する。

    
    	frame.getResetButton().addActionListener(data.new Clear());
    

第9回

演習9-1

5!=120, 6!=720

演習9-2

  1. fibo(20)=10946
  2. 以下のコードを fibo 関数と結合する。
    
        public static void main(String[] arg){
    	for(int i=0; i<=50; i++){
    	    System.out.println(i+": "+fibo2(i));
    	}
        }
    
  3. fibo(50) を計算するのに fibo(49)+fibo(48) を計算するが、 fibo(49) を計算するのに fibo(48)+fibo(47) を計算する。 つまり、 fibo(48) は 2 回計算される。 同様の理由で fibo(47) は 4 回計算され、 fibo(46) は 8 回計算される。 したがって、fibo(2) は 248 回計算することになる。 単純な計算であっても膨大な回数同じ計算をするので時間がかかる。
  4. 
        private static long[] a = new long[51];
        public static long fibo(int n){
    	if(a[n]!=0) return a[n];
    	if(n==0){
    	    a[n]=1;
    	    return a[n];
    	}
    	if(n==1){
    	    a[n]=1;
    	    return a[n];
    	}
    	a[n]=fibo2(n-1)+fibo2(n-2);
    	return a[n];
        }
    

演習9-3


class Rei {
    private static int combination(int n, int m){
	if(m==0) return 1;
	if(n==m) return 1;
	return combination(n-1,m-1)+combination(n-1,m);
    }
    public static void main(String[] arg){
	System.out.println(combination(5,2));
	System.out.println(combination(20,2));
    }
}

5C2=10, 20C2=190

演習9-4

n 枚のディスクの移動回数を an とする。 a1=1 である。 プログラムから an = (n-1 枚の移動)+n枚目の移動+(n-1枚の移動) なので、 an = an-1 + 1 + an-1 となる。 an + 1 = 2 × (an-1 + 1) より、 an = 2n - 1 である。

演習9-5

14種類。

演習9-6


import java.io.*;
import java.util.*;
class Ex {
    private static double[][] csvToMatrix(Reader r) throws IOException {
	LinkedList<double[]> ll = new LinkedList<double[]>();
	BufferedReader br = new BufferedReader(r);
	String input;
	while((input = br.readLine())!=null){
	    String[] data = input.split(",");
	    double[] array = new double[data.length];
	    for(int i=0; i< array.length; i++){
		array[i] = Double.parseDouble(data[i]);
	    }
	    ll.add(array);
	}
	double[][] matrix = new double[ll.size()][];
	int index=0;
	for(double[] d : ll){
	    matrix[index++] = d;
	}
	return matrix;
    }
    public static void main(String[] arg) throws IOException {
	Reader r = new InputStreamReader(System.in);
	double[][] mat = csvToMatrix(r);
	for(double[] d : mat){
	    System.out.println(Arrays.toString(d));
	}
    }
}

演習9-7

0110
1010
1101
0010

演習9-8


class Ex {
    private static int[][] getMatrix(InputStream is){
	Scanner scanner = new Scanner(is);
	int n = scanner.nextInt();
	int[][] matrix = new int[n][];
	for(int i=0; i<n; i++){
	    matrix[i] = new int[n];
	    for(int j=0; j<n; j++){
		matrix[i][j] = scanner.nextInt();
	    }
	}
	return matrix;
    }
    private static int getDegree(int[] vertex){
	int degree = 0;
	for(j=0; j<vertex.length; j++){
	    degree += vertex[i][j];
	}
	return degree;
    }
    private static boolean isEular(int[][] graph){
	int kiten=0;
	for(int i=0; i<graph.length; i++){
	    kiten += getDegree(graph[i]) % 2;
	}
	return (kiten==0)||(kiten==2);
    }
    public static void main(String[] arg){
	int[][] mat = getMatrix(System.in);
	if(isEular(mat)){
	    System.out.println("一筆書きできます。");
	}else{
	    System.out.println("一筆書きできません。");
	}
    }
}

第10回

演習10-1

削除を行うにはどこで削除を行うかはっきりさせる必要があります。 そのひとつは任意の位置で削除を行うことです。 これは、特定の頂点を注目する必要がありますので、イテレータのようなもの を用意しなければなりません。 しかし、イテレータは実装されてません。 そして、 add も最終頂点としての追加だけです。 そこで、ここでは先頭の頂点を削除するコードを与えます。 これは管理頂点が指す頂点を次に進めるだけで良いので、次のようになります。


public class SenkeiList<E> {
    public void removeFirst(){
        head = head.next;
    }
}

演習10-2

双方向リストを実装する際に考えなければいけないのは nil 頂点の処理であ る。 無くしてしまって、管理変数を二つ用意する方法や、 nil 頂点を両端に置く 方法、ひとつの nil 頂点の両端にリストを円状に結びつける方法などが考え られ、それぞれ一長一短がある。

解答作成中

演習10-3


import java.util.*;
public class AList<E> extends AbstractList<E> {
    private Object[] array;
    public AList(int n){
	super();
	array = new Object[n];
    }
    public E get(int index){
	@SuppressWarnings({"unchecked"}) 
	    E result = (E) array[index];
	return result;
    }
    public int size(){
	int result;
	for(result=0;result<array.length && array[result]!=null;result++);
	return result;
    }
    public void add(int index, E element){
	array[index] = element;
    }
}
class Test {
    public static void main(String[] arg){
	AList<String> list = new AList<String>(10);
	list.add("abc");
	list.add("def");
	list.add("ghi");
	for(String s : list){
	    System.out.println(s);
	}
    }
}

第11回

演習11-1

14種類

第12回

演習12-1

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科