電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

2005-12-01から1ヶ月間の記事一覧

友愛数判定

友愛数判定に挑戦してみる。 友愛数とは例えば220や284などで220の約数は1,2,4,5,10,11,20,22,44,55,110で合計すると284。同様に284の約数は1,2,4,71,142で合計で220である。 このように約数が互いを示す数のことを友愛数とよび、ピタゴラ…

リスト

Lispでその名を轟かせたデータ構造リストだが、簡単に図で表すと >①----->②---->③----->④ このように項目(node)の最後と次の項目の最初をつなげたものである。 つながっていると言う点では配列と同じと思うかもしれないが配列よりも優れている点として、 …

Josephus problem(ジョセファスの問題)

いまN人が集団自殺しようとしているとして、まず全員が円陣に並び、その円の中のM番目の人を順に処刑する。一人死ぬと取り除かれ、円の大きさが1へることになる。 今N=9(つまり全員で9人)M=5(つまり5番づつ)とする。処刑される順番を求めよ。 解き…

①-2スタック

メモリの項で散々スタックの説明をしたがリストを使ったスタックの実装について説明する。 データ構造として最も重要なスタックだが、基本的な操作は2つだけで、プッシュとポップと言う概念からなる。プッシュはリストで言えば項目の挿入であり、ポップは項…

Eukleides(ユークリッド)のアルゴリズム

Elements(原論)の中の解法を用いて既約分数(これ以上割れない分数)を計算する。 難しく書いたが要するに 最大公約数は何か?と言う回答を吐き出すプログラムを作れればよい。 解答に至る手順として最大公約数(Greatest Common Divisor。以下gcd)を求めれ…

②型モデル

宣言はいつでもリストで似たような図をかける。 上の例で言えば int(*func[10])(int a); という宣言があったら、これを fanc is array[10] of pointer to function(a is int) returning int. fancはint型を返す関数(aはint)へのポインタの配列[10] とよめ…

②Cの宣言解読

前橋和弥氏の書いた「C言語ポインタ完全制覇」では非常に面白い宣言の解読法がある。 ややこしい宣言は英語で読め。 というものである。 int *f(); /*f:intへのポインタを返す関数 int (*pf)(); /*pf:intを返す関数へのポインタ と書かれても一行目は何とか…

①プリプロセッサ

ソースファイルから実行ファイルが出来上がるまでにはプリプロセッサ、コンパイル、リンク、という段階を踏む。(下図) プリプロセッサ コンパイラ {ソースファイル}→ {プリプロセス} →{コンパイル} #ifdef等の処理 オブジェクト ファイルの生成 リンカ → {…

NULLと0と'\0'

文字列の終端にNULLを入れる間違いが多くある。 array[len]=NULL; これは環境によって動くが間違いである。 文字列は「ナル文字」で終わるのであって「ヌルポインタ」で終わるのではない。 ナル文字とは「全てのビットが0である文字」と規格され、'\0'で表…

②構造体自体をポインタで扱う

構造体をmallocして動的に確保したい。 こんなときも多いだろうがとりあえず書き方として #include<stdio.h> #include<stdlib.h> #include<string.h> #include "kouzoutai.h" main() { POINT *p_memallocate; p_memallocate=malloc(sizeof(struct p_kouzoutai)); p_memallocate->a=strdup(</string.h></stdlib.h></stdio.h>…

②構造体の初期化

構造体は初期化することが出来る。 例えば一度に全て0を入れたい場合、memset関数を使う。 #ifndef KOUZOUTAI_H #define KOUZOUTAI_H typedef struct p_kouzoutai { char *a; char *b; char *c; }POINT; typedef struct a_kouzoutai { char a[10]; char b[1…

②関数のポインタと構造体を使ったプログラム

少し難しいが非常に有用なプログラム。 #include<stdio.h> #include<string.h> int list(void) { printf("func list\n"); return 1; } int show(void) { printf("fanc show\n"); return 1; } int quit(void) { exit(0); } struct command{ char *com_str; int (*com_func)(void)</string.h></stdio.h>…

①メンバに文字列をコピー

メンバに文字列をコピーする。なお上で作成したヘッダファイルkouzoutai.hを使う。 #include<stdio.h> #include<string.h> #include "kouzoutai.h" int main(void){ struct p_kouzoutai copy; strcpy(copy.a,"testcopy"); printf("%s\n",copy.a); } 結果 異常終了 <|| 結果うま</string.h></stdio.h>…

①構造体の使い方

struct p_kouzoutai { char *a; char *b; char *c; } と struct a_kouzoutai { char a; char b; char c[]; } の違いは何だろうか?関数とポインタの項でやったが大きさ分のメモリを取るのが配列でアドレス分だけを取るのがポインタである。 早速見てみると、…

①プロトタイプ宣言

もし、コードが複数ファイルにまたがっていた時、プロトタイプ宣言はどこでするのか。 答えから言うとヘッダファイルにするべきである。 そして、その関数を使う全てのコードファイルにそのヘッダをインクルードする。そうすれば仮にaというファイルのafanc…

①関数

関数を理解するには何といってもスタック(メモリ)の動作である。 詳しくはスタックの項にあるが、 void B(int b,int c) { int d=4; } void A(void) { int a=1; B(2,3); } このような関数を呼び出したときに | | | | | | |4 |d |復帰情報 |2 |b …

②構造体の場合の書き方

プロトタイプ宣言に並んでヘッダファイルを作成する価値のあるものは構造体である。 構造体のヘッダファイルの書き方にはコツがある。 #ifdef KOUZOUTAI_H #define KOUZOUTAI_H typedef struct p_kouzoutai { char *a; char *b; char *c; }POINT; typedef st…

②エラーチェック

mallocを使って行う典型的な仕事はエラーを処理することである。 メモリが足りないときに対処するわけですが、処理をするのにもメモリが必要になるわけです。 そこでmallocであらかじめ無駄なメモリを確保しておいていざとなったらfreeする。 という方法がと…

①malloc

メモリを管理するというのは重要である。 メモリを管理しなくてもプログラムは作れる。 だが、オーバーフローの原因となったり柔軟性が無くなったりメモリを無駄に取ってしまったりと公開するには支障が出る。 そこで考え出されたのは「○○個までのデータが扱…

const

constとは変数を読み込み専用にするために使うものです。 #include<stdio.h> main(){ const int i=432526; i=536; printf("%d",i); }エラー E2024 const.c 4: const オブジェクトは変更できない(関数 main ) と怒られてしまった。関数の引数として使うときに書き方に</stdio.h>…

①配列とポインタによる文字列操作

初心者がつまづきやすいこの問題は、まず 配列の初期化と代入は別物であるという認識から始めようと思う。 #include<stdio.h> main(){ char a[]="ABCDEF"; int i; for(i=0;a[i]!=0;i++) printf("%c",a[i]); printf("\n"); } 結果 ABCDEF非常に脆弱性を抱えているがひ</stdio.h>…

①ポインタと配列

配列 配列を出力するとなると大体こんな風に書く。 #include<stdio.h> #define size 10 main() { int i; int array[size]={232,21,4,142,412,532,643,745,12,543}; for(i=0;i<size;i++) printf("%d\n",array[i]); }ではこの時メモリ上ではどうなっているのだろうか? %pで表してみると #include<stdio.h> #define size 10 main() { int i; int array[size]; for(i=0;i</size;i++)></stdio.h>

①型

型とはメモリ領域をどれくらい取るかというのをコンパイラに教えるためのものである。 型を知る上で非常に重要な機能はsizeofという命令。sizeofで得られた結果はsize_t型になる。 #include<stdio.h> int main(){ printf("char =%u\n",sizeof(char)); printf("short =</stdio.h>…

typedef

typedefは型を自分の好きな名前で宣言するときに利用するもので、 たとえばunsigned longが書くのがめんどうくさいのでulongとかに変えて ulong a;とか宣言することでunsigned longを意味するようにします。 具体的な書き方は #include<stdio.h> main(){ typedef unsi</stdio.h>…

バイトオーダー

#include<stdio.h> main() { int a=0x12345678; int i; unsigned char *p=(unsigned char*)&a; for(i=0;i<4;i++) { printf("%x\t",p[i]); } puts("\n"); } 実行結果 78 56 34 12 0x123・・と%xはどちらも16進数であるということである。 現在のCPUは32bitベースが殆</stdio.h>…

①メモリとスタック

メモリ さて、すべてのプログラムはメモリ上にデータをのせて実行するわけなのだが、 プログラム全体には5つの領域(セグメント)に分けられて実行される。 スタックもその1つである。 -1テキストセグメント(コードセグメント) ここにマシン語で記述されたプ…

③ローカル変数とグローバル変数

前日記憶クラスの実践的な基本を載せた。 今日はもう少し詳しい内容を載せる。一般的な変数にはローカル変数とグローバル変数がある。 ローカル変数はコードブロック(分かりやすくいうと{ }←この中の部分)の先頭で宣言することができる その寿命はコード…

①宣言

そもそも宣言とは ・register static extern等の記憶域クラス指定子(Storage Class Specifiers) ・const等の型修飾子(Type Qualifiers) ・int char float long等の型指定子(Type Specifiers) ・a i m等の宣言子(Declarators) ・inti=0;とかするとき…

②記憶クラス

記憶クラスにはauto,register,static,externがある。 どこに変数を入れたいかで使い所が違う。「auto」は一般的な変数で通常は記述しない。 大抵はこれにintやcharをつけてauto int a;とか宣言するのを省いてint a;とか書いている。 関数の中で宣言され、そ…

bubblesort

void sort(int input[],int output[],int size) { int i,j; int flg=1; int temp; for(i=0;i<size;i++) {output[i]=input[i];} for(i=size-1;i>=0&&flg==1;i--) { for(j=0;j<i;j++) { if(output[j]>output[j+1]) { temp=output[j]; output[j]=output[j+1]; output[j+1]=temp; flg=1; } else {flg=0;} } } } どれも数分で書いたのでバ</i;j++)></size;i++)>…