プログラムは書いて・動かして・間違って・直す が重要ということで、以下に前期期末試験前までに取り組むレポート課題をしめす。
レポート課題(プログラム例)
Java を用いて、後に示すデータ処理をするためのリスト構造を定義し、与えられたデータを追加していく処理を作成せよ。
課題の説明用に、複素数のリスト構造を定義し、指定した絶対値以下の複素数を抜き出す関数をつくった例を示す。
import java.util.* ;
class ComplexListNode {
double re ;
double im ;
ComplexListNode next ;
ComplexListNode( double r , double i , ComplexListNode n ) {
this.re = r ;
this.im = i ;
this.next = n ;
}
} ;
public class Main {
// 先頭からデータを挿入する方式
static ComplexListNode top = null ;
// 全リストを表示する処理
static void print( ComplexListNode p ) {
for( ; p != null ; p = p.next ) {
System.out.println( "(" + p.re + ")+j(" + p.im + ")" ) ;
}
}
// top に要素を追加する処理(先頭に入れる)
static void add( double r , double i ) {
top = new ComplexListNode( r , i , top ) ;
}
// 特定のデータを対象にした処理の例
static ComplexListNode filter_lessthan( ComplexListNode p , double v_abs ) {
ComplexListNode ans = null ;
for( ; p != null ; p = p.next ) {
if ( Math.sqrt( p.re * p.re + p.im * p.im ) <= v_abs )
ans = new ComplexListNode( p.re , p.im , ans ) ;
}
return ans ;
}
public static void main(String[] args) throws Exception {
add( 1.0 , 2.0 ) ;
add( -1.0 , -1.0 ) ;
add( 2.0 , -1.0 ) ;
add( 1.0 , 0 ) ;
print( top ) ;
ComplexListNode less_than_2 = filter_lessthan( top , 2 ) ;
System.out.println( "less than 2" ) ;
print( less_than_2 ) ;
}
}
((( 実行結果の例 )))
(1.0)+j(0.0)
(2.0)+j(-1.0)
(-1.0)+j(-1.0)
(1.0)+j(2.0)
less than 2
(-1.0)+j(-1.0)
(1.0)+j(0.0)
レポート内容
上記のプログラムをまねて、以下のレポート課題を作成すること。テーマは ((出席番号-1)%3+1) を選択すること。
- 年号のデータが、年号の名称と年号の始まりの年月日がYYYYMMDD形式で
- “Meiji”,18681023
- “Taisho”,19120730
- “Showa”,19261225
- “Heisei”,19890108
- “Reiwa”,20190501
の様に与えられる。このデータ構造を覚えるリスト構造を作成せよ。また ListNode のデータで、西暦の日付のリストが seireki_list = new ListNode( 19650207, new ListNode( 20030903 , null ) ) ; のように与えられたら、そのデータを和暦で表示するプログラムを作成せよ。 (参考2023年前期期末)
- 市町村名,月,日,最高気温,最低気温のデータが、
- “fukui”,8月,4日,27.6℃,22.3℃
- “fukui”,8月,5日,31.5℃,23.3℃
- “fukui”,8月,7日,34.7℃,25.9℃
- “obama”,8月,6日,34.2℃,23.9℃
の様に与えられる。このデータ構造で覚えるリスト構造を作成せよ。また、この中から真夏日(最高気温が30℃以上)でかつ熱帯夜(最低気温が25℃以上)の日のリストを抽出し表示するプログラムを作成せよ。(参考2022年前期期末)
- ホスト名と、IPアドレス(0~255までの8bitの値✕4個で与えるものとする)のデータ構造で、
- “www.fukui-nct.ac.jp”,104,215,54,205
- “perrine.tsaitoh.net”,192,168,11,2
- “dns.fukui-nct.ac.jp”,10,10,21,51
- “dns.google.com”,8,8,8,8
の様に与えられる。このデータ構造をリスト構造で覚えるプログラムを作成せよ。また、この中からプライベートアドレスのリストを抽出し表示するプログラムを作成せよ。プライベートアドレスは 10.x.x.x, 172.16~31.x.x,192.168.x.x とする。(参考2019年前期期末)
プログラムを作るにあたり、リスト構造には add( 与えられたデータ… ) のように呼び出してリストに追加すること。この時、生成されるリストが、登録の逆順になるか(先頭に挿入)、登録順(末尾に追加)になるかは、自分の理解度に応じて選択すること。抽出する処理を書く場合も登録順序どおりにするかは自分の理解度に応じて選べばよい。
また、理解度に自信がある人は、add() などの処理を「オブジェクト指向」のように記述する方法を検討すること。
あくまで、リスト構造の理解を目的とするため、ArrayList<型> , LinkedList<型> のようなクラスは使わないこと。(ただし考察にて記述性の対比の対象として使うのはOK。複素数の場合の LinkedList を使った例を以下に示す。)
import java.util.* ;
import java.util.stream.Collectors ;
class Complex {
double re ;
double im ;
Complex( double r , double i ) {
this.re = r ;
this.im = i ;
}
public double abs() {
return Math.sqrt( re * re + im * im ) ;
}
@Override
public String toString() {
return "(" + re + ")+j(" + im + ")" ;
}
} ;
public class Main {
public static LinkedList<Complex> top = new LinkedList<Complex>() ;
// 絶対値が指定した値以下の要素だけを集める関数
public static LinkedList<Complex> filter_lessthan(
LinkedList<Complex> list , double v_abs ) {
var ans = new LinkedList() ;
for( var c : list ) {
if ( Math.sqrt( c.re * c.re + c.im * c.im ) <= v_abs )
ans.add( c ) ;
}
return ans ;
}
public static void main( String[] args ) throws Exception {
// リストに複素数を追加
top.add( new Complex( 1.0 , 2.0 ) ) ;
top.add( new Complex( -1.0 , -1.0 ) ) ;
top.add( new Complex( 2.0 , -1.0 ) ) ;
top.add( new Complex( 1.0 , 0 ) ) ;
for( var c : top ) {
System.out.println( c ) ;
}
System.out.println( "---" ) ;
// static な関数でフィルタリング
for( var c : filter_lessthan( top , 2.0 ) ) {
System.out.println( c ) ;
}
/* Stream API を使ってフィルタリング
for( var c : top.stream() // LinkedList を Stream に変換
.filter( c->c.abs() < 2.0 ) // filter条件をラムダ式で渡す
.collect( Collectors.toList() ) // Collectorsで結果を集める
) {
System.out.println( c ) ;
}
*/
}
}
- LinkedListを使ったプログラム例(Paiza.io)