C

逆ポーランド式を計算するプログラム

C K&R

K&R本 演習5-10 コマンド行からの逆ポーランド式を計算するプログラムexprを書け。各演算子あるいは被演算数は引数として分離されているものとする。例えば expr 2 3 4 + *なら2×(3+4)を計算するようにせよ。 これはかなりプログラムらしい演習ですね。やっ…

strncpy、strncat、strncmpを自作する

C K&R

K&R本 演習5-5 その引数である文字列の最初の最大 n 文字を扱うライブラリ関数strncpy、strncat、strncmpを書け。例えば、strncpy(s,t,n)はtの最大n文字をsにコピーするものにせよ。 まずはstrncpy関数 #include <stdio.h> char *mystrncpy(char *s,char *t,int n) { </stdio.h>…

文字列の終りと比較するstrend関数

C K&R

K&R本 演習5-4 文字列tが文字列sの終りにあるときには1を、そうでないときにはゼロを返す関数strend(s,t)を書け。 #include <stdio.h> #include <string.h> int strend(char *s,char *t) { size_t slen = strlen(s); size_t tlen = strlen(t); if ( slen < tlen ) { return 0; }</string.h></stdio.h>…

チェイン法によるハッシュ探索

http://www.geocities.jp/ky_webid/algorithm/014.htmlハッシュの話が出てきました。LL等、他の言語では言語仕様として存在しているものですね。Cの場合は自分で実装しないといけません。どういう仕組みなのかちゃんと理解するためにもここはマスターする必…

0x03F566ED27179461ULLの求め方

C

2009-07-04 - 当面C#と.NETな記録 404 Blog Not Found:C - でも一番右端の立っているビット位置を求めてみた これ凄いですね。まだC言語勉強し始めて良く分からない部分も多いですが、なんとなくイメージは付きました。0x03F566ED27179461ULLは6ビットのパタ…

atof関数を自作する

C K&R

K&R本 演習4-2 atofを拡張して、次のような科学記法を扱えるようにせよ。 123.45e-6ここで、浮動小数点のうしろには、eやEと符号の付きうる指数部が続いてもよいとする。 #include <stdio.h> #include <ctype.h> #include <math.h> double myatof(char *s) { double type = 1; double e</math.h></ctype.h></stdio.h>…

空の引数リストではなくvoidを使う

C K&R

K&R本 4.2 double atof() のように、関数の宣言が引数を含まないときには、このatofの引数については何も仮定しないものと受け取られ、すべてのパラメータ・チェック機能はオフにされる。空の引数リストが許される特別な理由は、古いCプログラムを新しいコン…

itoa関数の再帰版の実装

C K&R

K&R本 演習4-12 printdのアイデアを使ってitoaの再帰版を書け。すなわち、再帰ルーチンを呼ぶことによって整数を文字列に変換せよ。 再帰を使って変換ですか。面白そうですね。 #include <stdio.h> void myitoa (int n,char *s) { if(n){ int i = 0; int l = n; while</stdio.h>…

警告レベル最大でstrcpy等を使うと警告

C

VCでstrcpy関数を含んだプログラムをコンパイルすると警告が出る。どうもセキュリティ関連でstrcpy_s関数の方を使わないといけないみたい。 #include <stdio.h> #include <string.h> int main (void) { char s1[10]; char s2[] = "abcedf"; strcpy_s(s1,sizeof(s1),s2); printf(</string.h></stdio.h>…

自己組織化探索

http://www.geocities.jp/ky_webid/algorithm/013.html検索結果位置を保存しておくということですか、やってみます。リスト構造は循環リスト再実装 - (void*)Pないとで作った物を利用します。 #include <stdio.h> #include <stdlib.h> struct LIST { int data; struct LIST *nex</stdlib.h></stdio.h>…

配列のシャッフル

C

前回の記事で配列のユニークをやったので思いつきで今回は配列のシャッフルをやってみたいと思います。 #include <time.h> #include "mylib.h" void shuffle (int *num, int array_size) { int i,j; srand( (unsigned)time(NULL) ); for(i=0;i</time.h>

配列のユニーク処理

C

エロと風俗情報満載 どう抜く?面白そうな題材を見つけました。配列の要素に同じ要素が含まれていたら除去するという処理です。 #include "mylib.h" int unique (int *num, int array_size) { int i,j,k; int uniq; for(j=i=0;i

文字列ポインタ配列のソート

文字列のポインタ配列をソートするにはどうしたらいいんだろうと思って実装してみた。 #include <stdio.h> #include <string.h> #include "mylib.h" void shell_sort (char **data, int array_size) { int h; int i,j; if ( array_size <= 1 ) { return; } for(h=1; h<array_size; h=h*3+1); for(h/=3;h>0;h/=3){ f</array_size;></string.h></stdio.h>…

循環リスト再実装

循環リスト - (void*)Pないともう少しシンプルに実装し直してみます。前の時はlast変数を用意してリストへの追加が最後尾になるように実装したのですが、あまり必要なさそうなので今回は無しでやります。 #include <stdio.h> #include <stdlib.h> struct LIST { int data; struc</stdlib.h></stdio.h>…

双方向リスト

http://www.geocities.jp/ky_webid/algorithm/012.html逆方向にも参照できる双方向リストですね。循環リストの拡張でやってみます。 #include <stdio.h> #include <stdlib.h> struct LIST { int data; int last; struct LIST *next; struct LIST *prev; }; typedef struct LIST </stdlib.h></stdio.h>…

文字列から文字群が見つかった位置を返す

C K&R

K&R本 演習2-5 文字列s2の任意の文字と等しい文字列s1の最初の文字位置を返す関数any(s1,s2)を書け。ただし一致する文字がなければ-1を返す。 今度は誤読しないよう。 #include <stdio.h> int any(const char *s1,const char *s2) { const char *s = s2; int i,j; int</stdio.h>…

文字列中のある文字列を除去する

C K&R

K&R本 演習2-4 文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1,s2)を書け。 #include <stdio.h> void squeeze (char *s, char *del) { char *p = del; int len = 0; int i,j,k; while(*del++) { len++; } for(j=i=0;s[i];++i){ if ( s[i] =</stdio.h>…

16進数から10進数へ変換するhtoi関数

C K&R

K&R本 演習2-3 16進数の文字列(0xあるいは0Xが付いているものも含めて)をそれと同値な整数値へ変換する関数htoi(s)を書け。許される文字は0から9とaからfおよびAからFである。 #include <stdio.h> int htoi (const char *s) { int n; if ( *s != '0' || !(*(s+1) != '</stdio.h>…

atoi関数での10倍していく処理

C K&R

K&R本 2.7atoi関数のサンプルがあった int atoi(char s[]){ int i, n; n = 0; for(i = 0; s[i] >= '\0' && s[i] <= '9'; ++i ) { n = 10 * n + (s[i] - '0'); } } このnの一行が素晴らしい。僕がatoi関数を自作した時はこうなっていた。 while(*str != '\0')…

定数のサフィックス

C K&R

K&R本 2.31234等の数値定数を使用する場合、サフィックスをつけることによって型を明示的に指定できる。以下に簡単な表を示す 定数 型 intの範囲内の数値(例 1234) int intの範囲以上の数値(例 5000000000) long lかLを付ける(例 1234l) long 小数点の数値(…

循環リスト

http://www.geocities.jp/ky_webid/algorithm/011.html片方向の線形リストの最後の要素が、一番最初の要素を指すわけですね。似たような実装になるんでしょうか。とりあえず実装してみます。 #include <stdio.h> #include <stdlib.h> struct LIST { int data; int last; struct </stdlib.h></stdio.h>…

extern

C K&R

K&R本 1.10関数外部で宣言された変数を関数内部で使用するにはexternが必要となる。また ある条件下ではextern宣言は省略可能である。すなわち、外部変数の定義が、特定の関数で使われる以前にそのソース・ファイルの中でなされていれば、関数内でのextern宣…

入力文字を逆転して表示する

C K&R

K&R本 演習1-19 文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に一行ずつ逆転するプログラムを書け。 #include <stdio.h> void reverse (char *s) { char c; char *p = s; int i = 0; int j; while(*++s&&*s!='\n') { ++i; } for(j</stdio.h>…

ANSI C以前の関数の定義

C K&R

K&R本 1.7 int power(); power(base, n) int base, n; { (中略) } こういう仕様だったため、コンパイル時に引数が正しいかどうかのチェックが不可能であった。ANSI Cでは int power(int, int); int power(int base, int n) { (中略) } と書けるようになった…

プロトタイプ宣言では引数名を省略できる

C K&R

K&R本 1.7 int power(int m,int n); と int power(int,int); は同義。型さえあってれば良い。

線形リスト(片方向)

http://www.geocities.jp/ky_webid/algorithm/010.htmlさてとうとうmalloc関数を使って動的に拡張していくタイプの処理に入りました。このあたりのリスト構造を極めれば今後割りと何でも作れそうな気がします。ということでここは何としてもキッチリと押さえ…

キュー再実装

http://d.hatena.ne.jp/pknight/20090704/1246706552ちゃんとループするように再実装してみました。 #include <stdio.h> typedef struct { int data[100]; int end; int start; } queue; void enqueue (queue *q,int data) { if ( (q->end + 1) % 10 == q->start ) { </stdio.h>…

A-Z等の省略記法を展開する

C K&R

K&R本 演習3-3 文字列s1中のa-zのような省略記法を、それと等価な完全リストabc・・・xyzにしてs2中に展開する関数expand(s1,s2)を書け。大文字、小文字、数字を許し、a-b-cやa-z0-9や-a-zのような場合も処理できるようにせよ。先頭および最後の-は文字とみなす…

エスケープ文字を文字に変換する

C K&R

K&R本 演習3-2 改行文字やタブのような文字を目で見えるエスケープ文字\nや\tに変換しながら、sをtにコピーするような関数escape(s,t)を書け。switchを使うこと。 #include <stdio.h> void escape(const char *s,char *t) { for(;*s;++s){ switch(*s){ case '\t': *t+</stdio.h>…

演算子の被演算数に対する評価順序

C K&R

K&R本 2.12 x = f() + g(); のような文ではfとgの評価順序はどちらでもよい。したがって、もしfとgのどちらか一方が変数を変更し、他方がその変数に従属しているなら、xは実行順序に依存することになる。特別の順序にしたければ、この場合も一時変数を使う手…