• Tidak ada hasil yang ditemukan

18 補足事項 ∼これまでに説明できなかったこと∼

N/A
N/A
Protected

Academic year: 2024

Membagikan "18 補足事項 ∼これまでに説明できなかったこと∼"

Copied!
8
0
0

Teks penuh

(1)

18 補足事項 〜これまでに説明できなかったこと〜

18–1 制御構造 〜繰返しからの脱出〜

while文・do〜while 文・for 文の繰返しのブロックの中から、終了条件に達していない段階で例外的に抜

け出したい、というような場合には、break 文や continue 文を用いる。 break文・continue文は、if文のブロッ クに対しては無効。

(1) break 文: 実行されると直ちに、最も内側のループから抜け出し、その直後に飛ぶ。

break 文は、多岐条件分岐の switch 文 でも用いられる。詳細後述。

...

{ /* ループここから */

...

break;

...

} /* ループここまで */

... /*** break でここ(ループの直後)に飛ぶ ***/

(2) continue 文: 実行されると直ちに、最も内側のループの先頭へ戻る。 continue 文の戻り先:

while 文では、条件式の評価へ

do〜while 文では、ループの最初の 実行式へ

for 文では、増分式の評価へ ... /*** continue でここ(ループの先頭)に戻る ***/

{ /* ループここから */

...

continue;

...

} /* ループここまで */

...

(2)

. break 文・continue 文による例外処理。 使用例としては、例えば、配列の中で条件 を満たす要素を端から探していって、見 付からなければ最後の要素まで見てやめ るが、途中で見付かったら直ちに抜け出 したい、というように、終了条件が複数 ある時に有効。

/* escape.c 2010-07-19 */

#include <stdio.h>

int main( int argc, char **argv ) {

int i;

for( i=0; i<10; i++ ) {

if( i == 5 ) {

break;

}

printf("%2d", i);

}

printf(" <--- break\n");

for( i=0; i<10; i++ ) {

if( i == 5 ) {

continue;

}

printf("%2d", i);

}

printf(" <--- continue\n");

return 0;

}

実行例 . break 文・continue 文の効果の違いに注目。

¨ ¥

§ ¦

0 1 2 3 4 <--- break

0 1 2 3 4 6 7 8 9 <--- continue

(3)

18–2 制御構造 〜多岐条件分岐〜

例えば、幾つか(3つ以上)の選択肢の中から一つ選んで入力を促し、その入力値によって場合分けをするよ うな場合、勿論 if 〜 elseの繰返しで書いても良いのだが、構造を正確に反映している気がしない。このよ うに或る式の値によって多岐に場合分けを行なう場合には、switch 文を用いて、より自然に記述することが 出来る。例で示そう。

. n は整数型とする。 この例では、n の値に従って、

1: A,B,C.

2: B,C.

3: D.

4: D.

5: E,F.

その他: F.

を実行して、次へ進む。

switch ( n ) { case 1:

文A;

case 2:

文B;

文C;

break;

case 3:

case 4:

文D;

break;

case 5:

文E;

default:

文F;

}

switch文は式(例ではn)の値を評価し、その値に等しい値のラベル(なければdefault)に飛ぶ。式は整数 型に限るが、int型でなくても良い。文字型charも整数型である。そこからbreak文に出会うか又は最後の } まで実行して、} の後に抜ける。基本的にはラベルは飛ぶ目印であるだけなので、break文がなければ、そ のまま次のラベルの後の文も実行してしまう。逆にこれを利用して、caseを連続して書くことにより、複数 の値に対して、実質的に同じ場所に飛ばすことが出来る。

(4)

. switch 文による多岐条件分岐。 このように並列に多岐分岐する場合に 適切。

break 文 を 忘 れ る と 、そ の ま ま 次 の printf() に突っ込んでしまうので注意。

/* arith3.c 2010-07-19 */

#include <stdio.h>

int main( int argc, char **argv ) {

int x, y;

char c;

printf("Input two integers combined by an arithmetic operator: ");

scanf("%d%c%d", &x, &c, &y);

switch( c ) { case ’+’:

printf("%d + %d = %d\n", x, y, x+y);

break;

case ’-’:

printf("%d - %d = %d\n", x, y, x-y);

break;

case ’*’:

printf("%d * %d = %d\n", x, y, x*y);

break;

case ’/’:

printf("%d / %d = %d\n", x, y, x/y);

break;

default:

printf("’%c’ is not valid.\n", c);

} }

実行例 . break 文と default ラベルの働きを確認のこと。

¨ ¥

§ ¦

=> ./arith3

Input two integers combined by an arithmetic operator: 7*11 7 * 11 = 77

=> ./arith3

Input two integers combined by an arithmetic operator: 7@11

’@’ is not valid.

=>

(5)

18–3 ファイル入出力

これまでのプログラムでの入出力は全て、標準入出力を介して行なっていた。その既定値は、標準入力の場 合は「キーボードからの入力」であり、標準出力の場合は「ディスプレイへの出力」である。しかし、大量の データを処理したい、データを再利用したい、などといった場合には、「ファイルからの入力」「ファイルへの 出力」を行なうことが望まれる。それには、シェルの入出力リダイレクション(<, >)を利用して、標準入出力

をファイルに変更するのがてっとり早く、標準入出力を介して入出力を行なう既存のプログラムをそのまま利 例えば、複数のファイルから交互にデー タを読みたい場合などは、入力リダイレ クションでは無理。

用できる利点もあるが、限界もある。

C言語にもファイル入出力の為の機構が標準で用意されている。その大まかな流れは次の通り。

(1) FILEへのポインタ変数を宣言する。

同時に利用するファイルの数だけFILE へのポインタ変数を宣言して用いる。 FILE 型は、ファイル入出力に必要な一連 のデータから成る構造体型で、stdio.h 内で定義されている。その構造体の中身 はシステムによって異なり得るが、とに かくこの型を使えばファイル入出力が出 来るように実装すべく定められている。

FILE *fp; /* ファイルポインタの宣言 */

ファイルへのアクセスは、全てこのポインタを介して行なう。

(2) ファイルを開く(関数 fopen()を用いる)。

関数 fopen() は、ファイル名と形式を引数に取り、その指定に応じてファイルを開き、そこへのポイ

ンタを返す。ファイル名は、実行形式のあるディレクトリからの相対パスや絶対パスによって文字列で

「ファイルを開く」とは実際には、FILE 型変数領域を確保し、読み書きに必要な データを設定した上で、ポインタを介し てそれにアクセス出来るようにすること だが、ユーザは余り意識しなくても良い。

与える。形式には、読取専用ならr を、書込専用ならw を指定する。

fp = fopen("data.txt", "r"); /* data.txt を読み込み専用で開く */

関数 fopen() は、指定されたファイルのオープンに失敗した場合には、その値として NULL を返す。

そのチェックを含めた以下のようなスタイルが一種の「決まり文句」である。

代入式の値を利用する例。乱発すると判 り難いソースになるが、このような決ま り文句で使うと有効。

if( (fp = fopen("data.txt", "r")) == NULL ) {

ファイルのオープンに失敗した場合の処理 ; }

(6)

(3) ファイルにアクセス(読み書き)する。

ファイルからの一行入力には関数fgets() を用いるのが良い。 gets() は危険なので使わないこと!

fgets(buf, 100, fp); /* 最大100文字まで fp から buf に読み込む */

ファイルへの一行出力には関数 fprintf() やfputs() を用いるのが良い。

fprintf(fp, "i=%d\n", i); /* fp に指定の書式で書き込む */

fputs(str, fp); /* fp に文字列 str を書き込む */

(4) ファイルを閉じる(関数 fclose() を用いる)。

関数 fclose() は、FILE へのポインタを引数に取り、そのファイルを閉じる。

fclose(fp); /* ファイルポインタ fp が指すファイルを閉じる */

次の 3 つのファイルポインタが標準で用意されている。

stdin : 標準入力 (読込専用)

stdout : 標準出力 (書込専用)

stderr : 標準エラー出力 (書込専用)

前々回に現れた

fgets(str, MAXLEN, stdin);

は、これを使ったもの。

それぞれキーボード入力・ディスプレイ出力(リダイレクションなどで変更された時は指定されたファイルな ど) が指定されている。これらを fgets(), fprintf() などのファイルポインタ指定に用いることも出来る

し、FILE * 型変数に代入することも出来るので、条件によってファイル出力と画面出力とを切替えることも

容易に可能。

エラーメッセージなど正常な出力データに混ぜたくないものは、標準エラー出力 stderr に出力するのが良

い。出力リダイレクション > やパイプライン | では、標準出力 stdout への出力のみが指定されたファイル C シェルでは

>&: 標準エラー出力込みの出力リダイレ クション

|&: 標準エラー出力込みのパイプライン が利用できる。

や後に続くプログラムに向かい、標準エラー出力 stderr への出力はディスプレイに表示される。

(7)

. 指定したファイルの内容を表示するプログラム(つまり自家製 cat)。 argc == 1

とは、コマンドそのもののみ、即ち引数 を取っていないこと。それ以外は

argc > 1 となる。

argv[1] 以降が(コマンド名の次からの) 引数。

関数 fgets()は、ファイルの終了を表す 文字を読み込むと NULL を返すので、こ れをファイル終了の判定に用いている。

変数 i を使わずに、argc 自身をカウン タに流用する手や、argv 自身をインクリ メントする手もあるが、まぁこれで良か ろう。

課題の最終締切は 86() とする。

/* mycat.c 2010-07-19 */

#include <stdio.h>

#include <stdlib.h>

#define MAXBUF 255

int main( int argc, char **argv ) {

char buf[MAXBUF+1];

int i;

FILE *fp;

if( argc == 1 ) {

printf("Usage: %s filename(s)\n", argv[0]);

exit(1);

}

for ( i=1; i<argc; i++) {

if( ( fp = fopen(argv[i], "r") ) == NULL ) {

printf("cannot open file: %s\n", argv[i]);

exit(2);

}

while( fgets(buf, MAXBUF, fp) != NULL ) {

printf("%s", buf);

}

fclose(fp);

}

return 0;

}

(8)

引き続き秋学期の「情報処理 IV 」も是非受講を。

Referensi

Dokumen terkait

maghamiらのデータの信頼性はそれほど高くないこと がわかる.各タンパク質のC末にTAP-tagを付けたこ とによる発現の変化がこの原因の一つであろう. プロテオマップによりタンパク質発現リソースの配 分を可視化する プロテオーム解析によって得られた数千のタンパク質 の発現量を単にテーブル(あるいはデータベース)とし

小学校の 2022年12月9日 株式会社ナガセ 幼児から社会人までの一貫教育ネットワーク展開する株式会社ナガセ(本社:東京都武蔵野市 代表取締 役社長 永瀬昭幸)は、12月の未来発見講座の講師として第167回芥川賞受賞の小説家 高瀬隼子先生(東 進卒業生)にご登場いただいたことをお知らせいたします。

2022年12月 【2023年度入学試験】 新型コロナウイルス等の感染症への対応について 2023年度入学試験において、試験日に新型コロナウイルス、インフルエンザ等の学校保健安全法に 規定されている感染病に罹患している、あるいは罹患が疑われる場合は、他の受験者等への感染防止 のため、試験当日は受験できません。

B:「家族」というキーワードに関連した用語についてあ る程度説明をすることができる。また、家族の生活に必要 な衣食住に関することをある程度理解している。そして、 国際比較より家族の多様性を知り、客観的なデータを用い て自分なりの考えを表現することができる。 C:「家族」というキーワードに関連した用語について説 明をすることができる。また、家族の生活に必要な衣食住

B:筆記試験、社会人基礎力、その他(課題)の3つの評価 方法において、満遍なくではないが、基本的な習得がなさ れ、2つの評価方法においてある程度の力が発揮できる。 C:2つの評価方法において、最低限の習得がなされ、1つ の評価方法において多少の力が発揮できる。 週 学修内容 授業の実施方法 到達レベルC可の基準 予習・復習 時間 能力名 分 1

医療管理に関する専門用語についておおむね理解できてい る。医療保障制度がおおむね説明できる。到達レベルB 医療管理に関する専門用語についてほぼ理解できている。 医療保障制度がほぼ説明できる。到達レベルC 週 学修内容 授業の実施方法 到達レベルC可の基準 予習・復習 時間 能力名 分 1 オリエンテーション 医療サービスの特徴及 び経済的特性を学ぶ。 講義

3単体の向きは図示しにくいのですが、やはり⟨a0a1a2a3⟩の4つの面そ れぞれの向きを考えてそれらの和をとったものが∂⟨a0a1a2a3⟩になりま す。−⟨a0a2a3⟩=⟨a0a3a2⟩,−⟨a0a1a2⟩=⟨a0a2a1⟩に注意すると、回転して 重ねたときすべての面に同じ向きがついていることを確かめてください。

2 整数 a, b∈Z に対し、その最大公約数 d:= gcda, b を求める Euclid の互除 法、および、それと同時に ax+by =d となる整数 x, y ∈Z を求める拡張互除法につい てまとめよ。また、(心得のある人は)何らかの計算機言語(表ソフトのマクロなどでも 良い)で実装せよ。 問4...