情報処理概論(第二日目)

Similar documents
演習2

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Microsoft PowerPoint - 講義10改.pptx

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

cp-7. 配列

PowerPoint プレゼンテーション

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

UNIX 初級講習会 (第一日目)

Microsoft Word - DF-Salford解説09.doc

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

Prog1_6th

プログラミング基礎

gengo1-8

PowerPoint Presentation

Microsoft Word - 3new.doc

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

基礎プログラミング2015

Microsoft PowerPoint - info1-8.ppt [互換モード]

PowerPoint Presentation

Microsoft PowerPoint - handout07.ppt [互換モード]

gengo1-12

Java プログラミング Ⅰ 11 回目多次元配列 2 次元配列 2 次元配列配列要素が直線上に並ぶ一次元配列に対して 平面上に並ぶ配列要素をもつ配列 直観的には 2 次元配列の準備配列変数の宣言は型と識別子を指定して次のように行う 型識別子 [ ][ ]; または 型 [ ][ ] 識別子 ; 配

スライド 1

演習1

※ ポイント ※

PowerPoint プレゼンテーション

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

2006年10月5日(木)実施

Microsoft PowerPoint - program.ppt [互換モード]

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

JavaプログラミングⅠ

JAVA入門

Microsoft Word - no204.docx

memo

ポインタ変数

Prog1_12th

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - prog04.ppt

データ構造

情報基礎A

演算増幅器

プログラミング実習I

gengo1-12

Microsoft PowerPoint - 11.pptx

第9回 配列(array)型の変数

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

演算増幅器

kiso2-09.key

Microsoft PowerPoint - C1(演算と変数).ppt

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

Microsoft Word - 資料 (テイラー級数と数値積分).docx

gengo1-12

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

pp2018-pp9base

memo

フローチャートの書き方

PowerPoint プレゼンテーション

フィルタとは

2

PowerPoint Presentation

PowerPoint プレゼンテーション

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

Microsoft Word - 資料 docx

Microsoft PowerPoint - prog06.ppt

プログラミングA

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft PowerPoint - 計算機言語 第7回.ppt

メソッドのまとめ

簡単な検索と整列(ソート)

Microsoft PowerPoint - 09.pptx

ガイダンス

スクールCOBOL2002

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

プログラミング基礎

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

. (.8.). t + t m ü(t + t) + c u(t + t) + k u(t + t) = f(t + t) () m ü f. () c u k u t + t u Taylor t 3 u(t + t) = u(t) + t! u(t) + ( t)! = u(t) + t u(

テキストファイルの入出力1

PowerPoint プレゼンテーション

Microsoft PowerPoint - KHPCSS pptx

Fortran90/95 2. (p 74) f g h x y z f x h x = f x + g x h y = f y + g y h z = f z + g z f x f y f y f h = f + g Fortran 1 3 a b c c(1) = a(1) + b(1) c(

情報処理Ⅰ

Microsoft PowerPoint - prog03.ppt

講習No.9

ファイル入出力

ポインタ変数

2

memo

GEC-Java

プレポスト【問題】

スクールCOBOL2002

プログラミング入門1

情報活用資料

Microsoft Word - Cプログラミング演習(9)

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

Transcription:

情報処理概論 工学部物質科学工学科応用化学コース機能物質化学クラス 第 8 回 2005 年 6 月 9 日

前回の演習の解答例 多項式の計算 ( 前半 ): program poly implicit none integer, parameter :: number = 5 real(8), dimension(0:number) :: a real(8) :: x, total integer :: i do i = 0, number write(*, *) 'a(', i,') = ' read(*, *) a(i) write(*, *) 'x = ' read(*, *) x

前回の演習の解答例 多項式の計算 ( 後半 ): total = a(0) do i = 1, number total = total + a(i) * x**i write(*, *) 'total = ', total stop end program 演算回数 ( 乗算 )= 演算回数 ( 足し算 ) number i i= 1 = number( number + 1) = 2 number number = 5 の時 : 乗算 15 回和算 5 回

前回の演習の解答例 多項式の計算 ( 後半 ) 計算量を削減 : a 0 + a 1 x + a 2 x 2 + a 3 x 3 + a 4 x 4 + a 5 x 5 ((((a 5 x + a 4 )x + a 3 )x + a 2 )x + a 1 )x + a 0 total = a(number) do i = number - 1, 0, -1 total = total * x + a(i) write(*, *) 'total = ', total stop end program 演算回数 ( 乗算 ) = number 演算回数 ( 足し算 ) = number number = 5 の時 : 乗算 5 回和算 5 回

多次元配列の利用例 実行時に大きさの決まる配列 ファイルからのデータ入力 ファイルへのデータ出力

配列の次元 1 次元配列 integer, dimension(5) :: a a(1) = 1 2 次元配列 real(8), dimension(3, 0:4) :: b b(3, 2) = 1.0D0d 3 次元配列 real(8), dimension(0:4, 8, 3) :: c c(4, 8, 2) = 2.0D0 4 次元配列 real(8), dimension(100, 50, 50, 3) :: d d(i, j, k, l) = d(i, j, k, l) + 1.0D0

2 次元配列の利用例 英語, 数学, 国語の 3 教科の点数を人数分入力し, 合計点の総平均を求める 人数を 5 人固定とし, 点数をキーボードから入力 %./ave No. 1 Kamoku 1: 30 Kamoku 2: 60 Kamoku 3: 40... No. 5 Kamoku 1: 90 Kamoku 2: 85 Kamoku 3: 95

プログラム例 1 (1/2) program score1 implicit none integer, parameter :: number = 5 integer, parameter :: kamoku = 3 integer :: i, j, total integer,dimension(number, kamoku) :: score real(8) :: ave intrinsic dble! Input score data from keyboard do j = 1, number write(*, *) 'No.',j do i = 1, kamoku write(*, *) 'Kamoku ', i, ':' read(*, *) score(j, i)

プログラム例 1 (2/2)! Calculate total and average total = 0 do i = 1, kamoku do j = 1, number total = total + score(j, i) ave = dble(total) / dble(number*kamoku) write(*, *) 'Average = ', ave stop end program

計算機内部の配列の姿と アクセス速度 多次元配列は一番左の添え字が先に増えるように記憶される プログラムでの表記 real(8), dimension(3, 3) :: b...... a(1,1) a(2,1) a(3,1) a(1,2) a(2,2) a3,2) a(1,3) 計算機内部 ( メモリ ) 計算機は連続したデータを高速にアクセスするようにできている. アクセスの順番が重要

多次元配列の推奨参照順序 できるだけ一番左の添え字に沿って参照するように繰り返しを構成する. 良い例 悪い例 do j = 1, number do i = 1, kamoku total = total + score(j, i) do i = 1, kamoku do j = 1, number total = total + score(j, i)

多次元配列の利用例 実行時に大きさの決まる配列 ファイルからのデータ入力 ファイルへのデータ出力

実行時に大きさが決まる配列 同じプログラムで 10 人分のデータや 100 人分のデータを扱いたい 方法 1: 毎回 emacs でプログラムを修正し, f90 で翻訳して実行ファイルを作成 program poly 人数が変わるたびに変更 implicit none integer, parameter :: number = 5 integer, parameter :: kamoku = 3 integer :: i, j, total integer,dimension(number, kamoku) :: score 面倒 方法 2: 実行時に配列の大きさを指定 入力データを書き換えるだけでよい.

プログラム例 2 (1/2) program score2 implicit none integer, parameter :: kamoku = 3 integer :: i, j, total, number integer, dimension(:,:), allocatable :: score real(8) :: ave intrinsic dble 大きさがまだ決まってない配列を宣言! Input number from keyboard write(*, *) 'Number: ' read(*, *) number! Set size of array A allocate(score(number, kamoku)) まだ大きさ ( 範囲 ) を指定しない 大きさ ( 範囲 ) の指定

プログラム例 2 (2/2)! Input score data from keyboard do j = 1, number write(*, *) 'No.',j do i = 1, kamoku write(*, *) 'Kamoku ', i, ':' read(*, *) score(j, i)! Calculate total and average total = 0 do i = 1, kamoku do j = 1, number total = total + score(j, i) ave = dble(total) / dble(number*kamoku) write(*, *) 'Average = ', ave stop end program

実行時に大きさが決まる配列 利用法 : 宣言して大きさを指定する 宣言型, dimension(:), allocatable :: 配列変数名 範囲は次元一つにつき : を一つ記述例 ) 2 次元の場合 (:, :) 大きさ ( 範囲 ) の指定 allocate( 配列変数 ( 範囲 )) 配列変数 : allocatable 付きで宣言した配列 範囲の指定方法は配列を宣言するときと同様 配列を利用する前に指定する

多次元配列の利用例 実行時に大きさの決まる配列 ファイルからのデータ入力 ファイルへのデータ出力

キーボードからの入力 大量のデータを入力する場合非効率 人間が打つので間違える可能性大間違えた場合の修正も困難 速度も遅い 何度も実行するプログラムで毎回データを入力するのは無駄 %./ave Number: 10 No. 1 Kamoku 1: 30 Kamoku 2: 60 Kamoku 3: 40... No. 10 Kamoku 1: 90 Kamoku 2: 85 Kamoku 3: 95 Average = 65.3

ファイルからの入力 ファイルに記述されたデータをプログラムの入力データとして利用 一度入力すれば何度でも利用できる 様々なデータを利用できる インターネットからダウンロードしたファイル メールに添付されたファイル スキャナや実験装置から得られたデータ 使い慣れたエディタを利用できるのでデータの修正も楽 10 30 60 40 %./ave... Average =... 90 85 95 入力データが記述されたファイル

ファイルから入力する方法 方法 1: UNIX の リダイレクション 機能を利用 キーボードから直接データを入力するプログラムをそのまま利用できる 実行時に選択可能 データの数が少ない場合に利用 方法 2: Fortran のファイル操作命令を利用 必ずファイルからデータを入力 データの数が多い場合に利用

方法 1: UNIX の リダイレクション 機能を用いたデータ入力 コマンドを実行する際キーボードからの入力の代わりにファイルに記述したデータを入力する 利用法 : 実行コマンド < 入力データのファイル 例 ) %./ave < score.dat 10 30 60 40... 90 85 95 score.dat (Emacs 等で別途作成 )

リダイレクション利用時の画面表示 入力データ以外は全て表示される. Kamoku1: のような表示も残る %./ave < score.dat Number: No. 1 Kamoku 1:... Kamoku 3: Average = 65.3 %

方法 2: Fortran のファイル操作命令を用いたデータ入力 プログラムの中で ファイルを開いて (open) データを読んで (read) ファイルを閉じる (close)

プログラム例 3 (1/2) program score3 implicit none integer, parameter :: kamoku = 3 integer :: i, j, total, number integer, dimension(:,:), allocatable :: score real(8) :: ave intrinsic dble open(10, file="score.dat") score.dat という名前のファイルを開いてファイル番号 10 を割り当てる! Read number from data file read(10, *) number ファイル番号 10 からデータ入力 allocate(score(number, kamoku) )

プログラム例 3 (2/2) do j = 1, number read(10, *) score(j, 1:kamoku) close(10) ファイル番号 10 を閉じる ファイル番号 10 からデータ入力 ( 一人分ずつ ) total = 0 do i = 1, kamoku do j = 1, number total = total + score(j, i) ave = dble(total) / dble(number*kamoku) write(*, *) 'Average = ', ave stop end program

ファイルを開く : open ファイルにアクセスするための番号を付ける 利用法 open( 番号, file = " ファイル名 ") 番号 : 正の整数. 慣習的に 10 以上の番号を付けることが多い ファイル名 : 別のディレクトリにあるときは場所も書く

ファイルを閉じる : close ファイルへのアクセス終了 利用法 close( 番号 ) 番号 : open で開いたファイルの番号

ファイルからデータを読む : read 利用法 read( 番号, 書式 ) データを格納する変数 番号 : ファイルの番号を指定 * を指定するとキーボードから入力 書式 : 今まで read や write で指定したものと同じ * を指定すると書式指定無し ( おまかせ )

read による配列データの入力 方法 A: 1 要素ずつ入力 do j = 1, number do i = 1, kamoku read(10, *) score(j, i) 方法 B: まとめて入力 do j = 1, number read(10, *) score(j, 1:kamoku)

データを読み込む場合の注意 1 行分のデータを 1 回の read 文で全て読み込む 1 回の read で 1 行文のデータがプログラムに取り込まれるので, 全て格納しないと読み落としが発生する. 例 ) 以下のデータを読み込み 10 20 30 40 50 60 方法 A(1 要素ずつ ) では読み落としが発生 do i = 1, 2 do j = 1, 3 read(10, *) score(i, j) 方法 B(1 行ずつ ) で読み込む do i = 1, 2 read(10, *) score(i, 1:3) score(1,1) に 1 行目 score(1,2) に 2 行目 score(1,3) 以降に入力するデータが不足

score.dat の例 do j = 1, number read(10, *) score(j, 1:kamoku) 方法 B で入力するので, 一行に一人分のデータを全て記述しておく 5 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 number ( 人数 ) 1 人目の点数 2 人目の点数 3 人目の点数 4 人目の点数 5 人目の点数 プログラム実行前に用意 (Emacs 等で作成 )

多次元配列の利用例 実行時に大きさの決まる配列 ファイルからのデータ入力 ファイルへのデータ出力

出力データ 画面に表示されたデータは ( 原則として ) 保存されない. ログアウトすると消えてしまう. 保存したいデータは画面ではなくファイルに出力 画面に収まりきれない量のデータ 他のプログラムで利用したいデータ 成果として公表したいデータ etc. 入力と同様,2 通りの方法 方法 1: UNIX のリダイレクション機能を利用 方法 2: Fortran のファイル操作命令を利用

方法 1: UNIX の リダイレクション 機能を用いたデータ出力 コマンドを実行する際画面に出力する代わりにファイルにデータを格納する 利用法 : 実行コマンド > 出力ファイル 例 ) %./ave > score.out 例 ) 入出力の組み合わせ %./ave < score.dat > score.out

方法 2: Fortran のファイル操作命令を利用したデータ出力 プログラムの中で ファイルを開き (open) データを書いて (write) ファイルを閉じる (close) open と close は入力のときと同じ 通常 read するファイルと write するファイルは別なので, それぞれ open, close を行う. 注意 : 同時に同じ番号でファイルを開くことは不可

ファイルにデータを書き出す 利用法 write( 番号, 書式 ) 出力データ 番号 : ファイルの番号を指定する * を指定すると画面に出力 書式 : 今まで read や write で指定したものと同じ * を指定すると書式指定無し ( おまかせ )

プログラム例 4 (1/2) program score3 implicit none integer, parameter :: kamoku = 3 integer :: i, j, total, number integer, dimension(:,:), allocatable :: score real(8) :: ave intrinsic dble open(10, file="score.dat")! Read number from data file read(10, *) number allocate(score(number, kamoku) )

プログラム例 4 (2/2) do j = 1, number read(10, *) score(j, 1:kamoku) close(10) total = 0 do i = 1, kamoku do j = 1, number total = total + score(j, i) ave = dble(total) / dble(number*kamoku) open(11, file = "score.out") write(*, *) 'Average = ', ave close(11) stop end program

演習 1 1. 次のプログラムを入力し, コンパイル program ex1 implicit none integer, parameter :: number = 5 integer :: i, total integer,dimension(number) :: score intrinsic dble total = 0 do i = 1, number read(*, *) score(i) total = total + score(i) write(*, *) 'Average = ', dble(total)/dble(number) stop end program

演習 1 2. 次のファイルを作成する (emacs コマンド ) 3. 実行 98 23 17 100 45 ファイル名は任意. 例えば test.dat % emacs test.dat a) キーボードから点数を直接入力 b) 2. で作成したデータファイル test.dat をリダイレクション機能を用いて入力

演習 2: 2 次元配列を用いたプログラム 学生の人数と各学生の 3 教科分の点数を入力すると, 各教科の平均とすべての平均を表示する データはファイルから入力する 入力データ例 5 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 実行例 %./ave3 Average=80.00 Kamoku 1. 70.00 Kamoku 2. 80.00 Kamoku 3. 90.00 %

演習 2: ヒント 講義で紹介したプログラム例 3 またはプログラム例 4 を参考にする 点数の総和の他に各科目の合計点も必要科目 1 2 3 1 生 2 徒 3 点数の総和 number 各科目の合計点

補足 : 複数の配列要素に対する参照, 代入 Fortran90 では配列の複数の要素に対する値の代入や参照, 計算を簡単に記述できる 省略形 が利用できる 例えば配列 a の全要素に 0.0D0 を代入する場合 do 文等で繰り返して参照, 代入してもよいが省略することも出来る do 文を利用 省略形 do i = 1, n do j = 1, n a(j, i) = 0.0D0 a = 0.0D0

配列全体に対する代入の省略形 全部に同じ値を代入 a = 0.0D0 一次元配列の場合 : 各要素に任意の値を代入 a = (/1.0D0, 0.2D0, -3.5D0, 0.0D0, 12.5D0/) 規則的な値を代入 省略形 a = (/ (2 * i, i = 1, 5) /) 以下の do 文と同じ意味 do i = 1, 5 a(i) = 2 * i

配列の一部に対する代入の省略形 2 列目の 5 行目から 10 行目の要素に 1.0D0 を代入 a(5:10,2) = 0.0D0 偶数の要素に, 1, 3, 5, 7, 9 と奇数を順に代入 a(2:n:2) = (/ (i, i = 1,n,2) /)

省略形の利用例 : 参照と代入 配列 a に配列 b をコピー ただし, a と b の要素数が同じ場合に限る a = b 配列 a に配列 b の各要素を 2 倍したものを格納 ただし, a と b の要素数が同じ場合に限る a = b * 2 配列 a の全要素の総和を計算 sum は intrinsic で予め宣言すること total = sum(a)

多次元配列の一括入力, 出力 多次元配列の値を一度に入力, 出力することもできる integer, dimension(5, 3) :: a read(10, *) a write(*, *) a この場合, 左の添え字から増える 順序で行われる 上の例では, 入出力の順番は以下の通り a(1,1) a(2,1) a(3,1) a(4,1) a(5,1) a(1,2) a(2,2) a(3,2)... 入力データは一行に一要素ずつ記述する 10 40 70... でも順番を間違えやすいので通常は do 文で順序を指定することが多い