アットウィキロゴ

lab5をポインタで実装できるのか??

右左を0、1に置き換えるを二進数と同じになるのは使えると思う。
void two(int i);
int main(){
	int a=14;
	two(a);
}
void two(int i){
	if(i==0) return;
	two(i/2);
	if(i%2!=0) {
		i-=1;
		printf("1");
	}
	else printf("0");
}
上は十進数を二進数に変えるプログラムのつもりです。これのif(){}の中に
p=p->left、else の後にp=p->rightを入れればOKっぽい気がする
番号 深さ 流れ
1 0 なし
2 1
3 1
4 2 右→右
5 2 右→左
6 2 左→右
7 2 左→左
8 3 右→右→右
9 3 右→右→左
10 3 右→左→右
11 3 右→左→左
12 3 左→右→右
13 3 左→右→左
14 3 左→左→右
15 3 左→左→左
上の表は、②分岐の関係を見やすく(?)したもの。ここからいろんな関係を
見つけ出してプログラムに利用すべし
  1. 右を0左を1とすると二進数の順に右左がならんでいる
  2. 流れる回数(右→右なら2回)はその始まりの回数と一致する。
  3. -例えば3回の流れは8から始まり、3回の流れは8回ある。
  4. 新しい深さに移動するのは”2の深さ乗”のときである
  5. (教科書より)左の子は2*i+1:右の子は2*i+2逆に親は(i-1)/2となる

ポインタが二つのやつについて

前回のやつでvoid preorder(int a,struct cell **S)みたいな感じな
ポインタが二つついたのがありました。それについての自分の考察
まずこのプログラム
#include<stdio.h>
void tasu(int a){
	a+=1;
}
int main(){
	int a=0;
	tasu(a);
	printf("%d",a);
}
これの実行結果は0です。returnが無いので、メインのaにa+=1は反映されません。
次にこのプログラム
#include<stdio.h>
void tasu(int *a){
	*a+=1;
}
int main(){
	int a=0;
	tasu(&a);
	printf("%d",a);
}
これの実行結果は1です。これは、アドレスで計算するとmainでも数字反映される
という決まりがあるためです。
これらのことを参考に考えると*Sの値を関数内で変えたときメインでもその
変化を反映させるために**Sという形になったと考えられます

タグ:

+ タグ編集
  • タグ:
最終更新:2007年06月26日 23:07