address - みる会図書館


検索対象: C言語によるプログラミング 基礎編 第2版
24件見つかりました。

1. C言語によるプログラミング 基礎編 第2版

10.10 fprintf ( stderr, " クローズに失敗しました。 1 : access—log . txtYnt exit ( EX 工 T—FA 工 LURE ) : / ☆手順 8 : 集計結果の並べ替え処理 SortAccessRank ( &AccessRank ) ー アドレス抽出処理☆ / return EX 工 T_SUCCESS : WriteAccessRank ( &AccessRank ) : / ☆手順 9 : 集計結果の出力処理☆ / ☆ / 土 n セ GetAddressString ( char *adress—string, char *buf ) " 宅☆ s ☆ s 宅 s ー sscanf ( buf, return address string : / ☆アドレス集計処理 address_string ) : int UpdateAccessRank ( char* address—string ) int i ′ / ☆ if if for ( 土 turn 0 : i く COUNT MAX ・ 新規アドレス文字列か ? i 十十 ) ( AccessRank [ i ] . count く = 0 ) AccessRank 構造体にアドレス文字列を登録☆ / strcpy ( AccessRank [ 土 ] . address ′ address—string ) ー AccessRank [ i ] . count break ー アドレスが一致するか ? ( ! strcmp ( AccessRank [ 土 ] . address ′ AccessRank [ i ] . count 十十 : 0 : break; address—string ) int アドレスの並び替え処理☆ / SortAccessRank ( VOid ) 0 : i く COUNT RANK f0 て ( 土 / ☆出力するホームページ個数分ソート AccessRank_t temp : int i ′ j ′・ 土十十 ) 実用的なプログラムへの応用 369

2. C言語によるプログラミング 基礎編 第2版

9 章構造体とユーザ定義型 name [ 32 レ / ☆名前 / ☆住所 す。これらをまとめて操作したいとき、別の構造体 (address 型マ 14 としましよう ) として宣言します。 中の zip や address , tel といったメンノヾは、その人の住んでいる「場所」に関するまとまった情報で 名簿の要素を 1 つの構造体にまとめたときと同じように考えるとよいでしよう。つまり、 roll 型の ますⅵ 3 。どのような場合に、ネストにするのでしよう。これは、 9.1.1 項でバラバラに定義された 構造体のメンバとして、別の構造体を宣言することができます。これを、構造体のネストと呼び 一構造体のネスト struct address { int char char ZIP; address[ 82 ] ー セ el [ 20 ]; / ☆郵便番号☆ / / ☆住所☆ / / ☆電話番号☆ / これを ro Ⅱ型構造体に組み込んで ro Ⅱ 2 構造体を作ってみましよう。 struct て 0112 { name[ 32 ] : char int birth; struct address addr : } my—data : / ☆名前 / ☆生年月日 / ☆ address 構造体を取り込む☆ / また、これは次のように展開した形で、 1 つの構造体宣言として記述することもできます。 struct て 0112 { char int birth; struct address { int ZIP; char address [ 82 / ☆生年月日 / ☆ネストされた構造体☆ / / ☆電話番号 / ☆郵便番号 char tel[ 20 ] ー } addr : } my—data : ネストされている addr 構造体のメンバ zip の参照は、次のようにします。 my—data . addr. zip = 1234567 : のネストを作ることができます。 るのです。ネストは 1 つ以上でもかまわないので、このルールを適用して、コンパイラが許す限り つまり、ネストになったメンバをビリオド (. ) で参照し、 さらにそのメンバもビリオドで参照す マ 13 マ 14 302 ネストのことを、入れ子と呼ぶこともあります。 重複しないようにしましよう。 構造体タグ名とその構造体に含まれるメンバ名は同じであってもかまいません。 しかし、混乱の元ですからできるだけ

3. C言語によるプログラミング 基礎編 第2版

1 0 章 ファイ丿レ 引数 戻り値 : char *address string, *Char buf : int 関数の引数は、 GetAddressString 関数で抽出元となる、アクセスログから読み込んだ文字列を buf と、 GetAddressString 関数で抽出した文字列を格納する address-String の 2 つです。関数のプロ ドレス文字列 address_string とします。 手順 5 では、アドレスの集計処理を行います。関数への人力は、手順 4 で行ったホームページア int GetAddressString ( char *address string ′ char *buf ) ー / ☆手順 4 : アドレス抽出処理を行う関数☆ / トタイプ宣言は、以下のとおりです。 関数名 引数 戻り値 ・ UpdateAccessRank : const char* address string : int / ☆ int 手順 5 : アドレスの集計処理☆ / UpdateAccessRank ( char* address—string ) : 手順 8 では、アクセス数の集計結果をアクセス数の多い順に並べ替えを行う処理を行います。並 べ替え処理は、 6.3.2 項で行ったアルゴリズムを使うことにしましよう。 関数名 引数 戻り値 : SortAccessRank(); . なし : int / ☆手順 8 : 集計結果の並べ替え 土 n セ SortAccessRank ( void ) ー 手順 9 では、結果をファイルへ出力します。 関数名 引数 戻り値 WriteAccessRank ( ) ; : int : なし / ☆手順 9 : 集計結果のファイルへの出力 int WriteAccessRank ( void ) ー ☆ / 作成した関数の処理イメージは以下のとおりです。 356

4. C言語によるプログラミング 基礎編 第2版

さて、 します。 10.10 実用的なプログラムへの応用ー これでプログラムの設計は完了しました。今まで作成したプログラムのリストを以下に示 リスト 10.12 main 関数の実装 #include く stdio . h> #include く stdlib . h> #include <string. h> #define COUNT MAX 10000 #define STR 工 NG_MÄX 500 #define COUNT RANK 10 typedef struct AccessRank_T 10n9 char count; / ☆集計するホームページアドレスの個数☆ / / ☆ホームページアドレス文字列の長さ☆ / / ☆ホームページランキングを求める個数☆ / / ☆結果を格納する構造体☆ / / ☆ホームページアクセス数☆ / address [ STRING MAX ] : / ☆ホームページアドレス☆ / }AccessRank_t : static AccessRank_t AccessRank [ COUNT MAX ] : 関数のプロトタイプ宣言 GetAddressString ( char *address_string ′ *char buf ) : int int int int UpdateAccessRank ( char *address ) : SortAccessRank ( void ) : WriteAccessRank ( void ) ー 土 n セ main ( void ) F 工 LE* fp; char buf [ STR 工 NG MAX ] ー char address_string [ STR 工 NG MAX ] ー / ☆手順 1 : ファイルのオープン fp = fopen ( " access_log. txt" if ( fp = = NULL ) fprintf ( s セ de てて′ " ファイルが見つかりません一 exit ( EX 工 T_FA 工 LURE ) ー / ☆手順 2 : ファイルの最後か ? access—log. txtYn" ) ′ / ☆手順 3 : もし、ファイルの終端でなければ、 1 行読み込み☆ / h 土 le ( fgets ( buf, STR 工 NG MAX, fp ) ) 手順 4 : アドレス文字列の取得 address_string = GetAddressString ( address_string , UpdateAccessRank ( address_string ) ー 手順 5 : アドレスの集計処理 buf ) ー / ☆手順 7 : ファイルのクローズ if ( fclose ( fp ) ) マ 27 C では、配列の要素はプログラム作成時に静的に固定されます。 法があります。この方法については応用編で説明します。 この回避方法として、 メモリ領域を動的に確保する方 359

5. C言語によるプログラミング 基礎編 第2版

1 0 章 ファイル プログラムの実行 ここまでで作成したプログラムリストをリスト 10.17 に示します。 リスト 10.17 人気ホームペーシランキンク作成プログラム #include く stdio . h> #include く stdlib . h> #include く string. h> #define COUNT MAX 10000 #define STR 工 NG_MAX 500 #define COUNT RANK 10 typedef struct AccessRank T 10n9 char count : address [ STR 工 NG MAX ] : / ☆集計するホームページアドレスの個数☆ / / * ホームページランキングを求める個数☆ / / * ホームページアドレス文字列の長さ☆ / / ☆ホームページアドレス☆ / / * ホームページアクセス数☆ / / ☆結果を格納する構造体☆ / }AccessRank t : static AccessRank セ AccessRank [ COUNT MAX ] / ☆ int int int 368 関数のプロトタイプ宣 GetAddressString ( char *address string ′ UpdateAccessRank ( char *address ) ー SortAccessRank ( void ) ー int WriteAccessRank ( void ) : int main ( void ) F 工 LE Char char / ☆ / ☆ if fp / ☆ *fp; buf [ STR 工 NG_MAX ] ー address_string [ STRIHG_MAX ] ー 手順 1 : ファイルのオープン☆ / fopen ( "access—log. txt" fp = = NULL ) 手順 2 : ファイルの最後か ? exit ( EXIT_FA 工 LURE ) : fprintf ( stderr, " ファイルが見つかりません一 *buf ) access_log. txtYn' 手順 3 : もし、ファイルの終端でなければ、 1 行読み込み ☆ / while ( fgets ( buf, STR 工 NG MAX ′ fp ) ) UpdateAccessRank ( address—string ) : / ☆手順 5 : アドレスの集計処理☆ / GetAddressString ( address_string, buf ) : / ☆手順 4 : アドレス文字列の取得 if 手順 7 : ファイルのクローズ ( fclose( fp ) ) ☆ /

6. C言語によるプログラミング 基礎編 第2版

10.10 実用的なプログラムへの応用 それぞれの項目は、スペースで区切られています。そして、それぞれの項目の文字列は、スペー スを含みません。この形式の文字列から、ホームページアドレス文字列を取得する方法として、 sscanf 関数を利用するのが最も簡単でしよう。すなわち、 sscanf 関数は、スペースまたは改行で区 切られた部分を解析しますので、 3 番目の文字列を取得するだけでよいことがわかります。よって、 プログラムは以下のとおりです。 リスト 10.13 アドレス抽出処理の実装 / ☆アドレス抽出処理☆ / 土 n セ GetAddressString ( char *address_string , char *buf ) ”宅☆ s %*s % s ”′ address_string ) ー sscanf ( buf, return 0 : sscanf の書式指定において、 " % ” " という指定を行っています。、は代入抑止文字と呼ばれます。 代人抑止文字は、その変換指定子に対応する人力文字列をスキップします。したがって、 address-string 文字列には、 " % ☆ s " の指定によって、ホスト名と日時がスキップされ、ホームページ アドレスのみが代人されます。 ロアトレス集計処理 アクセスログから抽出したホームページアドレスを元に、同じホームページアドレスを数え上げ る処理を考えてみましよう。 数え上げたホームページアドレスを格納するデータ構造は、以下のとおりでした。 typedef struct AccessRank T long count : char address [ STRING MAX ] : }AccessRank_t ー / ☆結果を格納する構造体☆ / / ☆ホームページアクセス数☆ / / ☆ホームページアドレス☆ / static AccessRank_t AccessRank [ COUNT MAX ] : 数え上げたホームページアドレスに対して、同じホームページアドレスがすでに存在するかどう かを調べ、もし存在すれば、カウントアップすればよいでしよう。この処理は、 f 。 r 文を用いて以 下のように記述できます。 / ☆ f0 て ( i 0 : i く COUNT MAX : i 十十 ) 同じアドレスであれば、アクセス数を増やす☆ / if ( ! strcmp ( AccessRank [ i ] . address , address_string ) ) AccessRank [ i ] . count 十十 : 361

7. C言語によるプログラミング 基礎編 第2版

AccessRank [ i ] . count break : アドレスが一致するか ? if ( !strcmp( AccessRank[ 土 ] . address, AccessRank [ i ] . count 十十 : break; return 0 : ロ集計結果の並ひ替え処理 10.10 実用的なプログラムへの応用 リスト 10.14 アドレス更新処理 アドレス集計処理 土 n セ UpdateAccessRank ( char *address_string ) 土 n セ i ′ j : fO て ( 土 0 ー i く COUNT MAX : i 十十 ) 新規アドレス文字列か ? if ( AccessRank [ 土 ] . count く = 0 ) AccessRank 構造体にアドレス文字列を登録☆ / strcpy ( AccessRank [ 土 ] . address ′ address_string ) ー 0 ー address_string ) ) 人気のある順にホームページアドレスを出力するためには、構造体全体を並び替える必要があり ます。配列の並び替え処理は、 6.3.2 項のアルゴリズムをそのまま使うことにしましよう。 6.3.2 項 の並び替え処理の部分を抜き出すと以下の通りです。 int temp; int 土′ j : fO て ( 土 f0 て ( j i く n i 十 1 ー 1 ー土十十 ) temp : j く n; j 十十 ) / ☆並べ替え☆ / if ( d [ j ] temp こで、 d は配列、 n は配列要素数、 temp は一時的に格納する変数ですので、これらはそれぞれ AccessRank 、 COUNT_MAX 、 AccessRank_t に置き換えるとそのまま使用することができますが、 363

8. C言語によるプログラミング 基礎編 第2版

1 0 章ファイル 文字列の比較は、 7 章で説明した strcmp 関数を使用します。 AccessRank 構造体配列は、 static で 宣言されており、すべてが 0 で初期化されます。 AccessRank 構造体配列にアクセスログから抽出し たホームページアドレスが存在しなかった場合は、 AccessRank 構造体配列に新規にホームページ アドレスを登録するという処理を考えてみましよう。 ます、 AccessRank 構造体配列に「ホームページアドレスが存在しない」とは具体的にどのよう なことでしようか。 Acce s sRank 構造体配列の cou nt は、 0 で初期化されます。したがって、 AccessRank 構造体の count 変数が 0 であることをチェックすればよいことがわかります。 if ( AccessRank [ 土 ] . count く = 0 ) 新規追加処理 次に、新規に「ホームページアドレスを登録する」ということをどのように考えればよいでしよ うか。 AccessRank 構造体に、ホームページアドレス文字列をコピーして、 いでしよう。すなわち、 strcpy 関数を使用して、 strcpy ( AccessRank [ 土 ] . address ′ address—string ) : カウントを 1 にすればよ AccessRank [ i ] . count と記述できます。まとめると、 if ( AccessRank [ i ] . count く = 0 ) strcpy ( AccessRank [ i ] . address ′ AccessRank [ i ] . count address string ) となります。作成したことをすべてまとめると UpdateAccessRank 関数は、以下のようになります。 362

9. C言語によるプログラミング 基礎編 第2版

9.4 構造体の活用 これは、まちがいです。優先順位を明示的に示すと、 &(sample. x) となります。構造体へのポイ ンタ p に、メンバである int 型変数 x のポインタを代人しようとしています。この例では、コンパイ ル時にエラーとなるでしよう。正しくは、次のように記述します。 struct tag *p ′ int *pp ′ p = &sample : pp = &sample . x; / ☆ p に構造体 sample のアドレスを代入 / ☆ pp に構造体 sample のメンバ x のアドレスを代入☆ / p は構造体の先頭を指し示すポインタで、 pp は最初のメンノヾを指し示すポインタです。 p と pp は 同じアドレスを指しますが、まったく性質の違うポインタであることを覚えておいてください , 22 。 また、共用体へのポインタも構造体へのポインタとまったく同じ方法で定義、および参照が可能 たとえば、住所情報を出力する関数は、引数に構造体変数を用いて次のようにすることが可能で 構造体は関数の戻り値の型や引数としても利用できます。 構造体と関数 9.4.3 です。 struct address { す。 int char char z IP : address[ 82 tel[ 20 レ レ void print_address ( st て uct printf ( "address : %sYn" printf ( printf ( :%1Yn" te1:%sYn" ZiP / ☆郵便番号☆ / / ☆住所☆ / / ☆電話番号☆ / address addr ) addr . address ) : addr . te1 ) : addr. zip ) : 構造体を関数の引数にするメリットは何でしようか。構造体が複数のデータをより自然な形でま とめることができることはすでに学びました。関数への利用でも同じことがいえるでしよう。関数 に対して多くのデータを渡す必要がある場合、構造体にまとめてしまえば 1 つの引数で済んでしま います。これは、 OS の API , 23 でもよく利用されている手法です。たとえば、シリアル通信 , 24 の環 境設定をする関数では、通信速度やパリティなど通信に関するすべてのパラメータを構造体にまと めて関数引数としています。 マ 22 マ 23 マ 24 つまり、 p と pp はアドレスとしてはメモリ上の同じ場所を指しますが、印は構造体データとして扱われ、 *PP は int 型 データとして扱われます。 Application Programminng lnterface の略で、 OS ( オペレーティングシステム ) がもつ機能をプログラムから利用できるよ うに、 OS 側で用意している関数群のことです。システムコールとも呼ばれます。 シリアル通信は複数の端末を接続したり、端末と周辺機器を接続したりする通信方式の 1 つです。代表的なものに RS ー 232C などの規格があり、コンピュータとモデムとの接続などに利用されます。通信を行うためには、通信速度やパリ ティなどの条件を接続する双方で一致させておく必要があります。 315

10. C言語によるプログラミング 基礎編 第2版

実用的なプログラムへの応用 10.10 ↓ fgets 関数で 1 行読み込み み 込 み アクセスログ 了 終 み 込 み 三ロ GetAccessString 関数 ↓ AccessRank ( 構造体配列 ) 参照 SortAccessRank 関数 ↓ WriteAccessRank 関数 出力 ランキングリスト ・図 10.7 各関数の処理イメージ それでは、全体の流れを示すために main 関数を実際に作成してみましよう。 int main ( void ) F 工 LE *fp; char buf [ STRING MAX ] ー char address string [ STR 工 NG MAX ] ー / ☆手順 1 : ファイルのオープン fp = fopen ( "access—log. txt" if ( fp U 石石 ) fprintf ( stderr, " ファイルが見つかりません一 access—log. txtYn" ) ′ exit ( EXIT_FA 工 LURE ) ー / ☆手順 2 : ファイルの最後か ? / ☆手順 3 : もし、ファイルの終端でなければ、 1 行読み込み ☆ / while ( fgets ( buf ′ STR 工 NG MAX, fp ) ) 手順 4 : アドレス文字列の取得☆ / GetAddressString ( address_string ′ buf ) ー 手順 5 : アドレスの集計処理 UpdateAccessRank ( address_string ) ー / ☆手順 7 : ファイルのクローズ if ( fclose( fp ) ) 357