2017-01-01から1年間の記事一覧

K&R演習[3-2]

課題 改行文字やタブのよな文字を、目で見えるエスケープ文字\nや\tに変換しながら、sをtにコピーするような関数escape(s, t)を書け。 逆に、エスケープ系列を実際の文字に変換する関数も書いてみよ。 回答 /* * @file 3-2 * @brief * @author * @date * @no…

K&R演習[2-10]

課題 if-elseの代わりに条件式を使って、大文字を小文字に変換する関数lowerを書き直せ。 回答 #include <stdio.h> int lower(int c); /* * @fn Main * @brief * @param * @return * @note */ int main(void) { int c, a; c = 'a'; a = lower(c); printf("%c, %c\n", </stdio.h>…

K&R演習[2-8]

課題 整数xの値を右にnビット回転する関数rightrot(x, n)を書け。 回答 #include <stdio.h> unsigned rightrot(unsigned x, int n); /* * @fn Main * @brief * @param * @return * @note */ int main(void) { unsigned ret, x, n; x = 65535; n = 0; ret = rightrot(x</stdio.h>…

K&R演習[2-7]

課題 xのビット位置pからnビットを反転し、他のビットはそのままにしたxをかえす関数invert(x,p,n)を書け。 回答 #include <stdio.h> unsigned invert(unsigned x, int p, int n); /* * @fn Main * @brief * @param * @return * @note */ int main(void) { unsigned x</stdio.h>…

K&R演習[2-6]

課題 位置pから始まるnビットをyの右端のnビットにセットし、他のビットはそのままにしたxを返す関数setbits(x, p, n, y)を書け。 回答 #include <stdio.h> unsigned setbits(unsigned x, int p, int n, unsigned y); /* * @fn Main * @brief * @param * @return * @n</stdio.h>…

K&R演習[2-5]

課題 文字列s2の任意の文字と等しい文字列s1の最初の文字位置を返す関数any(s1, s2)を書け。ただし、一致する文字がなければ-1を返す。 回答 /** * @file プログラミング言語C 2-5 * @brief * @author hiroyuki murai * @date 20171118 * note */ #include <stdio.h> </stdio.h>…

K&R演習[2-4]

課題 文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1, s2)を書け。 回答 #include <stdio.h> #include <string.h> void squeeze(char s1[], char s2[]); const int OK = 1; const int NG = 0; /** * @fn Main * @brief * @param * @return * @detail </string.h></stdio.h>…

K&R演習[2-3]

課題 16進数の文字列(0xあるいは0Xが付いているものも含めて)をそれと同値な整数値へ変換するhtoi(s)を書け。 回答 #include <stdio.h> #include <string.h> int htoi(char *str); /** * @fn Main * @brief * @param * @return * @detail */ int main(void) { int i; char str[3</string.h></stdio.h>…

K&R演習[2-2]

前提 for (i = 0; i < lim - 1 && (c = getchar() != '\n' && c != EOF; i++) { s[i] = c; } 課題 forループに等価なループを、&&あるいは||を使用しないで書け 回答 i = 0; while ((c = getchar() != EOF) { if (c == '\n') { break; } if (i >= (lim - 1) …

K&R演習[2-1]

課題 char, short, int, long変数のsigned及びunsignedの両方の方について、それらの範囲を決めるプログラムを、標準ヘッダからの適当な値を印字することと、直接計算することの双方で書け。 回答 #include <stdio.h> #include <limits.h> #include <math.h> /** * @fn Main * @brief * </math.h></limits.h></stdio.h>…

K&R演習[1-24]

課題 括弧、中括弧、大括弧の釣り合いが取れていないといったプログラムの基本的な構文エラーのチェックを行なうプログラムを書け。引用符、二重引用符・コメントなどの処理も忘れないこと。 回答 /** * @file プログラミング言語C 1-24 * @brief 括弧、中括…

K&R演習[1-23]

課題 Cプログラムから全てのコメントを除去するプログラムを書け。 回答 #include <stdio.h> #include <string.h> typedef unsigned long int u8; /** * @fn Main * @brief * @param * @return * @detail */ int main(void) { int c; char str[1000]; u8 pos_str = 0, pos_start</string.h></stdio.h>…

K&R演習[1-22]

課題 入力行を入力のn文字目までにある最後の非ブランク文字の後で折りたたむプログラムを書け。 私見 「折りたたむ」の意味が分からない。 方針 「折りたたむ」はブランク文字の削除を解釈する。 回答 #include <stdio.h> #include <string.h> typedef unsigned long int u8; c</string.h></stdio.h>…

K&R演習[1-21]

課題 ブランクの列を同じスペーシングをお粉う最小の数のタブおよびブランクで置き換えるプログラムentabを書け。 回答 #include <stdio.h> #include <string.h> typedef unsigned long int u8; const int TAB_WIDTH = 8; // タブ幅 void detab(u8 n, char *rslt); void entab(c</string.h></stdio.h>…

K&R演習[1-20]

課題 入力されたタブを、次のタブ・ストップまでのスペースを埋める適当な数のブランク(空白)で置き換えるプログラムdetabを書け。 回答 #include <stdio.h> #include <string.h> typedef unsigned long int u8; const int TAB_WIDTH = 4; // タブ幅 void detab(u8 n, char *rsl</string.h></stdio.h>…

K&R演習[1-19]

課題 文字列Sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に1行ずつ逆転するプログラムを書け。 回答 #include <stdio.h> #include <limits.h> #include <string.h> #define MAX_LINE_NUM 1000 /* 入力行数の最大値 */ #define MAX_LENGTH 1000 /* 入力文字</string.h></limits.h></stdio.h>…

K&R演習[1-18]

課題 各入力行から、行の後ろのブランクやタブを取り除き、かつ空白行は全て削除するようなプログラムを書け。 回答 #include <stdio.h> #include <limits.h> #include <string.h> #define MAX_LINE_NUM 1000 /* 入力行数の最大値 */ #define MAX_LENGTH 1000 /* 入力文字列長の最大値 */ </string.h></limits.h></stdio.h>…

K&R演習[1-17]

課題 80字より長い行を全て印字するプログラムを書け。 回答 /** * @file プログラミング言語C 1-17 * @brief * @author hiroyuki murai * @date 20171008 * @note */ #include <stdio.h> #include <limits.h> #include <string.h> #define MAX_LINE_NUM 1000 /* 入力行数の最大値 */ #def</string.h></limits.h></stdio.h>…

K&R演習[1-17]

課題 一番長い行を印字するプログラムのmainルーチンを書き直して、任意の行の長さの入力行群の長さ、およびテキストの出来るだけ多くの部分を正しく印字するようにせよ。 回答 #include <stdio.h> #include <limits.h> #define MAX_LINE_NUM 1000 /* 入力行数の最大値 */ #defi</limits.h></stdio.h>…

K&R演習[1-16]

課題 一番長い行を印字するプログラムのmainルーチンを書き直して、任意の行の長さの入力行群の長さ、およびテキストの出来るだけ多くの部分を正しく印字するようにせよ。 回答 #include <stdio.h> #include <limits.h> #define MAX_LINE_NUM 1000 /* 入力行数の最大値 */ #defi</limits.h></stdio.h>…

K&R演習[1-15]

課題 1.2節の温度換算プログラムを、変換の為の関数を使うように書き直せ。 回答 #include <stdio.h> // 華氏を摂氏に変換 float conversion_fahrenheit2celsius(float f); /** * @fn Main * @brief * @param * @return * @detail */ int main(void) { float fahr, ce</stdio.h>…

K&R演習[1-14]

課題 入力中の異なる文字の頻度をヒストグラムにプリントするプログラムを書け。 方針 「入力中の異なる文字の頻度をヒストグラムにプリントする」と解釈する。 回答 #include <stdio.h> const int CNT = 10; // 出現回数 const int N_CHAR = 26; // アルファベット数</stdio.h>…

K&R演習[1-13]

課題 入力した単語の長さをヒストグラムにしてプリントするプログラムを書け。 解答 #include <stdio.h> const int CNT = 10; // 出現回数 const int LENGTH = 20; // 文字列長 void print_histogram(int *cnt); // ヒストグラム表示 /** * @fn main * @brief 単語の</stdio.h>…

K&R演習[1-12]

課題 入力した単語を1行に一つずつ印字するプログラムを書け 解答 #include <stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { // ファイル終端まで if ((c == ' ') || (c == '\t')) { // タブかバックスペースを printf("\n"); // 改行に置換す</stdio.h>…

K&R演習[1-11]

課題 単語カウントプログラムのテストは、どのようにするか? 方針 複数条件網羅 同値分割で、state == OUTを'a'とする 解答 ・\n ・\b, 'a', \n ・\t, 'a', \n ・'a', '\n' 課題 もしバグがあるとしたら、それを暴き出すにはどんな入力をするのがよいか? …

K&R演習[1-10]

課題 各タブを\tに、各バックスペースを\bに、各バックスラッシュを\\に置き換えながら、 入力を出力に複写するプログラムを書け。 ソースコード #include <stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { if (c == '\t') { printf("\\t"); } el</stdio.h>…

K&R演習[1-9]

課題 二つ以上の空白を一つの空白に置き換えながら、入力を出力に複写するプログラムを書け。 ソースコード #include <stdio.h> int main(void) { int c1, c2, cnt; cnt = 0; while ((c1 = getchar()) != EOF) { if ((cnt >= 2) && // 2文字目以降で (c2 == c1) && //</stdio.h>…

K&R演習[1-8]

課題 空白、タブ、改行を数えるプログラムを書け。 ソースコード #include <stdio.h> int main(void) { int c, ns, nt, nl; ns = nt = nl = 0; while ((c = getchar()) != EOF) { if (c == '\n') ++nl; /* 改行 */ if (c == '\t') ++nt; /* タブ */ if (c == ' ') ++n</stdio.h>…

getchar()の機能

機能 キーボードからの入力を、Enter入力まで待つ。 Enter入力で待ちを解除して、以降は呼ばれる度に1文字ずつ入力された順に返す 例 ソースコード #include <stdio.h> int main(void) { int c; while (1) { c = getchar(); printf("getchar:%c\n", c); } } 実行内容</stdio.h>…

K&R演習[1-7]

課題 EOFの値を印字するプログラムを書け。 ソースコード #include <stdio.h> int main(void) { /* EOFの値を印字する */ printf("EOF:%d\n",EOF); } 実行結果 EOF:-1</stdio.h>