Hatena::Groupgeneration1986

仮想化済み古代魚

|

2008-05-01

休みなので更にK&R 演習1-13

20:19

 ずっとK&Rのターン。「ちょっとした更新」にしておきます。

K&R 演習1-13 駄目な例

20:19

 配列全部に0を入れて初期化するにあたってやらかしたミス。コメントにもあるようにint nword[20]で作られるのはnword[0]からnword[19]までであり[20]は作られない。

//	nwordは[0~19]しか存在しない。
	for (i = 0; i <= 20; ++i){	//nword[0~20]を初期化
		printf("変数nword[%d]を初期化\n", i);
		nword[i] = 0;

 実行したら無限ループしました。怖い怖い。

 訂正(hogelogさんのコメントより):無限ループする理由はnword[20]=0はi=0と同じなのでループが0からやり直しになってしまうため。コメントにあるプログラムを実行してみると

&i = 0012FF88, &nword[1] = 0012FF3C
&i = 0012FF88, &nword[2] = 0012FF40
&i = 0012FF88, &nword[3] = 0012FF44
(中略)
&i = 0012FF88, &nword[20] = 0012FF88

となり、iとnword[20]のアドレスが同じになっているのが分かります。そーなのかー。

正しい例

/*K&R P29 演習1-13*/
#include <stdio.h>

#define OUT 0
#define IN 1

int main(void)
{
	int c, state, i;
	int nword[20];			//noword[0~19]
	
	state = c = 0;
	for (i = 0; i <= 19; ++i){	//nword[0~19]を初期化
		printf("変数nword[%d]を初期化\n", i);
		nword[i] = 0;
	}
	
	while ((c = getchar()) != EOF){
		if (c != '\n' && c != '\t' && c != ' '){
			state = IN;
			++i;
		}
		else if (state == IN){	//単語内から外(\n \tスペース)へ出た
			state = OUT;
			++nword[i];	//字数iの単語数++
			i = 0;		//溜まったカウンタをリセット
		}
	}
	
	for (i = 1; i <= 19; ++i){	//ここもnword[20]による無限loop
		printf("[%2d]", i);
		
		for (; nword[i] >= 1 ; --nword[i])
			printf("*");
		
		printf("\n");
	}
	
	return 0;
}

「変数~初期化」はprintfデバッグをやってみた名残。正しくは「配列~初期化」のような気もする。

実行結果

変数nword[0]を初期化
変数nword[1]を初期化
変数nword[2]を初期化
変数nword[3]を初期化
変数nword[4]を初期化
変数nword[5]を初期化
変数nword[6]を初期化
変数nword[7]を初期化
変数nword[8]を初期化
変数nword[9]を初期化
変数nword[10]を初期化
変数nword[11]を初期化
変数nword[12]を初期化
変数nword[13]を初期化
変数nword[14]を初期化
変数nword[15]を初期化
変数nword[16]を初期化
変数nword[17]を初期化
変数nword[18]を初期化
変数nword[19]を初期化
(中略 このプログラムのソースコードをそのままコピペしてみた)^Z
[ 1]**************************
[ 2]*************************
[ 3]**************
[ 4]******
[ 5]*******
[ 6]***
[ 7]**
[ 8]***
[ 9]*
[10]***
[11]**
[12]*
[13]*
[14]*
[15]**
[16]
[17]*
[18]**
[19]

hogeloghogelog2008/05/01 19:22int nword[20];で確保されるのがnword[0-19]までってのはその通りです。ループの範囲をi<=20にしたら無限ループになったっていうのは、nword[20]てのがiと同じ位置を指していて、そこで
nword[20] = 0;
すなわち
i = 0;
としてしまっているからです。こんなプログラム実行してみると、&iと&nword[20]が同じ位置をしめしているのがわかるかと。
#include <stdio.h>
int main() {
int i, nword[20];
for (i = 0; i <= 20; ++i){
printf("&i = %p, &nword[%d] = %p\n", &i, i, &nword[i]);
nword[i] = 0;
}
return 0;
}

oldfisholdfish2008/05/01 20:22>hogelogさん
指摘どうもー。プログラムの実行結果確認したうえで一部追記しておきました。
アドレスとかポインタとか恐ろしいですね

トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080501

2008-04-30定期報告とか

 K&Rを購入したのでちまちま演習をやり始めています。

演習1-6 getchar() != EOFと言う式の値が0か1である事を確認せよ

17:23

  1. 「getchar() != EOF」を変数に代入
  2. 変数をそのままで表示

 でいいだろう、と言う事で以下に解答。

//演習1-6 getchar() != EOFと言う式の値が1か0であることを確認せよ
#include<stdio.h>

int main(void){
	int a = 0;
	
	printf("入力せよ");
	a = (getchar() != EOF);	
	                       
	printf("%d",a);		       
			       	
	return 0;
}

 ところが実行してみると何を入力しても1しか表示されない。空白でエンターしても1。これでは「0か1」であることが確認できていない。

とりあえず初心者が真につまずくところは、端末にEOFを入力する方法だと思う。

2008-03-29

 空白じゃ駄目なのか。もっかい先生に聞いてみたらCtrl+ZでEOFになるとのこと。

入力せよ^Z
0

しっかり0が表示されたので多分完成。

疑問

17:23

44日目 5分以内に九九の表を出力しなさい - id:wakutekaのプログラミングメモ

	if(x == y)
		printf("あいこ!");
	else if ((y+1)%3 == x%3)
		printf("かち!");
	else if ((y+2)%3 == x%3)
		printf("まけ!");
	else

凄く綺麗に判定してるのは分かるのにどういう理屈でこうなるのか分からない。ギギギ

刑法の知識を少し 「尊属殺」

17:23

CNN.co.jp

この関連で思い出したこと。

 昔刑法には第200条「尊属殺」という規定がありました(平成7年改正時廃止)。簡単に言っちゃうと「親・祖父祖母を殺したら重罪にするよ!」という仕組みです。これが廃止される一因になったとされるのが尊属殺重罰規定違憲判決 - Wikipediaです。この事件が上記オーストラリアの事件と似ている事件で、

被告人の女性A(当時29歳)は実父B(当時53歳)を絞殺した。殺害の日まで被告人Aは被害者Bによって10日間にわたり自宅に監禁状態にあり、最終的に口論の末に殺害したものである。

被告人Aは14歳の時から実父Bによって性的虐待を継続的に受けており、しかも近親相姦を強いられた結果、親娘の間で5人の子…を産む夫婦同様の生活を強いられていた。

被告人Aがその境遇から逃げ出せなかったのは、…妹が同じ目に遭うことを恐れたためであった。そうしたなか彼女も職場で相思相愛の相手が現れ、正常な結婚をする機会がめぐってきたが、その事をBに打ち明けたところ、怒り狂い監禁されたため殺害するに至った。そのため、彼女は犯行時に心神耗弱にあったといえ、情状酌量される事情があった。

尊属殺重罰規定違憲判決 - Wikipedia

 [これはひどい]。こりゃ実刑よりも執行猶予が妥当だろう、といった所ですが問題が一つ。

尊属殺による刑の加重(死刑/無期懲役)-法律で許される軽減2回(心神耗弱+情状酌量)=懲役3年6ヶ月 ->執行猶予にできない

 で、判決は「尊属殺を執行猶予と出来ない程の刑としているのは憲法違反であり無効」として懲役2年6月、執行猶予3年。取り合えずは執行猶予という事になりました。判決文で「尊属殺の規定自体は即違憲という訳じゃない」旨の事を言ってる辺り若干首を傾げる所もありますが、まあ、心情的に頷ける判決じゃないでしょうか。

wakataka_423wakataka_4232008/04/30 17:32ぐーを0、ちょきを1、ぱーを2にしてみたんだけど、
y=0ならx=1に勝てるし、y=1ならx=2に勝てるし、y=2ならx=0に勝てる。
3を0とおなじ(3で割った余りの世界では)って考えたら、y+1=xのときyが勝ちでまとめられる。
…っていうのを昔どこかで聞いたのを思い出しただけ。おりじなるじゃないお。


量刑の方程式が斬新だ。

トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080430

2008-04-235分以上かかったけど九九の表を出力した

  1. id:wakataka_423から挑戦状が届いた
  2. ぼっこぼこにしてやんよ!
  3.  無理でしたー> ;;;;;、(・ω(:;(⊂=⊂≡ (・ω・ ) バババババ

 whileを先に覚えたからwhileの方が楽な気がしてたけど、覚えてしまえばforで書く方が間違えにくいのかも。しっかり5分以上掛かってしまいました。


#include<stdio.h>

int main(void){
	int dan=1,gyou=1,buf=1;
	while(dan<=9){
		gyou=1;
		while(gyou<=9){
		buf = gyou*dan;
		printf("%3d",buf);
		gyou=gyou+1;	
		}
	dan=dan+1;
	printf("\n");
	}
return 0;
}

出力結果

  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81
トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080423

2008-04-21C言語とかK&Rとか

擬似乱数でじゃんけんゲーム

21:15

srandとrandの勉強と言うことでじゃんけんゲームを作ってみました

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void){
	int x,y;
	srand((unsigned) time(NULL));
	
	printf("じゃん、けん…\n1.ぐー 2.ちょき 3.ぱー\n");
		scanf("%d",&y);
	
	printf("ぽん!\nあなた:");
	switch(y){  			//プレイヤの出した手を表示
		case 1:
		printf("ぐー!");
		break;

		case 2:
		printf("ちょき!");
		break;

		case 3:
		printf("ぱー!");
		break;
	}
	printf("\nCPU:");
        x = rand() % 3+1;		//1~3の乱数でCPUの手を決定
	
	switch (x){
		case 1:
		printf("ぐー!\n\n");
			switch(y){
				case 1:
					printf("あいこ!");
					break;
				case 2:
					printf("まけ!");
					break;
				case 3:
					printf("かち!");
					break;
			}
		break;

		case 2:
		printf("ちょき!\n\n");
			switch(y){
				case 1:
					printf("かち!");
					break;
				case 2:
					printf("あいこ!");
					break;
				case 3:
					printf("まけ!");
					break;
			}
		break;
		
		case 3:
		printf("ぱー!\n\n");
			switch(y){
				case 1:
					printf("まけ!");
					break;
				case 2:
					printf("かち!");
					break;
				case 3:
					printf("あいこ!");
					break;
			}
		break;
	}
return 0;
}

以上

出力結果
じゃん、けん…
1.ぐー 2.ちょき 3.ぱー
2
ぽん!
あなた:ちょき!
CPU:ぱー!

かち!

 何というか美しさに書ける感じがしないでもないです。表示のバリエーションが少ない割には分岐が多すぎるような……。

K&Rの本を手に入れたい

21:15

 id:yaottiid:wakataka_423もこれでC言語勉強してるそうなので。ただ、一口にK&Rって言っても

  1. プログラミング言語C 第2版 ANSI規格準拠:C言語の解説+演習本
  2. プログラミング言語Cアンサー・ブック 第2版:その演習の解答集/アンサーブック

 の二つがあるそうで。取りあえず大学の図書館にはどちらも無いようなので新書か中古で買うしかないようです。何だか段々大学の勉強より気合入ってる気がします。自分で参考書購入とかどんだけー。

トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080421

2008-04-18C言語と格闘

ループの回数だけアスタリスクを表示

21:47

#include <stdio.h>

int main(void)
{
	int kaidan,kaisu;
	//0~9までループ
	kaisu = 0;
	while(kaisu <= 9)
	{
	kaidan = kaisu;
	printf("%d ",kaisu);
		while (kaidan > 0)
		{
			//*を表示
			printf("*");
			kaidan = kaidan - 1;
		}
	printf("\n");
	kaisu = kaisu++;
	}

	return 0;
}

 これがソース。はてな記法だと簡単に色付き表示できて感動しました。ソース書くのはFC2の方よりはてダ使った方が楽そうです。

出力結果は

0 
1 *
2 **
3 ***
4 ****
5 *****
6 ******
7 *******
8 ********
9 *********

こんな感じ

 36日目 K&RのExerciseをやってみた - id:wakutekaのプログラミングメモの一番最初の課題とほぼ一緒です。wakatakaさんがforでやってたのでWhileでやってみました。forの方も使い方覚えないとなー。

 ちなみに課題の出典であるK&RってのはC言語開発者さんの書いたC言語の練習本だそうで。今度秋葉原ブックオフが進出するそうですし、大学の帰りにでもちょっと探してみます。

第2版の日本語訳版の初版(要するに緑色カバーのもの)の日本語訳の品質の評判はとても悪い。

K&Rとは - はてなキーワード

 緑色カバーは買っちゃ駄目、と。

かわいそうな⑨のプログラム

21:47

お前が出来るって言ったから呼んでやったのに何だこれ。

「どないやねん、どないやねん」って50回練習してこい!

チルノはテンケテキテキなツッコミをしていきました - ニコニコ動画

哀れなチルノの修行を(不)完全再現!

#include <stdio.h>

int main()
{
	int kaidan,kaisu;
	//0~14までループ
	kaisu = 0;
	while(kaisu <= 14)
	{
	kaidan = kaisu;
	printf("%dどないやねん ",kaisu);
		while (kaidan > 0)
		{
			//*を表示
			printf("どないやねん。");
			kaidan = kaidan - 1;
		}
	printf("……。\n");
	kaisu = kaisu++;
	}
printf("Cirno >おわったよー!\n");
	return 0;
}

 50回表示させるのも難しくは無いんですが、それをやると出力結果が酷い事になるので14回で打ち止めです。

yaottiyaotti2008/04/18 22:30お。僕は1週間くらい前からK&R読み始めましたよ。
がんばりましょう!

wakataka_423wakataka_4232008/04/19 00:16トラバありがとう! 僕もK&R読み始めたのは一週間前です。単純なプログラムでも、思い通りに動くとたのしーよね!

RonaldoRonaldo2013/01/16 07:28I was sreiuosly at DefCon 5 until I saw this post.

bsanngfqolbsanngfqol2013/01/16 21:342oHSv6 <a href="http://daalxceejjty.com/">daalxceejjty</a>

yoikyiwyyoikyiwy2013/01/17 02:58TBt8Gk , [url=http://iqbfawexyhmb.com/]iqbfawexyhmb[/url], [link=http://oqcchevancmn.com/]oqcchevancmn[/link], http://wyjimjtzrfol.com/

okgzgzerepcokgzgzerepc2013/01/18 10:13gSzaBj , [url=http://wmbtcxydypxu.com/]wmbtcxydypxu[/url], [link=http://umkbzisrkzpz.com/]umkbzisrkzpz[/link], http://urfnckmomkml.com/

トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080418
|