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

Similar documents
Microsoft Word - Cプログラミング演習(3)

kiso2-09.key

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

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

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

Microsoft PowerPoint - lec10.ppt

Java講座

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

PowerPoint プレゼンテーション

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

kiso2-06.key

ポインタ変数

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

Microsoft Word - no103.docx

Microsoft PowerPoint - kougi6.ppt

:30 12:00 I. I VI II. III. IV. a d V. VI

piyo rtfd

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

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

slide5.pptx

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

ポインタ変数

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

プログラミング基礎

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - no11.docx

ポインタ変数

Microsoft PowerPoint - class04.ppt

Prog1_10th

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

PowerPoint プレゼンテーション

Prog1_6th

ポインタ変数

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

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

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

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

PowerPoint プレゼンテーション

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

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

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

講習No.12

gengo1-2

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

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

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

02: 変数と標準入出力

Microsoft Word - no15.docx

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

プログラミング実習I

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

memo

PowerPoint Presentation

講習No.9

情報処理演習 B8クラス

Prog1_15th

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(C 言語 ) サンプル問題 知識科目 第 1 問 (

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi2.ppt

Microsoft Word - no202.docx

PowerPoint プレゼンテーション

C言語によるアルゴリズムとデータ構造

cp-7. 配列

演算増幅器

PowerPoint Presentation

ポインタ変数

Taro-再帰関数Ⅱ(公開版).jtd

計算機プログラミング

:30 12:00 I. I VI II. III. IV. a d V. VI

Microsoft Word - 3new.doc

計算機プログラミング

Microsoft PowerPoint - 14Chap17.ppt

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

gengo1-11

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi4.ppt

プログラミング基礎

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

プログラミング実習I

Microsoft PowerPoint - kougi11.ppt

第2回講義:まとめ

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

tuat1.dvi

Taro-リストⅢ(公開版).jtd

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

Microsoft Word - no12.doc

Microsoft PowerPoint - kougi7.ppt

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

Taro-最大値探索法の開発(公開版

02: 変数と標準入出力

ファイル入出力

ファイル入出力

数値計算

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

Transcription:

第 8 回 (6/11) プログラミングスタイルなど [1] 名前のつけかた グローバル変数にはわかりやすい名前を, ローカル変数には短い名前を 関連性のあるものには関連性のある名前をつけて, 統一しよう 関数には能動的な名前を 名前は的確に 例題 1 次のコードの名前と値の選び方についてコメントせよ? #define TRUE 0? #define FALSE 1?? if ((ch = getchar()) == EOF)? not_eof = FALSE; 例題 2 次の関数を改良せよ? int smaller(char *s, char *t) {? if (strcmp(s, t) < 1)? return 1;? else? return 0;

[2] 式と文 構造がわかるようにインデントしよう 自然な形の式を使おう カッコを使ってあいまいさを解消しよう 複雑な式は分割しよう 明解に書こう 副作用 (++ などの演算子 ) に注意 例題 3 次の式のあいまいさをカッコを使って解消しよう? if (x&mask == BITS)? leap_year = y % 4 == 0 && y % 100!= 0 y % 400 == 0; 例題 4 次の式にはどんな副作用があるか述べなさい? array[i++] = i;? scanf("%d %d", &yr, &profit[yr]); 例題 5 次のそれぞれのコードを改良せよ? if (!(c == 'y' c == 'Y'))? return;? length = (length < BUFSIZE)? length : BUFSIZE;? flag = flag? 0 : 1;? quote = (*line == '"')? 1 : 0;

? if (val & 1)? bit = 1;? else? bit = 0; 例題 6 さまざまな評価順によって生成される可能性のある出力を列挙してみよ? n = 1;? printf("%d %d\n", ++n, ++n); [3] 一貫性と慣用句 インデントとブレースのスタイルを統一しよう 慣用句によって一貫性を確保しよう 多分岐の判定には else-if を使おう 例題 7 次のコードを正しく直しなさい? if (month == FEB) {? if (year%4 == 0 && year%100!= 0 year%400 == 0)? if (day > 29)? legal = FALSE;? else? if (day > 28)? legal = FALSE;

よく使われる慣用句的な形式 for (i = 0; i < n; i++) array[i] = 1.0; for (p = list; p!= NULL; p = p->next) 無限ループの書き方 for (;;) while (1) int c; while ((c = getchar())!= EOF) putchar(c); 例題 9 次のコードをもっと明解に書き直しなさい? if (retval!= SUCCESS)? {? return retval;? /* All went well! */? return retval;? for (k = 0; k++ < 5; x += dx)? scanf("%lf", &dx);

[4] マクロやリテラルな数値の使い方 関数マクロはなるべく使うな マクロの本体と引数はかっこに入れよう 数値はマクロでなく定数として定義しよう 整数でなく文字定数を使おう オブジェクトサイズは言語に計算させよう 例題 10 次のコードの問題点は何か? #define isupper(c) ((c) >= 'A' && (c) <= 'Z')?? while (isupper(c = getchar()))?? #define square(x) (x) * (x)?? y = 1 / square(x)? #define ISDIGIT(c) ((c >= '0') && (c <= '9'))? 1 : 0 列挙子 enum 型の活用 列挙子リストの中の識別子は int 型の定数として宣言される =で値を指定しない場合は, 定数の値は 0 から始まり, 順に1ずつ増やされる enum { NO, YES }; enum { MINROW = 1, /* 上端 */ MINCOL = 1, /* 左端 */ MAXROW = 120, /* 下端 */ MAXCOL = 80 /* 右端 */ };

はっきりした定数の使い方 例えば,0 という数値はプログラムの中で様々な文脈で登場する コンパイラは適切な型に自動変換してくれるが, 型を明記した方が読み手に 0 の役割りが分かりやすくなる? if (c >= 65 && c <= 90)? if (c >= 'A' && c <= 'Z') if (isupper(c))? str = 0; str = NULL;? name[i] = 0; name[i] = '\0';? x = 0; x = 0.0; sizeof 演算子の活用 char buf[1024]; fgets(buf, sizeof(buf), stdin); 注意.gets は入力行のサイズを制限する手段がないので極めて危険! # define NELEMS(array) (sizeof(array) / sizeof(array[0])) double dbuf[100]; for (i = 0; i < NELEMS(dbuf); i++) {

練習問題 26 1. 次のフォーマットで, ある人の 1 日ごとの仕事時間を入力すると, 日数と仕事の合計時間を出力するプログラムをつくりなさい ただし, 仕事時間の入力データが不正な場合 (hh:mm の入力で,hh>23 や hh<0 や mm>59 や mm<0 の場合 ) は再入力をさせるようにしなさい また, 終了は 0:0 とします < 入力例 > 仕事時間 hh:mm を入力して下さい (0:0 で終了 ) 3:35 2:09 4:55 0:0 ( 終了 ) < 出力例 > 日 数 17 日 合計時間 104 時間 23 分

2.( 難問 ) キーボードから入力された 1 行 ( 空白で区切られた正整数並びの文字列 ) を項に分解して,i 番目の項の整数値を配列要素 d[i-1] に累算しながら格納するプログラムをつくりなさい ただし, 配列 d の要素数は 10 として宣言し,10 項目より多い入力の場合は 11 項目以降を棄却しなさい 1 行の入力には関数 fgets を用いなさい fgets は改行文字も取り込む点に注意して, 入力の終了は 改行のみの入力 で判定しなさい ヒント 入力行の正整数並びの文字列を項に分解するには, 空白文字は関数 isspace, 数字文字は関数 isdigit で判定して行いなさい また, 一つの整数を表す文字列 s を数値化するにはライブラリ関数 int atoi(const char *) を用いて (stdlib.h をインクルードする ), 数字文字列 s は atoi(s) により数値化しなさい < 入力例 > 空白文字で区切って正整数の並びを入力してください! 入力終了は何も入力せずに改行です 59 37 88 32 19 44 98 78 8 項目の入力 21 35 57 3 項目の入力 入力終了 < 出力例 > d[0] = 80 d[1] = 72 d[2] = 145 d[3] = 32 d[4] = 19 d[5] = 44 d[6] = 98 d[7] = 78

3. 次のプログラムは, 数字文字列を入力して数値に変換するものです switch 文を用いている箇所を else-if 文を使って分かり易く書き直しなさい /* Q26-3 */ /* 数字文字列の入力 */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> main() { char c; double val = 0.0; int sign = 1, dot = 0, n = 0; printf(" 数字文字列を入力して下さい :"); while ((c = getchar())!= '\n') { switch (c) { case '-': sign = -1; /* 落下 */ case '+': c = getchar(); break; case '.': break; default: if (!isdigit(c)) { printf(" 正しい数字表記でありません!\n"); exit(1); } break; } if (c == '.') { dot = 1; } else { if (dot == 1) n++; val = val * 10 + (c - '0'); } } val /= pow(10.0, n); val *= sign;

printf(" 入力数は %f です \n", val); } 4.( 難問 ) 以下のコードはいずれも間違っています ループや条件文の現れるところで境界条件のテスト ( 条件分岐が正しく実行されるかどうか, ループの繰り返し回数が正しいかどうか ) を行ってみなさい その上で, どこに間違いがあるかを指摘して, 修正を施しなさい (a) 階乗を計算するコード :? int factorial(int n)? {? int fac;? fac = 1;? while (n--)? fac *= n;? return fac; (b) 文字列の文字を1 行に1 文字ずつ表示するコード :? i = 0;? do {? putchar(s[i++]);? putchar('\n'); while (s[i]!= '\0'); (c) コピー元からコピー先へ文字列を複写するコード :? void strcpy(char *dest, char *src)? {

? int i;? for (i = 0; src[i]!= '\0'; i++)? dest[i] = src[i]; (d) これも文字列コピーであるが,s から t に n 個の文字をコピーするコード :? void strncpy(char *t, char *s, int n)? {? while (n > 0 && *s!= '\0') {? *t = *s;? t++;? s++;? n--;