目次

Similar documents
ファイル入出力

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

ファイル入出力

02: 変数と標準入出力

PowerPoint Presentation

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog04.ppt

C言語講座 ~ファイル入出力編~

02: 変数と標準入出力

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

Microsoft Word - no15.docx

演算増幅器

Taro-ファイル処理(公開版).jtd

Microsoft Word - no204.docx

情報処理演習 B8クラス

C言語入門

Prog1_12th

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

2006年10月5日(木)実施

Microsoft PowerPoint - kougi6.ppt

プログラミング基礎

slide4.pptx

計算機プログラミング

gengo1-12

PowerPoint プレゼンテーション

gengo1-12

Microsoft Word - 3new.doc

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

PowerPoint Presentation

プログラミング基礎

ゲームエンジンの構成要素

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - kougi8.ppt

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft PowerPoint - lec10.ppt

プログラミング基礎

ポインタ変数

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

gengo1-12

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

※ ポイント ※

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

PowerPoint Presentation

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

以上

02: 変数と標準入出力

Microsoft Word - 06

ポインタ変数

プログラミング実習I

Microsoft PowerPoint - prog06.ppt

ファイルシステム

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

Microsoft PowerPoint - class04.ppt

ポインタ変数

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

cp-7. 配列

目次

PowerPoint プレゼンテーション

V

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

Microsoft PowerPoint pptx

プログラミング実習I

Microsoft PowerPoint - kougi2.ppt

Prog1_6th

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

スライド タイトルなし

memo

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - no103.docx

Microsoft PowerPoint - guidance.ppt

Original : Hello World! (0x0xbfab85e0) Copy : Hello World! (0x0x804a050) fgets mstrcpy malloc mstrcpy (main ) mstrcpy malloc free fgets stream 1 ( \n

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

PowerPoint プレゼンテーション

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

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

kiso2-09.key

プログラミングI 第2回 数理物理,総合理学等向け

3. 標準入出力

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

slide5.pptx

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

第2回講義:まとめ

練習&演習問題

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

プログラミングI第10回

講習No.9

Microsoft PowerPoint - kougi4.ppt

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Cプログラミング1(再) 第2回

演算増幅器

プログラミングA

プログラミング基礎

Microsoft Word - no11.docx

プログラミング基礎

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

PowerPoint プレゼンテーション

初歩のC言語ターミナル_2014_May.pages

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

Transcription:

プログラミング I 第数理物理, 総合理学等向け 2018 年 11 月 24 日土 海谷治彦 1

目次 ファイルとは何か? プログラムからファイルを扱うには? ファイルの読み込み ファイルの書き込み ファイルの削除, 名称変更 2

電源を切ってもデータが残ってる! コンピュータの電源を切って再起動しても, データは残っている. ワードの文書,MP3 ファイル, 画像ファイル, プログラムファイル これは, コンピュータの中でデータを保管してくれているからである. データを保管する単位をファイルと呼び, 保管庫をファイルシステムと呼ぶ. ファイルシステムはOSの一部であることが多い. ファイルシステムでは, 特定のファイル群をまとめて保管する機能がある. このまとめる部分をフォルダやディレクトリと呼ぶ. 3

オペレーティングシステム Operating System (OS) Windows 10, 8, 7, XP... UNIX Linux OS X (MacOS) Android ios... 興味がある人は 2 年前期に オペレーティングシステム の授業あります. 4

フォルダもしくはディレクトリ 下記は windows におけるユーザー kaiya の標準的なダウンロードファイルが置かれるフォルダ. 多くの OS では, このような階層構造を用いてファイルを整理して保存している. 5

ほとんど全てのデータはファイル 広く使われる OS(Windows 等 ) では, ほとんど全てのデータはファイルという単位で保管されている. 例えば, MS ワードの文書 MP3 の音楽 MP4 の動画 C のプログラム 実行可能プログラム (cc.exe や MS ワード自体 ) HTML ファイル 例えば, マイクロソフトワードは上記のファイルである. 6

プログラムから見たファイル 自作のプログラムからは, ファイルは単なるデータの配列に見える. 配列のサイズはデータのバイト数に相当する. 配列なので, 添え字に相当する値を用いて, ファイル内の任意の位置のデータを取り出すこともできる. ランダムアクセス (Random Access) と呼ばれる. しかし, ファイルの先頭から順番にデータを取り出し, プログラム中でデータを利用するのが最も一般的な方法である. 順次アクセス (Sequential Access) もしくはストーリム (Stream) と呼ばれる方法. キーボード入力や画面出力と同様に, ファイルを取り扱おうとする考え方に由来する. 7

ストリームのイメージ 1/3 自分のプログラム ファイル ( の中身 ) オペレーティングシステムはコンピュータの基本のプログラムであり アプリケーションを動かすため及びコンピュータを操作するために必須のものである 本授業では まず外側から見たオペレーティングシステム すなわちその役割および利用者に提供する機能について述べる 8

ストリームのイメージ 2/3 自分のプログラム ファイル ( の中身 ) オペレーティングシステムはコンピュータの基本のプログラムであり アプリケーションを動かすため及びコンピュータを操作するために必須のものである 本授業では まず外側から見たオペレーティングシステム すなわちその役割および利用者に提供する機能について述べる 9

ストリームのイメージ 3/3 自分のプログラム ファイル ( の中身 ) オペレーティングシステムはコンピュータの基本のプログラムであり アプリケーションを動かすため及びコンピュータを操作するために必須のものである 本授業では まず外側から見たオペレーティングシステム すなわちその役割および利用者に提供する機能について述べる 10

Fig 12-3 11

ファイルを読むための関数群 fopen 前図で円柱で示したデータが通る道を作る関数. データが通る道 = ストリーム 読み, 書き, 新規ファイル作成共通で使われる. fgetc, fgets, fscanf ストリームからデータを読み出す関数群. それぞれ, 一文字, 一行, 書式にあった形式を読み出す. 読み込めると, 読み込み位置 ( 前図での赤い矢印 ) は読んだ分だけ先に進む. fclose データが通る道 ( ストリーム ) を撤去する関数. プログラムからファイルが必要なくなったら必ず撤去しよう. 12

fopen の詳細 FILE *fopen(const char *path, const char *mode); 返り値 データを取得するための道 ( 前図の円柱 ) の端へのポインタが帰ってくる. 失敗すると NULL が返る. 引数 path ファイル名を指定. 必要ならフォルダ名を含めたファイル名 左上の例なら C: Users kaiya Downloads t2.pdf を指定. 引数 mode 読み込みのみ "r" か, 読み書き両方 "rw" か等を指定. 13

fgetc, fgets, fscanf int fgetc(file *stream); 一文字毎にデータをとってくる. char *fgets(char *s, int size, FILE *stream); 基本,s で指定された文字配列にストリームから一行分の文字列を読み出す. 改行文字も s に読み込む. もし, 一行が size を超えた場合,size までしか読まない. int fscanf(file *stream, const char *format,...); scanf のストリーム版. 14

サンプル List 12-1 // 抜粋 list12-1.c // ファイルの中身を画面に表示 char filename[filename_max]; FILE *fp; int c; printf("filename? "); scanf("%s", filename); if((fp=fopen(filename, "r"))==null){ printf("no such a file: %s n", filename); return -1; while((c=fgetc(fp))!=eof){ putchar(c); fclose(fp); 15

ファイルを書き込むの関数群 fopen 前図で円柱で示したデータが通る道を作る関数. 読み, 書き, 新規ファイル作成共通で使われる. モードは "w" で開く. fputc, fputs, fprintf ファイルにデータを書き込む関数群. それぞれ, 一文字, 一行, 書式にあった形式を読み出す. 書き込めると, 書き込み位置 ( 前図での赤い矢印 ) は書いた分だけ先に進む. fclose データが通る道を撤去する関数. プログラムからファイルが必要なくなったら必ず撤去しよう. 16

fputc, fputs, fprintf int fputc(int c, FILE *stream); 一文字書き込み int fputs(const char *s, FILE *stream); 一行, 書き込み s に改行文字が含まれれば, それを書き込む. int fprintf(file *stream, const char *format,...); 使い方は printf に同じ. 書式が決まったデータを書き出すのに便利. 17

// 抜粋 list12-2.c ファイルのコピー char filename[filename_max]; FILE *fp1, *fp2; int c; 書き込み例 List 12-2 printf("input Filename? "); scanf("%s", filename); if((fp1=fopen(filename, "r"))==null){ printf("no such a file: %s n", filename); return 1; printf("output Filename? "); scanf("%s", filename); if((fp2=fopen(filename, "w"))==null){ printf("cannot create the file: %s n", filename); return 1; while((c=fgetc(fp1))!=eof){ fputc(c, fp2); fclose(fp1); fclose(fp2); 18

ファイル削除, 名前変更 int remove(const char *pathname); ANSI での一般的なファイル削除関数 int unlink(const char *pathname); POSIX 準拠の OS( ほとんどの OS) で remove に同じ. int rename(const char *oldpath, const char *newpath); 名前の変更. それぞれ成功すると返り値 0 か返る. 19

代入文の値利用 とても誤りが発生しやすい 20

代入文自体の値 変数には値が記録されている. 記録されている値は参照して利用できる. たとえば printf 文 printf("%d n", d) たとえば代入文の右辺値 x=y+1 実は代入文自体にも値があり, 参照できる. 値は代入後の値. 例 x=(y=y+1)*3; 上記の意味は, yの値を一つ増やす 一つ増えたyの値を三倍したものをxとする. x++ と ++x の違い 両方とも x=x+1 の略. ただし, 代入文の値として, x++ 一つ増やす前のxの値 ++x 一つ増やした後の値となる. 21

// valassert1.c #include <stdio.h> 例題群 // valassert2.c #include <stdio.h> int main(void){ int x, y; x=3; y=5; printf("%d %d n", x, y); // 以下の式で二個の代入を実行 x=(y=y+1)*3; printf("%d %d n", x, y); return 0; int main(void){ int x, y, z; x=3; y=5; z=3; printf("%d %d %d n", x, y, z); // 以下の式で二個の代入を実行 x=(y++)*3; // ++ する前の値を利用 printf("%d %d %d n", x, y, z); z=(++y)*3; // ++ した後の値を利用 printf("%d %d %d n", x, y, z); return 0; 22

代入文自体の値利用はお勧めしない 前頁の例のように, 代入文自体の値を使うと, 式がかなり複雑になる. これは, プログラム誤りの根源となるので, 相当, 慣れていない限り利用しないほうがよい. 23

参考 : 代入文の値を使った while #include <stdio.h> int main(void){ int i, n=10; i=0; while((i++)<n){ // 条件判断では i だが, // ブロック内では +1 され済 printf("%d n", i); return 0; // nwhile1.c #include <stdio.h> int main(void){ int i, n=10; i=0; while(i<n){ i++; printf("%d n", i); return 0; // nwhile2.c 24

List 7-2 // List 7-2 p. 155 // コレも単に代入文の値を使っている // 結果として c=getchar() を二回書かなくてよくなった #include <stdio.h> int main(void){ int c; while((c=getchar())!='.'){ printf("'%c' n", c); return 0; // l7-2.c // 参考 List 7-1 #include <stdio.h> int main(void){ int c; c=getchar(); while( c!='.' ){ printf("'%c' n", c); c=getchar(); return 0; // l7-1.c 25

switch 文 26

switch 文の必然性 if 文はかなり柔軟に条件を設定し, 実行する命令を取捨選択できる. しかし, 単純にいくつかの選択肢から一つ選択する等を if 文で書くと若干煩雑になる. 例えば変数に入っている曜日 ( を表す値 ) によって, 実行命令を変更する等.( 曜日の選択 ) switch 文はこのような選択肢からの選択を直感的に記述することができる. 27

一般形と例 switch ( 式 ) { case 定数 1: 命令文群 1; break; case 定数 2: 命令文群 2; break; case 定数 3: // 以下, 同様 default: 命令群 ; break; scanf("%d", &v); switch (v) { // 値 v について case 1: // v が 1 だったら printf("january n"); // 一月 break; case 2: // v が 2 だったら printf("february n"); // 二月 break; default: // v が上記以外だったら printf("march or later n"); break; // switchmonth.c 省略された場合の選択 を意味します. ( 債務不履行ではありません ) 28

switch 文の命令実行の流れ 教科書 p.109 より 29

switch 文の制限 switch 対象の式には, 文字列を含む配列や構造体の場合分けは行なえない. 場合 (case) には定数しかつかえない. 変数はだめ. 個人的には,if 文を使うほうをお勧めしたい. または, 構造体等を使い, 値と処理の対応表や, 連想配列を作り, ループで検索するほうをお勧めしたい. ただし, 関数へのポインタ等が高度な文法が必要になる場合もある. 30

if 文を使った同じ意味のプログラム // switchif.c switchmonth.c と意味は同じ #include <stdio.h> int main(void){ int v; scanf("%d", &v); if(v==1){ // v が 1 だったら printf("january n"); // 一月 else if(v==2){ // v が 2 だったら printf("february n"); // 二月 else{ printf("march or later n"); return 0; 31

条件演算子 if ( 条件 ) 処理 1 else 処理 2 が単純にかける. 条件? 処理 1: 処理 2 単に単純に書けるたけでなく, この書式全体が式の一部に使える. 単純な条件判断の関数を名前をつけず定義できる感じ. 普通の if else 文は, 文であって式でないので, 式の一部には使えない. 見た目はわかりにくいが, たまに超便利なことがある. 初心者にはあまりお勧めできないかも. 32

if 文同様の使い方 int main(void){ // ifstate.c 普通の書き方 int v; scanf("%d", &v); if(v%2==0){ // 偶数 even number printf("%d is even. n", v); else{ // 奇数 odd number printf("%d is odd. n", v); int main(void){ // ifexp.c 条件? 処理 1: 処理 2 の書き方 int v; scanf("%d", &v); v%2==0? // 偶数 even number printf("%d is even. n", v): printf("%d is odd. n", v); // あまりこの使い方はしない. 33

? : 全体を式として利用 // ifexploop.c 式 (expression) の if 文 // 条件? 式 : 式を式として使う. #include <stdio.h> これ全体が式として計算され, int main(void){ 結果が %s に入る. int i; for(i=0; i<10; i++){ printf("%d is %s. n", i, i%2==0? "even": "odd"); // if 文でかくとかなりめんどい. for(i=0; i<10; i++){ printf("%d is ", i); if(i%2==0){ printf("even. n"); else{ printf("odd. n"); 34

本日は以上 演習はありません 35