gcc

The GNU MP Bignum Library

gcc

オイラー見てたら、多倍長演算ライブラリ発見。The GNU MP Bignum Library #include <gmp.h> int main(void) { mpz_t a, b, c; mpz_init_set_str(a, "1234567890123456789012345678901234567890", 0); mpz_init_set_str(b, "12345678901234567890123456789012345678</gmp.h>…

スタックのダンプ

GCC

ちと覗いてみた。 #include <stdio.h> void *stack_bottom; void display_stack(void) { void *p; int dummy = 0x5678; void *stack_top = (void *) &dummy; printf("stack_bottom : %p\n", stack_bottom); printf("stack_top : %p\n", stack_top); printf("stack_siz</stdio.h>…

東大の演習問題に挑戦(4) - 多倍長演算編

GCC

次は多倍長演算です。アルゴリズムとデータ構造演習 - C第1回 課題5-A:無限多倍長整数を連結リストで実現し、四則演算を実装せよ。但し、数を表示するときには10進表記にすること。レポートには、プログラムの簡単な説明と実装上の工夫(乗法演算の高速化な…

東大の演習問題に挑戦(3) - 平均・標準偏差・偏差値編

GCC

そういえば統計の問題を殆んどやったことが無い。今日の問題はコレダ!!アルゴリズムとデータ構造演習 C入門第3回 課題3-B: 2:次の関数を実装し、main中で呼び出して動作確認せよ。double average (double *data, int n) { dataの前部n個の平均値を求める }…

東大の演習問題に挑戦(2) - 圧縮・解凍編

GCC

もう一個いっとこー 課題2-A:データを圧縮・解凍するプログラムを実装せよ。 が・ガンバリマス。 方針 超簡単なランレングス符号でいっときます。 aaaaというデータがあったら、[4 a]として保存。1個の場合はaとします。 日本語は考えないということで、数…

東大の演習問題に挑戦

GCC

東大のアルゴリズムとデータ構造演習(リンク切れ)が面白そうなので演習問題を解いてみる。 課題1-A:シェルを実装せよ。 ガンバリマス。 方針 パイプもリダイレクトも無し。一番簡単そうな実装を目指します。 1行取得は面倒なのでGNU getline使います。 fork…

cursesでvi風移動してみる。

GCC

端末制御ライブラリ、cursesを使ってみた。すげー簡単。とりあえずvi風移動をしてみる。 #include <curses.h> int main(void) { int x = 0; int y = 0; int c; initscr(); // ウィンドウの初期化 noecho(); // キーボードのエコーをしない for (;;) { // 終わり方がわ</curses.h>…

ペグ・ソリティアを解く - ペグ・ソリティア盤の生成

GCC

Karetta|Cパズルプログラミング-再帰編|ペグ・ソリテアのペグ・ソリティアを解いていきます。ペグ・ソリティアは、上下左右のペグを1個飛び越すことが出来る。ペグを飛び越えたら飛び越えたペグを消す。という単純なルール。 OO.O.解いてみると、 OO.O. ..OO…

Nクイーンパズルを解く(2) - 対称性

GCC

今日はNクイーンパズルの対称性を検討してみます。簡単な6クイーンでやってみよう。 ans : 1 ...Q.. Q..... ....Q. .Q.... .....Q ..Q... ans : 2 ....Q. ..Q... Q..... .....Q ...Q.. .Q.... ans : 3 .Q.... ...Q.. .....Q Q..... ..Q... ....Q. ans : 4 ..…

Nクイーンパズルを解く

GCC

なんか集中力が落ちていたので。ずっとお絵描きしてました。部屋中紙だらけになってしまったので、たまにはプログラムを。SICPの復習が出来そうなので、Karetta|Cパズルプログラミング-再帰編のNクイーンパズルを自分なりに改造してみます。 改造ポイント 対…

再帰で一行取得とHQ9+

gcc

Cでファイルから一行取得するのは結構面倒な作業だと思います。でも、再帰使ったららくちんに一行取得出来るんじゃないかと。再帰だと、 改行があるまでgetchr 改行があったらmalloc ダダァッと文字を書き込む という感じに書ける。 一行取得だけじゃ面白く…

K&Rを読もう(45) 4.10 & 演習4-14 クイックソートとswap

gcc

演習4-14でswapマクロを書け。という問題が出てきたので、swapマクロを使ってK&R式クイックソートを書いてみます。 K&R式クイックソート解読 クイックソートは起点となる値と比べて、起点より低い、高いでソートしていく感じ。6 5 4 3 2 1について考えます。…

システムコールだけでHello, world

gcc

リンカのお勉強中デス。Binary Hacksのhack#25 「glibcを使わないでHello World」が面白そうだったので、アセンブリでやってみました。 .data hello: .ascii "Hello, World!!" .text .global _start _start: movl $4, %eax movl $1, %ebx movl $hello, %ecx …

K&Rを読もう(44) 演習 4-13 reverseを再帰で

GCC

reverseを再帰で。という難解な設問。僕のScheme力が試される。 いっこめ strlenで。 void reverse_iter(char *s1, char *s2) { if (*s1 != '\0') { *s2 = *s1; reverse_iter(s1 + 1, s2 - 1); } } void reverse(char *s1, char *s2) { int len = strlen(s1)…

K&Rを読もう(43) 演習 4-12 itoaを再帰で

GCC

たまにはK&Rを。 演習 4-12 itoaを再帰で書け。という問題。再帰に慣れてるはずなのに、この問題はムズィ。 int itoa_iter(int n, char s[], int i) { if (n == 0) { s[i] = '\0'; return i; } else { int tail = itoa_iter(n / 10, s, i + 1); s[tail - i] …

Schemeをつくろう(6) GCCの関数評価順序

C(GCC)の関数評価順序はちょっと予想に反する挙動を示す。 問題 GCCで表示される値は? printf("test> ", printf("1 "), printf("2 "), printf("3 "), printf("4 ")); 正解は、 正解 4 3 2 1 test> まとめ 勘弁して(泣 毎回ハマる。

C言語でScheme風オレオレ言語

GCC

なんかオレオレ言語が流行ってるみたいなので、参加してみる。 #include <stdio.h> #include <stdlib.h> #define define(ret, name, args, block) \ ret name args { return block; } #define if(expr, block1, block2) expr ? block1 : block2 #define eq(a, b) a == b #define</stdlib.h></stdio.h>…

カーネルのリンクリスト

GCC

何故かExt2ファイルシステムについて調べてました。ちょっとカーネルのソースを覗いてみたら、struct list_head構造体がやたら出てくる。気になって、include/linux/list.hを覗いてみると、驚くべき仕組みが隠れてた。そんなわけで写経。 #include <stdio.h> struct l</stdio.h>…

K&Rを読もう(42) 演習4-3 - 4-10 変数機能つきRPN電卓

GCC

今回の演習は逆ポーランド電卓。多機能になるような演習問題で結構楽しかったです。 さて、早速遊んでみます!! 逆ポーランド電卓なのでちょっと変態的な構文です。順にいきましょう。 まずは四則演算 1 1 + 2 1 2 3 4 5 + + + + 15 3.1415 10 * 10 * 314.15…

K&Rを読もう(41) 4.2 逆ポーランド電卓の写経

GCC

今回はプッシュバック式文字読み込みを使った逆ポーランド電卓。K&Rの序盤戦の山場かもしれない。さて、上手くできたかな? 1 2 3 4 5 6 7 8 9 10 +++++++++ 55 1 2 3 4 5 6 7 8 9 10 ********* 3628800おぉぉぉぉ。そうだ!括弧を付けてみよう〜。 (1 (2 (3 …

Cで2進数値を記述

C/C++で2進数値を記述 - きまぎらすほしゅの不定記 404 Blog Not Found:tips - 二進数表記まとめ を読んだら、「Rubyでプリプロセス」という手があるのかと。そんなわけでerbでプリプロセスしてみた。 binary.erb.c #include <stdio.h> #include <stdlib.h> int main(void) { pr</stdlib.h></stdio.h>…

K&Rを読もう(40) 演習 4-2 指数表現付きatof

GCC

math.hで小一時間ハマってしまった。 演習 4-2 atofを拡張して,123.45e-6のような指数表現を扱えるようにする問題。 #include <math.h> double atof_copy(char s[]) { double value = 0, power = 1; int i,sign, e_sign, e = 0; for (i = 0; isspace(s[i]); i++) ; s</math.h>…

K&Rを読もう(38) 演習 4-1 再開

GCC

ちょっとサボりすぎたかな・・・今日から4章に入ります。4章から、「これぞK&R」という問題が多数出てくるので楽しみです。 演習 4-1 sにおけるtの「最も右側」の出現位置を返す関数strrindex(s,t)を書け。簡単! return j - 1; と思ったが・・・「最も右側」…

K&Rを読もう(39) 4-2 atofの写経

GCC

K&Rのatofの写経をした。 double atof_copy(char s[]) { double value = 0, power = 1; int i,sign; for (i = 0; isspace(s[i]); i++) ; sign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') i++; for (; isdigit(s[i]); i++) value = value * …

K&Rを読もう(37) 演習3-4 - 3-6 itoa

GCC

今回は数値を文字列に変換する問題。 演習 3-4 サンプルのitoaはINT_MINの値が正しく処理出来ない。何故か&修正せよ。まず、INT_MAX,INT_MINの値を確認する。 INT_MAX 2147483647 01111111111111111111111111111111 INT_MIN -2147483648 1000000000000000000…

C言語でRubyライクなブロックを

GCC

マクロでブロック渡せば良いんじゃないかなぁ。 #include <stdio.h> #include <stdlib.h> #define times(n, i, block) for (i = 0; i < n; i++) block int main(void) { int i,j; times(3, i, { printf("outer block : %d\n", i); times(3, j, { printf(" inner block : %d\n", </stdlib.h></stdio.h>…

K&Rを読もう(36) 演習 3-3 aからzまで。

GCC

デジャブ? 演習 3-3 文字列s1の中のa-zのような省略記法を、それと等価な完全リストabc..xyzにしてs2の中に展開する関数expand(s1, s2)を書け。大文字、小文字、数字を許し、a-b-cやa-z0-9や-a-zのような場合も処理出来るようにせよ。先頭及び最後の-は文字…

K&Rを読もう(35) 演習 3-2 特殊文字のエスケープ

GCC

なんだか危険な香りのする問題。 演習 3-2 \n,\tを\\n,\\tに変換する問題。escape(s, t)だと、問題がありそうな関数なので、mallocを使ってメモリを確保した。 #include <stdio.h> #include <stdlib.h> #include <string.h> char *escape(char *s); int main(void) { char *e; e = escape(</string.h></stdlib.h></stdio.h>…

K&Rを読もう(34) 演習 3-1 バイナリサーチ

GCC

二分探索というやつですね。半分の半分の半分の・・・とやっていく方法。検索以外にも応用が効く。計算処理の高速化とか。バグ探しとか・・・。 演習 3-1 僕の頭が弱いので、再帰で挑戦。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 0x100000 int binsearch</time.h></stdlib.h></stdio.h>…

K&Rを読もう(33) 2.12 優先度と評価順序

GCC

優先順位って面倒だと思う今日この頃。You, 全部括弧つけちゃいなよ。 インクリメントの副作用 K&R P66より。予測と異なる答えが出た。 #include <stdio.h> #include <stdlib.h> int main(void) { int c = 'a'; printf("%c %c %c %c\n", c++, c++, c++, c); return EXIT_SUCCESS</stdlib.h></stdio.h>…