試し読みできます
課題1 「重複のない4桁の乱数を生成する」
数当てゲーム
を行うプログラム
[出典]平成18年度 秋期 午後試験 問6
課題1 「重複のない4桁の乱数を生成する」
プログラムが生成した目標数をユーザーが推測する数当てゲームを作成します。 手始めに目標数をランダムに生成する関数createRandomNumber()
と、ユーザーから入力された推測数がルールに違反していないかチェックする関数isValidNumber()
を作成してください。
目標数と推測数のルールは「各桁の数字がすべて異なる4桁の数字列」です。 プログラム内ではこれらの数字をint
型でなくchar
型の配列に格納します。

試し読みできます
ソースコードの雛形
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
/** 目標数の桁数 */
#define DIGITS 4
#define TRUE 1
#define FALSE 0
void createRandomNumber(char target[]);
int isValidNumber(char num[]);
/**
* @brief 重複のない数字列をランダムに生成する。
*
* @param [out] target 目標数
* @return なし
*/
void createRandomNumber(char target[])
{
/** @todo 実装してください。 */
}
/**
* @brief 重複のない数字列かチェックする。
*
* @param [in] num 推測数
* @retval TRUE すべて異なる数字の場合
* @retval FALSE それ以外の場合
*/
int isValidNumber(char num[])
{
/** @todo 実装してください。 */
return TRUE;
}
int main(int argc, char *argv[])
{
char target[DIGITS + 1];
int valid;
/* 擬似乱数を初期化する。 */
srand( (unsigned int)time(NULL) );
createRandomNumber(target);
valid = isValidNumber(target);
printf("%s is %d\n", target, valid );
valid = isValidNumber("3474");
printf("3474 is %d\n", valid );
return 0;
}
試し読みできます
課題1 「URLエンコードを行う」
文字列のURLエンコード
を行うプログラム
[出典] 平成16年度 秋期 午後試験 問6
課題1 「URLエンコードを行う」
URLとして使用できる文字には制限があるため、CGIなどへGETメソッドでリクエストを送信する際には文字列パラメータを次のような規則に従って変換する必要があります。 文字列のURLエンコードを行う関数URLEncode()
を作成してください。- 英数字と'@'(0x40)、'*'(0x2A)、'-'(0x2D)、'.'(0x2E)、'_'(0x5F)の記号は変換しない。
- それ以外の文字は'%'の後に文字コードの16進表記(2桁)を続けた3文字に変換する。

試し読みできます
ソースコードの雛形
#include <stdio.h>
#include <string.h>
/** URLバッファサイズ */
#define URLSIZE 256
int replaceChar(unsigned char c);
void URLEncode(unsigned char *input, unsigned char *output);
/**
* @brief 変換する必要のある文字かチェックする。
*
* @param [in] c 文字
* @retval 0 無変換文字の場合
* @retval 1 それ以外の場合
*/
int replaceChar(unsigned char c)
{
if( '0' <= c && c <= '9' ) return 0;
if( 'A' <= c && c <= 'Z' ) return 0;
if( 'a' <= c && c <= 'z' ) return 0;
if( '@' == c ) return 0;
if( '*' == c ) return 0;
if( '-' == c ) return 0;
if( '.' == c ) return 0;
if( '_' == c ) return 0;
return 1;
}
/**
* @brief 文字列をURLエンコードする。
*
* @param [in] input エンコード前の文字列
* @param [out] output エンコード済み文字列
* @return なし
*/
void URLEncode(unsigned char *input, unsigned char *output)
{
/** @todo 実装してください。 */
}
int main(int argc, char *argv[])
{
char param[URLSIZE];
/* テストデータでURLEncode()を実行する。 */
URLEncode("Hi!", param);
printf("Hi! => %s\n", param);
return 0;
}
試し読みできます
課題1 「UNIX形式のパスを変換する」
相対パスを絶対パスに
変換するプログラム
[出典] 平成21年度 春期 午後試験 問9
課題1 「UNIX形式のパスを変換する」
UNIX系OSのパス表記は、ディレクトリ名を「/
」で区切り、ルートディレクトリ「/
」から始まる絶対パスを使用します。 相対パスで使用する「.
」はカレントディレクトリを指し、「..
」は1つ上のディレクトリを指します。 パスがディレクトリを指すとき末尾の「/
」はあってもなくても構いません。 なお相対パスに含まれる「..
」が多すぎる場合、ルートディレクトリ直下を指しているものと解釈されます。与えられたUNIX形式のパスを絶対パスに変換する関数
convert()
を作成してください。
試し読みできます
ソースコードの雛形
#include <stdio.h>
#include <string.h>
void convert(const char *path, const char *base, char *result);
/**
* @brief 相対パスを絶対パスに変換する。
*
* @param [in] path 変換前のパス
* @param [in] base カレントディレクトリの絶対パス
* @param [out] result 変換後の絶対パス
* @return なし
*/
void convert(const char *path, const char *base, char *result)
{
/** @todo 実装してください。 */
}
int main(int argc, char *argv[])
{
char result[FILENAME_MAX];
convert("../../b/c/", "/a/d/e/", result);
printf("%s\n", result);
return 0;
}
試し読みできます
課題1 「単語幅でワードラップする」
単語幅でワードラップ
を行うプログラム
[出典] 平成17年度 春期 午後試験 問6
課題1 「単語幅でワードラップする」
欧文ピッチ処理(文字固有の字幅に従って字送りする)を行って印刷するとき、単語の途中で改行されないように英文テキストを出力する関数print_string()
と、単語幅を求める関数word_width()
を作成してください。英文テキストは単語の配列として関数
print_string()
に渡されるものとします。 出力する際は単語の区切りとなる空白文字を補ってください。なお英文テキストに含まれる各文字の文字幅は、後述する構造体
CHARPROF
の配列にあらかじめ定義されているものとします。
試し読みできます
ソースコードの雛形
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/** 1行の行幅(ピクセル数)*/
#define LINE_WIDTH 120
/** 文字の高さ(ピクセル数) */
#define MOJI_HIGHT 10
/** 英文テキストに含まれる文字群 */
const char EnglishChars[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"!\"#%&'()*+,-./:;<=>?[]^_{|}~";
/**
* @brief 文字幅のリスト要素
*/
typedef struct
{
char char_p; /**< 文字 */
int char_w; /**< 文字幅(ピクセル数) */
} CHARPROF;
int word_width(char *str, CHARPROF *char_list);
void print_string(int line_w, char *str_list[], CHARPROF *char_list, int space_w);
int init_char_list(CHARPROF *char_list, int *space_w);
/**
* @brief テキストをワードラップして表示する。
*
* @param [in] line_w 1行の行幅(ピクセル数)
* @param [in] str_list 英文を構成する単語の配列
* @param [in] char_list 文字幅のリスト
* @param [in] space_w 空白文字の文字幅(ピクセル数)
* @return なし
*/
void print_string(int line_w, char *str_list[], CHARPROF *char_list, int space_w)
{
/** @todo 実装してください。*/
}
/**
* @brief 単語幅を計算する。
*
* @param [in] str 単語
* @param [in] char_list 文字幅のリスト
* @return 単語幅(ピクセル数)
*/
int word_width(char *str, CHARPROF *char_list)
{
/** @todo 実装してください。*/
return 1;
}
/**
* @brief 文字幅のリストを初期化する。
*
* @param [out] char_list 文字幅のリスト
* @param [out] space_w 空白文字の文字幅(ピクセル数)
* @retval 0 成功
* @retval -1 失敗
*/
int init_char_list(CHARPROF *char_list, int *space_w)
{
int i;
/* 空白文字の文字幅を設定する。 */
*space_w = (MOJI_HIGHT / 2) + 1;
/* 文字幅を適当に設定する。 */
srand(1234);
for( i = 0; i < strlen(EnglishChars); i++ )
{
char_list[i].char_p = EnglishChars[i];
char_list[i].char_w = *space_w + rand() % 4;
}
return 0;
}
int main(int argc, char *argv[])
{
char *test_data[] = {
"This","is","a","pen.",
"You","don't","need","a","pen","to","write","C","programs.",
NULL
};
CHARPROF char_list[sizeof(EnglishChars)];
int space_w;
/* 文字幅のリストを初期化する。 */
init_char_list(char_list, &space_w);
/* テストデータでprint_string()を実行する。 */
print_string(LINE_WIDTH, test_data, char_list, space_w);
return 0;
}
試し読みできます
課題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?
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?

試し読みできます
ソースコードの雛形
#include <stdio.h>
/** 1行の最大文字数 */
#define COLUMNS 40
void printout_text(char *filename);
/**
* @brief テキストをワードラップして表示する。
*
* @param [in] filename 英文テキストファイル
* @return なし
*/
void printout_text(char *filename)
{
/** @todo 実装してください。 */
}
int main(int argc, char *argv[])
{
if( argc < 2 )
{
printf("usage: %s filename\n", argv[0]);
return -1;
}
printout_text(argv[1]);
return 0;
}
試し読みできます
奥付
基本情報技術者レベルの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/)
運営会社:株式会社ブクログ