目次
はじめに
はじめに
Visual C++ 2010 Expressのインストール
プログラムの作成
hello.c
コンパイルと実行
C言語プログラミングの学習環境
終了ステータスって?
整数値を3桁区切りで表示するプログラム
課題1 「整数値を3桁区切りで表示する」
ソースコードの雛形
h20a6.c
ソースコードの解説
配列の要素を反転する
課題2 「整数型の最大値と最小値を表示する」
h20a6_min.c
ソースコードの解説
課題3 「64ビットの整数値を表示する」
h20a6_x64.c
ソースコードの解説
他の言語のlong型
課題4 「整数値を4桁区切りの16進数で表示する」
h20a6_hex.c
ソースコードの解説
多倍長整数の加算を行うプログラム
課題1 「多倍長整数型を作る」
ソースコードの雛形
h21a9_set.c
ソースコードの解説
課題2 「多倍長整数の比較を行う」
h21a9_cmp.c
ソースコードの解説
課題3 「多倍長整数の加算を行う」
h21a9_add.c
ソースコードの解説
条件演算子を使用する
課題4 「多倍長整数の減算を行う」
h21a9_sub.c
ソースコードの解説
課題5 「多倍長整数型に符号を追加する」
h21a9_ssub.c
ソースコードの解説
課題6 「符号付き多倍長整数の加減算を行う」
h21a9_sign.c
h21a9_sign.c - part2
ソースコードの解説
数当てゲームを行うプログラム
課題1 「重複のない4桁の乱数を生成する」
ソースコードの雛形
h18a6_prev.c
ソースコードの解説
擬似乱数って?
課題2 「マスターマインドを作成する」
ソースコードの雛形
h18a6.c
ソースコードの解説
課題3 「平均推測回数を表示する」
h18a6_average.c
ソースコードの解説
課題4 「組合せを用いてマスターマインドを解くAIを作成する」
h18a6_ai.h
h18a6_ai.c
h18a6_ai_comb.c
ソースコードの解説
課題5 「順列を用いてマスターマインドを解くAIを作成する」
h18a6_ai_perm.c
ソースコードの解説
課題6 「順列のみを用いてマスターマインドを解くAIを作成する」
h18a6_ai_perm10.c
ソースコードの解説
ソースコードの分割
文字列のURLエンコードを行うプログラム
課題1 「URLエンコードを行う」
ソースコードの雛形
h16a6.c
ソースコードの解説
ポインタを扱うときの注意
課題2 「空白文字を+記号に置換する」
h16a6_space.c
ソースコードの解説
課題3 「URLデコードを行う」
h16a6_decode.c
ソースコードの解説
相対パスを絶対パスに変換するプログラム
課題1 「UNIX形式のパスを変換する」
ソースコードの雛形
h21h9.c
ソースコードの解説
課題2 「Windows形式のパスを変換する」
h21h9_win.c
ソースコードの解説
課題3 「両方の形式を変換する」
h21h9_both.c
ソースコードの解説
WindowsでもUNIXでもコンパイルできるソースコード
課題4 「ファイルの有無を確認する」
h21h9_exists.c
ソースコードの解説
標準ライブラリ関数の調べ方
単語幅でワードラップを行うプログラム
課題1 「単語幅でワードラップする」
ソースコードの雛形
h17h6.c
ソースコードの解説
課題2 「文字列をトークン分割する」
h17h6_token.c
ソースコードの解説
課題3 「改行文字に対応する」
h17h6_newline.c
ソースコードの解説
Windowsのフォントから文字幅を取得してみる
文字数でワードラップを行うプログラム
課題1 「文字数でワードラップする」
ソースコードの雛形
h22h9.c
ソースコードの解説
ファイル記述子って?
課題2 「タブ文字に対応する」
h22h9_tab.c
ソースコードの解説
課題3 「定義済みのキーワードを参照する」
ソースコードの雛形
h22h9_keyword1.c
ソースコードの解説
課題4 「キーワードを定義する」
h22h9_keyword2.c
ソースコードの解説
奥付
奥付

閉じる


<<最初から読む

45 / 120ページ

試し読みできます

ソースコードの雛形

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. /** 目標数の桁数 */
  6. #define DIGITS  4
  7. #define TRUE    1
  8. #define FALSE   0
  9. void createRandomNumber(char target[]);
  10. int isValidNumber(char num[]);
  11. /**
  12. *  @brief 重複のない数字列をランダムに生成する。
  13. *
  14. *  @param [out] target 目標数
  15. *  @return なし
  16. */
  17. void createRandomNumber(char target[])
  18. {
  19.     /** @todo 実装してください。 */
  20. }
  21. /**
  22. *  @brief 重複のない数字列かチェックする。
  23. *
  24. *  @param [in] num 推測数
  25. *  @retval TRUE    すべて異なる数字の場合
  26. *  @retval FALSE   それ以外の場合
  27. */
  28. int isValidNumber(char num[])
  29. {
  30.     /** @todo 実装してください。 */
  31.     
  32.     return TRUE;
  33. }
  34. int main(int argc, char *argv[])
  35. {
  36.     char target[DIGITS + 1];
  37.     int valid;
  38.     
  39.     /* 擬似乱数を初期化する。 */
  40.     srand( (unsigned int)time(NULL) );
  41.     
  42.     createRandomNumber(target);
  43.     valid = isValidNumber(target);
  44.     printf("%s is %d\n", target, valid );
  45.     
  46.     valid = isValidNumber("3474");
  47.     printf("3474 is %d\n", valid );
  48.     
  49.     return 0;
  50. }

試し読みできます

課題1 「URLエンコードを行う」

文字列のURLエンコード
を行うプログラム

[出典] 平成16年度 秋期 午後試験 問6

課題1 「URLエンコードを行う」

 URLとして使用できる文字には制限があるため、CGIなどへGETメソッドでリクエストを送信する際には文字列パラメータを次のような規則に従って変換する必要があります。 文字列のURLエンコードを行う関数URLEncode()を作成してください。
  1. 英数字と'@'(0x40)、'*'(0x2A)、'-'(0x2D)、'.'(0x2E)、'_'(0x5F)の記号は変換しない。
  2. それ以外の文字は'%'の後に文字コードの16進表記(2桁)を続けた3文字に変換する。
URLエンコードの変換例

試し読みできます

ソースコードの雛形

  1. #include <stdio.h>
  2. #include <string.h>

  3. /** URLバッファサイズ */
  4. #define URLSIZE 256


  5. int replaceChar(unsigned char c);
  6. void URLEncode(unsigned char *input, unsigned char *output);


  7. /**
  8. * @brief 変換する必要のある文字かチェックする。
  9. *
  10. * @param [in] c 文字
  11. * @retval 0 無変換文字の場合
  12. * @retval 1 それ以外の場合
  13. */
  14. int replaceChar(unsigned char c)
  15. {
  16. if( '0' <= c && c <= '9' ) return 0;
  17. if( 'A' <= c && c <= 'Z' ) return 0;
  18. if( 'a' <= c && c <= 'z' ) return 0;
  19. if( '@' == c ) return 0;
  20. if( '*' == c ) return 0;
  21. if( '-' == c ) return 0;
  22. if( '.' == c ) return 0;
  23. if( '_' == c ) return 0;
  24. return 1;
  25. }


  26. /**
  27. * @brief 文字列をURLエンコードする。
  28. *
  29. * @param [in] input エンコード前の文字列
  30. * @param [out] output エンコード済み文字列
  31. * @return なし
  32. */
  33. void URLEncode(unsigned char *input, unsigned char *output)
  34. {
  35. /** @todo 実装してください。 */
  36. }


  37. int main(int argc, char *argv[])
  38. {
  39. char param[URLSIZE];
  40. /* テストデータでURLEncode()を実行する。 */
  41. URLEncode("Hi!", param);
  42. printf("Hi! => %s\n", param);
  43. return 0;
  44. }

試し読みできます

課題1 「UNIX形式のパスを変換する」

相対パスを絶対パスに
変換するプログラム

[出典] 平成21年度 春期 午後試験 問9

課題1 「UNIX形式のパスを変換する」

 UNIX系OSのパス表記は、ディレクトリ名を「/」で区切り、ルートディレクトリ「/」から始まる絶対パスを使用します。 相対パスで使用する「.」はカレントディレクトリを指し、「..」は1つ上のディレクトリを指します。 パスがディレクトリを指すとき末尾の「/」はあってもなくても構いません。 なお相対パスに含まれる「..」が多すぎる場合、ルートディレクトリ直下を指しているものと解釈されます。
 与えられたUNIX形式のパスを絶対パスに変換する関数convert()を作成してください。

UNIX形式のパス変換例

試し読みできます

ソースコードの雛形

  1. #include <stdio.h>
  2. #include <string.h>


  3. void convert(const char *path, const char *base, char *result);


  4. /**
  5. * @brief 相対パスを絶対パスに変換する。
  6. *
  7. * @param [in] path 変換前のパス
  8. * @param [in] base カレントディレクトリの絶対パス
  9. * @param [out] result 変換後の絶対パス
  10. * @return なし
  11. */
  12. void convert(const char *path, const char *base, char *result)
  13. {
  14. /** @todo 実装してください。 */
  15. }


  16. int main(int argc, char *argv[])
  17. {
  18. char result[FILENAME_MAX];
  19. convert("../../b/c/", "/a/d/e/", result);
  20. printf("%s\n", result);
  21. return 0;
  22. }

試し読みできます

課題1 「単語幅でワードラップする」

単語幅でワードラップ
を行うプログラム

[出典] 平成17年度 春期 午後試験 問6

課題1 「単語幅でワードラップする」

 欧文ピッチ処理(文字固有の字幅に従って字送りする)を行って印刷するとき、単語の途中で改行されないように英文テキストを出力する関数print_string()と、単語幅を求める関数word_width()を作成してください。
 英文テキストは単語の配列として関数print_string()に渡されるものとします。 出力する際は単語の区切りとなる空白文字を補ってください。
 なお英文テキストに含まれる各文字の文字幅は、後述する構造体CHARPROFの配列にあらかじめ定義されているものとします。

文字幅、単語幅、行幅

試し読みできます

ソースコードの雛形

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>


  4. /** 1行の行幅(ピクセル数)*/
  5. #define LINE_WIDTH 120
  6. /** 文字の高さ(ピクセル数) */
  7. #define MOJI_HIGHT 10

  8. /** 英文テキストに含まれる文字群 */
  9. const char EnglishChars[] = "0123456789"
  10. "abcdefghijklmnopqrstuvwxyz"
  11. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  12. "!\"#%&'()*+,-./:;<=>?[]^_{|}~";

  13. /**
  14. * @brief 文字幅のリスト要素
  15. */
  16. typedef struct
  17. {
  18. char char_p; /**< 文字 */
  19. int char_w; /**< 文字幅(ピクセル数) */
  20. } CHARPROF;


  21. int word_width(char *str, CHARPROF *char_list);
  22. void print_string(int line_w, char *str_list[], CHARPROF *char_list, int space_w);
  23. int init_char_list(CHARPROF *char_list, int *space_w);


  24. /**
  25. * @brief テキストをワードラップして表示する。
  26. *
  27. * @param [in] line_w 1行の行幅(ピクセル数)
  28. * @param [in] str_list 英文を構成する単語の配列
  29. * @param [in] char_list 文字幅のリスト
  30. * @param [in] space_w 空白文字の文字幅(ピクセル数)
  31. * @return なし
  32. */
  33. void print_string(int line_w, char *str_list[], CHARPROF *char_list, int space_w)
  34. {
  35. /** @todo 実装してください。*/
  36. }


  37. /**
  38. * @brief 単語幅を計算する。
  39. *
  40. * @param [in] str 単語
  41. * @param [in] char_list 文字幅のリスト
  42. * @return 単語幅(ピクセル数)
  43. */
  44. int word_width(char *str, CHARPROF *char_list)
  45. {
  46. /** @todo 実装してください。*/
  47. return 1;
  48. }


  49. /**
  50. * @brief 文字幅のリストを初期化する。
  51. *
  52. * @param [out] char_list 文字幅のリスト
  53. * @param [out] space_w 空白文字の文字幅(ピクセル数)
  54. * @retval 0 成功
  55. * @retval -1 失敗
  56. */
  57. int init_char_list(CHARPROF *char_list, int *space_w)
  58. {
  59. int i;
  60. /* 空白文字の文字幅を設定する。 */
  61. *space_w = (MOJI_HIGHT / 2) + 1;
  62. /* 文字幅を適当に設定する。 */
  63. srand(1234);
  64. for( i = 0; i < strlen(EnglishChars); i++ )
  65. {
  66. char_list[i].char_p = EnglishChars[i];
  67. char_list[i].char_w = *space_w + rand() % 4;
  68. }
  69. return 0;
  70. }


  71. int main(int argc, char *argv[])
  72. {
  73. char *test_data[] = {
  74. "This","is","a","pen.",
  75. "You","don't","need","a","pen","to","write","C","programs.",
  76. NULL
  77. };
  78. CHARPROF char_list[sizeof(EnglishChars)];
  79. int space_w;
  80. /* 文字幅のリストを初期化する。 */
  81. init_char_list(char_list, &space_w);
  82. /* テストデータでprint_string()を実行する。 */
  83. print_string(LINE_WIDTH, test_data, char_list, space_w);
  84. return 0;
  85. }

試し読みできます

課題1 「文字数でワードラップする」

文字数でワードラップ
を行うプログラム

[出典]平成22年度 秋期 午後試験 問9

課題1 「文字数でワードラップする」

 ファイルから英文テキストを読み込んで、単語の途中で改行されないように出力する関数printout_text()を作成してください。 英文テキストには英数字と記号、連続する空白文字と改行文字を含みます。 英数字と記号の文字幅はすべて同じ(固定幅)という前提で、1行の最大文字数は40文字とします。 サンプルとして下記の英文テキストを提示します。 もっと長い英文テキストが必要な場合は海外のニュースサイトなどからコピーしてくると良いでしょう。
 ファイルから文字を読み込むには関数fgetc()を使います。

The C Programming Language

A language that doesn't have everything is actually easier to program in than some that do. Life's too short to code in C, right?


40文字でワードラップ

試し読みできます

ソースコードの雛形

  1. #include <stdio.h>
  2. /** 1行の最大文字数 */
  3. #define COLUMNS 40
  4. void printout_text(char *filename);
  5. /**
  6. * @brief テキストをワードラップして表示する。
  7. *
  8. * @param [in] filename 英文テキストファイル
  9. * @return なし
  10. */
  11. void printout_text(char *filename)
  12. {
  13. /** @todo 実装してください。 */
  14. }
  15. int main(int argc, char *argv[])
  16. {
  17. if( argc < 2 )
  18. {
  19. printf("usage: %s filename\n", argv[0]);
  20. return -1;
  21. }
  22. printout_text(argv[1]);
  23. return 0;
  24. }

試し読みできます

奥付



基本情報技術者レベルのC言語演習課題


http://p.booklog.jp/book/4438


著者 : nakano.h
著者プロフィール:http://p.booklog.jp/users/com2ch/profile


感想はこちらのコメントへ
http://p.booklog.jp/book/4438

ブクログ本棚へ入れる
http://booklog.jp/item/3/4438



電子書籍プラットフォーム : ブクログのパブー(http://p.booklog.jp/
運営会社:株式会社ブクログ



試し読みはここまでです。続きは購入後にお読みいただけます。

この本は有料です。閲覧するには購入する必要があります。
購入するにはしてください。
有料本の購入に関しては、こちらのマニュアルをご確認ください。
販売価格200円(税込)

読者登録

nakano.hさんの更新情報・新作情報をメールで受取りますか?(読者登録について