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

Similar documents
講習No.12

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

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

プログラミング及び演習 第1回 講義概容・実行制御

プログラミング実習I

Prog1_10th

第2回講義:まとめ

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

2006年10月5日(木)実施

memo

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

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

gengo1-2

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

PowerPoint プレゼンテーション

Microsoft Word - no11.docx

Prog1_15th

第3回 配列とリスト

Microsoft PowerPoint - 14Chap17.ppt

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

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

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

gengo1-12

PowerPoint プレゼンテーション

02: 変数と標準入出力

Prog1_6th

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

Microsoft PowerPoint pptx

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

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

プログラミング基礎

Prog1_12th

Microsoft Word - no02.doc

ポインタ変数

Microsoft PowerPoint pptx

gengo1-12

PowerPoint Presentation

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

Microsoft Word - CHAP2.DOC

memo

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

PowerPoint Presentation

Microsoft Word - no15.docx

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

PowerPoint Presentation

gengo1-12

kiso2-09.key

‚æ4›ñ

数値計算

プログラミングA

R2.7 ポインタの型に気を付ける R2.7.1 (1) ポインタ型は 他のポインタ型及び整数型と相互に変換してはならない ただし データへのポインタ型における void* 型との相互変換は除く (2) ポインタ型は 他のポインタ型 及びポインタ型のデータ幅未満の整数型と相互に変換してはならない た

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

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

プログラミング実習I

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

Microsoft PowerPoint ppt

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

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - prog06.ppt

Microsoft Word - 3new.doc

8 / 0 1 i++ i 1 i-- i C !!! C 2

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

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

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

Microsoft PowerPoint pptx

C#の基本2 ~プログラムの制御構造~

ファイル入出力

Java講座

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft PowerPoint - kougi2.ppt

プログラミング基礎

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

slide5.pptx

Microsoft PowerPoint - lec10.ppt

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

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

情報処理演習 B8クラス

株式会社アルウィン C 言語コーディング規約 ver.0.1

cp-7. 配列

基礎プログラミング2015

Microsoft PowerPoint - prog04.ppt

memo

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

講習No.1

Microsoft Word - Training8_データ構造とポインタ.docx

kiso2-06.key

Microsoft PowerPoint - kougi7.ppt

ファイル入出力

プログラミング基礎

関数とは 関数とは 結果を得るために 処理を行う仕組み です Excel2010 には あらかじめ関数が数式として組み込まれています たとえば SUM 関数 は 指定した値をすべて合計する 仕組みです 長い計算式や複雑な計算式を作成せずに 簡単に結果を求めることができます 例合計 =A1+A2+A3

Microsoft Word - no103.docx

Microsoft PowerPoint - 3.pptx

Microsoft Word - no12.doc

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

memo

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

ポインタ変数

プログラミングI第10回

Microsoft PowerPoint - prog07.ppt

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

Transcription:

Training 10 プリプロセッサ 株式会社イーシーエス出版事業推進委員会 1

Lesson1 マクロ置換 Point マクロ置換を理解しよう!! マクロ置換の機能により 文字列の置き換えをすることが出来ます プログラムの可読性と保守性 ( メンテナンス性 ) を高めることができるため よく用いられます マクロ置換で値を定義しておけば マクロの値を変更するだけで 同じマクロを使用したすべての箇所が変更ができるので便利です 問題 1 次のプログラムが実行されたとき x に以下の値が入力された場合の 最終的な y の値を答えなさい #include <stdio.h> #define MAX 20 #define MIN 10 int x,y; scanf("%d",&x); 1 x = 9 2 x = 10 3 x = 11 4 x = 19 5 x = 20 6 x = 21 if( x > MAX) y = MAX; else if( x < MIN ) y = MIN; else y = x; 問題 2 次の配列 str の値が 文字列 "abcdef" となるように 部分の空欄を埋めなさい #define 1 2 const char str[] = "abc" MYSTR; 問題 3 次の 部分を埋め プログラムを完成させなさい 処理内容 事前定義マクロを使い コメントのとおりに動作する #include <stdio.h> /* ソースファイルのパス名を出力 */ printf(" 1 = %s n", 1 ); /* 現在のソースファイルの行番号を出力 */ printf(" 2 = %d n", 2 ); /* ソースファイルをコンパイルした日付を出力 */ printf(" 3 = %s n", 3 ); /* ソースファイルをコンパイルした時刻を出力 */ printf(" 4 = %s n", 4 ); 2

Lesson2 前処理制御 Point 前処理制御を理解しよう!! 別ファイルの内容の読み込むインクルードや 不要なソースコードを読み飛ばすことができる制御コマンドが前処理制御です これらは便利なツールですので しっかりと理解しておきましょう 問題 1 次の 部分を埋め プログラムを完成させなさい 処理内容 x の値を求める (3 つのファイルは同じ階層のフォルダに存在するものとする ) #include 1 keisan.h int keisan(int); int x; x = 10; x = keisan(x); keisan.c int keisan(int z) z = ( z + 20 ) * 100; return z; 問題 2 次の 部分を埋め プログラムを完成させなさい 処理内容 標準ライブラリの関数 sqrt を使用し x の値を求める ( 必要な標準ヘッダファイルは math.h とする ) #include 1 double x; x = sqrt(10.5); 3

問題 3 下図のような階層でファイルが存在し に作成した test.h と 標準ヘッダファイルの stdio.h を読み込みたい場合はどのように記述するか 次の 部分を埋めて答えなさい test.h はカレントディレクトリを標準の場所として探す記述をし stdio.h は直接 標準の場所 ( 標準ヘッダ格納先 ) のみを探す記述とする C: test src ( 省略 ) system include A test.h 標準ヘッダ格納先 B stdio.h 標準ヘッダファイル /* test.h を読み込む */ #include 1 /*stdio.h を読み込む */ #include 2 ( 略 ) 問題 4 下図のような階層でファイルが存在し に hdr1.h と hdr2.h を読み込みたい場合はどのように記述するか 次の 部分を相対パス指定で埋めて答えなさい C: test src c h hdr1.h include hdr2.h /* hdr1.h を読み込む */ #include 1 /* hdr2.h を読み込む */ #include 2 ( 略 ) 4

問題 5 次のプログラムを実行した時の 最終的な y の値を答えなさい int x,y; x = 0; y = 1; #if 1 x = 2; y = x + 2; y = x + 3; y = y * 2; 問題 6 次のプログラムを実行した時の 最終的な y の値を答えなさい #define COND 0 int x,y; x = 1; y = 1; #if COND > 0 x = x + 2; #elif COND == 0 x = x + 3; x = x + 5; y = x * 2; 問題 7 次のプログラムを実行した時の 最終的な y の値を答えなさい #define BBB int x,y; x = 1; y = 1; #ifdef AAA #ifndef BBB x = x + 1; x = x + 2; #ifndef BBB x = x + 10; x = x + 15; y = x * 2; 5

Lesson3 関数マクロ Point 関数マクロを理解しよう!! マクロに関数を定義することもできます この関数マクロは引数をつけて定義することもできます 関数マクロを定義するときには 結果が意図しない値にならないように ( ) を適切につけましょう 問題 1 次のプログラムが実行されたときの 最終的な w x y z の値を答えなさい #include <stdio.h> #define KAKE_A(a) (a * 10) #define KAKE_B(b) ((b) * 10) int w,x,y,z; 1 w 2 x 3 y 4 z w = KAKE_A(6); x = KAKE_B(6); y = KAKE_A(6 + 2); z = KAKE_B(6 + 2); 問題 2 次のプログラムを読み 以下の問に答えなさい ( 各ファイルは同じ階層にある ) type.h #ifndef TYPE_H #define TYPE_H /* 基本型定義 */ typedef signed char S1; typedef unsigned char U1; typedef signed short S2; typedef unsigned short U2; typedef signed long S4; typedef unsigned long U4; typedef void VD; main.h #ifndef MAIN_H #define MAIN_H #define NUM 7 const S1 MAX = round( 2.3 ); const S1 MIN = round( -2.6 ); const S1 num_table[num] = CAL_A( -6.0 ), CAL_A( -1.4 ), CAL_A( -2.1 ), CAL_B( 26.4 ), CAL_B( 15.2 ), CAL_C(-1.1), CAL_C( 0.9 ) ; #undef CAL_A #undef CAL_B #undef CAL_C routine.h #ifndef ROUTINE_H #define ROUTINE_H #define round(i) ( ( S1 )( ( ( i ) >= 0.0 )? ( ( i ) + 0.5 ) : ( ( i ) - 0.5 ) ) ) #define CAL_A(a) ( ( S1 )( ( a ) * 2.0 ) ) #define CAL_B(b) ( ( S1 )( ( ( b ) / 2.0 ) - 5.4 ) ) #define CAL_C(c) ( ( S1 )( ( c ) + 1.1 ) ) 6

#include <stdio.h> #include "type.h" #include "routine.h" #include "main.h" VD main(vd) S1 i; S1 max_over; S1 min_under; max_over = 0; min_under = 0; for( i = 0 ; i < NUM ; i++) if( num_table[i] >= MAX ) max_over++; else if( num_table[i] <= MIN ) min_under++; printf("max_over の値は %d になります n", max_over); printf("min_under の値は %d になります n", min_under); 1 MAX MIN の値を答えなさい 2 num_table の値を全て答えなさい 3 printf で出力される max_over min_under の値を答えなさい 7

Lesson4 マクロの応用 Point マクロを使ったソースを読めるようにしよう!! マクロを使いスイッチを作ることにより スイッチの切り替えで違うプログラムを実行することができます 移植性を持たせたいときなどに効果を発揮します 問題 1 以下のプログラムを読み問いに答えなさい ( 各ファイルは同じ階層にある ) main.h /* 基本型定義 */ typedef signed char S1; typedef unsigned char U1; typedef signed short S2; typedef unsigned short U2; typedef signed long S4; typedef unsigned long U4; typedef void VD; /* マクロ定義 */ #define SWITCH1 1 #define SWITCH2 2 #define SWITCH3 3 #define SWITCH4 4 #define SIMUKE A #include <stdio.h> #include "main.h" VD main(vd) U2 in_a; U2 in_b; U2 ans; U1 str[5] = 7,3,4,2,0 ; U1 i; U1 j; /* 初期化 */ in_a = 2; in_b = 4; ans = 0; #if SIMUKE == SWITCH2 for( i = 0; i < 4; i++ ) ans += in_a; #if SIMUKE == SWITCH1 ans = in_a + in_b; #if SIMUKE == SWITCH2 for( i = 0; i < 4; i++ ) ans -= in_a; #if SIMUKE == SWITCH1 for( i = 0; i < 2; i++ ) ans += in_b; for( j = 0; j < 3; j++ ) ans += in_a; 8

for( i = 0; i < 5; i++ ) str[i] = ( ans + in_a ); #if SIMUKE == SWITCH3 ans += in_b; ans *= in_a; #elif SIMUKE == SWITCH4 ans %= 2; for( i = 0; i < 3; i++ ) ans += ( in_b + in_a ); if( ( ans >= 100 ) ( str[3] >= 5 ) ) printf(" ans の値は %d です ", ( ans + str[i] ) ); else printf(" ans の値は %d です ", ans ); 1 A を SWITCH1 にしたときの printf の出力結果を答えなさい 2 A を SWITCH2 にしたときの printf の出力結果を答えなさい 3 A を SWITCH3 にしたときの printf の出力結果を答えなさい 4 A を SWITCH4 にしたときの printf の出力結果を答えなさい 9

10

解答 Training10 プリプロセッサ Lesson1 マクロ置換 110 210 311 419 問題 1 520 620 問題 2 1MYSTR 2"def" 1MAX MIN の初期化方法 main.h 内で MAX MIN は変数宣言で関数マクロを呼んで初期化を行っています 2num_table の設定関数マクロ CAL_A(a) CAL_B(b) CAL_C(c) を用いて num_table を作成しています 引数として受け取った値をそれぞれ計算して その値を S1 でキャストをしています 3max_over min_under の算出 main 関数で num_table の値の中で MAX の値以上になる数 MIN の値以下になる数を数えています Lesson4 マクロの応用 問題 1 ans の値は 26 になります 1 FILE 2 LINE 問題 3 3 DATE 4 TIME Lesson2 前処理制御 問題 1 1"keisan.h" 問題 2 問題 3 問題 4 ans の値は 0 になります ans の値は 8 になります ans の値は 18 になります 問題 2 1<math.h> 問題 3 1"test.h" 2<stdio.h> 問題 4 1"../h/hdr1.h" (Windows 上の多くのコンパイラでは ".. h hdr1.h" でも可 ) 2"../../include/hdr2.h" (Windows 上の多くのコンパイラでは ".... include hdr2.h" でも可 ) 問題 5 8 問題 6 8 問題 7 32 解説 問題 7 このプログラムでは #define で定義されているのは BBB だけです つまり AAA は定義されてなく BBB は定義されている状態です そのため 18 行目で x の値が 16 となり 21 行目で y は 16 2=32 となっている Lesson3 関数マクロ 問題 1 160 260 326 480 問題 2 1MAX : 2 MIN : -3 2num_table[] = -12, -2, -4, 7, 2, 0, 2; 3max_over: 3 min_under : 2 解説 問題 2 整数の定義についてプログラムでは整数の定義を 0.0-6.0 などのようにあえて小数表記をしています これにより 数値を double 型として定義できます 関数マクロ round(i) について ( ( i ) >= 0.0 )? ( ( i ) + 0.5 ) : ( ( i ) - 0.5 ) ) は条件と その条件が真の場合 偽の場合の処理を 1 行で表したものです 条件は '? ' の前の ( i ) >= 0.0 です 真の場合の処理は '? ' の後の ( i ) + 0.5 です 偽の場合の処理は ': ' の後の ( i ) - 0.5 です そしてその結果を S1(signed char) でキャストをしています この関数マクロでは引数が正の数なら 0.5 を足して 負の数なら 0.5 を引いて小数点以下を切り捨て 整数にしています ( 四捨五入の処理 ) 11