Hatena::Groupgeneration1986

仮想化済み古代魚

|

2008-06-29

=と==を間違えない方法 #2

20:34

「a == 3」を「3 == a」って書くようにすればtypoっても大丈夫。「3 = a」はErrorでるから。

http://generation1986.g.hatena.ne.jp/oldfish/20080524#c1211692957

コメントされたのは気付いてたのに試したりするの忘れてました。ものぐさいくない。下記のコード内でもやってる

#define eq ==

と合わせて覚えておきたい技。

K&R演習1-22 文字列を折りたたみ

20:34

 getlineを流用。

#include <stdio.h>

#define eq ==
#define ORIME 20
#define MAXLINE 1000

void tatamu(char s[]);
int getline(char s[]);

int main(void)
{
	char line[MAXLINE];
	
	while(getline(line) > 0){
		tatamu(line);
		printf("処理\n%s\n", line);
	}
	return 0;
}

void tatamu(char s[])
{
	int i;
	int j;		//seisyoの添字用
	char seisyo[MAXLINE];	//たたんだ後の文字列を格納

	for(i = j = 0; (seisyo[j] = s[i]) != '\0'; i++, j++){
		//ORIME桁に到着
		if((i+1) % ORIME eq 0){
			j++;
			while(seisyo[j-1] eq '\t' || seisyo[j-1] eq ' ')//前字は?
				j--;
			seisyo[j] = '\n';
		}
	}
	seisyo[j] = '\0';
	
	for(i = 0; (s[i] = seisyo[i]) != '\0'; i++);	//sの中身をseisyoで上書き
	s[i] = '\0';
}

int getline(char s[])
{
//割愛
}

タイピングゲーム

20:34

でもですよ! ちょっと手の込んだタイピングゲームならローマ字の入力の違いを吸収してくれますよね。

たとえば「ちゃ」→「CHA」「TYA」「CYA」

みたいな感じで…

近接戦闘.BLO FLAサンプル : やったータイピングゲームできたよー

タイピングゲームで日本語の表示だけ見てローマ字のABCを気にしない事ってありますよね。コマンドプロンプトでも一応日本語入力は出来ますから、C言語かつCUIだったらいっそ平仮名を受け取るのも手じゃないでしょうか。

もっとも手の位置まで正確に覚えるんだ!と言う場合はキーの位置も関係するのでローマ字を表示するべきかも。

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

2008-05-25

Flex SDKの入れ方をちょっと書いてみた

14:31

no titleno titleから「Flex SDK + お気に入りのテキストエディタ (Mac OSX)」をちょっと改変してWindows向けにしてみました。コマンドプロンプトの入力例なんかを弄った以外はほぼ原文そのまんまです。

Flex SDK + お気に入りのテキストエディタ (Windows)

14:31

元にした文章:OS & 開発環境別 Hello, World! チュートリアルより「Flex SDK + お気に入りのテキストエディタ (Mac OSX)」by yossy:beinteractive Creative Commons — 表示 3.0 非移植 — CC BY 3.0

下の文章はCreative Commons — 表示 3.0 非移植 — CC BY 3.0 by goldbook/oldfish。

まずはAdobe Open SourceのFlex SDKのページからFlex SDKをダウンロードしてきて、Lhaplus等のソフトを使ってflex_sdk_3.zipを解凍し、Cドライブ直下に移動します。

展開したディレクトリの中に必要なもの一式が入っていて、中にあるbinディレクトリにはコマンドラインツール群が入っています。 このコマンドラインツール群は開発する上で頻繁に使う事になるので、先にパスに追加しておきましょう。

マイコンピュータを右クリックして「プロパティ」を開き、「詳細設定」タブの「環境変数」を開きます。管理者アカウントでログインしている場合は「システム環境変数」、そうでない場合は「ユーザー環境変数」の「PATH」へ「;c:\flex_sdk_3\bin」を書き足します。

C:\>mxmlc
Adobe Flex Compiler (mxmlc)
Version 3.0.0 build 477
Copyright (c) 2004-2007 Adobe Systems, Inc. All rights reserved.

mxmlc [options] [defaultVar]
Use 'mxmlc -help' for more information.

このように表示されれば正しくパスが設定されています。

ここまでで特に問題が無ければ開発環境の構築は完了です。早速ActionScriptを書き始めましょう!!

Flex SDKで開発を始めるにあたって、特に決められたルールはありません。なので適当な場所ですぐに開発を始める事が出来ます。 今回は視覚的にも解りやすくするために、

Cドライブに「helloworld」と言うフォルダを作成し、その中を開発用フォルダにしてみましょう。

C:\>mkdir helloworld

C:\>cd helloworld

C:\helloworld>

次にメインロジックとなるクラスファイルを作りましょう。ココのようなファイルを作って、 HelloWorld.asという名前で保存してください。

保存出来たら、早速コンパイルしてみましょう。コンパイルにはmxmlcというコマンドを使用します。

C:\helloworld>mxmlc HelloWorld.as

これを実行するとhelloworldディレクトリの中に、HelloWorld.swfというファイルが作成されていると思いますのでブラウザ等で開いてみましょう。無事にHello Worldが表示されると思います。

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

2008-05-24

USBの中身が度々吹っ飛ぶ件について

22:01

 K&Rの演習1-22を仕上げたんですがまたUSBの中身が吹っ飛んだのでソースコードがお亡くなりになりました。ちくせう。あとでもっかい書き直します。

=と==を間違えないための豆知識

22:01

前者は代入。後者は比較ですね。本来「c == 1」つまり「cが1であるか」と言う所を「c = 1」、「cに1を代入する」としてしまう等。

中学高校で自他共に認める「ケアレスミスが多い子」だったのでC言語の勉強中にもこういう凡ミスが非常に多い。で、Twitterで「また間違えたー!」と言う旨のPOSTをした所

@goldbook #define eq == とかしておくと幸せになれますよ

Twitter / code_air_edge

なんと。早速実験。

#include <stdio.h>
#define eq ==

int main(void)
{
	int i = 0;
	if (i eq 0){
		printf("成功しました");
	}
	return 0;
}

これでちゃんと動きました。defineって数字や文字に限らないんですね。

ukstudioukstudio2008/05/25 14:22あと、おれはあんまりやらないけど「a == 3」を「3 == a」って書くようにすればtypoっても大丈夫。「3 = a」はErrorでるから。

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

2008-05-17

K&R 演習1-20

21:46

#include <stdio.h>
#define MAXLINE 1000
#define SPACE 3

void detab(char s[], int n);
int getline(char s[]);

int main(void)
{
	char line[MAXLINE];
	while(getline(line) > 0){
		detab(line, SPACE);
		printf("処理後\n%s", line);
	}
	return 0;
}

void detab(char s[], int n){

	int i, m;
	for (i = 0; s[i] != '\0'; ++i){
		if (s[i] == '\t'){
			s[i] = 'x';
			m = i;
			for (; s[m] != '\0'; ++m)
				;
			for (; m > i; --m){
				s[m+SPACE-1] = s[m];
			}
			for (m = 0; m < SPACE; m++){
				s[i+m] = 'x';
			}
		}
	}
}


int getline(char s[])
{
	int i;
	for (i = 0;i < MAXLINE && (s[i] = getchar()) != '\n' && s[i] != EOF; ++i)
		;
	if (s[i] == '\n')
		i++;
	s[i] = '\0';
	return i;
}

例によって縦に長い。文字配列の操作って面倒ですね。

あと、Flashが気になってるのでFlex SDKを落としてみました。あんまり重く無いと良いんですが。

Firefox 3.0 RC1 日本語化メモ

21:46

 Firefox 3.0 Beta5 poratbleを使ってる人向け。

 RC1に更新すると、Locale Switcherが入ってても言語パックのバージョンが合わないとかでメニューが英語に戻ってしまいました。再度日本語化するにはhttp://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0rc1/win32/xpi/からja.xpiを入れます。

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

2008-05-10

K&R 演習1-18解けたよー

15:05

//K&R P38 演習1-18 改行前のタブ、空白、空白行を削除して印字
#include <stdio.h>
#define MAXLINE 1000	//入力される行の最大長

int getline(char line[], int maxline);
int add(char to[], char from[], int end);	//toが先である点注意
void clean(char s[]);

int main(void)
{
	char line[MAXLINE];	//現在の入力行の文字列
	int i;
        char save[5000];	//4000文字まで入る保管用配列
	int end;

	for (i = end = 0; getline(line, MAXLINE) > 0; ++i){
		clean(line);
		printf("cleanの結果:%s", line);
		end = add(save, line, end);
	}

	printf("処理後の文字列は%s", save);
	
	return 0;
}

//配列sに行を格納して長さを返す
int getline(char s[], int lim)
{
	int c, i;
	
	for (i=0; i<lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
		s[i] = c;	//改行まで文字を配列に入れる
	if (c == '\n'){
		s[i] = c;	//行の最後が改行なら改行も格納
		++i;		//その後ろへ移動
	}
	s[i] = '\0';		//改行の後ろに\0を格納。末尾の目印
	return i;
}

//文字配列を保存末尾に追加する。\0の格納場所を返す
int add(char to[], char from[], int end)	//to, from, endは仮引数
{
	int i;
	
	for (i = 0; from[i] != '\0'; ++i)
		to[end+i] = from[i];	//\0の次にfromの内容を入れる
                		
	printf("『%d文字格納』\n", i);
		end = end + i;
		to[end] = '\0';
		
		return end;
}

void clean(char s[])
{
	int i, feof;
	feof = 1;	//EOFフラグ。倒れなければEOF
	
	for (i = 0; s[i] != '\0'; ++i){
		if (s[i] == '\n'){
			feof = 0;	//\nがあったらeof行ではない=フラグ倒し
			printf("EOFではない\n");
		}
	}
			
	printf("s[%d] = \\0 まで移動\n", i);
	i--;
	printf("s[%d]に移動\n", i);

	for (; (s[i] == '\t'||s[i] =='\n'||s[i] ==' ') && i > 0; --i){	
		s[i] = '\0';
		printf("\\t, \\n, または半角スペース削除\n");
	}
	
	if (feof == 0 && (s[i] != '\t') && (s[i] !=' ') && (s[i] != '\n')){
		i++;
		s[i] = '\n';
		i++;
		s[i] = '\0';
		printf("空白行ではない\n");
	}
	else if (s[i] == '\n')
		s[i] = '\0';
}

 文字配列を操作するのが面倒で面倒で……。解けるまでやたらと時間が掛かってしまいました。これよりもっと高度な事やってるOffice系ソフトを最初に作った人は偉いですね。

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