Microsoft Word - report#8.docx

Similar documents
1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは 50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字が x または X( エックスの小文字か大文字 ) 8 進数 : 先頭 1

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

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

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

Prog1_10th

Microsoft Word - 3new.doc

Microsoft PowerPoint - 5Chap15.ppt

Microsoft PowerPoint - lec10.ppt

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

memo

02: 変数と標準入出力

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

Microsoft Word - no202.docx

Java講座

情報処理Ⅰ演習

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft PowerPoint - prog03.ppt

プログラミング実習I

Microsoft PowerPoint - C_Programming(3).pptx

02: 変数と標準入出力

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

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

gengo1-11

02: 変数と標準入出力

プログラミング基礎

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

< F2D837C E95CF CF68A4A94C5816A2E6A>

プログラミング実習I

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

PowerPoint Presentation

Prog1_6th

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

02: 変数と標準入出力

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

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

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

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

Microsoft Word - no12.doc

PowerPoint Presentation

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

講習No.12

PowerPoint プレゼンテーション

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

プログラミング基礎

memo

第2回講義:まとめ

02: 変数と標準入出力

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

数値計算

Report#2.docx

PowerPoint プレゼンテーション

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

数値計算

memo

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

2

Microsoft Word - no103.docx

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

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

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

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

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

2

計算機プログラミング

PowerPoint プレゼンテーション

slide5.pptx

C 言語講座 Vol 年 5 月 29 日 CISC

memo

講習No.9

ポインタ変数

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

ポインタ変数

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

Microsoft PowerPoint - 11.pptx

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - C4(反復for).ppt

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

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

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

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

program7app.ppt

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

ファイル入出力

Report#2.docx

PowerPoint プレゼンテーション

CプログラミングI

Microsoft Word - no11.docx

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

情報処理演習 B8クラス

物質工学科 田中晋

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

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

PowerPoint プレゼンテーション - 物理学情報処理演習

PowerPoint Presentation

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

Microsoft Word - no13.docx

Transcription:

プログラミング I report#8 提出日 :7 月 18 日 ( 木 ) 所属 : 工学部情報工学科学籍番号 :135713B 氏名 : 天願寛之

目次 ソース cardinal についての考察ソース conv10 についての考察ソース select_sort.c についての考察ソース print_num.c についての考察ソース msg.c についての考察感想 P4 P7 P10 P13 P14 P14

1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字がxまたはX( エックスの小文字か大文字 ) 8 進数 : 先頭 1 文字が0( 零 ) 10 進数 : 先頭 1 文字が0( 零 ) 以外の数字考察ポイント : 複数あるポインタ変数が何を指しているかの把握 Makeコマンドでの実行 プログラムソースコード 1-a. ソース cardinal.c /* Program Comment */ #include <stdio.h> #include <string.h> #define MAX 256 : cardinal.c : 基数変換と整列処理 void conv10(char **x, int *k, int n); void select_sort(int x[], int m[], int n); void print_num(char *x[], int m[], int n); void msg(); int main(){ char *dt[50], num[10], buf[max], *p=buf; int n=0, len, i10[50], move[50]; puts("- - - - - - - - Input"); while(gets(num)!= NULL) { len = strlen(num); if(p > buf+max- (len+1)) break; strcpy(p, num); dt[n] = p; p += strlen(num)+1; n++; puts("- - - - - - - - Result"); conv10(dt,i10,n); select_sort(i10,move,n); print_num(dt,move,n); msg(); return(0); <1>

1-b. ソース conv10.c /* Program */ : conv10.c void conv10(char **x, int *k, int n){ while(n- - > 0){ switch(**x){ case '0' : sscanf(*x+1, "%o", k); break; case 'x' : case 'X' : sscanf(*x+1, "%x", k); break; default : sscanf(*x, "%u", k); break; x++; k++; 1-c. ソース select_sort.c /* Program */ : select_sort.c void select_sort(int x[], int m[], int n){ int i, j, k, w; for(i=0; i<n; i++) m[i]=i; for(i=0; i<n- 1; i++){ k=i; for(j=i+1; j<n; j++) if( x[j] > x[k] ) k=j; w = x[i]; x[i] = x[k]; x[k] = w; w = m[i]; m[i] = m[k]; m[k] = w; 1-d. ソース print_num.c /* Program */ : print_num.c void print_num(char *x[], int m[], int n){ int i; for(i=0; i<n; i++){ puts( x[m[i]] ); <2>

1-e. ソース msg.c /* Program : msg.c */ int msg(){ printf("#### Message from C #### By ICHIRO n"); return(0); 1-f. ソース makefile # #cardinal.c のための make ファイル # cardinal: cardinal.o conv10.o select_sort.o print_num.o msg.o gcc - o cardinal cardinal.o conv10.o select_sort.o print_nu m.o msg.o cardinal.o: cardinal.c gcc - c cardinal.c conv10.o: conv10.c gcc - c conv10.c select_sort.o: select_sort.c gcc - c select_sort.c print_num.o: print_num.c gcc - c print_num.c msg.o: msg.c gcc - c msg.c 実行結果 - - - - - - - - Input x21 021 055 22 - - - - - - - - Result 055 x21 22 021 #### Message from C #### By ICHIRO [ プロセスが完了しました ] <3>

1-a-1. ソース cardinal についての考察 1-a-2. ソース cardinal.c 01 /* 02 Program : cardinal.c 03 Comment : 基数変換と整列処理 04 */ 05 06 #include <stdio.h> 07 #include <string.h> 08 #define MAX 256 /*MAXを256と定義*/ 09 10 void conv10(char **x, int *k, int n); /* 関数 conv10のプロトタイプ宣言 */ 11 void select_sort(int x[], int m[], int n); /* 関数 select_sortのプロとタイプ宣言 */ 12 void print_num(char *x[], int m[], int n); /* 関数 print_numのプロトタイプ宣言 */ 13 void msg(); /* 関数 msgのプロトタイプ宣言 */ 14 15 int main(){ 16 /*char 型のポインタ配列 dt[50], 配列 num[10],buf[max], ポインタpを宣言. ポインタpに配列 bufのアド 17 レスを代入 */ 18 char *dt[50], num[10], buf[max], *p=buf; 19 /*int 型の変数 n,len, 配列 i10[50],move[50] を宣言. 変数 nに0を代入 */ 20 int n=0, len, i10[50], move[50]; 21 22 puts("- - - - - - - - Input"); 23 /*whileループ*/ 24 while(gets(num)!= NULL) { 25 len = strlen(num); /* 関数 strlenでnumの文字列の長さ取得しlenに代入 */ 26 if(p > buf+max- (len+1)) break; /*if 文,p > buf+max- (len+1) であればループを抜ける */ 27 strcpy(p, num); /* 関数 strcpy, 文字列 pに文字列 numをコピー */ 28 dt[n] = p; /* ポインタ配列 dt[n] にpに代入された文字列の先頭アドレスを代入 */ 29 p += strlen(num)+1; /*p 足す文字列 numの長さ +1を取得しpに代入 */ 30 n++; /*nのインクリメント*/ 31 32 puts("- - - - - - - - Result"); 33 conv10(dt,i10,n); /* 関数 conv10, 引数 dt,i10,nを取り呼び出し */ 34 select_sort(i10,move,n); /* 関数 select_sort, 引数 i10,move,nを取り呼び出し */ 35 print_num(dt,move,n); /* 関数 print_nuk, 引数 dt,move,nを取り呼び出し */ 36 msg(); /* 関数 msg, 引数なしで呼び出し */ 37 38 return(0); 39 1-a-3. 解析イ. 08 行目でMAXを256と定義している これはNULLを含んだ文字数を256 文字分が上限であるということである ロ. 10 行目でvoid 型関数 conv10のプロトタイプ宣言している ハ. 11 行目でvoid 型関数 select_sortのプロトタイプ宣言をしている ニ. 12 行目でvoid 型関数 print_numのプロトタイプ宣言をしている ホ. 13 行目でvoid 型関数 msgのプロトタイプ宣言をしている ヘ. 18 行目でchar 型のポインタ配列 dt[50] 配列 num[10] buf[max] ポインタpを宣言 ポインタpに配列 bufの先頭アドレスを代入している <4>

ト. 20 行目で int 型の変数 n len 配列 i10[50] move[50] を宣言 変数 n に 0 を代入して いる チ. 24 行目から 31 行目で while 文を用いてループしている 関数 gets を用いて入力され た行の値を配列 num に代入し その値が NULL 以外ならループを続けている リ. 25 行目で関数 strlen を用いて配列 num に代入された文字数を取得 ( このとき最後に 追加される NULL は含まない ) し int 型変数 len に代入している ヌ. 26 行目 if 文で p > buf+max-(len+1) ならばプログラムを抜ける p は buf の先頭 アドレスを代入されているので値は buf の先頭アドレスである buf+max-(len+1) について buf は確保した配列の先頭アドレスの値 MAX は定義した通り 256 len は入力した文字数である ル. 27 行目では 関数 strcpy を用いて char 型のポインタ変数 p に文字列 num をコピー ( こ のとき NULL も含んでいる ) している よって 間接的に buf には入力した文字 +NULL が入る ヲ. 28 行目では char 型ポインタ配列 dt の n 番目の配列に p の指すアドレスを代入 ワ. 29 行目では p に p+ 入力した文字数 +1 の値を代入している p は最初 buf の先頭アド レスを持つので最初は先頭アドレスから入力した文字数 +1 分を移動したアドレス が代入されたことになる カ. 30 行目では int 型変数 n のインクリメントを行っている このインクリメントによ り 1 回目のループで 28 行目での配列 dt[1] に 29 行目で変わった p の指すアドレスを代 入することになる ヨ. 33 行目では 関数 conv10 を引数に dt i10 n を取り呼び出している タ. 34 行目では 関数 select_sort を引数に i10 move n を取り呼び出している レ. 35 行目では 関数 print_num を引数に dt move n を取り呼び出している ソ. 36 行目では 関数 msg を引数なしで呼び出している 1-a-4. 考察 イ. 26 行目の if 文での動作について MAX の定義を変更し いくら文字数を入力をしたら ループを抜けるのか試してみる (MAX の定義を 5 に変える ) 1-a-4- イ -1. 出力結果 ( 入力は 12345 とする ) - - - - - - - - Input 12345 - - - - - - - - Result #### Message from C #### By ICHIRO [ プロセスが完了しました ] 入力した文字数は MAX を超えていないが break したことが分かる <5>

1-a-4- イ -2. 出力結果 ( 入力は 1234 とする ) - - - - - - - - Input 1234 p = 1497303433 buf = 1497303433 MAX = 5 len = 4 - - - - - - - - Result 1234 #### Message from C #### By ICHIRO [ プロセスが完了しました ] 演算を分かりやすく理解するため 26 行目の後に下記のような 1 行を書き加えている printf("p = %d buf = %d MAX = %d len = %d n",p,buf,max,len); 出力結果より 4 文字の入力によって 26 行目の左辺と右辺の式は等号を示す事になり while 文でのループを抜け Result を出し break していないことが分かる 1-a-4- イ -3. 出力結果 ( 入力は 1,12,123,1234 と異なる行で文字数を増やして入力する ) - - - - - - - - Input 1 p = 1530423438 buf = 1530423438 MAX = 256 len = 1 12 p = 1530423440 buf = 1530423438 MAX = 256 len = 2 123 p = 1530423443 buf = 1530423438 MAX = 256 len = 3 1234 p = 1530423447 buf = 1530423438 MAX = 256 len = 4 - - - - - - - - Result 1234 123 12 1 #### Message from C #### By ICHIRO [ プロセスが完了しました ] 出力結果より ポインタ p の持つ値は入力した文字数 +1 分ずれていることが分かる こ の +1 分は NULL が入ることが分かる これらの結果より文字を入力していくにつれポイ ンタ p の指すアドレスはその文字数 +1 分埋まっていくので最大で入力出来る文字数は NULL を含んだ 256 文字だと分かる ロ. 1-a-4 の考察イ. より 29 行目で p に代入した p+ 文字数 +1 の +1 は NULL 文字のことで あり 28 行目で dt[n](n = 0,1,2 ) に代入されているのは入力していった値のそれぞ れの先頭アドレスだと分かる ハ. 図 イメージ ( 入力した文字列を 3 つ x21 055 22 と考える <6>

num x 2 1 0 /num 0 5 5 0 /num 2 2 0 *p=dt[0]=buf-----*p=dt[1]=buf+len1+1-----*p=dt[2]=buf+len1+1+len2+1 buf x 2 1 0 0 5 5 0 2 2 0 len1==3(x21) len2==3(055) len3==2(22) len1+1==4(x21 0) len2+1==4(055 0) len3+1==3(22 0) 1-b-1. ソース conv10 についての考察 1-b-2. ソース conv10.c 01 /* 02 Program : conv10.c 03 */ 04 05 void conv10(char **x, int *k, int n){ 06 while(n- - > 0){ 07 switch(**x){ 08 case '0' : 09 sscanf(*x+1, "%o", k); 10 break; 11 case 'x' : 12 case 'X' : 13 sscanf(*x+1, "%x", k); 14 break; 15 default : 16 sscanf(*x, "%u", k); 17 break; 18 19 x++; 20 k++; 21 22 <7>

1-b-3. 解析イ. 05 行目のvoid 型関数 conv10でmain 関数から受け取った引数は char **x が dt int *k が i10 int n が n である ロ. 06 行目はwhile 文を用いて変数 nが0より大きい間デクリメントしながら07 行目から 21 行目までをループする 入力した文字列が3つなら cardinal.c によりn=3の値が与えられているので 3 回だけループする事ができる ハ. 07 行目からのswitch-case 文について 01 switch (c) { 02 case A: 処理 A; 03 break; 04 case B: 処理 B; 05 break; 06 case C: 処理 C; 07 break; 08 default: 処理 N; 上記のようなswitch-case 文では 01 行目の c の値が A のとき処理 Aが行われる 以下同様で 08 行目の default はオプションであり 無くても良い という意味と同義である つまり caseで分けた他の条件以外ということである ソースconv10.c では **xの値 つまりdt[n] の指す文字列の最初のアドレスが持つ要素が 0 か x または X か それ以外で処理を分岐している ニ. 08 行目から10 行目について case 0 つまり入力した文字列 または文字の最初の文字が0であれば関数 sscanfにより *x+1 つまりdt[n] の指すアドレスを1つずらして ずらした先のアドレスがもつ要素の書式を8 進数に換えてその値をポインタ変数 kに代入している ホ. 11 行目から13 行目について case x または X つまり入力した文字列 または文字の最初の文字がxまたはXであれば関数 sscanfにより *x+1 つまりdt[n] の指すアドレスを1つずらして ずらした先のアドレスがもつ要素の書式を16 進数に換えてその値をポインタ変数 kに代入している ヘ. 15 行目から17 行目について caseで分けた他の条件以外のときは関数 sscanfにより *x* つまりdt[n] の指すアドレスがもつ要素の書式を符号なし10 進数に換えてその値をポインタ変数 kに代入している <8>

1-b-4. 考察 ( 入力した文字列を 3 つ x21 055 22 と考える ) イ. 実際の出力結果 - - - - - - - - Input x21 055 22 - - - - - - - - Result case'x' *x+1 = 21 case'x' **x = x case'0' *x+1 = 55 case'0' **x = 0 case'def' *x = 22 case'def' **x = 2 055 x21 22 #### Message from C #### By ICHIRO [ プロセスが完了しました ] この出力結果より関数 sscanf により変換されるのは それぞれ先頭が x または X 0 であればその次からの値である またそれ以外の条件に当てはまる値はその先頭の値か らであることが分かる ロ. 図 イメージ x *x x++ dt dt[0] dt[1] dt[2] buf x 2 1 0 0 5 5 0 2 2 0 %x %o %u i10=*k k++ k 33 45 22 <9>

1-c-1. ソース select_sort.c についての考察 1-c-2. ソース select_sort.c 01 /* 02 Program : select_sort.c 03 */ 04 05 void select_sort(int x[], int m[], int n){ 06 int i, j, k, w; 07 08 for(i=0; i<n; i++) m[i]=i; 09 for(i=0; i<n- 1; i++){ 10 k=i; 11 for(j=i+1; j<n; j++) 12 if( x[j] > x[k] ) k=j; 13 w = x[i]; 14 x[i] = x[k]; 15 x[k] = w; 16 w = m[i]; 17 m[i] = m[k]; 18 m[k] = w; 19 20 1-c-3. 解析イ. 05 行目でvoid 型関数 select_sortがmain 関数から受け取った引数は int x[] が i10 int m[] が move int n が n である ロ. 06 行目でint 型変数 i j k wを宣言している ハ. 08 行目でfor 文で変数 iの初期値は0 変数 iが引数で受け取った変数 nより小さい間ループを続け ループ毎に変数 iをインクリメントしている ループしている間変数配列 m[i] に変数 iを代入している ニ. 09 行目のfor 文で変数 iの初期値は0 変数 iが引数で受け取った変数 n-1より小さい間ループを続け ループ毎に変数 iをインクリメントしている 10 行目ではループしている間変数 kに変数 iを代入し また11 行目 for 文で変数 jの初期値を変数 i+1にし 変数 jが引数で受け取った変数 nより小さい間ループを続け ループ毎に変数 jをインクリメントしている 11 行目でのforループは12 行目でのif 文により x[j] > x[k] ならば変数 kに変数 jを代入するという作業をし それを抜けると13 行目で w に x[i] を代入 14 行目で x[i] に x[k] を代入 15 行目で x[k] に w を代入 16 行目で w に m[i] を代入 17 行目で m[i] に m[k] を代入 18 行目で m[k] に w を代入している <10>

1-c-4. 考察 ( 入力した文字列を 3 つ x21 055 22 と考える ) イ. 入力した文字列が 3 つの場合 main 関数で変数 n は 3 を代入されているので 08 行目の for 文では m[0]=0 m[1]=1 m[2]=2 と代入される ロ. 09 行目の for 文での条件式は i<2 となるのでループは 1 回となる ハ. 10 行目の変数 k には 1 回目の動作では 0 が 1 回目のループでは 1 が代入される ニ. 11 行目の for 文では 1 回目の動作で初期値には変数 i が 0 なので 1 が代入される また 条件式とループ毎の動作によりループは 1 回となる 09 行目の for 文による 1 回目の ループのときは i が 1 なのでループはしない 以下選択法と細かい流れを示す その前に sscan で変換された値を int 型配列 i10 で受け取るにあたり 変換された値を 求めた結果以下の通りだと分かった x21=33, 055=45, 22=22 実際に流れの結果を示しておく - - - - - - - - Input x21 p = 1424619662 buf = 1424619662 MAX = 256 len = 3 055 p = 1424619666 buf = 1424619662 MAX = 256 len = 3 22 p = 1424619670 buf = 1424619662 MAX = 256 len = 2 - - - - - - - - Result m[0]==1,m[1]==0,m[2]==2,x[0]==45,x[1]==33,x[2]==22 055 x21 22 #### Message from C #### By ICHIRO [ プロセスが完了しました ] 選択法 i=0 x[0]=33-x[1]=45-x[2]=22 配列 m(move) m[0]=0-m[1]=1-m[2]=2 33と45を比較 22と45を比較 ---------------------------------------- 配列 xと配列 mで各々中身を入れ替え i=1 x[0]=45-x[1]=33-x[2]=22 m[0]=1-m[1]=0-m[2]=2 33と22を比較 ---------------------------------------- 何もしない最終結果 x[0]=45-x[1]=33-x[2]=22 / m[0]=1-m[1]=0-m[2]=2 <11>

x[0]=33,x[1]=45,x[2]=22 m[0]=0,m[1]=1,m[2]=2. 09 行 for 文による1 回目の動作 i=0,k=0 11 行 for 文による1 回目の動作 j=1 if 文 x[1] > x[0] つまり 45 > 33は真 k=1 11 行 for 文による2 回目の動作 j=2 if 文 x[2] > x[1] つまり 22 > 45は偽 w=x[0] w=33 x[0]=x[1] x[0]=45 x[1]=w x[1]=33 w=m[0]...w=0 m[0]=m[1]..m[0]=1 m[1]=w m[1]=0 09 行 for 文による2 回目の動作 i=1,k=1 11 行 for 文による1 回目の動作 j=2 if 文 x[2] > x[1] つまり 22 > 33は偽 w=x[1] w=33 x[1]=x[1] x[1]=33 x[1]=w x[1]=33 w=m[1]..w=0 m[1]=m[1].m[1]=0 m[1]=w..m[1]=0 結果 m[0]==1,m[1]==0,m[2]==2,x[0]==45,x[1]==33,x[2]==22 1-c-4 考察イで先に出力した結果と同じになった <12>

1-d-1. ソース print_num.c についての考察 1-d-2. ソース print_num.c 01 /* 02 Program : print_num.c 03 */ 04 05 void print_num(char *x[], int m[], int n){ 06 int i; 07 08 for(i=0; i<n; i++){ 09 puts( x[m[i]] ); 10 11 1-d-3. 解析イ. 05 行目でvoid 型関数 print_numがmain 関数から受け取った引数は char *x[] が dt int m[] が move int n が n である ロ. 06 行目でint 型変数 iを宣言している ハ. 08 行目のfor 文は変数 iの初期値 0 変数 iが変数 nより小さい間ループ ループ毎に変数 iをインクリメントする ニ. 09 行目のputsで ループの間 x[m[i]] を出力し続ける 1-d-4. 考察 ( 入力した文字列を3つ x21 055 22 と考える ) イ. x[] は配列の先頭アドレス m[] は配列の値である ロ. x[m[i]] はi=0のときm[0]==1 よって x[1] つまりdt[1] が出力される 関数 convでdt[1] は 055 を指しているので 055 が出力される ハ. x[m[i]] はi=1のときm[1]==0 よって x[0] つまりdt[0] が出力される 関数 convでdt[0] は x21 を指しているので x21 が出力される ニ. x[m[i]] はi=2のときm[2]==2 よって x[2] つまりdt[2] が出力される 関数 convでdt[2] は 22 を指しているので 22 が出力される <13>

1-e-1. ソース msg.c についての考察 1-e-2. ソース msg.c /* Program : msg.c */ int msg(){ printf("#### Message from C #### By ICHIRO n"); return(0); 1-e-3. 解析 イ. 関数 printf で #### Message from C #### By ICHIRO を出力している 1-e-4. 考察 イ. しなくていいんじゃないか? 2. 感想流れを知って実際にどんな値を持つか調べるのに苦労しました %uや%oの出力が結局うまく出来ずに別のところで値を確かめることになりました ここまできても未だにうまくいかない事が多いので反省し これからに生かしたいです <14>