Microsoft Word - CompA-Ex doc

Similar documents
JavaプログラミングⅠ

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

プログラミングA

Microsoft PowerPoint ppt

K227 Java 2

Prog1_15th

System.out.print 先段まで使用してきた上記 System/Math/String クラスは基本パッケージと呼ばれ,import 文の記述なしに提供されるクラス 2.2 BufferedReader クラスと例外処理 端末から文字列をプログラムに入力したい場合,java.io.Buff

メソッドのまとめ

JavaプログラミングⅠ

2

Microsoft PowerPoint - lec06 [互換モード]

JavaプログラミングⅠ

プログラミング入門1

オブジェクト指向プログラミング・同演習 5月21日演習課題

デジタル表現論・第6回

スライド 1

Microsoft Word - problem3.doc

JavaプログラミングⅠ

Prog2_9th

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

プログラミング入門1

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

2

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

Microsoft PowerPoint - prog03.ppt


Javaセキュアコーディングセミナー2013東京第1回 演習の解説


Microsoft Word - CombB-Ex

JavaプログラミングⅠ

Microsoft PowerPoint ppt

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

マークアップ言語

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

プログラミング入門1

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

kantan_C_1_iro3.indd

プログラミング入門1

プログラミング入門1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Prog1_13th

Microsoft PowerPoint - 11.pptx

Prog1_10th

Prog1_11th

PowerPoint Presentation

Prog2_10th

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

Java講座

マークアップ言語

文字列操作と正規表現

Javaによるアルゴリズムとデータ構造

PowerPoint プレゼンテーション

Microsoft Word - java a.doc

情報実習Ⅱ

r1.dvi

Microsoft Word - problem5.doc

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

JavaプログラミングⅠ

2

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

人工知能入門

JavaプログラミングⅠ

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

2

CプログラミングI

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

GEC-Java

JavaプログラミングⅠ

Prog1_6th

プログラミング基礎I(再)

デジタル表現論・第4回

プログラムの基本構成

問題1 以下に示すプログラムは、次の処理をするプログラムである

情報処理Ⅰ

JAVA入門

DVIOUT-exer

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

< F2D B838A835882CC8CF68EAE2E6A7464>

GEC-Java

リファレンス,配列 例外処理

Prog1_3rd

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

基礎計算機演習 実習課題No6

微分方程式 モデリングとシミュレーション

Javaプログラムの実行手順

メソッドのまとめ

Microsoft PowerPoint - prog04.ppt

Transcription:

コンパイラ演習参考資料 2008/09/23 担当 : 佐々木晃 算術式の処理と逆ポーランド記法 ( 第一回スライド 29 ページ ) (1) 実数値 (double の値 ) を格納するスタックを実装せよ ( 配列やリストを使うとよい ) (2) 逆ポーランド記法によって実数値の算術演算を行う計算機のプログラムを作成せよ 演算子や被演算子の各要素同士は空白で区切られるものとする (a) 四則演算のみなお 実行結果は 次の例と自分の作成した例で示せ (1) 4.0 3.0 - (2) 5.0 4.0 3.0 - * (3) 5.0 4.0 3.0 * - (4) 4.0 3.0-5.0 6.0 + * (b) 三角関数なども使えるようにしてみよ ( 余力のある人 ) "2.0 pi sin" は sin(2.0*π) ( 答えは 0 ( 実際は丸め誤差が生ずる )), pi sin はそれぞれ単項のオペレータ ( スタックトップに対して演算を行う演算子 ) 2.0 pi は 2.0 をスタックに積む スタックトップの 2.0 とπを掛けた結果をスタックのトップとする (2.0 2.0 * pi sin は [2.0, 2.0] [4.0] [4.0π] [0] java.lang.math ライブラリなどを利用すればよい (3) 第 1 回スライドp29にある方法 ( この資料の最後でも説明している ) を用いて 中置記法による算術式 ( 四則演算を行う ) を逆ポーランド記法へ変換するプログラムを作成せよ ただしオペランド ( 被演算子数 ) は任意の文字列とし 演算子 被演算子 括弧は空白で区切られるものとする ( 問題 4と同様 ) なお 実行結果は 次の例と自分の作成した例で示せ (0) aa + bb (1) aa + bb * cc (2) ( aa + bb ) * cc (3) d - e * ( f + g ) - h (4) n - (o + p * q ) * r

後置記法に変換するアルゴリズム (1 回目講義スライド p29 をまとめたもの ) 初期設定 : スタックに '$' を積む 以下の I,II を繰り返す : I. 次の入力記号 ( トークン )ai を読む 読み込むトークンがない場合は ai='$' とする (1) II. ai で場合分けの処理を行う (a) ai がオペランドの場合 そのまま表示する (2) (b) ai が '(' の場合 それをスタックに積む (3) (c) ai が ')' の場合 最初の '(' が現れるまでスタックの内容を順番に降ろす (4) その際 降ろした内容がオペレータ ( 演算子 ) であった場合はそれを表示する (d) ai が '$' の場合 '$' が現れるまでスタックの内容を順番に降ろし処理を終了 その際 降ろした内容がオペレータ ( 演算子 ) であった場合はそれを表示する (5) (e) それ以外 ( つまり ai がオペレータ ( 演算子 ) の場合 ( ) の処理を行う (6) ( ) 以下の (a)(b) を行う (a) b がオペレータで かつ prec(b) >= prec(ai) である間以下を繰り返す 1. スタックトップ ( つまり b) を降ろす 2. bを表示する (b) bがオペレータでない場合 あるいは prec(b)< prec(ai) となった場合 ( すなわち (a) が成り立たなくなった場合 ))ai をスタックに乗せる ここで b はスタックトップの内容 prec(x) を演算子順位の値を返す関数であるとする prec('+') = 1, prec('-') = 1, prec('*') = 2, prec('/') = 2 プログラム作成までのステップ : (0) アルゴリズムを理解する 例えば以下の式をアルゴリズムに沿って紙に書いて処理を追ってみる a + b * c オペランド ( 被演算子 ) やオペレータ ( 演算子 ) がどのようにスタックに積まれるか 演算子の優先順位はどのように処理されるか? ( a + b ) * c 括弧がある場合はどのように処理されるか? (1) 擬似コードにする alltokens = alltokens + "$"; push( $ ); while(true){ ai = 次のトークンを読む ();

if(aiがオペランド ) ai を表示 ; else if (ai == '(') /* (2) の処理 */ push(ai); else if (ai == ')') /* (3) の処理 */ do { c = pop(); if (cがオペランド) cを表示 ; while(cが '(')); else if... ( ) の処理部分の擬似コード while(true){ b = peek(); // スタックトップの内容を ( おろさずに ) 調べる関数 if(b がオペレータかつ prec(b) >= prec(ai)) pop(); bを表示 ; else break; push(ai); (2) プログラムを書く 試すときは いきなり長い式を処理しようとしない 単純な式から それが動くことを確認して だんだん複雑な式を試す a a+b a+b+c a+b*c a*b+c (a+b) (a+b)*c まずは 問題を簡単にして括弧のない式だけが読めるプログラムを目標にして作っても良い その動きを確認したら 括弧を使えるものに拡張する うまく動かない場合は まず 必要となる小さな部品が想定どおりに動作するかを確かめる 今回の場合は 大きく分けて以下の部品があるので それらがきちんと動くかを確かめる o スタックの処理 (push, pop, peek) の部分の理解 o 単語の読み込み ( トークンの切り出し ) の部分 o メインルーチンやサブルーチン

練習問題スタックの実装 (= 問題 (1)) ( ヒント 配列を利用する場合は 下記のようにする isempty(), pop(), peek(), push(double d) の中身を埋めよ 次の言葉が分からない人は java の復習をすること - 配列 - コンストラクタ - メソッド 引数 返り値 ) public class MyStack { static final int NUM_CONTENTS = 100; // 最大値は100 double [] contents; private int index = -1; public MyStack() { // コンストラクタ contents = new double[num_contents]; boolean isempty(){ // スタックの中身が空かどうかを返すメソッド double pop(){ // スタックの先頭 ( トップ ) から要素をおろす 返り値はおろした値 double peek(){ // スタックの先頭 ( トップ ) の内容を返す void push(double d){ // 引数 d で与えられた double 値をスタックに積む public static void main(string[] args) { // テストプログラム MyStack st = new MyStack(); st.push(12.34); st.push(45.68);

System.out.println("st.pop() = " + st.pop()); System.out.println("st.peek() = " + st.peek()); st.pop(); System.out.println("st.isEmpty() = " + st.isempty()); st.pop(); // エラー 練習問題 (= 問題 (2) (3) への準備 ) java.util.stack クラスを利用して スタックの動きを確かめよ 下記は例 import java.util.stack; public class StackTest { public static void main(string[] args) { System.out.println("String Stack test ----"); Stack<String> st = new Stack<String>(); st.push("abc"); st.push("def"); st.pop(); System.out.println("st.peek() = " + st.peek()); System.out.println("Double Stack test ----"); Stack<Double> dst = new Stack<Double>(); dst.push(123.0); dst.push(987.456); dst.push(double.parsedouble("123.4567")); System.out.println("dst = " + dst); System.out.println("dst.pop() = " + dst.pop()); 練習問題 (= 資料問題 (2)) 逆ポーランドの計算機を作成せよ

(1) まず 入力した式を空白に区切る実験 import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class CalcPostfixPre { public static void main(string[] args) { BufferedReader r= new BufferedReader(new InputStreamReader(System.in)); String line = ""; try { line = r.readline(); catch (IOException e) { e.printstacktrace(); System.exit(0); String [] alltokens = line.split(" "); // 空白で区切る for(string token : alltokens){ // for each System.out.println("token = " + token); (2) スタックを使って処理を行う ((1) への修正 他の演算子の部分を作る ) String [] alltokens = line.split(" "); Stack<Double> st = new Stack<Double>(); // 先の MyStack を使ってもよい for(string token : alltokens){ System.out.println("token = " + token); if ("+".equals(token)) { double y = st.pop(); double x = st.pop(); st.push(x + y); else if("-".equals(token)){... else if...// 他の演算子の場合を書く else {// オペランドの場合 st.push(double.parsedouble(token));