C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   無題   
     ・[8573] asd 
     ・[8604] 行 
     ・[8607] asd 
     ・[8641] asd 
   課題の質問   
     ・[8599] バグ 
   アルファベットの検定   
     ・[8575] 管理人 
     ・[8577] keichan 
     ・[8578] minami 
     ・[8579] minami 
     ・[8583] フリオ 
     ・[8584] フリオ 
     ・[8585] minami 
     ・[8597] minami 
   まだ課題です   
     ・[8545] 管理人 
     ・[8570] 徹夜 
     ・[8571] asd 
     ・[8576] 管理人 
   ランダムウォーク   
     ・[8553] asd 
     ・[8555] keichan 
     ・[8556] hana 
     ・[8560] asd 
     ・[8569] hana 
   こういうの苦手なんで ....   
     ・[8564] box 
     ・[8565] BAZZ 
     ・[8566] box 
     ・[8567] box 
     ・[8568] BAZZ 
   書式変換フォーマット ....   
     ・[8477] toyo 
     ・[8480] BAZZ 
     ・[8482] 管理人 
     ・[8562] BAZZ 
   サービス関数   
     ・[8548] asd 
     ・[8549] asd 
   WinMain関数が・・・   
     ・[8547] YuO 
   関数についてしつもん ....   
     ・[8494] Hermit 
     ・[8504] BAZZ 
     ・[8505] BAZZ 
     ・[8506] BAZZ 
     ・[8507] yossiy 
     ・[8508] 組木紙織 
     ・[8509] Hermit 
     ・[8510] Hermit 
     ・[8544] yossiy 
   分からないプログラム ....   
     ・[8520] YuO 
     ・[8539] なぎ 
     ・[8541] まだ未熟 
   課題で・・複素数の四 ....   
     ・[8459] box 
     ・[8460] 管理人 
     ・[8462] 管理人 
     ・[8463] が 
     ・[8464] 管理人 
     ・[8465] 管理人 
     ・[8466] 管理人 
     ・[8469] 管理人 
     ・[8471] 管理人 
     ・[8497] しっぽ 
     ・[8499] box 
     ・[8500] 管理人 
     ・[8501] 管理人 
     ・[8502] しっぽ 
     ・[8511] がんも 
     ・[8512] がんも 
     ・[8513] がんも 
     ・[8514] がんも 
     ・[8523] 管理人 
     ・[8526] YuO 
     ・[8527] 管理人 
     ・[8540] がんも 
   乱数の検定   
     ・[8533] バグ 
     ・[8534] minami 
     ・[8535] バグ 
     ・[8536] フリオ 
     ・[8537] バグ 
     ・[8538] minami 
   2直線の交点を求める ....   
     ・[8531] asd 
   10進数を2進数に・・ ....   
     ・[8387] バグ 
     ・[8388] toyo 
     ・[8495] 谷口 
     ・[8518] 谷口 
     ・[8521] YuO 
     ・[8522] 谷口 
     ・[8524] 谷口 
     ・[8525] YuO 
     ・[8528] 谷口 
     ・[8530] YuO 
   また課題です(C++) ....   
     ・[8516] バグ 
     ・[8517] 徹夜 
   文字列判定プログラム   
     ・[8496] box 
     ・[8498] しっぽ 
     ・[8503] マサキ 
   BCC32(DSでの)が、楽 ....   
     ・[8490] バグ 
   困っています;;   
     ・[8479] 管理人 
     ・[8484] sakura 
     ・[8485] DRAGON 
     ・[8486] box 
     ・[8487] まるちですYO 
   カードをシャッフルす ....   
     ・[8410] フリオ 
     ・[8411] 管理人 
     ・[8412] 羽流布 
     ・[8413] 羽流布 
     ・[8415] 羽流布 
     ・[8416] Hermit 
     ・[8417] box 
     ・[8418] 羽流布 
     ・[8419] Hermit 
     ・[8421] 羽流布 
     ・[8422] 管理人 
     ・[8431] 羽流布 
     ・[8433] 羽流布 
     ・[8435] バグ 
     ・[8438] 羽流布 
     ・[8444] フリオ 
     ・[8448] フリオ 
     ・[8449] 羽流布 
     ・[8452] バグ 
     ・[8453] フリオ 
     ・[8470] 羽流布 
     ・[8474] Hermit 
     ・[8483] 羽流布 
   コンパイル〜実行につ ....   
     ・[8455] マサキ 
     ・[8456] box 
     ・[8458] マサキ 
     ・[8461] box 
     ・[8472] Hermit 
     ・[8473] box 
     ・[8476] マサキ 
   入門編の項目0からい ....   
     ・[8426] 管理人 
     ・[8427] 管理人 
     ・[8428] とまとん 
     ・[8430] 管理人 
     ・[8451] とまとん 
   課題の質問   
     ・[8354] バグ 
     ・[8355] elmes 
     ・[8356] バグ 
     ・[8358] Justy 
     ・[8359] elmes 
     ・[8366] elmes 
     ・[8367] Justy 
     ・[8383] バグ 
     ・[8389] バグ 
     ・[8390] Justy 
     ・[8392] バグ 
     ・[8442] hoge 
   たびたびすいません。   
     ・[8193] バグ 
     ・[8196] 管理人 
     ・[8203] 神魔 
     ・[8206] 管理人 
     ・[8437] 神魔 
   10次元   
     ・[8436] YuO 
   学校で・・・   
     ・[8373] 管理人 
     ・[8414] しゃか 
     ・[8424] 管理人 
     ・[83701182409970] shaka 
   C初心者です。   
     ・[8361] 卓也 
     ・[8362] box 
     ・[8363] ほけほけ 
     ・[8364] ほけほけ 
     ・[8377] 管理人 
     ・[8380] 管理人 
     ・[8381] 管理人 
     ・[8382] フリオ 
     ・[8395] 管理人 
   今回もよろしくお願い ....   
     ・[8369] Justy 
     ・[8371] sub 
     ・[8372] フリオ 
     ・[8386] sub 
     ・[8391] Justy 
   include fileを開けま ....   
     ・[8261] box 
     ・[8352] YY 
     ・[8375] 管理人 
     ・[8384] yy 
   2の32乗   
     ・[8334] box 
     ・[8379] 管理人 
   ファイルから行列を読 ....   
     ・[8335] box 
     ・[8341] タケ 
     ・[8347] フリオ 
     ・[8378] 管理人 
   課題でこまってます( ....   
     ・[8279] 管理人 
     ・[8288] toyo 
     ・[8289] toyo 
     ・[8291] 管理人 
     ・[8292] 管理人 
     ・[8300] がんも 
     ・[8365] がんも 
     ・[8376] 管理人 
   またまたお邪魔します ....   
     ・[8235] BAZZ 
     ・[8236] 管理人 
     ・[8238] 管理人 
     ・[8239] BAZZ 
     ・[8240] BAZZ 
     ・[8241] 管理人 
     ・[8242] Justy 
     ・[8245] 管理人 
     ・[8247] バグ 
     ・[8278] BAZZ 
     ・[8280] 管理人 
     ・[8284] Justy 
     ・[8285] 管理人 
     ・[8340] BAZZ 
     ・[8374] 管理人 
   教えてください!行  ....   
     ・[8313] toyo 
     ・[8336] chai 
   和が一定の数列を、す ....   
     ・[8256] バグ 
     ・[8264] ぽん太 
     ・[8272] しっぽ 
     ・[8327] 市進太郎 
     ・[8330] ぽん太 
     ・[8331] しっぽ 
   ダブルバッファリング ....   
     ・[8266] しっぽ 
     ・[8273] バグ 
     ・[8275] しっぽ 
     ・[8314] バグ 
     ・[8315] ま〜く 
     ・[8326] バグ 
     ・[8328] ま〜く 
   コンソール画面の削除 ....   
     ・[8320] フリオ 
     ・[8321] バグ 
     ・[8323] Lbfuvab 
   mainでのまわし方がこ ....   
     ・[8296] 霧裂 
     ・[8297] ひろろ軍曹 
     ・[8299] ひろろ軍曹 
     ・[8301] box 
     ・[8303] ひろろ軍曹 
     ・[8305] YuO 
     ・[8306] フリオ 
     ・[8308] フリオ 
     ・[8309] フリオ 
     ・[8311] ひろろ軍曹 
   連結リストについて   
     ・[8260] box 
     ・[8262] 流 
     ・[8263] Hermit 
     ・[8307] 流 
   別ウィンドウで起動す ....   

Name:  ..ぴよぴよ(118ポイント)   Date: 2007/06/13(水) 14:11   No:8572       
Title: 無題    
今、授業でPAD図の作成を行っています。
知識が0からっだったし、ペースも早く正直ついていけません・・・。
課題なので質問もできなくて困ってます!

2つの正の整数を読み込んで、一致した桁の個数を求めるという問題なんですが、
いくら考えてもわからないんです。
教えてください、お願いします。


118ポイント を手に入れた。


Name: asd  ..中級者(14,352ポイント)   Date: 2007/06/13(水) 15:11   No:8573     
Title: Re:無題    
> 今、授業でPAD図の作成を行っています。
> 知識が0からっだったし、ペースも早く正直ついていけません・・・。
> 課題なので質問もできなくて困ってます!

課題をこなす上でPAD図について分からないことがあるのであれば
質問しても問題ないと思います。
PAD図が何か分からないと課題を解きようがないですよね。

> 2つの正の整数を読み込んで、一致した桁の個数を求めるという問題なんですが、
> いくら考えてもわからないんです。
> 教えてください、お願いします。

最終的にPAD図を作成する課題のようですが、何が分かりませんか?

・2つの正の整数を読み込んで一致した桁の個数を求める手順
・上の手順をPAD図で書く方法
・その他

手順自体が分からない場合、試しにプログラムやPAD図抜きで同じことをやってみると良いと思います。

例)1234と1214の2つの正の整数のうち一致している桁は何桁ありますか?

この例題を解くときに行さんはどうやって答えを出しますか?まずはそのやり方を書き出してみてください。
#ちなみに例題の答えは3桁(3個)です

PAD図が分からない場合にも行さんが考えた手順を書き出してみてください。
そこから図に置き換えていけば課題は完成かなと思います。


2倍のポイントを手に入れた! 338ポイント を手に入れた。

Name:  ..ぴよぴよ(163ポイント)   Date: 2007/06/14(木) 12:30   No:8604     
Title: Re:無題    
レスありがとうございます。
個数を求める手順がわからないんです。
2つの整数のそれぞれの桁数の求め方はわかったのですが・・・。


45ポイント を手に入れた。

Name: asd  ..上級者(15,644ポイント)   Date: 2007/06/14(木) 13:45   No:8607     
Title: Re:無題    
行さんの言うそれぞれの桁数というのは
例えば1234は4桁、12345は5桁と言うことでしょうか?

それが分かれば次のステップ、一桁ずつ順番に一致しているか調べることができますよね?
前のレスで書いた例題ので同じ数字の桁が何個あるかについて
どう考えていけば3桁同じだと分かるのかを考えてみましょう。

#時間がないので分かりづらいレスになっていますことをお許しください。
#プログラム関係なしに1234と1214について同じ数字の桁が3個あることが分からないのであれば言ってください^^


130ポイント を手に入れた。

Name: asd  ..上級者(16,188ポイント)   Date: 2007/06/15(金) 10:19   No:8641     
Title: Re:無題    
ここのホームラン数の調べ方が参考になると思います^^
http://www.play21.jp/board/formz.cgi?action=res&resno=8629&page=&id=dixq&rln=8640


34ポイント を手に入れた。



Name: ragnarok  ..ぴよぴよ(202ポイント)   Date: 2007/06/14(木) 01:22   No:8594       
Title: 課題の質問    
課題でこのような問題が出たのですが、途中までしか分からなくて・・・

[ まず,3×3の全マス目の初期状態を1〜6の並び番号付きでコンソールに表示する.
次に,キーボードからシフト回数を入力する.
入力された回数だけ,シフト処理を繰り返し実行する.


(1) 1〜6の並びのうちの1つをランダムに選び,その並びのシフト方向(-1 または +1)をランダムに決定する.
(2) 上記(@)の並びに対し,決定した方向のシフト操作でのシャッフルを実行する.
(3) シフトされた結果を表示する.なお,選択された並び番号及びシフト方向も併せて表示する.

(4) キーボードより1〜6の並び番号,及び-1または+1のシフト方向を入力.
(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
(6) シフトによるシャッフル結果を表示する.
(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る


<実行例>

シフト回数は?2 ← キーボードから2と入力

1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6


<1回目> 3を-1動かす
1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6


<2回目> 5を1動かす
1 2 3
[1][1][2] 4
[3][2][2] 5
[3][3][1] 6

(1)〜(3)の動作がここまで

(4)〜(7)の動作はここから

どの並びを動かしますか?(1〜6) 5 ← キーボードから5と入力
どう動かしますか? (-1 or 1) -1 ← キーボードから-1と入力

1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6


どの並びを動かしますか?(1〜6) 3 ← キーボードから3と入力
どう動かしますか? (-1 or 1) 1 ← キーボードから1と入力

1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6

Congratulations !! ]

(3)までのプログラムはできてるんですが、(4)からの処理がお手上げ状態で・・・
よろしくお願いします。
<!--2-->


202ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(47,417ポイント)   Date: 2007/06/14(木) 09:34   No:8599     
Title: Re:課題の質問    
ここまで出来ていたら、すぐだと思いますよ。

>>(4) キーボードより1〜6の並び番号,及び-1または+1のシフト方向を入力.

これはとりあえずscanf関数でいいでしょう。


>>(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
>>(6) シフトによるシャッフル結果を表示する.

実際にシャッフルする動作はrotate_vとrotate_h関数がそのまま再利用できますよね?


>>(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る

これはif文でいいですよね。


data[0][0] , data[1][0] , data[2][0]
data[0][1] , data[1][1] , data[2][1]
data[0][2] , data[1][2] , data[2][2]


例えば、上図のように並んでいるとすると…


// 最上段の判定
if (data[0][0] == data[1][0] && data[0][0] == data[2][0])

// 最左列の判定
if (data[0][0] == data[0][1] && data[0][0] == data[0][2])


こんな感じです。
繰り返し処理は(4)〜(7)をwhileで囲ってやり、(7)の判定が真の場合にbreakでループから抜けてやればいいだけですね。頑張って!!(^-^)


420ポイント を手に入れた。



Name: minami  ..ぴよぴよ(195ポイント)   Date: 2007/06/13(水) 15:30   No:8574       
Title: アルファベットの検定    
前回「乱数の検定」のトピックを立てさせてもらったminamiです
乱数の検定については無事終了しましたが、今度の課題は
テキストファイル内のデータ(a〜Zまでの52文字の羅列)について検定するものです

基本的な質問かもしれませんが、アルファベットを取り扱うプログラムはASCIIコード
に変換して処理したほうがいいのでしょうか?


105ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(370,210ポイント)   Date: 2007/06/13(水) 16:05   No:8575     
Title: Re:アルファベットの検定    
アスキーコードに変換して・・という意味がよくわからないのですが、
minamiさんは具体的にどうやって変換しようとしているのですか?

char c='1';
printf("%c\n",c);
printf("%d\n",c);

printf("%c\n",1);
printf("%d\n",1);

printf("%c\n",'1');
printf("%d\n",'1');

アスキーコード表を見ながら上記の説明が出来れば、文字列処理はかなりスムーズに進むと思います。


197ポイント を手に入れた。

Name: keichan  ..上級者(24,875ポイント)   Date: 2007/06/13(水) 17:01   No:8577     
Title: Re:アルファベットの検定    
isalpha 関数を使っちゃダメなんですか?

11ポイント を手に入れた。

Name: minami  ..ぴよぴよ(897ポイント)   Date: 2007/06/13(水) 17:23   No:8578     
Title: Re:アルファベットの検定    
管理人さん、返信ありがとうございます。

説明不足ですみません。

今の状態は、test.txtにアルファベットの羅列が入っています。
プログラム上でファイルを読み込むと同時に
@アルファベットの出現頻度を検定する
Aその羅列の連検定を実施する

@については下のようなプログラムになったのですが
Aについては2次元配列を利用して作成しようと思ってます。



/* ファイル中の英文字の出現頻度を調べる */
void Count(FILE *fp)
{
int c;
/* ファイルの終わりに達するまで1文字読み込む */
while ((c = getc(fp)) != EOF)
/* c がアルファベットの小文字か大文字なら */
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
C[c]++; /* カウントする */
}



Aでは2次元配列を使って
アルファベットの羅列が「BcfnihxichaqyffchFUjlcmihJ・・・・」だったら
[Bc][cf][fn][ni][ih][hx][xi]とファイルから読み込むと同時に
2次元配列でカウントしていく感じで作成しようと考えてます。

a b c ・・・・・y z A B C・・・・・Y Z
------------------------------------------
a| 1 3・・・・・・・・・ 6・・・・・・・2
b| 0 4 5 ・・・・・6 7 4 0 4 ・・・・ 4 6
c| 2・・・・・・・ 9 2 7 3 0 ・・・・ 5 2
・|
・|
・|
y|
z|
A|
B|
・|
・|
・|
Y|
Z|

 
 

こういうイメージで
横の座標が、連の文字「●▲」における一文字目(●)で、縦の座標が二文字目(▲)
をあらわしていて、"「●▲」が出た時点で縦と横の交点に1カウントする"
という感じにするとプログラムが書きやすいのかな?を思ってます。
長々と書いてしまいました。
自分のわからないことを人に説明するのって意外と難しいですね・・・ m(__)m



702ポイント を手に入れた。

Name: minami  ..ぴよぴよ(932ポイント)   Date: 2007/06/13(水) 17:27   No:8579     
Title: Re:アルファベットの検定    
投稿して自分のレスをみたら、表のところがずれていました。
すみません
横の「a b c・・・Y Z」がもう少し右よりです。


35ポイント を手に入れた。

Name: フリオ  ..中級者(10,171ポイント)   Date: 2007/06/13(水) 19:09   No:8583     
Title: Re:アルファベットの検定    
 
 急ごしらえですが、とりあえずできました。
表示は、適当なので、ご自身で工夫してください。

#include <stdio.h>
#include <ctype.h>

#define CHMAX 256

void ChTest(int chtest[][CHMAX], int freq[], FILE *fp)
{
int ch0, ch1, i, j;

ch0 = fgetc(fp);
freq[ch0] ++;
if(ch0 != EOF){
while((ch1 = fgetc(fp)) != EOF){
chtest[ch0][ch1] ++;
ch0 = ch1;
freq[ch0] ++;
}
}
return;
}

void PrintResult(int chtest[][CHMAX], int freq[])
{
int i, j;

printf(" ");
for(i = 0; i < CHMAX; i ++) if(isalpha(i))printf("%c", i);
puts(" freq");
for(i = 0; i < CHMAX; i ++){
if(!isalpha(i)) continue;
printf("%c ", i);
for(j = 0; j < CHMAX; j ++){
if(isalpha(j)){
printf("%d", chtest[j][i]);
}
}
printf(" %d\n", freq[i]);
}
return;
}
int main(void)
{
FILE *fp;
int chtest[CHMAX][CHMAX] = {0,};
int freq[CHMAX] = {0,};

if((fp = fopen("test.txt", "r")) == NULL) return 1;
ChTest(chtest, freq, fp);
fclose(fp);
PrintResult(chtest, freq);
return 0;
}

 


477ポイント を手に入れた。

Name: フリオ  ..中級者(10,236ポイント)   Date: 2007/06/13(水) 19:14   No:8584     
Title: Re:アルファベットの検定    
 
> freq[ch0] ++;
> if(ch0 != EOF){

ここは、

if(ch0 != EOF){
freq[ch0] ++;

です。
 


65ポイント を手に入れた。

Name: minami  ..ぴよぴよ(977ポイント)   Date: 2007/06/13(水) 20:17   No:8585     
Title: Re:アルファベットの検定    
フリオさん、ありがとうございます。

今までmain関数の中での処理ばかりしてたので、こうやって関数をいくつか使って
プログラムするとすごく見やすくなるのですね。

しかも、アルファベットの出現頻度と連なりの検定をひとつのプログラムで
できるとは思ってもいませんでした。

文字処理マクロ等、勉強不足のところも多々ありますがフリオさんのプログラム
を参考に自分なりのプログラム作成に励みます。

またわからないときはよろしくお願いします。


45ポイント を手に入れた。

Name: minami  ..かけだし(1,907ポイント)   Date: 2007/06/14(木) 08:22   No:8597     
Title: Re:アルファベットの検定    
おはようございます
昨日、アルファベットの検定について質問したminamiです。

フリオさんのプログラムを見ながら勉強したのですが、ChTest関数のところが
よくわからなくてこまってます。
6行目ではテキストファイル中のアルファベット、1文字1文字についての
出現頻度を求めていると思うんですが、
9行目の[ch0]と[ch1]については、連なりの検定をしているところでいいんですか?

5行目でch0にテキストファイルの文字を読み込んで、8行目でch1に同じテキストファイルから
読み込んでいますよね
だから、9行目の[ch0][ch1]は同じ文字(テキストファイルの1文字目)になるのではないでしょうか?
私の勉強不足で、初歩的な疑問かもしれませんが、ここのところがちょっと判らなかったので
また質問させてもらいました。


1: void ChTest(int chtest[][CHMAX], int freq[], FILE *fp)
2: {
3: int ch0, ch1, i, j;
4:
5: ch0 = fgetc(fp);
6: freq[ch0] ++;
7: if(ch0 != EOF){
8: while((ch1 = fgetc(fp)) != EOF){
9: chtest[ch0][ch1] ++;
10: ch0 = ch1;
11: freq[ch0] ++;
12: }
13: }
14: return;
15: }



2倍のポイントを手に入れた! 930ポイント を手に入れた。



Name: 徹夜  ..ぴよぴよ(486ポイント)   Date: 2007/06/11(月) 22:55   No:8542       
Title: まだ課題です    
int main()
{
int i,j,ln;
printf("何段ですか:");
scanf("%d",&ln);
for(i=1;i<=ln;i++){
for(j=1;j<=ln-i;j++){
putchar(' ');
}
for(j=1;j<=2*i-1;j++){
putchar('*');
}
printf("\n");
}
return(0);
}
ピラミッドを*で表示プログラムになっていると思います。しかし課題にはもう1題あって半径rをキーボードから入力してもらい、半径rの円をアスタリスクで表示せよという問題が出されています。試行錯誤しながら問題を解いていたのですがどうしても解法が見つからないので、再びここでお願いすることにしました。


243ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(370,013ポイント)   Date: 2007/06/12(火) 01:30   No:8545     
Title: Re:まだ課題です    

#include <stdio.h>
#define X 16
#define Y 16

void main(){
/*ループ用のカウンタを2つ宣言*/
for(/*-XからXまでループさせる*/){
for(/*-YからYまでループさせる*/){
if(/*円の条件式にマッチするなら*/)
printf("■");
else
printf(" ");
}
printf("\n");
}
return ;
}

 
穴埋めすれば答えになるサンプルを書いてみました。
円の条件式はいいですか?
例えば中心が原点で半径3の円の内側である条件式はどう書きますか?
現在半径が16まで対応できるようにdefineで定義してありますから、16までで半径を決めて、
最初はscanfなしに、手書きで条件式書いてみてください。

注釈してある部分を式に変更すると完成します。


333ポイント を手に入れた。

Name: 徹夜  ..ぴよぴよ(576ポイント)   Date: 2007/06/13(水) 13:31   No:8570     
Title: Re:まだ課題です    
defineが分かりません。
あとループ構文を-X〜Xまで作るときはもう一個変数を立てて作るのですか?変数iをたてて
for(i=-x;i<=x;i++)とかですか?
円の条件式はx*x+y*y<=r*rだと思いますが、それの使い方が分からないです。



 


90ポイント を手に入れた。

Name: asd  ..中級者(14,014ポイント)   Date: 2007/06/13(水) 13:58   No:8571     
Title: Re:まだ課題です    
> defineが分かりません。

調べてみませんか?

Google検索 c言語 define
http://www.google.co.jp/search?hl=ja&q=c%E8%A8%80%E8%AA%9E+define&lr=&btnG=Google+%E6%A4%9C%E7%B4%A2

> あとループ構文を-X〜Xまで作るときはもう一個変数を立てて作るのですか?変数iをたてて
> for(i=-x;i<=x;i++)とかですか?

コメント中にループ用変数を2つ宣言とあります。

> 円の条件式はx*x+y*y<=r*rだと思いますが、それの使い方が分からないです。
ループ用変数がそれぞれX座標、Y座標にあたるのでそれに置き換えて条件式を書けばよいと思います。
また、半径は固定で考えてよいと思うので(後にscanfを使うと思います)rは適当な半径に置き換えましょう。

例)
X座標のループ変数がi、Y座標のループ変数がj、半径5のときの条件式
i*i+j*j<=5*5

目の前にコンパイルできる環境があるのであればまずはやってみませんか?
やってみてダメだったらどの様に書いてどううまくいかないのか説明してもらわないと
なかなか上達しませんよ〜^^


277ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(370,387ポイント)   Date: 2007/06/13(水) 16:40   No:8576     
Title: Re:まだ課題です    
defineについてはasdさんが示していらっしゃる方法で調べてみてください。
解らないことがあればまずgoogleです。
もうほとんどasdさんが示していらっしゃるので、私が言うことはありませんが、
私のサンプルは半径が指定できないので、とりあえず円を描くプログラムを完成させてからscanfなどで半径を取り込みましょう。
最初は半径は固定でいきましょう。

>> for(i=-x;i<=x;i++)とかですか?

おしいですが、今回xは何を用いるかと言うと・・。
defineについて調べると解ります。

とりあえず色々自分で書いてみて何度も実行していく中で答えを見つけていきましょう。
自分でやってみずに「こうですか?」「こうですか?」と聞くのはよくないので。
やってみて出来なかったらまた聞いてください。


177ポイント を手に入れた。



Name: hana  ..ぴよぴよ(216ポイント)   Date: 2007/06/12(火) 13:30   No:8552       
Title: ランダムウォーク    
こんにちは、はじめまして
今やってる課題で「ランダム粒子」に関するプログラムを作ってます。
最終的には100個の粒子が移動距離は不規則で動き回るものを目指してます。

今のところ、1個の粒子がxy座標上を±1ずつ移動するプログラムを作成しましたが
これを移動距離はそのまま±1で、粒子の数を100個に増やす方法が良くわかりません。



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

int main (void)
{
int i,num0;
int m=0;
int n=0;
double x[10000];
double y[10000];
srand((unsigned)time(NULL));

for(i=0;i<10000;i++){
num0=rand()%4;
switch(num0){
case 0: m=m+1; break;
case 1: m=m-1; break;
case 2: n=n+1; break;
case 3: n=n-1; break;
}
x[i]=m;
y[i]=n;
printf("x=%.0f\t",x[i]);
printf("y=%.0f\n",y[i]);
}
}


for文を使えばいいと思うのですが、どなたか教えてください。


216ポイント を手に入れた。


Name: asd  ..中級者(11,911ポイント)   Date: 2007/06/12(火) 13:47   No:8553     
Title: Re:ランダムウォーク    
掲載されているプログラムでx,yを10000の配列にしているところから、
10000個分のXY座標を保存できる=10000個の粒子の座標を保存できると考えたのですが違うのでしょうか?
(粒子100個ならそれぞれ100にすればいいのでは?)

現状のプログラムでは初期位置が全て(0,0)となってしまうため、
for文に入る前にそれぞれの初期座標をランダムに決定する処理を追加すると1箇所に固まらずばらばらになるかと思います。

また、for文全体を無限ループするようにすれば終了させるまで延々と粒子が動いてくれるかと思います。

大きな勘違いをしていたらゴメンナサイ。


251ポイント を手に入れた。

Name: keichan  ..上級者(24,864ポイント)   Date: 2007/06/12(火) 14:29   No:8555     
Title: Re:ランダムウォーク    
こんな感じでしょうか?

#include<stdio.h>

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

#define X_LIMIT (200)
#define Y_LIMIT (200)
#define PARTICLE_NUM (100)

int main (void)
{
int i, num0;
double x[PARTICLE_NUM];
double y[PARTICLE_NUM];
srand((unsigned)time(NULL));

/* 初期位置の設定 */
for( i=0; i<PARTICLE_NUM; ++i ) {
x[i] = rand() % X_LIMIT;
y[i] = rand() % Y_LIMIT;
}

for( i=0; i<PARTICLE_NUM; ++i ) {
switch(rand() % 4) {
case 0: x[i] = x[i] + 1; break;
case 1: x[i] = x[i] - 1; break;
case 2: y[i] = y[i] + 1; break;
case 3: y[i] = y[i] - 1; break;
}
printf("x=%.0f\t",x[i]);
printf("y=%.0f\n",y[i]);
}
return 0;
}



730ポイント を手に入れた。

Name: hana  ..ぴよぴよ(36ポイント)   Date: 2007/06/12(火) 15:08   No:8556     
Title: Re:ランダムウォーク    
asdさん、返信ありがとうございます。
配列を10000個用意したのは、移動する粒子の(x、y)座標を格納して実行すると
コマンドラインで(x、y)の座標が出るようにするために準備したのですが・・・
もしかしてこれって必要ないのでしょうか?

keichanさん、ありがとうございます
まだ初心者で、defineは初めて見ました。
調べてみたら「べんり〜♪」って感じになりました。
このプログラムでは移動回数は100回で設定!でいいんですよね
実行後の結果というのは、100個の粒子各々の最終的な座標になるのですか?


36ポイント を手に入れた。

Name: asd  ..中級者(13,737ポイント)   Date: 2007/06/12(火) 18:34   No:8560     
Title: Re:ランダムウォーク    
>配列を10000個用意したのは、移動する粒子の(x、y)座標を格納して実行すると
>コマンドラインで(x、y)の座標が出るようにするために準備したのですが・・・
>もしかしてこれって必要ないのでしょうか?

それぞれの粒子の移動履歴を取っておきたいということであれば必要かと思いますが、
一度座標を表示したらそれ以降値が変化してもいいのであれば配列にしなくてもよいかと思います。
私が言わんとしたことはkeichanさんが形にしてくれていますのでそれを参考にすると良いかと思います。

そしてhanaさんのコメントで気がついたことがあるのですが、

>このプログラムでは移動回数は100回で設定!でいいんですよね

keichanさんのプログラムでは100個の粒子がそれぞれ1回だけ移動した結果を表示するものかと思います。
配列x,yはそれぞれの粒子のX座標、Y座標を保存している配列になります。
図にするとこんなかんじです。

[0] [1] [2] ... [98] [99]
X 200 105 10 ... 10 123
Y 10 5 2 ... 51 54

上の図から、それぞれの粒子の座標は以下になります。

粒子0(200,10)
粒子1(105,5)
粒子2(10,2)
(中略)
粒子98(10,51)
粒子99(123,54)

ですので移動回数を2回以上にする場合にはfor文を繰り返し実行する必要があります。


/*粒子を無限に移動させる*/
while(1){
/*それぞれの粒子を1度移動させる*/
for( i=0; i<PARTICLE_NUM; ++i ) {
switch(rand() % 4) {
case 0: x[i] = x[i] + 1; break;
case 1: x[i] = x[i] - 1; break;
case 2: y[i] = y[i] + 1; break;
case 3: y[i] = y[i] - 1; break;
}
printf("x=%.0f\t",x[i]);
printf("y=%.0f\n",y[i]);
}
}


何となく分かってもらえたでしょうか?

keichan様>
意図と違う説明をしていたら遠慮なく突っ込んでください^^


2倍のポイントを手に入れた! 1,826ポイント を手に入れた。

Name: hana  ..ぴよぴよ(278ポイント)   Date: 2007/06/13(水) 08:14   No:8569     
Title: Re:ランダムウォーク    
asdさん詳しい説明ありがとうございます

もう少し自分でkeichanさんとasdさんのソースコードを見て勉強させてもらいます.
また分からないときはよろしくお願いします.


62ポイント を手に入れた。



Name: BAZZ  ..入門者(4,981ポイント)   Date: 2007/06/12(火) 21:41   No:8563       
Title: こういうの苦手なんです。    
LINK : fatal error LNK1104: ファイル 'C:\DOCUME~1\○○' を開くことができません。

こんなエラーがでます。○○の部分は名前が入ります。
イロイロ検索してみたのですが
環境変数だの何だのって難しいことばかりが・・・・orz

いつもはVC++ EEでふつうにコンソール画面で
デバッグ処理してプログラムの動作を確認するんですけど
今回は実験結果をいっぱい入れるので
リダイレクトを使ってみたくてですね。

でコマンドプロンプトから読んで実行させようとしてるんですが
蒸気のエラーが出てしょうがありません・・・
リンクエラーはもっとも苦手です・・・(得意なエラーはありませんが(爆

開くことができないって言うのはどういうことなのでしょうか??
どうぞよろしくおねがいします。


263ポイント を落としてしまった。


Name: box  ..比類無きプログラマー(70,991ポイント)   Date: 2007/06/12(火) 22:20   No:8564     
Title: Re:こういうの苦手なんです。    
exeファイル作成まではこれまでと同様の方法で行ない、
できあがったexeファイルを実行するときだけ
コマンドプロンプトを使うようにしてみてはいかがでしょうか?


59ポイント を手に入れた。

Name: BAZZ  ..初心者(5,245ポイント)   Date: 2007/06/12(火) 23:13   No:8565     
Title: Re:こういうの苦手なんです。    
>box様

おぉ!!!
ありがとうございます

普通にできました^^
こんな方法もあるんですねーーー

--------------------------------------------------------------
で実行してみましたらリダイレクトで問題が発生しました。。。
続けて質問してしまいまして申し訳ありません^^;

ソースは添付のとおりでございまして、
data.txtというファイルから入力していきたいのですが
出力が変になります・・・

data.txtの内容を下に載せます。
どこかまちがっているのでしょうか??
リダイレクト使ったことないんですけど、
これでいいんじゃないかっておもってるんですが・・・・・

ちなみにVC++のコマンドプロンプト上で
カレントディレクトリをDebugに合わせてから
dataprs.exeを実行させた後

dataprs.exe < data.txt
って入力して実行させてます。(確かこれでよかったはず。

返信よろしくお願いします!

********** data.txt ************
0.00 0.00
2.00 8.94
4.00 17.55
6.00 26.50
8.00 34.80
10.00 44.2
0.00 0.00
2.00 4.22
4.00 8.28
6.00 12.55
8.00 16.55
10.00 20.90
0.00 0.00
2.00 3.00
4.00 5.90
6.00 8.90
8.00 11.70
10.00 14.55




2倍のポイントを手に入れた! 264ポイント を手に入れた。

Name: box  ..比類無きプログラマー(71,146ポイント)   Date: 2007/06/12(火) 23:45   No:8566     
Title: Re:こういうの苦手なんです。    

> 出力が変になります・・・

「変になる」だけですと、状況がこちらに正しく伝わりません。
実行時に何かエラーメッセージが出たのでしたら、その内容を
正確に伝えてください。

ソースコードをざっと見たところ、気になる点が1つあります。

> bun += (1 / DN) * o[j][i] * o[j][i];

DNは6なので、1/6という整数どうしの割り算を行なった結果、ゼロになります。
ゼロにo[j][i]を何度掛けてもゼロのままです。

bun += (double) (1 / DN) * o[j][i] * o[j][i];

のようにキャストするか、DNによる割り算を最後に持ってきて

bun += o[j][i] * o[j][i] / DN;

とするかでしょう。割り算を最後に持ってくる場合、キャストは不要です。


155ポイント を手に入れた。

Name: box  ..比類無きプログラマー(71,178ポイント)   Date: 2007/06/12(火) 23:50   No:8567     
Title: Re:こういうの苦手なんです。    

あともう一点。

> o[j][n] = v[j][n] / i[j][n];

ここで、ゼロによる割り算を行なっていませんか?


32ポイント を手に入れた。

Name: BAZZ  ..初心者(5,395ポイント)   Date: 2007/06/13(水) 00:46   No:8568     
Title: Re:こういうの苦手なんです。    
返信ありがとうございます!

言われたところ直しました!

えーと結論から申しまして解決しました^^

dataprs.exeを実行させてから
キー入力のところでリダイレクトのコマンド入れてましたwww
数値じゃないもの入れてるんだから
分けわかんない数字になるの当たり前ですよね・・・


解決しました!

box様、ご丁寧にどうもありがとうございました!


150ポイント を手に入れた。



Name: BAZZ  ..入門者(4,995ポイント)   Date: 2007/06/09(土) 09:35   No:8475       
Title: 書式変換フォーマットでしたっけな    
printfで
%d、%f、%sみたいなやつがありますよね??

これをつかいながら最近気づいたことがあります
%fにおいて、整数aの範囲をa > 0としたときに
%.afとしたら小数点以下a桁までの値がその直前の
小数点以下a + 1桁目が四捨五入されて表示されますよね??

そこで
%.adとした場合なんですが
これについてがよくわかりません。
printf("%.4d",123);
の実行結果は確か
0123
だったと思うんですが
これって
%04dだとおもいましたけど、これでおなじことができませんか??

%sにかんしては
char mozi[6] = "hello"

printf("%.4s", mozi);
の実行結果は
hell

なんです。

解説なんかを読むと
表示する最低桁数を設定するものみたいです。int型は初期値が1、doubleは6見たいなふうに
なってるそうです。

intは上の桁から数えてa桁分数えてそれ以下の桁数なら0を左に詰めて表示。
doubleは小数点以下からa桁分表示。
charは最初の文字からa文字目までを表示

ってことになるとおもうんですが、これでいいんでしょうか??

ひさしぶりに質問内容がまとまってると思いますけど(爆
よろしくおねがいしますm(__)m


95ポイント を手に入れた。


Name: toyo  ..かけだし(1,457ポイント)   Date: 2007/06/09(土) 10:43   No:8477     
Title: Re:書式変換フォーマットでしたっけな    
いいんじゃないでしょうか

d, i, o, u, x, X 変換では、表示される最小の桁数を指定する。
a, A, e, E, f, F 変換では、小数点以下に表示される数字の桁数を指定する。
g と G 変換では、有効数字の最大桁数を指定する。
s と S 変換では、文字列から出力される最大文字数を指定する。


116ポイント を手に入れた。

Name: BAZZ  ..初心者(5,028ポイント)   Date: 2007/06/09(土) 15:07   No:8480     
Title: Re:書式変換フォーマットでしたっけな    
疑問が解決しました。

本当にありがとうございましたm(__)m


33ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(369,085ポイント)   Date: 2007/06/09(土) 15:15   No:8482     
Title: Re:書式変換フォーマットでしたっけな    
http://www.google.co.jp/search?hl=ja&q=printf+%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89&lr=

この辺の検索で色々わかりますよ^^


51ポイント を手に入れた。

Name: BAZZ  ..初心者(5,244ポイント)   Date: 2007/06/12(火) 21:37   No:8562 解決!     
Title: Re:書式変換フォーマットでしたっけな    
うわww
すごい多いですねwww

なんか・・・まだまだって感じが激しくしてきます。
当たり前ですけど。

管理人さん、toyoさん
返信ありがとうございました!


53ポイント を手に入れた。



Name: momo  ..ぴよぴよ(27ポイント)   Date: 2007/06/11(月) 23:11   No:8543       
Title: サービス関数    
下記課題なのですが、まず問題の意味が分からないのですが、何をどうすればよいのでしょうか?
自分の現在の力ではどうにも出来ませんので、どなたか、素人でも分かる解説をお願いできませんでしょうか?

下記の式1,2の結果を取得するサービス関数を作りなさい
(ただし、main()とは別のソースファイルに関数を作成すること)

式1  a + 10
式2  a × 2.1

※a は int型の変数で、サービス関数の引数で渡すこと


27ポイント を手に入れた。


Name: asd  ..中級者(11,582ポイント)   Date: 2007/06/12(火) 11:05   No:8548     
Title: Re:サービス関数    
課題として出されたのであれば、ご自分が理解できるまで担当の先生に質問してはどうでしょうか?
そしてその上でどこまでできて何が分からないのかを改めて質問しなおしてください。

1からすべて教えるのはさすがに掲示板では難しい気もしますし^^;

・プログラムの作り方はわかりますか?
・サービス関数の作り方はわかりますか?
・引数を渡した関数の作り方はわかりますか?
・関数を別ファイルにして利用する方法はわかりますか?


173ポイント を手に入れた。

Name: asd  ..中級者(11,660ポイント)   Date: 2007/06/12(火) 11:07   No:8549     
Title: Re:サービス関数    
あ〜ぁ、マルチポストですか。
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1616

掲示板規約より
>・マルチポスト(複数の掲示板に同じ質問を書く事)は禁止です。


78ポイント を手に入れた。



Name: たのもー  ..入門者(2,665ポイント)   Date: 2007/06/12(火) 02:00   No:8546       
Title: WinMain関数が・・・    
みなさんお久しぶりです。

最近「book off」でプログラムはなぜ動くのかという本を買いました。
まぁそんなことはどうでもいいのですが・・

その本に載っているプログラムでコンパイルできないものがあります。
コンパイルしようとすると

エラー E2040 window.c 10: 宣言が正しく終了していない(関数 WinMain )
エラー E2027 window.c 16: メモリ上に配置されなければならない(関数 WinMain )
警告 W8008 window.c 26: 条件が常に真(関数 WinMain )
警告 W8066 window.c 32: 実行されないコード(関数 WinMain )
エラー E2277 window.c 34: 左辺値が必要(関数 WinMain )
警告 W8057 window.c 42: パラメータ 'hInstance' は一度も使用されない(関数
WinMain )
警告 W8057 window.c 42: パラメータ 'hPrevInstance' は一度も使用されない(関数
WinMain )
警告 W8057 window.c 42: パラメータ 'lpCmdLine' は一度も使用されない(関数
WinMAin)
警告 W8057 window.c 42: パラメータ 'nCmdShow' は一度も使用されない(関数
WinMain)

とでます。
本とよく見比べたのですがたぶん相違はないと思います。
どこが悪いのかご指導よろしくお願いしますm(_ _)m

↓↓  ソース  ↓↓
<window.c>

#include "windows.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )

{
float f;
unsigned long 1;
int i;
char s[80];

f = (float)0.75;

memcpy(&1, &f, 4);

for (i = 33; i >= 0; i--)
{
if ((i == 1) || (i == 10))
{
s[i] = '-';
}
else
{
if (1 % 2 == 1)
{
s[i] = '1';
}
else
{
s[i] = '0';
}
1 /= 2;
}
}
s[34] = '\0';

MessageBox(NULL, s, "単精度浮動小数点数の表し方", MB_OK);

return 0;
}


長くなってスミマセンm(_ _)m


P.S
管理人さん、かなり遅れてですが「50万」突破おめでとうございます。(^\^)



674ポイント を手に入れた。


Name: YuO  ..入門者(4,961ポイント)   Date: 2007/06/12(火) 02:28   No:8547     
Title: Re:WinMain関数が・・・    
エラーメッセージ読めば,ある程度場所の推測がつきそうな物ですが……。

10行目,26行目,32行目の元のコードは数字の1ではなくLの小文字のlではないですか?
# 26行目は%の前にある1の方。


ついでに,
> #include "windows.h"

#include <windows.h>
に,
> int APIENTRY WinMain

int WINAPI WinMain
にした方がWindows SDKの記述に合わせることができます。

それから,
> f = (float)0.75;
はキャストの誤用なので,
f = 0.75f;
とすべきです。


158ポイント を手に入れた。



Name: yossiy  ..かけだし(1,442ポイント)   Date: 2007/06/10(日) 01:09   No:8491       
Title: 関数についてしつもんです。    
C言語を始めて関数でつまづいています。

平均点、標準偏差、偏差値を求めるプログラムです。
関数を使わないものは出来たのですが、関数を使ったものに直すことができません。
引数の書き方もよくわかりません。

どなたか教えてください。






関数を使わないもの

#include <stdio.h>
#include <math.h>
#define NUM 10
int main(void)
{
int soten[NUM]={84,95,60,100,83,72,93,85,65,98};
int goukei;
double heikin;
double hensati[NUM];
double hyoujunhensa;
int i,n;

/*****計算をする部分*****/
/*****平均点を求める*****/
goukei = 0;
for (i=0; i<NUM; i++) {
goukei += soten[i];
}
heikin = (double)goukei / NUM;

/*****標準偏差を求める*****/
goukei = 0;
for (i=0; i<NUM; i++) {
goukei = goukei + (soten[i] - heikin) * (soten[i] - heikin);
}
hyoujunhensa = sqrt(goukei/NUM);
/*****偏差値を求めて配列に入れる*****/
for (i=0; i <NUM; i++){
hensati[n] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
}

/*****表示をする部分*****/
/*****平均点と標準偏差の表示*****/
printf("平均点 %5.2f\n",heikin);
printf("標準偏差 %6.3f\n",hyoujunhensa);

/*****個人の点数、偏差値の表示*****/
for(i=0; i<NUM; i++){
for(n=0; n<NUM; n++);
printf("点数 %d 偏差値 %6.3f\n", soten[i],hensati[n]);

}
return 0;
}


関数を使ったもの

#include <stdio.h>
#include <math.h>
#define NUM 10

double cal_heikin(int soten[NUM]);
double cal_hyoujunhensa(int soten[NUM],double heikin);
double cal_hensati(int soten,double heikin,double hyoujunhensa);

int main(void)
{
int soten[NUM]={84,95,60,100,83,72,93,85,65,98};
double heikin;
double hensati[NUM];
double hyoujunhensa;
int i,n;
heikin = cal_heikin(soten,NUM);
printf("平均:%5.3f\n",heikin);"
hyoujunhensa = cal_hyoujunhensa(soten,NUM,heikin);
printf("標準偏差:%5.3f\n",hyoujunhensa);
for(i=0; i<NUM; i++){
for(n=0; n<NUM; n++);
printf("点数 %d 偏差値 %5.3f\n", soten[i],hensati[n]);
}
return 0;
}
/*平均点を求める*/
double cal_heikin(int soten,NUM){
int goukei,i;
double heikin;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei += soten[i];
}
heikin = (double)goukei / NUM;
return heikin;
}
/*標準偏差を求める*/
double cal_hyoujunhensa(int soten,NUM,double heikin){
int goukei,i;
double heikin,hyoujunhensa;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei = goukei + (soten[i] - heikin) * (soten[i] - heikin);
}
hyoujunhensa = sqrt(goukei/NUM);
return hyoujunhensa;
}
/*偏差値(一人分)を求めて配列に入れる*/
double cal_hensati(int soten,double heikin,double hyoujunhensa){
int i,n;
double hensati[NUM];
for (i=0; i <NUM; i++){
hensati[n] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
}
return hensati;
}


1,442ポイント を手に入れた。


Name: Hermit  ..初心者(6,734ポイント)   Date: 2007/06/10(日) 08:29   No:8494     
Title: Re:関数についてしつもんです。    
>関数を使わないものは出来たのですが、関数を使ったものに直すことができません。

関数を使わない物も変なので、まずはそちらを直しましょう。

電卓片手に、数値を検証しなおしたら、ちょっと違うことが解ると思いますが。

あと、int i,n; のうち、n は余計です。それを使っている所が変になっています。


関数呼び出しですが、
double cal_heikin(int soten[NUM]);
double cal_heikin(int soten,NUM){

double cal_hyoujunhensa(int soten[NUM],double heikin);
double cal_hyoujunhensa(int soten,NUM,double heikin){

宣言と、関数の受け取りが違っています。

まだたくさん間違いはありますが、とりあえずそれだけ書いておきます。


224ポイント を落としてしまった。

Name: BAZZ  ..初心者(5,118ポイント)   Date: 2007/06/10(日) 15:19   No:8504     
Title: Re:関数についてしつもんです。    
とりあえずソースが見にくくてしょうがないので
ソースを
 
で囲うようにしてみてくださいな^^
そうすると字下げが生かされますんで。

これ重要ですよーー^^
多分orz



90ポイント を手に入れた。

Name: BAZZ  ..初心者(5,151ポイント)   Date: 2007/06/10(日) 15:23   No:8505     
Title: Re:関数についてしつもんです。    
あれ、
なんか消えてしまった。"
 
"で囲ってみてくださいといいたかったのです。


33ポイント を手に入れた。

Name: BAZZ  ..初心者(5,191ポイント)   Date: 2007/06/10(日) 15:27   No:8506     
Title: Re:関数についてしつもんです。    
すいません。なんか馬鹿やってしまってorz
いいたいことをペイントで描きました。
どうぞみてやってください・・・


40ポイント を手に入れた。

Name: yossiy  ..かけだし(2,455ポイント)   Date: 2007/06/10(日) 18:12   No:8507     
Title: 関数についてしつもんです。2    
アドバイスありがとうございます。

直せるところは直してみました。
要素数NUMの引数の書き方がわかりません。

まだまだエラーがありますので、引き続きご指導願います。



#include <stdio.h>
#include <math.h>
#define NUM 10 /*要素数*/

double cal_heikin(int soten[NUM]);/*引数:素点の配列(int配列)、要素数(int型)、返り値:平均点(double)*/
double cal_hyoujunhensa(int soten[NUM],double heikin);/*引数:素点の配列(int配列)、要素数(int)、平均点(double)、返り値:標準偏差(double)*/
double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa);/*引数:素点(int)、平均点(double)、標準偏差(double)、返り値:偏差値(double)*/

int main(void)
{
int soten[NUM]={84,95,60,100,83,72,93,85,65,98};
double heikin;
double hensati[NUM];
double hyoujunhensa;
int i,n;
heikin = cal_heikin(soten);
printf("平均:%5.3f\n",heikin);"
hyoujunhensa = cal_hyoujunhensa(soten,heikin);
printf("標準偏差:%5.3f\n",hyoujunhensa);
hensati[n]=cal_hensati(soten,heikin,hyoujunhensa)
for(i=0; i<NUM; i++){
for(n=0; n<NUM; n++);
printf("点数 %d 偏差値 %5.3f\n", soten[i],hensati[n]);
}
return 0;
}
/*平均点を求める*/
double cal_heikin(int soten[NUM]){
int goukei,i;
double heikin;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei += soten[i];
}
heikin = (double)goukei / NUM;
return heikin;
}
/*標準偏差を求める*/
double cal_hyoujunhensa(int soten,double heikin){
int goukei,i;
double heikin,hyoujunhensa;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei = goukei + (soten[i] - heikin) * (soten[i] - heikin);
}
hyoujunhensa = sqrt(goukei/NUM);
return hyoujunhensa;
}
/*偏差値(一人分)を求めて配列に入れる*/
double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa){
int i,n;
double hensati[NUM];
for (i=0; i <NUM; i++){
hensati[n] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
}
return hensati;
}


1,013ポイント を手に入れた。

Name: 組木紙織  ..中級者(14,001ポイント)   Date: 2007/06/10(日) 18:36   No:8508     
Title: Re:関数についてしつもんです。2    
コメントをいれてコンパイルが通るように一部変更しました。
宣言の部分の int soten[NUM]は int soten[]で十分ですので。
内容は一切見ていません。

#include <stdio.h>
#include <math.h>
#define NUM 10 /*要素数*/

double cal_heikin(int soten[NUM]);/*引数:素点の配列(int配列)、要素数(int型)、返り値:平均点(double)*/
double cal_hyoujunhensa(int soten[NUM],double heikin);/*引数:素点の配列(int配列)、要素数(int)、平均点(double)、返り値:標準偏差(double)*/
double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa);/*引数:素点(int)、平均点(double)、標準偏差(double)、返り値:偏差値(double)*/

int main(void)
{
int soten[NUM]={84,95,60,100,83,72,93,85,65,98};
double heikin;
double hensati[NUM];
double hyoujunhensa;
int i,n;
heikin = cal_heikin(soten);
/*最後の"は必要なし*/
printf("平均:%5.3f\n",heikin);/*"*/
hyoujunhensa = cal_hyoujunhensa(soten,heikin);
printf("標準偏差:%5.3f\n",hyoujunhensa);
/*最後に;を入れてください*/
hensati[n]=cal_hensati(soten,heikin,hyoujunhensa);
for(i=0; i<NUM; i++){
for(n=0; n<NUM; n++);
printf("点数 %d 偏差値 %5.3f\n", soten[i],hensati[n]);
}
return 0;
}
/*平均点を求める*/
double cal_heikin(int soten[NUM]){
int goukei,i;
double heikin;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei += soten[i];
}
heikin = (double)goukei / NUM;
return heikin;
}
/*標準偏差を求める*/
/*1番目の引数は整数型ですか?宣言時は配列でしたよ*/
double cal_hyoujunhensa(int soten[NUM],double heikin){
int goukei,i;
/*変数heikinの再宣言?*/
double /*heikin,*/hyoujunhensa;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei = goukei + (soten[i] - heikin) * (soten[i] - heikin);
}
hyoujunhensa = sqrt(goukei/NUM);
return hyoujunhensa;
}
/*偏差値(一人分)を求めて配列に入れる*/
double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa){
int i,n;
double hensati[NUM];
for (i=0; i <NUM; i++){
hensati[n] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
}
/*配列を返しますか?宣言ではdoubleを返しています
今回は何も考えずに最初の要素を返しています。
*/
return hensati[0];
}


1,163ポイント を落としてしまった。

Name: Hermit  ..初心者(7,674ポイント)   Date: 2007/06/10(日) 18:56   No:8509     
Title: Re:関数についてしつもんです。2    
#include <stdio.h>

#include <math.h>
#define NUM 10 /*要素数*/

double cal_heikin(int soten[NUM]);/*引数:素点の配列(int配列)、要素数(int型)、返り値:平均点(double)*/
/*平均点を求める*/
double cal_heikin(int soten[NUM]){
int goukei,i;
double heikin;
goukei = 0;
for (i=0; i<NUM; i++) {
goukei += soten[i];
}
heikin = (double)goukei / NUM;
return heikin;
}
double cal_hyoujunhensa(int soten[NUM],double heikin);/*引数:素点の配列(int配列)、要素数(int)、平均点(double)、返り値:標準偏差(double)*/
/*標準偏差を求める*/
//double cal_hyoujunhensa(int soten,double heikin){
double cal_hyoujunhensa(int soten[],double heikin){
// int goukei,i;
// double heikin,hyoujunhensa; //引数で渡された heikin が有るから heikin は必要なし
int i;
//合計が、int だと、小数点以下は切り捨てられる。double に!
double goukei, hyoujunhensa;
// goukei = 0;
goukei = 0.0;
for (i=0; i<NUM; i++) {
goukei = goukei + (soten[i] - heikin) * (soten[i] - heikin);
}
hyoujunhensa = sqrt(goukei/NUM);
return hyoujunhensa;
}
//double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa);/*引数:素点(int)、平均点(double)、標準偏差(double)、返り値:偏差値(double)*/
/*偏差値(一人分)を求めて配列に入れる*/
//double cal_hensati(int soten[NUM],double heikin,double hyoujunhensa){
void cal_hensati(int soten[NUM],double hensati[],double heikin,double hyoujunhensa){
int i,n;
// double hensati[NUM]; ここで宣言しても、関数を抜けると捨てられます、引数などで渡してもらう方がいいかな?やり方は色々ある。
for (i=0; i <NUM; i++){
// n は初期化されてない上、どこでも変化していない。なぜ使用する?
// hensati[n] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
hensati[i] = (soten[i] - heikin) / hyoujunhensa *10 + 50;
}
// return hensati; これを返してもどうしようもない。
}
int main(void)
{
int soten[NUM]={84,95,60,100,83,72,93,85,65,98};
double heikin;
double hensati[NUM];
double hyoujunhensa;
int i,n;
heikin = cal_heikin(soten);
printf("平均:%5.3f\n",heikin);//" <- なに?この '"' は。
hyoujunhensa = cal_hyoujunhensa(soten,heikin);
printf("標準偏差:%5.3f\n",hyoujunhensa);
// hensati[n]=cal_hensati(soten,heikin,hyoujunhensa) この様な事しても、配列に数値は入らない
// cal_hensati(soten,hensati,heikin,hyoujunhensa)
cal_hensati(soten,hensati,heikin,hyoujunhensa);
for(i=0; i<NUM; i++){
// for(n=0; n<NUM; n++); 何のためにある?
// printf("点数 %d 偏差値 %5.3f\n", soten[i],hensati[n]);
printf("点数 %d 偏差値 %5.3f\n", soten[i],hensati[i]);
}
return 0;
}


940ポイント を手に入れた。

Name: Hermit  ..初心者(8,322ポイント)   Date: 2007/06/10(日) 21:16   No:8510     
Title: Re:関数についてしつもんです。2    
普通、標準偏差は、母体を推計して出すと思うので、こっちで計算する方がいいとおもいます。
元の計算方法は、StDevP の方、
#include <stdio.h>

#include <math.h>
#define COUNT(x) (sizeof(x)/sizeof(x[0]))
struct Ave_Stdev
{ //名前は、excel にあわせる。
double Ave;
double StDev;
double StDevP;
};
struct Ave_Stdev
st_asp (int *point, int count)
{
struct Ave_Stdev data;
double Ave = 0.0;
double StDev2 = 0.0;
int i;
for (i = 0; i < count; i++)
{
Ave += point[i];
StDev2 += point[i] * point[i];
}
data.Ave = Ave / count;
{ //同じなのでとりあえず tmp にまとめる
double tmp = StDev2 - data.Ave * Ave;
data.StDev = sqrt (tmp / (count - 1));
data.StDevP = sqrt (tmp / count);
} //tmp のための{}付け終わり
return data;
}
int
main (void)
{
int soten[] = { 84, 95, 60, 100, 83, 72, 93, 85, 65, 98 };
struct Ave_Stdev data = st_asp (soten, COUNT(soten));
int i;
printf ("平均:%5.3f\n", data.Ave);
printf ("標準偏差:%5.3f\n", data.StDev);
for (i = 0; i < COUNT(soten); i++)
printf ("点数 %3d 偏差値 %5.3f\n", soten[i],
(soten[i] - data.Ave) / data.StDev * 10 + 50);
return 0;
}


648ポイント を手に入れた。

Name: yossiy  ..かけだし(2,497ポイント)   Date: 2007/06/12(火) 00:17   No:8544 解決!     
Title: Re:関数についてしつもんです。2    
みなさん、ありがとうございます。
大変参考になりました。
基本的な事が分からず苦労しています。
またよろしくお願いします。


42ポイント を手に入れた。



Name: まだ未熟  ..かけだし(1,057ポイント)   Date: 2007/06/11(月) 00:16   No:8519       
Title: 分からないプログラムエラーがあるんですが・・・    
実は、習ったのを復習しようと家でやってみたんですが、
どうしても、分からないエラーがあります。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"compa4.h"

int check (FILE **);
int recordin (FILE *, struct class *p);
void tansak (FILE *, struct class *q, int *N);
void output (struct class *q);


void main (void)
{
FILE *fp;
struct class d;
int M;
int No = 0;

M = check(&fp);

if(M == NULL || M == EOF)
{
exit(1);
}

while(No != 0)
{
fseek(fp, 0, SEEK_SET);
printf("出席番号 ==");
scanf("%d", &No);
tansak(fp, &d, &No);
}
fclose(fp);

}

int check (FILE **fo)
{
struct class h;
int ren;

if((*fo = fopen("TEST4S01.DAT","r")) == NULL)
{
printf("ファイルのオープンエラー\n");
ren = NULL;
}
else
{
ren = recordin(*fo, &h);
if(ren == EOF)
{
printf("データはありません");
}
fseek(*fo, 0, SEEK_SET);
}
return ren;
}

int recordin (FILE *fn, struct class *p)
{
int ret;

ret = fscanf(fn, "%2d%10s%3d%3d%3d*c", &(p->personNo), p->name, &(p->eigo),
&(p->suga), &(p->koku));

return ret;
}

void tansak (FILE *fk, struct class *k, int *N)
{
int F;

F = recordin(fk, k);

while((*N != '^Z')&&(F != EOF))
{
if(*N == k->personNo)
{
if((-1> k->eigo)&&(k->eigo >101))
{
printf("点数のerror\n");
break;
}
if((-1> k->suga)&&(k->suga >101))
{
printf("点数のerror\n");
break;
}
if((-1> k->koku)&&(k->koku >101))
{
printf("点数のerror\n");
break;
}
else
{
output(k);
break;
}
}
else
{
F = recordin(fk, k);
}
}
if(F == EOF)
{
printf("データが見つかりません\n");
}
}

void output (struct class *q)
{
int total;
total = q->eigo + q->suga + q->koku;
printf("%6d %10s %3d %3d %3d %3d %3d", (q->personNo), (q->name), (q->eigo), (q->koku), (total), ((total)/3));
}

上のプログラムを実行して、下のようなエラーが出ました。
6 : 宣言に型が多すぎる。
19 : 不正な構造体の演算(main)
38 : 'check'の再宣言で型が一致してない
6 : 一つ前の'check'の定義

このプログラムは一度コンパイルできたんですが、内容はほぼ同じなのに、
家でやるとなぜかこういうエラーがでました。
自分の頭じゃどう見ても間違いはないように見えるんですが、どこが間違っているのでしょうか?


1,057ポイント を手に入れた。


Name: YuO  ..入門者(3,910ポイント)   Date: 2007/06/11(月) 01:11   No:8520     
Title: Re:分からないプログラムエラーがあるんですが・・・    
compa4.hは正しいヘッダファイルですか?
恐らく,宣言が終了していないなどの問題が存在するのだと思いますが。


1ポイント を手に入れた。

Name: なぎ  ..上級者(23,417ポイント)   Date: 2007/06/11(月) 15:11   No:8539     
Title: Re:分からないプログラムエラーがあるんですが・・・    
既に、YuO さんから回答があるとおりだと思います。

具体的には、
#compa4.h

の中にある、

sturcut class {
char name[100];
int personNo;
int koku;
int suga;
int eigo;
}

といった感じの宣言の最後の、; が抜けている可能性が非常に高いと思われます。



124ポイント を手に入れた。

Name: まだ未熟  ..かけだし(1,098ポイント)   Date: 2007/06/11(月) 21:06   No:8541 解決!     
Title: Re:分からないプログラムエラーがあるんですが・・・    
YuOさん、なぎさんありがとうございます。
確かに調べた結果、お二人のおっしゃるとおり、宣言の最後に;が抜けていました。
てっきり、プログラムの方に問題があると思っていました。


41ポイント を手に入れた。



Name: がんも  ..ぴよぴよ(527ポイント)   Date: 2007/06/09(土) 01:09   No:8457       
Title: 課題で・・複素数の四則演算    
どうも理解ができなくて困っています(>_<;)

問題はこうです。

いま,複素数を表す構造体 COMPLEX を,次の文によって定義したとします.

typedef struct{ float re, im; } COMPLEX;

例えば COMPLEX c; と宣言したとき,c.re が複素数 c の実数部を表し,c.im が虚数部を表します.このとき,複素数どうしの四則演算を行なう関数 c_cal() を書きなさい.ただし,この関数の最初の行を

COMPLEX c_cal ( COMPLEX a, char c, COMPLEX b )

と定め,プログラム中で c_cal(a,'+',b) と書けば複素数 a とbの和を返し(返却値として出力し),同様に,c_cal(a,'-',b)}, c_cal(a,'*',b), c_cal(a,'/',b) と書くことにより,複素数 a と b の差,積,商をそれぞれ返すものとします.



これはscanfを使って入力するのかなとも思いましたが
複素数の入力なんてできるのですか?・・・

かといってプログラムの中で複素数の計算もどうやればよいのかよくわかりません;;;
ぜひアドバイスをください


433ポイント を手に入れた。


Name: box  ..比類無きプログラマー(70,592ポイント)   Date: 2007/06/09(土) 01:38   No:8459     
Title: Re:課題で・・複素数の四則演算    

> これはscanfを使って入力するのかなとも思いましたが
> 複素数の入力なんてできるのですか?・・・

複素数をa+biの形で表わすとすると、
実部aも虚部bも実数ですので、scanf()で2つの実数を入力して、
構造体のメンバーに割り振ればよいです。

> かといってプログラムの中で複素数の計算もどうやればよいのかよくわかりません;;;

いったんプログラムを離れて、(a+bi)と(c+di)の四則演算を
手で行なってみてください。どうなりますか?


2倍のポイントを手に入れた! 196ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(367,705ポイント)   Date: 2007/06/09(土) 01:40   No:8460     
Title: Re:課題で・・複素数の四則演算    
こんにちは。

課題をやる上で苦労した経験を思い出します。
当時は難しく感じていたものも、今思えば何故あの時は順を追って考えなかったのだろうと思います。
こういう課題において、プログラムって実は一つ一つの処理って難しくないんですよね。
沢山しないといけないことがあるので、難しく感じてしまっているだけなんです。
ですので、私が一つ一つ答えに導くような課題を出しますので少しずつ完成にもっていきませんか?

まず、scanfの使い方は理解していらっしゃるようですね。
構造体の利用の仕方はOKですか?


typedef struct{
int x,y;
}com_t;
 
 

このように定義すると、xとyという人まとまりのケースが出来ます。

com_t com;

このように宣言するとxとyのまとまりであるcom_t型の変数がcomという名前で用意されます。
つまり、comというまとまりのなかに、xとyというint型の変数がそれぞれある状態です。
ですから、comの中にあるxをさしたい時は
com.x
とかけるわけです。
その辺はOKですか?

もし「微妙だ・・」と感じてらっしゃるようでしたらおさらいしておいてくださいね。
http://www9.plala.or.jp/sgwr-t/c/sec15.html

次に、自作関数については大丈夫ですか?
自分で関数を作れますか?
return文の意味は解っていますか?

もしわからなければ過去に自作関数について答えたので、
http://www.play21.jp/board/formz.cgi?action=res&resno=6825&page=&lognum=23&id=dixq&rln=7257
こちらのトピの「自作関数について」をお読み下さい。

また、プログラムでわからないことがあればウェブで何でも調べられますから
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
ウェブで勉強してください。

では課題の内容に入っていきます。

課題1−1
xというint型の変数を用意し、scanfで整数を入力させ格納し、xのデータを表示するだけのプログラムを書きましょう。

課題1−2
typedef struct{ float re, im; } COMPLEX; という名前で構造体を定義し、
COMPLEX c;
で宣言した変数のreとimにそれぞれ1.3と2.4を単なるイコールの代入で格納し、表示するプログラムを書きましょう。

課題1−3
先ほどのre,imにそれぞれscanfで実数の値を取り込み表示するプログラムを書きましょう。その際、入力前にprintf文で任意に何の値を入力させるのかを促す説明文を追加しましょう。

課題2−1
main関数から自作関数void calc(int a,int b);へ、メイン関数内で、入力させた2つの整数を渡し、その関数内で、2つの数値の和を表示するプログラムを書きましょう。

課題2−2
main関数から自作関数int calc(int a,int b);へ、メイン関数内で、入力させた2つの整数を渡し、その関数内で和を計算し、計算結果をint型でメイン関数へ返し、その結果をメイン関数で表示するプログラムを書きましょう。

課題2−3
main関数から自作関数double calc(double a,double b);へ、メイン関数内で、入力させた2つの「実数」を渡し、その関数内で「割り算」を計算し、計算結果をdouble型でメイン関数へ返し、その結果をメイン関数で表示するプログラムを書きましょう。
また、割り算をするとき、分母が0の時は計算が出来ないエラーをprintfで表示し、main関数には-1を返します。

課題3−1
main関数で、課題1−3と同じように構造体に2つの実数を格納させる。宣言はCOMPLEX a,b;とし、計4つの値を取り込む。
自作関数COMPLEX calc(COMPLEX a,COMPLEX b);へ、メイン関数内で、入力させた2つのa,bを渡し、その関数内で 新たにCOMPLEX cを宣言。a.im+b.im , a.re+b.re の計算結果をそれぞれcに格納する。計算結果をCOMPLEX型でメイン関数へ返し、その結果をメイン関数で表示するプログラムを書きましょう。

最終課題 は提示された課題です。


1,508ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(367,244ポイント)   Date: 2007/06/09(土) 01:57   No:8462     
Title: Re:課題で・・複素数の四則演算    
とりあえず課題2−3位からこの課題が本格化してきますので、
もし「2−2位までは楽勝でわかる」という感じでしたら、以下回答例を書いておきますので、自分が書いたプログラムと照らし合わせて、合ってたら次々進んでください。

少しでもわからない、あるいは「なんでこうなるの?」みたいな疑問がちょっとでもある課題については、そこで手をとめて、
先ほど紹介したウェブなどの参考サイトをじっくり読んでください。
ちょっとでもわからないところをそのままにしていると後でつけがまわってきます。
着実に全てを理解しながら進んでいった方が身に付きますので、今までの知識を確認しながら先に進んでください。
これらが全部出来たら課題も完成するはずです。



以下回答例

課題1−1

#include <stdio.h>
void main(){
int x;
scanf("%d",&x);
printf("%d",x);
return ;
}

課題1−2

#include <stdio.h>

typedef struct{
float re,im;
}COMPLEX;

void main(){
COMPLEX c;
c.re=1.3;
c.im=2.4;
printf("%f %f",c.re,c.im);
return ;
}

課題1−3

#include <stdio.h>

typedef struct{
float re,im;
}COMPLEX;

void main(){
COMPLEX c;
printf("実数部->");
scanf("%f",&c.re);
printf("虚数部->");
scanf("%f",&c.im);
printf("実数部=%f 虚数部=%f",c.re,c.im);
}

課題2−1

#include <stdio.h>

void calc(int a,int b){
printf("%d",a+b);
}
void main(){
int x,y;
scanf("%d",&x);
scanf("%d",&y);
calc(x,y);
}

課題2−2

#include <stdio.h>

void calc(int a,int b){
return a+b;
}
void main(){
int x,y,z;
scanf("%d",&x);
scanf("%d",&y);
z=calc(x,y);
printf("%d",z);
}


461ポイント を落としてしまった。

Name:  ..ぴよぴよ(539ポイント)   Date: 2007/06/09(土) 01:57   No:8463     
Title: Re:課題で・・複素数の四則演算    
丁寧に教えていただいて本当にうれしい限りです(;_;)

そしてヒントをもとになんとか自力でプログラムを作ったのですが、

出力が0にしかならないんです;;どこが間違っているか指摘していただければうれしいです


#include <stdio.h>
#include <math.h>

typedef struct{ float re, im; } COMPLEX;

COMPLEX c_cal(COMPLEX a, char c, COMPLEX b)
{
COMPLEX sum;

if(c == '+'){sum.re = a.re + b.re ; sum.im = a.im + b.im ;}
else if(c == '-'){sum.re = a.re - b.re ; sum.im = a.im - b.im ;}
else if(c == '*'){sum.im = a.im * b.im - a.re * b.re ;
sum.re = a.im * b.re + a.re * b.im ;}
else if(c == '/'){sum.im = (a.im * b.im + a.re * b.re)/(pow(b.im,2)+pow(b.re,2)) ;
sum.re = (a.re * b.im - a.im * b.re)/(pow(b.im,2)+pow(b.re,2)) ;}

return sum;

}

int main(void)
{
COMPLEX a, b, sum; char c;

printf("aの虚数部 実数部 四則演算子 bの虚数部 実数部\n");
scanf("%f%f%c%f%f", &a.re, &a.im, &c, &b.re, &b.im);

sum = c_cal(a, c, b);

printf("sum = %f + (%f)i\n", sum.im, sum.re);

}


539ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(367,385ポイント)   Date: 2007/06/09(土) 02:08   No:8464     
Title: Re:課題で・・複素数の四則演算    
なんだ、始めて1ヶ月ということなので、まだ手も足も出ないで困ってらっしゃるのかと思いましたが、かなりもう答えまで出来てるじゃないですか^^
これは失礼しました。

途中のプログラムがまちがってなさそうなのに、計算結果がおかしいときは
取り込んだ数値が正常かどうかをまず、疑います。
入力した数値は本当にとりこめていますか?

scanf("%f%f%c%f%f", &a.re, &a.im, &c, &b.re, &b.im);
printf("%f %f %c %f %f\n", a.re, a.im, c, b.re, b.im);

このように書いて確かめてみましょう。


141ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(367,678ポイント)   Date: 2007/06/09(土) 02:13   No:8465     
Title: Re:課題で・・複素数の四則演算    
scanf("%f%f%c%f%f", &a.re, &a.im, &c, &b.re, &b.im); 

この記述を

scanf("%f%f %c%f%f", &a.re, &a.im, &c, &b.re, &b.im);
このように変更して実行すると、printfの結果はどうなりますか?

何故このような事になるか、ウェブで調べて見ましょう!!
 
 

検索をかけるとよいワードのサンプル・・。
http://www.google.co.jp/search?hl=ja&q=scanf+%E6%96%87%E5%AD%97&lr=
http://www.google.co.jp/search?hl=ja&q=scanf+%E5%8D%B1%E9%99%BA&lr=
http://www.google.co.jp/search?hl=ja&q=scanf+%E6%AE%8B%E3%82%8B&lr=
http://www.google.co.jp/search?hl=ja&q=scanf+%E3%83%90%E3%83%83%E3%83%95%E3%82%A1&lr=


293ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(368,016ポイント)   Date: 2007/06/09(土) 02:26   No:8466     
Title: Re:課題で・・複素数の四則演算    
大事なエラー処理が一つ出来てないです。
課題2−3を見てエラー処理を追加してみてください。
例えば全部0の値をいれて計算するとどうなります?

それから計算できる演算子じゃない文字が入力された時のエラー処理も行うと良いでしょう。
そこまでしろと書いてないので、しなくてもいいかもしれませんが、よいいいと思います。
scanfはなかなかエラー処理のしにくい関数ですが、ある程度オプションがあります。例えば


#include <stdio.h>

void main() {
char c=NULL;
printf("a,b,c,dのどれかを入力してください。->");
scanf("%[abcd]" , &c);
if(c==NULL)
printf("正常に入力されていません。\n");
else
printf("入力された値 = %c" , c);
}

実行結果1

a,b,c,dのどれかを入力してください。->b
入力された値 = b

実行結果2

a,b,c,dのどれかを入力してください。->z
正常に入力されていません。



 
このように「abcd」のどれかの文字だけしか入力を受け付けたくない時は%[abcd]と書く事が出来ます。
また、「abcd以外」を受け付けたい時は%[^abcd]とかけます。
便利なので知っておくと得ですよ♪


338ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(368,190ポイント)   Date: 2007/06/09(土) 02:40   No:8469     
Title: Re:課題で・・複素数の四則演算    

ん・・・。
掛け算間違ってないですか?

sum.im = a.im * b.im - a.re * b.re ;
sum.re = a.im * b.re + a.re * b.im ;

ここ。

計算式は


(a+bi) * (c+di)
=a*c + a*di + c*bi + bi*di
=(a*c - b*d) + (a*di + c*bi)
 ↑↑ ↑↑
rere imim

   re
つまりリアルパートにリアルパートとイマジナリーパートの混合の掛け算があってはおかしいですよね。
ですから上記計算式をそのままあてはめると

z.re = z1.re * z2.re - z1.im * z2.im;
z.im = z1.re * z2.im + z1.im * z2.re;

こんな感じになりませんか?
 
 


174ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(368,959ポイント)   Date: 2007/06/09(土) 03:53   No:8471     
Title: Re:課題で・・複素数の四則演算    
あえてscanfを使って厳密に書くならこんな感じでしょうかねぇ。


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

typedef struct{
float re,im;
}COMPLEX;

COMPLEX c_cal(COMPLEX a, char c, COMPLEX b){
COMPLEX sum;
if(c == '+'){
sum.re = a.re + b.re ;
sum.im = a.im + b.im ;
}
else if(c == '-'){
sum.re = a.re - b.re ;
sum.im = a.im - b.im ;
}
else if(c == '*'){
sum.re = a.re * b.re - a.im * b.im ;
sum.im = a.im * b.re + a.re * b.im ;
}
else if(c == '/'){
if(b.im==0 && b.re==0){
printf("0割禁止\n");
exit(99);
}
sum.im = (a.im * b.im + a.re * b.re)/(pow(b.im,2)+pow(b.re,2));
sum.re = (a.re * b.im - a.im * b.re)/(pow(b.im,2)+pow(b.re,2)) ;
}
else{
printf("対応した演算子ではない。\n");
exit(99);
}
return sum;
}

void main(void){
int x=0,z;
COMPLEX a, b, sum; char c=NULL;

while(x<5){
switch(x){
case 0:
printf("aの\n実数部 -> "); z=scanf("%f",&a.re); break;
case 1:
printf("虚数部 -> "); z=scanf("%f",&a.im); break;
case 2:
printf("四則演算子 -> "); scanf(" %[-+/*]c",&c); break;
case 3:
printf("bの\n実数部 -> "); z=scanf("%f",&b.re); break;
case 4:
printf("虚数部 -> "); z=scanf("%f",&b.im); break;
}
switch(x){
case 0:case 1:case 3:case 4:
if(z==0) printf("数値以外の入力。再入力してください。\n");
else x++;
break;
case 2:
if(c!=NULL) x++;
else printf("四則演算子ではありません。再入力してください。\n");
break;
}
fflush(stdin);
}

sum = c_cal(a, c, b);

printf("(%.2f + %.2fi) %c (%.2f + %.2fi) =",a.re,a.im,c,b.re,b.im);
printf(" %.2f + (%.2f)i\n", sum.re, sum.im);
}

実行結果1

aの
実数部 -> 2.3
虚数部 -> 3.1
四則演算子 -> /
bの
実数部 -> 0.2
虚数部 -> 2.1
(2.30 + 3.10i) / (0.20 + 2.10i) = 0.95 + (1.57)i


実行結果2

aの
実数部 -> 2.1
虚数部 -> s.8ds2
数値以外の入力。再入力してください。
虚数部 -> 1.2
四則演算子 -> 2d1c/
四則演算子ではありません。再入力してください。
四則演算子 -> *
bの
実数部 -> 1.0
虚数部 -> 0.9
(2.10 + 1.20i) * (1.00 + 0.90i) = 1.02 + (3.09)i

 
 
半分寝ながら書いたんでどこか違うかもしれませんけど、とりあえず、エラー処理はしておいたほうがよいのではないでしょうか。

ではおやすみなさいm(_ _)MzzZ


769ポイント を手に入れた。

Name: しっぽ  ..初心者(8,026ポイント)   Date: 2007/06/10(日) 11:14   No:8497     
Title: Re:課題で・・複素数の四則演算    

else if(c == '/'){
if(b.im==0 && b.re==0){
printf("0割禁止\n");



これはORの間違えでしょう。

if(b.im==0 || b.re==0){



70ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,932ポイント)   Date: 2007/06/10(日) 11:20   No:8499     
Title: Re:課題で・・複素数の四則演算    
&& でいいんじゃないでしょうか。
3+0i(つまり、ただの3)で割ったり、0+7i(つまり、ただの7i)で割ったり
することは十分に考えられます。


70ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(369,257ポイント)   Date: 2007/06/10(日) 11:27   No:8500     
Title: Re:課題で・・複素数の四則演算    
&&でいいと思います。
というのも、分母に値が2種類あるので、分母が0になるにはその2つの値が両方0でないといけません。
それぞれの値は2乗しているので、2-2のように2つの値が相殺して0になることもありませんから、
やはり分母が0になるパターンは2つの値が両方0の時のみに成ると思います。

sum.im = (a.im * b.im + a.re * b.re)/(pow(b.im,2)+pow(b.re,2));

この式ですから、b.imとb.reどちらも0の時のみ分母が0になると考えましたm(_ _)m


172ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(368,874ポイント)   Date: 2007/06/10(日) 11:42   No:8501     
Title: Re:課題で・・複素数の四則演算    

一つおまけを言いますと、

scanf(" %[-+/*]c",&c); break;

この記述。

scanf(" %[+-*/]c",&c); break;

と書くと、うまくいきません。[+-*/]の方が順番的にすんなりいくように思うのに、
わざと順番を変えているのには理由があります。
実は[]の中は正規表現に似た書き方が出来、
[0-9]とかけば、0〜9の値ということになり、2でも5でもマッチします。
ですから、[+-*/]の前半の[+-*]は、「"+"〜"*"」の文字コード内でマッチさせろと言う意味に
なってしまい、"-"マイナスの文字としての意味を失ってしまいます。

http://e-words.jp/p/r-ascii.html
アスキーコード表によると、"+"は43、"*"は42ですから、43〜42で、間違ってマッチする文字は
無いにしても、マイナスがマッチしなくなります。

この○〜○という範囲を表すマイナスは一番最初に書くか、最後に書けばただの文字と解釈されますので、
マイナスを一番最初に書く必要があったということです。
ちょっと発展的なお話でしたが、「なぜこの順番じゃないとうまくいかないんだ?」と
疑問でしたらその疑問が解決すればと思い書きました。
 
 
 


383ポイント を落としてしまった。

Name: しっぽ  ..初心者(8,154ポイント)   Date: 2007/06/10(日) 11:51   No:8502     
Title: Re:課題で・・複素数の四則演算    
> && でいいんじゃないでしょうか。
> 3+0i(つまり、ただの3)で割ったり、0+7i(つまり、ただの7i)で割ったり
> することは十分に考えられます。

了解です。


7ポイント を手に入れた。

Name: がんも  ..ぴよぴよ(651ポイント)   Date: 2007/06/10(日) 21:30   No:8511     
Title: Re:課題で・・複素数の四則演算    
本当にいろいろありがとうございます!

%fと%cの間にスペースを入れたらとりあえず足し算はできました。
ご指摘どおり割り算や、+−/*以外の記号が入れられた場合のときを作りたいと思います。

掛け算なのですが、
sum.im = a.im * b.im - a.re * b.re ではあっていませんか??

それと、書いていただいたプログラムですが、自分にはまだ理解できないものがいっぱいありまして・・(汗

NULLとexit(99)は初めて見ました。どういう意味なのか教えていただけたらうれしいです


124ポイント を手に入れた。

Name: がんも  ..ぴよぴよ(656ポイント)   Date: 2007/06/10(日) 21:31   No:8512     
Title: Re:課題で・・複素数の四則演算    
またまたすみません;;

%fと%cの間にスペースを入れたのは、cがスペースも文字として読み込んでしまうからなのですか??


5ポイント を手に入れた。

Name: がんも  ..ぴよぴよ(677ポイント)   Date: 2007/06/10(日) 21:51   No:8513     
Title: Re:課題で・・複素数の四則演算    
わたしreのほうを虚部と勘違いしてました!掛け算間違ってましたね;;

21ポイント を手に入れた。

Name: がんも  ..ぴよぴよ(808ポイント)   Date: 2007/06/10(日) 22:38   No:8514     
Title: Re:課題で・・複素数の四則演算    
結構できました。ひとつ気になるのが、
scanf("%f",&a.re);
scanf("%f",&a.im);
scanf("%c",&c); if(c == '\n') scanf("%c",&c);
scanf("%f",&b.re);
scanf("%f",&b.im);
という感じにかいて、記号が+-*/以外だったらプログラムを終了するようにしましたのですが
(exit(99)というのを使いました、だけど、意味はなんとなくでしかわかってません;;)
入力のときに
たとえば
1 1 + 1 1
と入力するとスペースが文字と判断されるらしくて、終了してしまいます。
これはどう回避すればよいでしょうか?


131ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(369,462ポイント)   Date: 2007/06/11(月) 02:04   No:8523     
Title: Re:課題で・・複素数の四則演算    
NULLというのは「何もない」ということです。ヌル文字とか終端記号の別名で呼ばれるのご存知でしょうか。
何も無い、つまり条件にマッチせず、何も格納されていないと言う状態を示します。
exit関数はそこで処理を強制終了する関数です。

また、%cの前にスペースをあけると、改行コードを含め、そこまでの空白などを読み飛ばしてくれるのです。

>たとえば
>1 1 + 1 1
>と入力するとスペースが文字と判断されるらしくて、終了してしまいます。

スペースが文字と認識されているわけではありません、scanfはスペースか改行で区切られた区間を一区間としているのです。
もしこれを避けるにはgetchar関数を使うべきでしょう。
getchar関数は標準入力からのデータを1文字ずつ取得する関数ですから、スペースがあったら読み飛ばすようにプログラムを組めばスペースを無視できます。
記号がはいってくるまでを数値データとすればいいのです。
ただ文字データを数値データに変更しなければなりませんし、文字列処理が配列とカラムなど、結構複雑になってしまいますので、ちょっと入門したての方法としてはわかりずらいかもしれません。
スペースを無視する仕様にしなければならないのでしょうか?
もしそうならgetcharについてお調べ下さい。

また、exit(99)の「99」は別にこの数字でなくてもいいです。
このプログラム以外の他のプロセスに与える数値であり、どこでエラーが発生して終了したかを示すものですので、この中の値はなんでもいいです。
とりあえずexit関数を呼べば処理が終了します。


588ポイント を手に入れた。

Name: YuO  ..入門者(4,733ポイント)   Date: 2007/06/11(月) 03:17   No:8526     
Title: Re:課題で・・複素数の四則演算    
えーっと……。管理人さんのコード/発言に突っ込みどころが……。
あんまりだというところがあるので,書いておきます。

----引用ここから----
    scanf("%[abcd]" , &c);

if(c==NULL)
printf("正常に入力されていません。\n");
else
printf("入力された値 = %c" , c);
----引用ここまで----
cはcharですから,不適切です。
[は,スキャンセットでない文字を見つけると自動的に終端のナル文字を追加します。
よって,a, b, c, dどれか一文字でも入力されると,*(&c + 1)以降にナル文字を書き込むため,未定義の動作となります。
# cへの代入の有無はscanfの戻り値を使った方がわかりやすいかと。


> fflush(stdin);

よくある間違い:fflush(stdin);
fflushを入力ストリームに使った場合の結果は未定義とされています。

ちなみに,昔未定義動作を考えずに実行したことがありまして,リダイレクトを行った場合に動作が変化するなど,別の影響もあったりします。


基本的にはscanfとそれ以外の入力関数を混ぜないというFAQに従うのがよいでしょう。


> NULLというのは「何もない」ということです。ヌル文字とか終端記号の別名で呼ばれるのご存知でしょうか。

NULLは空ポインタ定数 (null pointer constant) であって,ヌル文字 (JISではナル文字,null character)や終端記号とは異なります。


479ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(369,680ポイント)   Date: 2007/06/11(月) 03:43   No:8527     
Title: Re:課題で・・複素数の四則演算    
ご指摘ありがとうございます。

>scanf("%[abcd]" , &c);

こちら記載ミスでした。サンプルや、他の説明の中では

scanf("%[abcd]c" , &c);

こんな感じでcをつけてあります。
これで大丈夫だと思っていたんですが・・。

調べてみるとこれでもcのアドレス以外にも値が書き込まれるようですね。

fflushについては使用の仕方に問題があるようですね。それも含め少し調べてみます。

またscanfとgetcharを同じプログラムに使ってはいけないという意味がはっきりよくわからないので、こちらも明日調べて見ます。

>NULLは空ポインタ定数 (null pointer constant) であって,ヌル文字 (JISではナル文字,null character)や終端記号とは異なります。

昔この記事を読んだ事がありました。
http://www.cmagazine.jp/src/kinjite/c/null.html
昔から両方とも0と思っても不具合が無く、ずっと両方0を表すと思っていたので抜けきれていませんでした。
ご指摘ありがとうございました。
間違っていた部分についてお詫びします。


218ポイント を手に入れた。

Name: がんも  ..ぴよぴよ(848ポイント)   Date: 2007/06/11(月) 20:55   No:8540 解決!     
Title: Re:課題で・・複素数の四則演算    
できました!本当にありがとうございました。
またお世話になると思いますがよろしくお願いします。


40ポイント を手に入れた。



Name: minami  ..ぴよぴよ(121ポイント)   Date: 2007/06/11(月) 13:14   No:8532       
Title: 乱数の検定    
はじめましてminamiと申します。
C言語を始めてまだ1ヶ月弱という初心者です。

初心者ということで課題については徐々にステップアップしながらの勉強なのですが
「乱数の連検定」ぽいプログラムでつまづいてしまいました。

今やってるプログラムは「”rand()%10”で作った一桁の擬似乱数の連検定」です。
たとえば乱数が[1.4.6.5.3.7.9.6.5.4.3.7.4.2.3.4.0.9.0.5.4.2.4.5.6.・・・・(一万個の乱数)]という具合にあるとしたら
[1.4][4.6][6.5]・・・・という並びがいくつずつあるのか?を検定するものです。
つまり[00]が何個、[01]が何個、[02]が何個・・・[98]が何個、[99]が何個、というように数えていくものです。
とりあえず下記のプログラムを作ったのですが、一応はちゃんとした結果は出ます。
ただ、for文でグルグルまわして無駄な処理を10000×10000回やってるので、自分でもいまいちなものになってます。


#include<stdio.h>

int main (void)
{
int i,j,k,m,n;
int ransu[15000][10];
int count;
FILE*fp;

//rand1.txtに擬似乱数を書き込む
fp = fopen("rand1.txt", "w");
for(i=0;i<10000;i++){
fprintf(fp,"%d\n",rand()%10);
}
fclose(fp);

//rand1.txtから擬似乱数をransu配列に書き込む
fp = fopen("rand1.txt","r");
for(i=0; i<10000; i++){
fscanf(fp, "%d",&ransu[i][0]);
}
fclose(fp);


//擬似乱数の連検定
for(k=0; k<10; k++){
for(m=0; m<10; m++){
count=0;
for(n=0; n<10000; n++){
if(ransu[n][0]==k && ransu[n+1][0]==m)
count++;
}
printf("%d\t",count);
if(m!=0 && m%9==0)printf("\n");
}
}
}


配列[00]〜[99]までをあらかじめ用意しておいて、rand()関数で乱数を発生させると同時に
[1.4.6.5.3.7.9.6.5.4.3.7.4.2.3.4.0.9.0.5.4.2.4.5.6.・・・・(一万個の乱数)]という乱数なら
1.4が出た時点で配列[14]に入れる、4.6が出たら配列[46]に入れるというようなプログラムって出来るものなんですか?

わかりにくい説明でスンマセン m(__)m
ヘルプお願いします。


121ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(46,365ポイント)   Date: 2007/06/11(月) 13:27   No:8533     
Title: Re:乱数の検定    
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0 … (10000個の乱数)]

の場合は、[12][23][34][45][56][67][78][89][90]という感じで検出されるという事でしょうか?


59ポイント を手に入れた。

Name: minami  ..ぴよぴよ(122ポイント)   Date: 2007/06/11(月) 13:43   No:8534     
Title: Re:乱数の検定    
TO バグさん
FM minami

バグさんの言うとおりです。


1ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(46,689ポイント)   Date: 2007/06/11(月) 13:48   No:8535     
Title: Re:乱数の検定    
こんな感じでいかがでしょうか?
分からない部分があったら、また聞いて下さいね(^-^)


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

int main(void)
{
int i, nIndex, nVal[10000], nCnt[100];

/* 乱数発生用の前準備 */
srand((unsigned)time(NULL));

/* カウント用配列を0で初期化する */
memset(nCnt, 0, sizeof(int) * 100);

/* 10000個の乱数を準備する */
for (i = 0; i < 10000; i++)
{
nVal[i] = rand() % 10;

/* 2回目のループ以降に毎回組み合わせを調べる */
if (i > 0)
{
/* 1つ前の乱数値を10倍した数値と、今回の乱数値を足す事でIndexを作成する */
nIndex = nVal[i - 1] * 10 + nVal[i];

/* 求められたIndex場所のカウントを1つ足す */
nCnt[nIndex]++;
}
}

/* カウント用配列の中身を表示する */
for (i = 0; i < 100; i++)
{
printf("%d = %d\n", i, nCnt[i]);
}

return 0;
}


324ポイント を手に入れた。

Name: フリオ  ..中級者(9,694ポイント)   Date: 2007/06/11(月) 14:07   No:8536     
Title: Re:乱数の検定    
 
 これでできると思います。


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

int main(void)
{
int array[100] = {0,};
int num0, num1, i;

srand((unsigned)time(NULL));
num0 = rand() % 10;
for(i = 1; i < 10000; i ++){
num1 = rand() % 10;
array[num0 * 10 + num1] ++;
num0 = num1;
}
for(i = 0; i < 100; i ++) printf("%02d %d\n", i, array[i]);
return 0;
}

 


180ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(46,751ポイント)   Date: 2007/06/11(月) 14:12   No:8537     
Title: Re:乱数の検定    
minamiさんのソースにファイルからの読み書きがあったので、一度は配列に格納しておいた方が改造しやすいかと思ったのですが、確かにフリオさんの方がスマートですね(^-^)

62ポイント を手に入れた。

Name: minami  ..ぴよぴよ(90ポイント)   Date: 2007/06/11(月) 14:28   No:8538 解決!     
Title: Re:乱数の検定    
バグさん、フリオさん回答ありがとうございます。
お二人のソースコードを見ると、自分の書いたプログラムがいかに無駄が多いか分かりました。
参考にさせてもらいます。

これからもお二人のようなプログラムが書けるように精進します。

本当にありがとうございました。


32ポイント を落としてしまった。



Name: すけさく  ..ぴよぴよ(29ポイント)   Date: 2007/06/11(月) 09:38   No:8529       
Title: 2直線の交点を求めるプログラム    
傾きXと切片Yを2組入力して交点を求めるプログラム…という問題なのですが…。
いかんせんc言語暦10日の素人です。

1つのプログラムにすべてまとめて書くという形式なのですが、お時間のある方、教えていただけませんでしょうか。


29ポイント を手に入れた。


Name: asd  ..中級者(11,409ポイント)   Date: 2007/06/11(月) 10:02   No:8531     
Title: Re:2直線の交点を求めるプログラム    
>1つのプログラムにすべてまとめて書くという形式なのですが、お時間のある方、教えていただけませんでしょうか。

どこまでできていて何が分かりませんか?
・(プログラム抜きにして)2組の傾きと切片から交点を求めるやり方がわからない
・傾きと切片を入力する方法がわからない
・入力してもらった値から交点をプログラム上で計算するやり方がわからない
・計算終了後、画面に出力する方法がわからない

まずはどこまでできていて何が分からないのか整理してみませんか?^^


187ポイント を手に入れた。



Name: 谷口  ..ぴよぴよ(0ポイント)   Date: 2007/06/07(木) 08:11   No:8385       
Title: 10進数を2進数に・・・    
10進数を2進数に変換について

10進数を2進数に変換する問題なのですが、
まったくもって理解ができません、教えて頂ければ幸いです

S(符号)は1ビットで仮数の符号を表す
E(指数部)は4ビットで指数を表し負数は2の補数で表現
M(仮数部)は11ビットで仮数の絶対値を表す

基数は2とする
仮数の0,2進数の少数以下第一位が1になるように、正規化された形で表す
小数点はEとMの位置にする
0の表現はー0と+0の二通りがあり特別に指数部と仮数部をすべて0にする

問.10進数の-5.25を2進数で表示しなさい
問.10進数の-0.125を2進数で表示しなさい

答えと解き方を教えて頂ければ幸いです
スレ違いということは承知しております、迷惑でしたら削除の方お願い致します



Name: バグ  ..熟練のプログラマー(44,854ポイント)   Date: 2007/06/07(木) 08:27   No:8387     
Title: Re:10進数を2進数に・・・    
プログラム上ではなくて、10進数から2進数への変換はできますか?
それが分からないと、プログラムを書くことは出来ないと思います。


49ポイント を手に入れた。

Name: toyo  ..かけだし(1,341ポイント)   Date: 2007/06/07(木) 09:44   No:8388     
Title: Re:10進数を2進数に・・・    
>スレ違いということは承知しております、迷惑でしたら削除の方お願い致します
ということはCで表示するとかじゃなくてただ変換するだけと言うことですね
迷惑でもないんですがここの規約に
---------------
http://dixq.net/board/board.html
・マルチポスト(複数の掲示板に同じ質問を書く事)は禁止です。
---------------
とあります
OKWave(教えてgoo)かこちらか、どちらかにしぼられた方がいいですよ


168ポイント を手に入れた。

Name: 谷口  ..ぴよぴよ(47ポイント)   Date: 2007/06/10(日) 10:57   No:8495     
Title: Re:10進数を2進数に・・・    
>toyoさん
失礼しました、教えてgooの方は解決という形で、こちらの掲示板に絞りたいと思います
よろしくお願いします


47ポイント を手に入れた。

Name: 谷口  ..ぴよぴよ(355ポイント)   Date: 2007/06/10(日) 23:54   No:8518     
Title: Re:10進数を2進数に・・・    
自分で解いてみているのですが

>問.10進数の-5.25を2進数で表示しなさい

マイナスなので、先頭は1

@−5.25=−0.01=(−0.1)2 ×2^1なので指数はー1だから
(−1)10=0001   これを反転し1110

A5.25の5は2で割っていって(101)
 0.25を2でかけて(01)

それを合わして(10101)

答えは
1 1110 10101000000

////////////////////////////////////////////////////////////////////////////
>問.10進数の-0.125を2進数で表示しなさい
−0.125なので先頭は1

@−0.125=−0.001=(−0.1)2 × 2^2
(−2)10=0010   これを反転し1101

A0.125を2でかけてやって001

答えは
1 1101 00100000000

でいいのでしょうか?またー0.125ではなく0.125の場合は先頭の1をとって
0 1101 00100000000という形に変えるだけでいいのでしょうか?


308ポイント を手に入れた。

Name: YuO  ..入門者(4,023ポイント)   Date: 2007/06/11(月) 01:18   No:8521     
Title: Re:10進数を2進数に・・・    
・途中式の数式が明らかに間違っている
>−5.25=−0.01=(−0.1)2 ×2^1
っていったい何ですか?
・2の補数の扱いが間違っている
反転するだけの物は1の補数と言います。

ヒントを書くなら,-5.25については,
-5.25 = -1 * 5.25 = -1 * 0.65625 * 8 = -1 * 0.65625 * 23
と考えて処理します。


113ポイント を手に入れた。

Name: 谷口  ..ぴよぴよ(470ポイント)   Date: 2007/06/11(月) 01:45   No:8522     
Title: Re:10進数を2進数に・・・    
解説書に
−0.0625の場合は
(−0.0625)10=(−0.0001)2=(0.1)2 × 2^−3
と書いてありましたので、それに応じてー5.25もそのようにしてみるとこのような結果になりました

ヒントの0.65625はどこから出てきたのでしょうか?

何卒、よろしくお願いします


115ポイント を手に入れた。

Name: 谷口  ..ぴよぴよ(638ポイント)   Date: 2007/06/11(月) 02:11   No:8524     
Title: Re:10進数を2進数に・・・    
上の自分の記事は、独学でやってみると理解できました

それを踏まえて、やってみましたが
1番目の問題(−5.25)は→1 0011 10101000000

2番目の問題(−0.125)は→1 1110 10000000000

となりました、合っていますでしょうか?

また、−5.25ではなく5.25の場合は先頭の1を0に変えるだけでよろしいのでしょうか


168ポイント を手に入れた。

Name: YuO  ..入門者(4,254ポイント)   Date: 2007/06/11(月) 02:22   No:8525     
Title: Re:10進数を2進数に・・・    
> −0.0625の場合は
> (−0.0625)10=(−0.0001)2=(0.1)2 × 2^−3
> と書いてありましたので、それに応じてー5.25もそのようにしてみるとこのような結果になりました

その解説書はほぼ正しいですが (最後の部分にマイナス記号がないので,後の等号が成り立たない) ,あなたはそれを全くもって理解できていませんね。
その式は,間違っている部分に修正を加えると,
「-0.0625を2進数で表現すると-0.0001だから,(2進数の-0.1)かける(10進数の2)の(10進数の-3)乗である」
という意味です。

> ヒントの0.65625はどこから出てきたのでしょうか?
5.25を8で割った (= 8分の1をかけた) 値です。
浮動小数点数の表現(-1)S*M*2Eで正規化された形にするために,5.25に乗ずると範囲[0.5, 1)の値になるような,2の整数乗の値を使っています。

とりあえずは,-5.25や-0.125を2進数で普通に表してみることから始める必要があるのかも。
# 浮動小数点数でやるには知識不足だと思う。


231ポイント を手に入れた。

Name: 谷口  ..ぴよぴよ(669ポイント)   Date: 2007/06/11(月) 07:17   No:8528     
Title: Re:10進数を2進数に・・・    
返信ありがとうございます

といいますと

1番目の問題(−5.25)は→1 0011 10101000000

2番目の問題(−0.125)は→1 1110 10000000000

の答えで間違っているということでしょうか?






31ポイント を手に入れた。

Name: YuO  ..入門者(4,803ポイント)   Date: 2007/06/11(月) 09:54   No:8530     
Title: Re:10進数を2進数に・・・    
> 1番目の問題(−5.25)は→1 0011 10101000000
> 2番目の問題(−0.125)は→1 1110 10000000000
> の答えで間違っているということでしょうか?

質問と回答が入れ違いになってしまったようですね。
どちらも答えは正しいです。


2倍のポイントを手に入れた! 70ポイント を手に入れた。



Name: 徹夜  ..ぴよぴよ(211ポイント)   Date: 2007/06/10(日) 22:49   No:8515       
Title: また課題です(C++)    
int main()
{
int i,j,ln;
printf("何段ですか:");
scanf("%d",&ln);

for(i=1;i<=ln;i++){
for(j=1;j<=ln-i;j++)
putchar('*');
putchar('\n');
}
return(0);
}
このプログラムは左上が直角なのですが、このあとこれを書き換えて右上を直角とする*で表された直角三角形を作るという問題ですが、どこをどう書き換えればいいのか分かりませんお願いします。


130ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(46,306ポイント)   Date: 2007/06/10(日) 23:06   No:8516     
Title: Re:また課題です(C++)    
右上を直角にする為には、右に寄せる必要がありますよね?
それでは、右に寄せるにはどうすればいいでしょうか?
一番簡単なのは、寄せたい数だけ、' '(空白)を表示するのが良いかと思いますよ(^-^)


88ポイント を手に入れた。

Name: 徹夜  ..ぴよぴよ(243ポイント)   Date: 2007/06/10(日) 23:20   No:8517 解決!     
Title: Re:また課題です(C++)    
出来ました
空白表示してみました。
ありがとうございました。


32ポイント を手に入れた。



Name: マサキ  ..かけだし(1,147ポイント)   Date: 2007/06/10(日) 01:29   No:8492       
Title: 文字列判定プログラム    
あらかじめ与えられた文字列の集合に対し、文字を入力して、その集合の要素かどうかを判定するプログラムを作っています。
プログラムの条件としては
1 文字列の集合を、以下の構造体を用いたリストとして記述すること

 struct cell{
char animal[20];
struct cell *next;
};

2 再帰的関数memberを使って、文字列の判定を行うこと。
  memberのプロトタイプ宣言
  int member(char * , struct cell *);
第1引数:文字列 第2引数:リストへのポインタ
  返り値:第1引数の文字列が第2引数のリストの要素なら1を、そうでなければ0を返す。

3 今回、文字列の集合は
  {rat,cat,dog,elephant,horse,bat,hamster}
と与えられている。

4 00と入力すると、プログラム終了

という条件の下私はこのようなプログラムを作りました.(添付ファイル)
このプログラムは、コンパイルはできるのですが、実行するとセグメントエラーをおこしてしまいます。
コンパイル時にエラーが表示されない以上、私の実力ではどうすることもできません。
このプログラムはどこがいけないのでしょうか?
何処を改善すればちゃんと作動するようになるのでしょうか?
是非とも教えていただきたいです。宜しくお願いします。



515ポイント を手に入れた。


Name: box  ..比類無きプログラマー(70,862ポイント)   Date: 2007/06/10(日) 11:05   No:8496     
Title: Re:文字列判定プログラム    
問題点を逐一説明するのがたいへんなので、サンプルコードを提示します。
よろしければ研究してみてください。


43ポイント を手に入れた。

Name: しっぽ  ..初心者(8,147ポイント)   Date: 2007/06/10(日) 11:16   No:8498     
Title: Re:文字列判定プログラム    
実行時にエラーになるのはポインタaのポイント先を指定しないで、
ポインタaを使用しているためです。

strcpy(a->animal, str1);
で、aが実体のないオブジェクトをポイントしてしまっています。

リストについての復習するのが近道です。


121ポイント を手に入れた。

Name: マサキ  ..かけだし(1,391ポイント)   Date: 2007/06/10(日) 13:10   No:8503 解決!     
Title: Re:文字列判定プログラム    
おかげさまでプログラムが完成しました。
以前作ったリスト構造のプログラムを復習したとこと、先ほどの自分のプログラムが間違いだらけであることにきづきました。
全然リスト構造を理解できてませんでした。
boxさん、わざわざプログラムまで載せて下さって、どうもありがとうございました。


2倍のポイントを手に入れた! 244ポイント を手に入れた。



Name:  ..かけだし(1,379ポイント)   Date: 2007/06/09(土) 19:27   No:8489       
Title: BCC32(DSでの)が、楽に設定できるのを見つけたのでなんとなく報告を…    
http://hp.vector.co.jp/authors/VA029438/WebApp/bcc32tutEntrance.html

上記においてbcc32を使用するための面倒な設定を自動でしてくれるソフト(?)があったので、報告してみたり・・・

お久しぶりです(挨拶遅w

大学では、VCが入っているのに使用せずに進んでいくので、BCC入れようと(楽して)、彷徨っていたところ、見つけました。
かなり最初でしたが・・・

ウイルスバスターに引っかかってないので問題は無いかと思います。
もし、良さそうであると判断されたら、初心者に勧めるところに追加してみてはどうでしょうか??

以上、どうでもいいような報告でした。


188ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(46,218ポイント)   Date: 2007/06/09(土) 20:55   No:8490     
Title: Re:BCC32(DSでの)が、楽に設定できるのを見つけたのでなんとなく報告を…    
BCCはフリーコンパイラと、BCCデベロッパーにターボデバッガーとこれがあれば大抵の事はできますよね(^-^)
あとは、フリーのリソースエディターで使い勝手の良い物があれば最高なんですけど、いちどVisualStudioのリソースエディターを使ってしまうと、なかなか他の物に移れないんですよね…(;^_^A


86ポイント を手に入れた。



Name: sakura  ..ぴよぴよ(177ポイント)   Date: 2007/06/09(土) 13:49   No:8478       
Title: 困っています;;    
下記のプログラムの組み方が、手元の参考書をいくら読んでも分かりません・・・。
とても困っておりますので、どなたかご教授いただけないでしょうか?


char a;
char b[Ö];
short c;
int d;
float e;
double f;

上記の各変数(配列の場合は各要素)のアドレスを16進数で表示しなさい。
また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。


177ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(369,034ポイント)   Date: 2007/06/09(土) 14:08   No:8479     
Title: Re:困っています;;    
アドレスは変数に&をつけると表せます。
また、printfのオプションについては
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
この辺をよく読んでみてください。
サイズを調べる時は「sizeof」を検索してみてください。


75ポイント を手に入れた。

Name: sakura  ..ぴよぴよ(341ポイント)   Date: 2007/06/09(土) 16:17   No:8484     
Title: Re:困っています;;    
早速のご回答ありがとうございます。
しかし、
>>アドレスは変数に&をつけると表せます。
とのことですが、どうもそんなに簡単なことを問うている問題には思えないのですが、、

そもそも、私問題の意味がイマイチわからないのですが、
この問題はどういう意味なのでしょうか?


2倍のポイントを手に入れた! 164ポイント を手に入れた。

Name: DRAGON  ..ぴよぴよ(51ポイント)   Date: 2007/06/09(土) 16:32   No:8485     
Title: Re:困っています;;    
>そもそも、私問題の意味がイマイチわからないのですが、
>この問題はどういう意味なのでしょうか?

それは課題を出した人聞いた方がよろしいかと思うのですが・・


例えば、、

char a;

の場合は

printfを使って、&a
で表示させるとアドレスを表示できますよ。


51ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,819ポイント)   Date: 2007/06/09(土) 17:14   No:8486     
Title: Re:困っています;;    
複数の掲示板に同じ質問をなさるのは「マルチポスト」といいまして、
好ましく思われません。どこか一つだけで十分なはずです。
ところで、

> char b[Ö];

配列の添字に「オーウムラウト」は付きません。何かの間違いではないでしょうか。


95ポイント を手に入れた。

Name: まるちですYO  ..ぴよぴよ(13ポイント)   Date: 2007/06/09(土) 17:28   No:8487     
Title: Re:困っています;;    
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1615
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+30283


13ポイント を手に入れた。



Name: 羽流布 [URL]  ..入門者(4,045ポイント)   Date: 2007/06/07(木) 19:22   No:8409       
Title: カードをシャッフルするプログラム    
またまた質問に来ました<うるふ>です。

私は小説を書いているのですが、とある本でカードを利用した物語作成術が載っておりました。そこで、これをCで実現しようと思い、取り組んでいるのですが行き詰まりました……。

乱数を発生させる方法は分かったのですが、以下のプログラムでは結果が重複してしまって、同じものを二回引くという矛盾が生じてしまいます。

この矛盾を無くしたいのですが、何か良い案はありませんでしょうか?

/*************************
物語作成お助けプログラム
*************************/

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

#define NUM 24

// 関数のプロトタイプ
int GetRandom(int min, int max);

int main(void) {
char rune[NUM][128] = { {"知恵"}, {"生命"}, {"信頼"}, {"勇気"},
{"慈愛"}, {"秩序"}, {"至誠"}, {"創造"},
{"厳格"}, {"治癒"}, {"理性"}, {"節度"},
{"調和"}, {"結合"}, {"庇護"}, {"清楚"},
{"善良"}, {"解放"}, {"変化"}, {"幸運"},
{"意思"}, {"誓約"}, {"寛容"}, {"公式"} };
int i, n;

srand( (unsigned int)time(NULL) );

for (i = 0; i < 6; i++) {
n = GetRandom(0, NUM - 1);
switch (i) {
case 0: printf(" 主人公の現在―――〉"); break;
case 1: printf(" 主人公の近い未来―〉"); break;
case 2: printf(" 主人公の過去―――〉"); break;
case 3: printf(" 援助者――――――〉"); break;
case 4: printf(" 敵対者――――――〉"); break;
case 5: printf(" 結末(目的)―――〉"); break;
}
printf("%s", rune[n]);
if ( GetRandom(0, 1) ) {
printf("<逆>");
}
printf("\n");
}
return (0);
}

// 範囲乱数を実現する関数
int GetRandom(int min, int max) {
return ( min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)) );
}


928ポイント を手に入れた。


Name: フリオ  ..初心者(8,831ポイント)   Date: 2007/06/07(木) 19:52   No:8410     
Title: Re:カードをシャッフルするプログラム    
 
 カードをシャッフルするプログラムです。


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

int main(void)
{
char *rune[] = {"知恵", "生命", "信頼", "勇気", "慈愛", "秩序", "至誠", "創造",
"厳格", "治癒", "理性", "節度", "調和", "結合", "庇護", "清楚",
"善良", "解放", "変化", "幸運", "意思", "誓約", "寛容", "公式",};
char *temp;
int i, j;

srand((unsigned)time(NULL));
for(i = 0; i < 24; i ++){
printf("%s ", rune[i]);
if(i % 8 == 7) putchar('\n');
}
i = 24;
while(i > 1){
j = rand() % i --;
temp = rune[i];
rune[i] = rune[j];
rune[j] = temp;
}
putchar('\n');
for(i = 0; i < 24; i ++){
printf("%s ", rune[i]);
if(i % 8 == 7) putchar('\n');
}
return 0;
}

 


313ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,628ポイント)   Date: 2007/06/07(木) 19:54   No:8411     
Title: Re:カードをシャッフルするプログラム    
シャッフルについてはフリオさんが紹介なさっていますので、
同じものを2回引かない方法について。

方法は色々あると思います。
配列にデータを入れておき、選択した項目をどかして、左に詰めていく方法。
絵に描くとこんな感じ。


[0]~[6]のそれぞれの配列要素に2桁の乱数が入っているとします。

[0] [1] [2] [3] [4] [5] [6]
23 45 62 12 73 21 23

こんな風に値が入っているとします。
乱数で0~6の値を出し、仮に4が出たとします。

[0] [1] [2] [3] [4] [5] [6]
23 45 62 12 73 21 23

この値を取り出したいわけですね。
[4]の値を取り出し、それ以降の数値を左に寄せましょう。

[0] [1] [2] [3] [4] [5] [6]
23 45 62 12 21 23

次は乱数で0~5までの値を出します。仮に2が出たとします。[2]を取り出し、左へつめる・・。

これを繰り返せば同じ値を拾う事はありません。


これはもし文字列ならポインタを使うことになるでしょうから、
もし他の方法がよければもう一つ紹介します。

もう一つは構造体を使った方法です。

typedef struct{
int flag;
char st[64];
}ram_t;

ramt_t ram[10];

こんな風に構造体の配列を用意し、最初構造体の中のflagは全て0にしておきます。
で、stに文字列をいれます。
乱数でi=0~9の値を出し、ram[i].flagが0ならその中のstの文字列を使います。
使ったらram[i].flag=1;にしておきます。
次またこの配列要素を調査した時、flagは1になっていますから、既に使ったという事がわかりますし、
そうなったら他の要素を利用しましょう。


等など、色々方法はあると思います。



どうでしょう?おわかりいただけましたでしょうか。


350ポイント を手に入れた。

Name: 羽流布 [URL]  ..入門者(4,201ポイント)   Date: 2007/06/07(木) 21:33   No:8412     
Title: Re:カードをシャッフルするプログラム    
>フリオさん
 ありがとうございます^^
 変数宣言の中括弧は不必要だったのですね。
 そこら辺も曖昧でしたので助かりました。

>管理人さん
 ポインタはまだ習っていませんが、構造体は今週学んだばかりです。
 構造体って、こんな使い方が出来るんですね。全く考えていませんでした……。
 というわけで、構造体のほうでプログラムを作り変えてみます。


156ポイント を手に入れた。

Name: 羽流布 [URL]  ..入門者(4,234ポイント)   Date: 2007/06/07(木) 21:59   No:8413     
Title: Re:カードをシャッフルするプログラム    
>フリオさん
 j = rand() % i --; の意味が理解できないのですが……?


33ポイント を手に入れた。

Name: 羽流布 [URL]  ..入門者(4,878ポイント)   Date: 2007/06/07(木) 23:45   No:8415     
Title: Re:カードをシャッフルするプログラム    
下記のプログラムを実行したら、

 32: 左辺値が必要(関数 main )

というエラーが出たのですが、何が原因でしょうか?

/*************************
物語作成お助けプログラム
*************************/

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

#define NUM 24

typedef struct {
int flag;
char st[64];
} ram_t;

// 関数のプロトタイプ
int GetRandom(int min, int max);

int main(void) {
char rune[NUM][64] = { "知恵", "生命", "信頼", "勇気",
"慈愛", "秩序", "至誠", "創造",
"厳格", "治癒", "理性", "節度",
"調和", "結合", "庇護", "清楚",
"善良", "解放", "変化", "幸運",
"意思", "誓約", "寛容", "公式" };
ram_t ram[NUM];
int i, n;

srand( (unsigned int)time(NULL) );

for (i = 0; i < NUM; i++) {
ram[i].st = rune[i]; // ここが32行目です
ram[i].flag = 0;
}
for (i = 0; i < 6; i++) {
switch (i) {
case 0: printf(" 主人公の現在―――〉"); break;
case 1: printf(" 主人公の近い未来―〉"); break;
case 2: printf(" 主人公の過去―――〉"); break;
case 3: printf(" 援助者――――――〉"); break;
case 4: printf(" 敵対者――――――〉"); break;
case 5: printf(" 結末(目的)―――〉"); break;
}
n = GetRandom(0, NUM - 1);
while (ram[n].flag == 1) {
n = GetRandom(0, NUM - 1);
}
printf("%s", ram[n].st);
ram[n].flag = 1;
if ( GetRandom(0, 1) ) {
printf("<逆>");
}
printf("\n");
}
return (0);
}

// 範囲乱数を実現する関数
int GetRandom(int min, int max) {
return ( min + (int)(rand() * (max-min+1.0) / (1.0 + RAND_MAX)) );
}


644ポイント を手に入れた。

Name: Hermit  ..初心者(6,803ポイント)   Date: 2007/06/08(金) 00:00   No:8416     
Title: Re:カードをシャッフルするプログラム    
問題の行は、
strcpy(ram[i].st,rune[i]);
としておけば良いようです。

又は、構造体を
typedef struct {
int flag;
char *st;
} ram_t;
にしてあれば、そのまま
ram[i].st=rune[i];
でもいいでしょう。


72ポイント を落としてしまった。

Name: box  ..比類無きプログラマー(70,249ポイント)   Date: 2007/06/08(金) 00:00   No:8417     
Title: Re:カードをシャッフルするプログラム    
>  32: 左辺値が必要(関数 main )

strcpy() を使ってください。


15ポイント を手に入れた。

Name: 羽流布 [URL]  ..入門者(4,962ポイント)   Date: 2007/06/08(金) 00:12   No:8418 解決!     
Title: Re:カードをシャッフルするプログラム    
皆さん、ありがとうございますm(_ _)m

どうやら、ポインタが絡んでくるようですね。
私はまだ習っていないので、よく分かりませんが……。

とりあえず、これで目的のプログラムは完成しました。
欲を言えば、<逆>を表示する確率を変更できればいいのですが、無理なんでしょうね↓↓


84ポイント を手に入れた。

Name: Hermit  ..初心者(6,858ポイント)   Date: 2007/06/08(金) 00:22   No:8419     
Title: Re:カードをシャッフルするプログラム    
普通に、rand() 使えばいいだけではないでしょうか。
if ((rand() % 10) > 6) printf("<逆>");
例えばこれなら 30% 程度かな。

if (rand() < (RAND_MAX /4)) printf("<逆>");
だったら、25 % くらい


55ポイント を手に入れた。

Name: 羽流布 [URL]  ..入門者(4,994ポイント)   Date: 2007/06/08(金) 00:34   No:8421 解決!     
Title: Re:カードをシャッフルするプログラム    
>Hermitさん
 こうすれば確率を調整できるのですか。
 ありがとうございますm(_ _)m

 でも、実行してみると全部<逆>になったりと……なんか前より極端になった気が……。
 まぁ、0か1かという乱数ですから、確率なんてあんまり意味ない気がしてきました○TZ


32ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,676ポイント)   Date: 2007/06/08(金) 01:04   No:8422     
Title: Re:カードをシャッフルするプログラム    
先日から
「ポインタ」=「やめる、避ける」
と嫌ってらっしゃるようですが、
char *st="shuffle";
という記述はなんら難しいものではなく、
char st[10]="shuffle";
などと宣言したのと同じように扱えます。
まだ学校で習って無いようでしたら難しくないですからネットに沢山ある参考になるサイトをのぞいてみてはいかがでしょうか?
今の範囲の中では実行する上で特に詳しい仕組みを理解していなくても使えますよ。

あと、
>j = rand() % i --; の意味が理解できないのですが……?
についてですが、
i--;

i++;
は式が評価された後でマイナス、プラスされます。一方その逆で、
--i;
++i;
という書き方もあり、これは式を評価する前に増減させます。
つまり、式と、インクリメント、デクリメントの式をひとまとまりで書いただけであり、
j = rand() % i;
i--;
と書いたのと同じです。
for(i=0;i<10;i++)
などと書きますよね。
i++;
は式が評価された後に、計算されますから、

i=1;
printf("%d\n",i++);
printf("%d\n",i);
これを実行すると、
1
2
となります。上記プログラムは同様に
i=1;
printf("%d\n",i);
i++;
printf("%d\n",i);
と同じことです。


48ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(5,101ポイント)   Date: 2007/06/08(金) 11:36   No:8431 解決!     
Title: Re:カードをシャッフルするプログラム    
>管理人さん
 そうですよね、未知なる物を嫌ってはいけませんよね。
 好奇心を持って取り組みたいと思います^^

 i++ とかの ++ の部分は今まであまり意識せずに使っていました。
 なので、参考になりました。
 ありがとうございますm(_ _)m


107ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(5,802ポイント)   Date: 2007/06/08(金) 12:23   No:8433     
Title: Re:カードをシャッフルするプログラム    
 皆さんの意見を参考にプログラムを改良してみました^^

 でも、実際にツールとして使うためには、プログラムの終了条件に「エンターを押して終了」などの処理が必要だということに気付きました。
 そこで、エンターの文字列表現が知りたいのですが、改行の表現では上手くいかないようです……。どのように表現すればいいのでしょうか?

/*************************
物語作成お助けプログラム
*************************/

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

#define NUM 24

typedef struct {
int flag;
char *st;
} ram_t;

int main(void) {
char *rune[NUM] = { "知恵", "生命", "信頼", "勇気",
"慈愛", "秩序", "至誠", "創造",
"厳格", "治癒", "理性", "節度",
"調和", "結合", "庇護", "清楚",
"善良", "解放", "変化", "幸運",
"意思", "誓約", "寛容", "公式" };
char ch;
ram_t ram[NUM];
int i, j, n;

srand( (unsigned int)time(NULL) );

for (i = 0; i < NUM; i++) {
ram[i].st = rune[i];
ram[i].flag = 0;
}
for (i = 0; i < 6; i++) {
switch (i) {
case 0: printf(" 主人公の現在―――〉"); break;
case 1: printf(" 主人公の近い未来―〉"); break;
case 2: printf(" 主人公の過去―――〉"); break;
case 3: printf(" 援助者――――――〉"); break;
case 4: printf(" 敵対者――――――〉"); break;
case 5: printf(" 結末(目的)―――〉"); break;
}
j = NUM;
n = rand() % j--;
while (ram[n].flag == 1) {
n = rand() % j--;
}
printf("%s", ram[n].st);
ram[n].flag = 1;
if ( (rand() % 10) < 3 ) {
printf("<逆>");
}
printf("\n");
}
printf("エンターで終了\n");
if ( scanf("%c", &ch) ) {
return (0);
}
}


701ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(46,063ポイント)   Date: 2007/06/08(金) 13:02   No:8435     
Title: Re:カードをシャッフルするプログラム    
環境によって違う場合もありますので、下記のようなプログラムで調べてみてはいかがでしょうか?
押したキーのコードを16進数で表示します。



#include <stdio.h>
#include <conio.h>

int main(void)
{
unsigned char chKey;

while( 1 )
{
chKey = getch();

if (chKey != 0x00)
{
printf("%X\n", chKey);
}
}

return 0;
}


140ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(5,932ポイント)   Date: 2007/06/08(金) 13:58   No:8438     
Title: Re:カードをシャッフルするプログラム    
一応、Dと出ましたけど、これって環境によって違うということですか?
それでは、実用的ではない気がするのですが……?
どうしましょ○TZ


2倍のポイントを手に入れた! 130ポイント を手に入れた。

Name: フリオ  ..中級者(9,377ポイント)   Date: 2007/06/08(金) 16:24   No:8444     
Title: Re:カードをシャッフルするプログラム    
 
 こういうことでしょうか。
Win2000、BCC32 5.5.1で動作確認。


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

#define RUNE 24
#define ITEM 6

void Shuffle(char **card, int number)
{
char *temp;
int i, j;

i = number;
while(i > 1){
j = rand() % i --;
temp = card[i];
card[i] = card[j];
card[j] = temp;
}
return;
}

void Print(char **card)
{
char *item[] = {" 主人公の現在 ", "主人公の近い未来", " 主人公の過去 ",
" 援助者 ", " 敵対者 ", " 結末(目的) ",};
char *notrune[] = {"", "<逆>",};
int i;

for(i = 0; i < ITEM; i ++){
printf(" %s -> %s%s\n", item[i], card[i], notrune[!(rand() % 5)]);
}
putchar('\n');
return;
}

int main(void)
{
char *rune[] = {"知恵", "生命", "信頼", "勇気", "慈愛", "秩序", "至誠", "創造",
"厳格", "治癒", "理性", "節度", "調和", "結合", "庇護", "清楚",
"善良", "解放", "変化", "幸運", "意思", "誓約", "寛容", "公式",};

srand((unsigned)time(NULL));
do{
Shuffle(rune, RUNE);
Print(rune);
}while(getch() != 0x0d);
return 0;
}

 


546ポイント を手に入れた。

Name: フリオ  ..中級者(9,498ポイント)   Date: 2007/06/08(金) 17:56   No:8448     
Title: Re:カードをシャッフルするプログラム    
 
 上のだと、カーソルキーを押したとき一気に二つ進んでしまうのでその対策として
関数、

int Quit(void)
{
int ch;

ch = getch();
if(ch == 0x00) getch();
return ch == 0x0d;
}

 
を追加して、
while(getch() != 0x0d);

while(!Quit());
に変更。
 


121ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(5,971ポイント)   Date: 2007/06/08(金) 17:57   No:8449 解決!     
Title: Re:カードをシャッフルするプログラム    
>フリオさん
 ありがとうございます。
 0x0d がエンターを表しているのですね? 私は Windows XP、BCC32 5.5.1 ですが、問題ありませんでした。
 以下は改良版です。

/*************************
物語作成お助けプログラム
*************************/

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

#define NUM 24

// 関数のプロトタイプ
int Quit(void);

typedef struct {
int flag;
char *st;
} ram_t;

int main(void) {
char *rune[NUM] = { "知恵", "生命", "信頼", "勇気",
"慈愛", "秩序", "至誠", "創造",
"厳格", "治癒", "理性", "節度",
"調和", "結合", "庇護", "清楚",
"善良", "解放", "変化", "幸運",
"意思", "誓約", "寛容", "公式" };
ram_t ram[NUM];
int i, j, n;

printf("結果の単語から連想できるものを考え、物語を紡ぎ出すのです!\n");
printf("(注)<逆>は意味が反対になります。\n\n");

srand( (unsigned int)time(NULL) );

for (i = 0; i < NUM; i++) {
ram[i].st = rune[i];
ram[i].flag = 0;
}
for (i = 0; i < 6; i++) {
switch (i) {
case 0: printf(" 主人公の現在―――〉"); break;
case 1: printf(" 主人公の近い未来―〉"); break;
case 2: printf(" 主人公の過去―――〉"); break;
case 3: printf(" 援助者――――――〉"); break;
case 4: printf(" 敵対者――――――〉"); break;
case 5: printf(" 結末(目的)―――〉"); break;
}
j = NUM;
n = rand() % j--;
while (ram[n].flag == 1) {
n = rand() % j--;
}
printf("%s", ram[n].st);
ram[n].flag = 1;
if ( (rand() % 10) < 3 ) {
printf("<逆>");
}
printf("\n");
}
printf("\nエンターで終了\n");
for (; ;) {
if ( Quit() ) {
return (0);
}
}
}

int Quit(void) {
int ch;

ch = getch();
if (ch == 0x00) {
getch();
}
return (ch == 0x0d);
}


39ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(46,132ポイント)   Date: 2007/06/08(金) 22:02   No:8452     
Title: Re:カードをシャッフルするプログラム    
BCCならば、それで大丈夫ですが、同じソースコードでもVisualStudioだと不具合が出ます。
ファンクションキーや矢印を押した時に最初に返ってくるコードが0x00ではなく、0xE0になるんですよね。
前に、これで随分と悩まされた事があったので、参考までに…(;^_^A


69ポイント を手に入れた。

Name: フリオ  ..中級者(9,514ポイント)   Date: 2007/06/08(金) 23:18   No:8453     
Title: Re:カードをシャッフルするプログラム    
 
> 最初に返ってくるコードが0x00ではなく、0xE0になるんですよね。

 これですね。
http://support.microsoft.com/kb/57888/ja
 


16ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(6,028ポイント)   Date: 2007/06/09(土) 03:28   No:8470     
Title: Re:カードをシャッフルするプログラム    
>BCCならば、それで大丈夫ですが、同じソースコードでもVisualStudioだと不具合が出ます。
 でも、実行ファイルでプログラムを使う場合にはコンパイラは関係ないですよね?


57ポイント を手に入れた。

Name: Hermit  ..初心者(6,958ポイント)   Date: 2007/06/09(土) 09:25   No:8474     
Title: Re:カードをシャッフルするプログラム    
>でも、実行ファイルでプログラムを使う場合にはコンパイラは関係ないですよね?
今回は関係なさそうですね(^^;
	printf("エンターで終了\n");

if ( scanf("%c", &ch) ) {
return (0);
}

の所は、
	printf("エンターを押してください\n");

getchar();
return 0;

で良い気がする(^^;


30ポイント を手に入れた。

Name: 羽流布 [URL]  ..初心者(6,092ポイント)   Date: 2007/06/09(土) 16:08   No:8483 解決!     
Title: Re:カードをシャッフルするプログラム    
>Hermitさん
 ありがとうございます。
 疑問が解消されました。

只今、学校の宿題に取り組んでいますので、また質問することになりそうです。


64ポイント を手に入れた。



Name: マサキ  ..ぴよぴよ(276ポイント)   Date: 2007/06/08(金) 23:58   No:8454       
Title: コンパイル〜実行について    
現在Windows上でシグウィンを使いながら、プログラミングを行っています。
そこで、わからないことがあったので質問させていただきます。

まず、ファイル名 file_post に 
3.2 2 + 4 -
という数値が保存されているファイルがあります。
そして、逆ポーランド記法の評価をするプログラムとして、calc_postfix.c というプログラムがあります。
一応、このプログラムは添付させておきます。
本来、このプログラムは標準入力から数値を読み取り、結果を表示させるものです。
しかし、標準入力からではなく、file_postから数値を読み取り、結果を表示させるにはどうすればいいいのでしょう??
私は 
$gcc calc_postfix.c < file_ppost
とし、実行してみたところセグメントエラーになってしましました。
何処が間違っているのかわかりません。
もしわかるかたがいたら、教えてくださると助かります。
宜しくお願いします。


229ポイント を手に入れた。


Name: マサキ  ..ぴよぴよ(314ポイント)   Date: 2007/06/09(土) 00:00   No:8455     
Title: Re:コンパイル〜実行について    
訂正:
$gcc calc_postfix.c < file_ppost を $gcc calc_postfix.c < file_post

余分にpが一つついていました。


38ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,396ポイント)   Date: 2007/06/09(土) 00:45   No:8456     
Title: Re:コンパイル〜実行について    

> $gcc calc_postfix.c < file_ppost

実行の仕方が正しくないのではないでしょうか?

gccで実行ファイルを作った後、
実行ファイル名 < file_post <Return>
のように実行すればよいのではないかと思います。

ところで、ソースコードの中に気になる点がいくつかあります。
1)isdigit()を使っていますので、ctype.hをインクルードしてください。
2)pop()の戻り値はint型でよいのでしょうか?例としてあげられた計算の結果が正しくないですよね。
3)pop()の中で実行しているfree()は必要でしょうか?
  引数のcは、動的に確保した領域を指すポインタではありません。



147ポイント を手に入れた。

Name: マサキ  ..ぴよぴよ(455ポイント)   Date: 2007/06/09(土) 01:31   No:8458     
Title: Re:コンパイル〜実行について    
たしかにそうですよね^^; まだまだ初心者なので申し訳ありません。
返し値がint型だと、小数点以下が無視されてしまいますからね......
教えてくれてありがとうございました。

ところで、
$gcc calc_postfix.c
$callc_postfix < file_post <Return>
と実行しましたところ
bash:syntax error near unexpected token 'newline'
と出てきてしまいました。
またどこか間違っているのでしょうか??
宜しくお願いいたします。


141ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,660ポイント)   Date: 2007/06/09(土) 01:41   No:8461     
Title: Re:コンパイル〜実行について    

> $gcc calc_postfix.c
> $callc_postfix < file_post <Return>

実行時のプログラム名でエルが1つ多いのは、
投稿時のちょっとした手違いですか?
それとも、本当にこのようにして実行しましたか?


68ポイント を手に入れた。

Name: Hermit  ..初心者(6,928ポイント)   Date: 2007/06/09(土) 08:34   No:8472     
Title: Re:コンパイル〜実行について    
bash のエラー出力がよくわかりませんが、

gcc calc_postfix.c
としたばあい、実行ファイルは、同じフォルダー中の、a.out.exe になるんじゃなかったっけ?

で実行するには、
./a.out < file_post
でなかったかと・・・
最近 cygwin 使ってないので違ってたらゴメンね。


70ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,724ポイント)   Date: 2007/06/09(土) 08:52   No:8473     
Title: Re:コンパイル〜実行について    
Hermitさんがお書きになったとおり、
作成する実行ファイル名を明示的に指定していないので、
実行ファイルにはデフォルトの名前が付いているのかもしれないですね。

フォルダの内容を確認してみてください。>マサキさん


64ポイント を手に入れた。

Name: マサキ  ..ぴよぴよ(632ポイント)   Date: 2007/06/09(土) 10:28   No:8476 解決!     
Title: Re:コンパイル〜実行について    
>>boxさん
lが一つ多いのは、投稿時の手違いです。紛らわしくて申し訳ないです。

また、
$gcc calc_postfix.c
$./a.out < file_post
とやってもできませんでしたが、
$gcc calc_postfix.c
$./a.exe < file_post
としたら、正しく答えが出力されました。
boxさん、Hermitさん、親切に教えてくれてありがとうございました。



177ポイント を手に入れた。



Name: とまとん  ..ぴよぴよ(470ポイント)   Date: 2007/06/08(金) 01:58   No:8425       
Title: 入門編の項目0からいきなりつっかかりました・・・    
Javaは独学で簡単なゲームを作れる程度、
C言語に関してはド素人ですが本格的なシューティングゲームを作ってみたいなと思いC++に挑戦しようとしてこのサイトにたどり着きました。

それでまったく初期の部分で申し訳ないのですが・・・
BorlandC++ Compiler 5.5の導入部分でプログラムを組む所までは行き、「メイク」
をしてみたのですが以下の文がでてエラーになってしまいます。


> c:\borland\bcc55\Bin\make.exe -fDebug\test.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c "C:\Documents and Settings\○○○\デスクトップ\bccdev1221\test\DrawPixel.cpp"
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\documents and settings\○□○\デベハトップ\bccdev1221\test\drawpixel.cpp:
エラー F1009 c:\documents and settings\○□○\デベハトップ\bccdev1221\test\drawpixel.cpp: 入力ファイル 'c:\documents and settings\○□○\デベハトップ\bccdev1221\test\drawpixel.cpp' をオープンできない
*** 1 errors in Compile ***

** error 1 ** deleting Debug\DrawPixel.obj

Make End !! (Elapsed time 0:00.172)

(○○○、○□○は一応伏せてあります。四角の部分のみ変な描写になってます。またファイルの保管場所は指定が無い場合はすべてデスクトップに保存しています)
過去ログ等確認して、3度ほどやり直してみましたが同じメッセージが出てしまいます。もう根本的なところから間違ってると思うんですが。
デベハトップってなんじゃいorz


470ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(365,954ポイント)   Date: 2007/06/08(金) 03:22   No:8426     
Title: Re:入門編の項目0からいきなりつっかかりました・・・    
DXライブラリの設定に関するページはお読みになりました?
http://homepage2.nifty.com/natupaji/DxLib/dxuse_bcc.html


24ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(366,024ポイント)   Date: 2007/06/08(金) 03:24   No:8427     
Title: Re:入門編の項目0からいきなりつっかかりました・・・    
BorlandC++ Compiler 5.5を使うのならマイクロソフトから無料で提供されているVisualC++ 2005 Express Editionを使ったほうがずっといいですよ。
検索かければダウンロードできますので。


70ポイント を手に入れた。

Name: とまとん  ..ぴよぴよ(524ポイント)   Date: 2007/06/08(金) 08:16   No:8428     
Title: こんな時間にありがとうございます。    
ちゃんと設定していると思いますが。。。

VisualC++ って無料なんですか! ゲーム製作の参考書では有料と書いてあったもので・・・
とりあえずこちらをDLしてみますね。ダメならまた聞きに来ます illiOTZ


54ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(366,197ポイント)   Date: 2007/06/08(金) 10:56   No:8430     
Title: Re:こんな時間にありがとうございます。    
VisualStudio.2003や2005は有料ですが、ExpressEditionは無料なんです。
機能はある程度制限されているのですが、最初のうちは十分すぎるほどですので、是非オススメです。

2005でも、普通の製品は何万もして高いですが、学生でしたらアカデミック版が購入できるのでホントやすいですよ。
http://www.coneco.net/PriceList/1051221318/order/MONEY/#list
4000円位です。
アカデミック版でも機能は同じです。

(もし学生で)もし今からプログラムをべんきょうしていかれるのでしたら毎回使うコンパイラに4000円はかなりお得な値段だとおもうのでよければ検討してみてください。


173ポイント を手に入れた。

Name: とまとん  ..ぴよぴよ(531ポイント)   Date: 2007/06/08(金) 20:02   No:8451 解決!     
Title: 解決しました    
ExpressEdition で先に進むことが出来ました。ありがとうございます。

って4000円ですか...少し検討してみたいと思います。


7ポイント を手に入れた。



Name: elmes  ..ぴよぴよ(429ポイント)   Date: 2007/06/06(水) 19:56   No:8353       
Title: 課題の質問    
初めて投稿させていただきます。
早速なんですが、課題が分からず質問させていただきます。

[1本の道に,食べ物が多数落ちている.
ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.

<仕様>
「道」は要素数20程度の1次元配列で表現する.
「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする.
「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる.
「動物」の訪れた場所のエサは食べられたものとする.
「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する.
繰り返し処理中は,毎回数十〜数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.
余力があれば,cursesライブラリを使用して,毎回コンソール内の同じ箇所にスクロール無しで表示できるようにする.]

という問題なんですが、どうぞよろしくお願いします。
ちなみに配列まで習っており、標準ライブラリはまだ習ってません。


429ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(44,643ポイント)   Date: 2007/06/06(水) 20:21   No:8354     
Title: Re:課題の質問    
えっと、いくつか確認させてください。

まず、コンパイラは何をお使いでしょうか?

それから、cursesライブラリって何ですか?

最後に、標準ライブラリを習ってないという事は、使用してはいけないという意味でしょうか?


57ポイント を手に入れた。

Name: elmes  ..ぴよぴよ(589ポイント)   Date: 2007/06/06(水) 20:29   No:8355     
Title: Re:課題の質問    
返信ありがとうございます。

コンパイラについてですが、申し訳ないんですがちょっと確認ができないんです。
ちなみにOSはリナックスです。
次にcursesライブラリについてですが、
(余力があればcursesライブラリを使用して・・・・・・スクロール無しで表示できるようにする)
↑の行は無視していただいて結構です。
最後に標準ライブラリについてですが、これは使用してはいけないという解釈でお願いします。



160ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(44,714ポイント)   Date: 2007/06/06(水) 21:00   No:8356     
Title: Re:課題の質問    
ごめんなさい、OSがLinuxという時点で私では力になれそうにありません…。
更に標準関数も使えないのでは余計に…です(;´Д`)
申し訳ないですm(__)m


71ポイント を手に入れた。

Name: Justy  ..ハッカー(112,781ポイント)   Date: 2007/06/06(水) 22:06   No:8358     
Title: Re:課題の質問    
>標準ライブラリについてですが、これは使用してはいけないという解釈でお願いします
 これはなかなか大変な縛りですね。
 rand()や srand()、time()も使えないとなると /dev/randomとか/dev/urandomとか使うんでしょうかね。


Name: elmes  ..ぴよぴよ(562ポイント)   Date: 2007/06/06(水) 22:20   No:8359     
Title: Re:課題の質問    
すいません、標準ライブラリについてですが、
使用してもいいということが分かりました☆


27ポイント を落としてしまった。

Name: elmes  ..かけだし(1,150ポイント)   Date: 2007/06/07(木) 00:03   No:8366     
Title: Re:課題の質問    
いろいろなヒントを元に、

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

#define TABEMONO 20

int main(void)
{
int miti[TABEMONO];
int i,n,doubutu, tabemono=TABEMONO;
time_t t1,t2;

srand(time(NULL));

/*毒饅頭を全体に置く、毒が弱いので20個食べないと死なない*/
for(n=0;n<TABEMONO;n++) miti[n]=1;
/*動物を放す*/
doubutu=(rand()%19);
i=1;
while(tabemono>0){/*毒饅頭置いてある間は続ける*/*/
/*現在の状況を表示、動物に居る所に毒饅頭があれば食べる(毒饅頭が1個減る)。*/
printf("%5d:",i++);
for(n=0;n<TABEMONO;n++){
if(n==doubutu){
if(miti[n]!=0){
tabemono--;
miti[n]=0;
}
printf("○");
miti[n]=0;

}
else if(miti[n]==1)printf("*");
else printf("-");
}
if(doubutu==0)doubutu++;/*左端だから右にしかいけない*/
else if(doubutu==TABEMONO)doubutu--;/*右端だから以下省略*/
else if(rand()%2==0) doubutu++;/*端じゃないなら乱数で行く方向を決める*/
else doubutu--;
printf("\n");


/*------------*------------------*---------------*----------
ここに一時停止するコードを入れる
---------------------------*---------------*--------------*/
}
return 0;
}

といった感じまでは仕上がったんですが、「一時停止するコード」がどうしても分かりませんでした。
この部分を何とかお願いしたいのですが・・・


588ポイント を手に入れた。

Name: Justy  ..ハッカー(112,765ポイント)   Date: 2007/06/07(木) 00:36   No:8367     
Title: Re:課題の質問    
>「一時停止するコード」がどうしても分かりませんでした
 Linuxなら getch()とかどうでしょう?
 キーボードの入力待ちで一時停止しますよ。


16ポイント を落としてしまった。

Name: バグ  ..熟練のプログラマー(44,805ポイント)   Date: 2007/06/07(木) 04:38   No:8383     
Title: Re:課題の質問    
>>繰り返し処理中は,毎回数十〜数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.

とあるので、getchだとまずいのではないでしょうか?
課題文を見る限りでは、ウェイト用タイマー関数を自作するのも課題みたいですね。
たしか、time.h内に経過時間を返す関数があったような…


91ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(45,842ポイント)   Date: 2007/06/07(木) 09:48   No:8389     
Title: Re:課題の質問    
私なら、こうするというものを載せてみます。変数名等も全て私の好みでつけましたので、参考程度に…
Windows上での動作は確認しましたが、Linuxでは分かりません。標準関数しか使っていないので、多分大丈夫だとは思いますけど…(^_^;)


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

#define WAIT 100 /* ミリ秒単位で一時停止時間を指定する */

int main(void)
{
char szWay[21];
int i, nAnimal, nFood, nWay[20];
clock_t ctStart, ctEnd;

/* 乱数生成の為の前準備 */
srand((unsigned)time(NULL));

/* 道の上に食べ物を配置する */
for (i = 0; i < 20; i++) nWay[i] = 1;

/* 食べ物の数を初期化する */
nFood = 20;

/* 動物の初期位置の決定 */
nAnimal = rand() % 20;

/* 食べ物の数が0以上の間、ループさせる */
do
{
/* 動物の位置と同じ位置に食べ物がある場合には、食べ物のカウントを1つ減らす */
if (nWay[nAnimal] == 1) nFood--;

/* 道の配列へ動物が居る位置を格納する */
nWay[nAnimal] = 2;

/* 道の表示用の文字列を作成する */
for (i = 0; i < 20; i++)
{
switch (nWay[i])
{
case 0:
szWay[i] = '_';
break;
case 1:
szWay[i] = '*';
break;
case 2:
szWay[i] = 'O';
break;
}
}

/* 文字列の終端に終端記号を追加する */
szWay[20] = '\0';

/* 道を表示する */
printf("%s\r", szWay);

/* 動物の移動処理 */
nWay[nAnimal] = 0;
if (rand() % 2 == 0)
{
nAnimal++;
}
else
{
nAnimal--;
}

if (nAnimal < 0) nAnimal = 19;
if (nAnimal > 19) nAnimal = 0;

/* 一時停止処理用タイマー */
ctStart = clock();
do
{
ctEnd = clock();
}
while (ctEnd - ctStart <= WAIT);
}
while (nFood > 0);

return 0;
}


2倍のポイントを手に入れた! 988ポイント を手に入れた。

Name: Justy  ..ハッカー(113,035ポイント)   Date: 2007/06/07(木) 10:00   No:8390     
Title: Re:課題の質問    
>とあるので、getchだとまずいのではないでしょうか?
 んー、たしかにそうなんですが、既にサンプルのなかで usleepを使っているのにも
関わらず「一時停止」と訊かれていたので、時間的に止めたいというわけじゃないのかな
とも思ったわけです。

 そう言われるてみると、そうではなくただ単に usleep()などを使った時間的な一時停止で
いいのかもしれませんね。


133ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(45,923ポイント)   Date: 2007/06/07(木) 10:08   No:8392     
Title: Re:課題の質問    
なるほど、そう言われてみればそうですね(^_^;)

usleepという関数がどこで定義されているのか分からないですけど…あ、ひょっとしたら、最初の方に出てきたcursesというライブラリ内に存在しているのかもしれませんね。


81ポイント を手に入れた。

Name: hoge  ..かけだし(1,272ポイント)   Date: 2007/06/08(金) 14:51   No:8442     
Title: Re:課題の質問    
ごめん。インデント崩れた。あと最後にmoveが無かった。
良ければ上のをけしといて。

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

void init_load(int* load, int size)
{
int i;
for (i = 0; i < size; ++i) {
load[i] = rand() / (RAND_MAX / 2);
}
}

void print_load(int* load, int size)
{
int i;
static char disp[] = {'-', '*', '0'};
for (i = 0; i < size; ++i) {
printw("%c", disp[load[i]]);

}
printw(" food: %d\n", count_food(load, size));
}

int move_animal(int* load, int size, int pos)
{
load[pos] = 0;
if (rand() / (RAND_MAX / 2))
++pos;
else
--pos;
if (pos < 0)
pos = size -1;
else if (pos > size -1)
pos = 0;

load[pos] = 2;
return pos;
}

int count_food(int* load, int size)
{
int i;
int food = 0;
for (i = 0; i < size; ++i) {
if (load[i] == 1)
++food;
}
return food;
}

int main(int argc, char* argv[])
{
int *load;
int size;
int pos;
WINDOW* win;

if (argc != 2) {
printf("%s num\n", argv[0]);
return 1;
}
size = strtol(argv[1], NULL, 10);
if (!size)
return 1;
load = (int*)calloc(size, sizeof(int));
if (!load)
return 1;

win = initscr();

srand(time(NULL));
init_load(load, size);
pos = rand() / (RAND_MAX / size);

while (count_food(load, size) != 0) {
move(1, 1);
print_load(load, size);
pos = move_animal(load, size, pos);
wrefresh(win);
usleep(100000);
}
move(1, 1);
print_load(load, size);
wrefresh(win);
usleep(100000);

endwin();
return 0;
}




552ポイント を手に入れた。



Name: 神魔  ..かけだし(1,245ポイント)   Date: 2007/06/01(金) 15:14   No:8191       
Title: たびたびすいません。    
すいません、また行き詰ってしまいました。
前回書き込みをしたときの問題は解決したのですが、新しい問題が発生してしまいました。

#include "DxLib.h"
#include <stdio.h>

void hannou(int);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int Cr;
Cr=GetColor(255,255,255);
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int I,A=0;
I=0;
while(1){
switch (I){
case 0:DrawString(0,0,"あなたって男?女?",Cr);
DrawString(15,30,"A:実は男です。",Cr);
DrawString(15,45,"B:意外に女です。",Cr);
while(1){
if(CheckHitKey(KEY_INPUT_A)==1||
CheckHitKey(KEY_INPUT_B))
break;
}
while(1){
ClearDrawScreen();
A++;
hannou(A);
if(CheckHitKey(KEY_INPUT_RETURN)==1)
ClearDrawScreen();
break;
}
break;
}
}

WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
void hannou(int a){

int i;
i=GetRand(4);
Cr=GetColor(255,255,255);
if(a<=10){
switch(i){
case 0:DrawString(0,0,"ふ〜ん、で?",Cr);
break;
case 1:DrawString(0,0,"興味無いし。",Cr);
break;
case 2:DrawString(0,0,"ごめん、聞いてなかった。",Cr);
break;
case 3:DrawString(0,0,"だからなに?",Cr);
break;
case 4:DrawString(0,0,"へぇ。",Cr);
break;
}
}
}

前回とあまり変わっていませんが、このプログラムをコンパイルすると

test.cpp(44) : error C2065: 'Cr' : 定義されていない識別子です。

とエラーが出てしまいます。
どこがいけないのかまったくわかりません。
どなたか解決策を教えてください。
お願いいたします。


813ポイント を落としてしまった。


Name: バグ  ..熟練のプログラマー(43,477ポイント)   Date: 2007/06/01(金) 15:28   No:8193     
Title: Re:たびたびすいません。    
エラーメッセージそのままの意味ですよ。
確かに、WinMainの中ではCrが定義されていますが、hannouの中には定義されていませんよね?


46ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(359,824ポイント)   Date: 2007/06/01(金) 16:11   No:8196     
Title: Re:たびたびすいません。    
過去に詳しく自作関数と、変数の有効範囲について説明したことがあります。

http://www.play21.jp/board/formz.cgi?action=res&resno=5084&page=&lognum=17&id=dixq&rln=5134

こちらの「自作関数について」と「変数の有効範囲について」をお読みください。


89ポイント を手に入れた。

Name: 神魔  ..かけだし(1,810ポイント)   Date: 2007/06/01(金) 17:24   No:8203     
Title: Re:たびたびすいません。    
えっと、それってつまりhannouの中で変数Crを宣言すればいいんですか?
(int i,Crみたいな感じで。)
でもそうすると

libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_execute_transformation" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jcopy_markers_execute" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_adjust_parameters" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_request_workspace" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jcopy_markers_setup" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_write_stdout" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_read_stdin" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_read_scan_script" は未解決です
libjpeg.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_keymatch" は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 9 が未解決です。
link.exe の実行エラー

ていうエラーが出てしまうんです。

また、Crをグローバル関数として宣言しようと思い、
#include "DxLib.h"
#include <stdio.h>
int Cr;

と記述してみたのですが、上と同じエラーが出てしまいました。
どうすればいいですか?


565ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(360,196ポイント)   Date: 2007/06/01(金) 17:34   No:8206     
Title: Re:たびたびすいません。    
コンパイラは何を使っています?
もしかしてVisual Studio 2005 ExpressEditionじゃないでしょうか。
フリー版は設定が必要です。
http://homepage2.nifty.com/natupaji/DxLib/dxuse.html

それでも解決しない場合は本家で聞いてみてください。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?

後、質問する前にほとんど同じような質問が10日前に投稿されているので、そちらも一応目を通してから投稿してください。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=442


188ポイント を手に入れた。

Name: 神魔  ..かけだし(1,882ポイント)   Date: 2007/06/08(金) 13:33   No:8437     
Title: Re:たびたびすいません。    
バグさん、管理人さん、ありがとうございました。
返信遅れてしまい、すいませんでした。
最近PCを起動することができなかったので…。

管理人さんのおっしゃった通り、DXライブラリ置き場掲示板で質問してみました。
お騒がせしてすいませんでした。


72ポイント を手に入れた。



Name: しゃけ  ..ぴよぴよ(201ポイント)   Date: 2007/06/08(金) 12:08   No:8432       
Title: 10次元    
今回初めて投稿させていただきます。
大学の課題で次のようなプログラムを作れという課題が出たのですがまるでわからなかったので質問させていただきます。

各要素が整数の2つの10次元ベクトルをキーボードから入力して2つのベクトルの和
と内積をサブルーチンで求めて表示するプログラムを作成せよ。

ベクトルは配列で表現できるそうなんですがいったいどのようにしたらいいでしょうか?
ちなみにOSはLinuxでemacsを使用しています。


201ポイント を手に入れた。


Name: YuO  ..入門者(3,909ポイント)   Date: 2007/06/08(金) 13:32   No:8436     
Title: Re:10次元    
個人的には,
typedef struct tagVector10D

{
int value[10];
} Vector10D
という感じの構造体を使いますね。

あとは,
Vector10D Vector10D_Add (Vector10D lhs, Vector10D rhs); /* ベクトルの和 */
int Vector10D_InnerProduct (Vector10D lhs, Vector10D rhs); /* ベクトルの内積 */
を,ベクトルの定義に従って計算するように作ればよいです。
# 内積がintで大丈夫か,という問題は気にしないことにする。

> ベクトルは配列で表現できるそうなんですがいったいどのようにしたらいいでしょうか?

直接的にこの質問に答えるなら,「課題を満たすように作ればよい」としか答えられません。
「何が解らないか」をちゃんと説明してもらえれば,それについて回答ができるかもしれませんが。

> ちなみにOSはLinuxでemacsを使用しています。

emacsはエディタであって,vi使おうがWindowsで書いてFTPしようが,基本的にどうでもよい話です。
ここで書くべきはコンパイラの情報です。


272ポイント を落としてしまった。



Name: しゃか  ..ぴよぴよ(88ポイント)   Date: 2007/06/07(木) 02:12   No:8370       
Title: 学校で・・・    
ボンバーマンのようなゲームを作ることになりました。
作る際には2次元配列を使って、いけないところを作っていけば、あのボンバーマンのような網の目状に動くことが出来ると考えていいのですか?
あと、敵の前に立ったら敵がこっちに接近してくるというプログラムは、矩形を使って作成していけばいいんでしょうか??
ゲームを作るのは初めてで、どこから手をつけていけばいいのかも分かりません。よかったらその点もお答えいただければ幸いです。
駄文で申し訳ありません。
返答お待ちしております。


88ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(364,344ポイント)   Date: 2007/06/07(木) 02:30   No:8373     
Title: Re:学校で・・・    
おぉ、ボンバーマンですか!
先日作りました^^
よければこちらの記事読んでみてください。
http://www.play21.jp/board/formz.cgi?action=res&resno=5924&page=&lognum=20&id=dixq&rln=6283&vino=28

どこまでリアルに作るかですが、厳密に作ろうと思うと結構難しいですよ。
ボンバーマンって1区間ごとにあるくわけじゃないですよね。
ちびちび歩くわけですから、単純に配列にいけない区間を用意したからそれで制御できるというものでもないです。
また、Y方向にぴったり一致した時のみ上に進めるようにプログラムしたのですは、操作性が悪くてしかたありません。
ですから、若干曲線を描いて進路を修正するようなプログラムも必要です。
歩行について何を言ってるのかわからなければ、上記URLからソフトをダウンロードして一回やってみてください。
その意味が解ると思います。

しかし、「もどき」でよく、リアルさも求めないのなら、「ゲームプログラミングの館」で紹介している「いけない区間を作る」で可能だと思います。

何度も言いますけど、どこまで作るかですよね。
厳密に作るにはかなり時間も必要ですし、困難な場面もあります。もし厳密に作るのなら「最初からどうすればいいかわからない・・」とう状況では完成は難しいかもしれません。
作りこみたければ、「ゲームプログラミング」について学んでみてください。
うちのHPはどこまで参考になるかわかりませんけど、参考になりそうな項目があればのぞいてみてください。
http://dixq.net/g/

いきなりボンバーマンを作るのは難しいと思うので、簡単なサウンドノベルゲームやRPGなどをいくつか作ってみて感覚を掴んでみる事も大事だと思います。
私にゲームプログラミングの力があるわけではないので、どこまで力になれるかわかりませんが、素人の趣味で得た知識無いでよければ力になりますからまた何かあればお聞き下さい。


423ポイント を手に入れた。

Name: しゃか  ..ぴよぴよ(290ポイント)   Date: 2007/06/07(木) 22:13   No:8414     
Title: Re:学校で・・・    
早速質問に答えてくれてありがとうございます!!
返信に書いていただいた「若干曲線を描いて進路を修正するようなプログラム」とはいったいどんな感じのプログラムなのでしょうか???
ちなみに今作っているのは、ボンバーマンの、武器が刀になったバージョンとでもいいましょうか。背後から攻撃しないと敵が倒せないというようなものです。
多分ちょくちょく顔を出させていただくと思いますのでよろしくお願いします。


202ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,930ポイント)   Date: 2007/06/08(金) 01:16   No:8424     
Title: Re:学校で・・・    
口では説明しきれないので、一度ゲームやってもらった方がわかりやすいですと、書いた通り実際に遊んでもらったほうがわかりやすいです。
たとえばx%32==0となる鉛直線を移動させようとしたとき、座標がこの点に達した時のみ上下に移動できたのでは、操作しにくくてしかたないのです。
本物のボンバーマンもそうですが、少々座標が違っても移動中に修正しなければならないのです。
やはりやってみないと何を言ってるのかわからないでしょう。
ボンバーマンをちびちび上下左右に動かしてみてください。その動きを良く見たら意味がわかるでしょう。
ライブラリは何をお使いですか?
DirectX? DXlib? それとも専門学校などの独自のライブラリでしょうか。

ゲームを作った事がなければ、いきなり難しいプログラムに取り組むと、途中でコードがぐちゃぐちゃになってしまったりする危険性があるので、小さい簡単なゲームを一つ作ってみてはいかがでしょうか。

使い物になりそうな関数を汎用的にして、引き続き使用できるようにすれば、次に作るゲームにもいかせるでしょう。


2倍のポイントを手に入れた! 254ポイント を手に入れた。

Name: shaka   Date: 2007/06/21(木) 16:12   No:83701182409970     
Title: Re:学校で・・・    
お久しぶりです!!
ボンバーマンをダウンロードさせていただいたのですが言っている意味が分かりました!!
あの動きは、壁に当たったら上下左右がいける場所かを判断して、OKなら座標を足したり引いたりする処理を書くという感じでしょうか???
あともうひとつ質問なんですが敵の動きが上手くいきません><
壁やオブジェクトに当たったら向きを乱数で変えて動いて行くプログラムを書きたいのですが、何度やっても敵が壁にめり込んだりしてしまいます。

ちなみにソースがこれです。
//敵の移動
void move_teki()
{
if((en.x%32)==0 && (en.y%32)==0 )
{
en.muki = rand()%4;
teki_move_flg = 1;
}

}
void move_teki_a()
{
if(teki_move_flg == 1)
{
if(en.muki==0) //右向きならx座標を増やす
{
en.x = en.x+en.espeed;
}

else if(en.muki==1) //左向きならx座標を減らす
{
en.x = en.x+en.espeed;
}
else if(en.muki==2)//上
{
en.y = en.y-en.espeed;
}
else if(en.muki==3)//下
{
en.y = en.y+en.espeed;
}
if(can_cannot(en.x,en.y,en.muki,hantei)==1)
{
teki_move_flg = 0;

}
}
}

ちなみにライブラリは学校独自のライブラリを使っています。
よろしくお願いします。




Name: ほけほけ  ..ぴよぴよ(52ポイント)   Date: 2007/06/06(水) 22:28   No:8360       
Title: C初心者です。    

たとえば、点数をscanfで入力するプログラムで、
その値を黒画面上に棒グラフっぽく表す方法があれば教えて下さい。

あと、連続で文字を表示する場合、
例えば、**************と黒画面上に出したい場合、

<定義略>
printf(%14c,'*')

なんて書き方ありますかね?

超初心者です、
もしよければどなたか教えてください。


52ポイント を手に入れた。


Name: 卓也 [URL]  ..ぴよぴよ(349ポイント)   Date: 2007/06/06(水) 22:33   No:8361     
Title: Re:C初心者です。    
ただ単にprintf("**************");
と、表記して下さればできますよ


18ポイント を手に入れた。

Name: box  ..比類無きプログラマー(70,234ポイント)   Date: 2007/06/06(水) 22:34   No:8362     
Title: Re:C初心者です。    
> printf(%14c,'*')
>
> なんて書き方ありますかね?

私だったら、まずサンプルコードを書いて試してみます。
そうしてみる予定や余裕はありますか?


42ポイント を手に入れた。

Name: ほけほけ  ..ぴよぴよ(100ポイント)   Date: 2007/06/06(水) 22:57   No:8363     
Title: Re:C初心者です。    

> ただ単にprintf("**************");
> と、表記して下さればできますよ

ぴよぴよさん
ありがとうございます。
ただ、レイアウトを考えて、黒画面に表示する場合、マスの数指定で表記はできないのかと思ったんです。
その場合、やはりループ処理で表記するしかないんですかね?


48ポイント を手に入れた。

Name: ほけほけ  ..ぴよぴよ(134ポイント)   Date: 2007/06/06(水) 22:58   No:8364     
Title: Re:C初心者です。    
> > printf(%14c,'*')
> >
> > なんて書き方ありますかね?
>
> 私だったら、まずサンプルコードを書いて試してみます。
> そうしてみる予定や余裕はありますか?

boxさん、ありがとうございます。
いまコンパイルができない状態にありまして、すいません。
明日試してみます。


34ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(364,878ポイント)   Date: 2007/06/07(木) 02:46   No:8377     
Title: Re:C初心者です。    

どうしてもループを使いたくないのなら、
文字列にそれぞれのスターを要素数に対応して格納しておけばどうでしょうか。

char st[10][10]={
{""},
{"*"},
{"**"},
{"***"},
{"****"},
{"*****"},
{"******"},
{"*******"},
{"********"},
{"*********"}
};

このように入れておいて、scanfで取り込んだ値を要素番号として表示すればその数だけスターが表示されます。
コレくらいしか方法は思いつきません・・。
forを使ったほうが早いかと思います。
 


214ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,239ポイント)   Date: 2007/06/07(木) 03:08   No:8380     
Title: Re:C初心者です。    
サンプルです。エラー処理していません。


#include <stdio.h>

void main(){
int n;
char st[11][11]={
{""},
{"*"},
{"**"},
{"***"},
{"****"},
{"*****"},
{"******"},
{"*******"},
{"********"},
{"*********"},
{"**********"},
};
printf("0~10の数字を入力してください\n");
scanf("%d",&n);
printf("%s",st[n]);
}

実行結果

0~10の数字を入力してください
10
**********

 


170ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,271ポイント)   Date: 2007/06/07(木) 03:16   No:8381     
Title: Re:C初心者です。    
それから卓也さん、何度も申し上げていますが、お伝えしたい事があるので、私までメールを下さい。

32ポイント を手に入れた。

Name: フリオ  ..初心者(8,518ポイント)   Date: 2007/06/07(木) 04:31   No:8382     
Title: Re:C初心者です。    
 
 こんな方法もあります。


#include <stdio.h>

int main(void)
{
int n;
char *marks = "********************";

puts(marks);
n = 14;
printf("%.*s", n, marks);
return 0;
}

 


117ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(365,278ポイント)   Date: 2007/06/07(木) 12:34   No:8395     
Title: Re:C初心者です。    
あ、その手がありますね。

質問者さん、フォーマット文字列のフォーマットについてこちら参考になります。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html


7ポイント を手に入れた。



Name: sub  ..初心者(6,314ポイント)   Date: 2007/06/07(木) 00:41   No:8368       
Title: 今回もよろしくお願いします    
今回も学校の課題なのですが、よろしくお願いします。

成績データの件数に上限を設けることなく、また、扱うデータ件数の増減に柔軟に対応できるよう、一方向の連結リストを用いて成績データを記憶するようにしろ、ということみたいです。

一応エラーはすべて消せたのですが、連結リストとかポインタすらあまりわかっていないのでかなり厳しく、たいへん見にくいしいろいろ間違ってると思います。

それに前の課題ではできていたはずなのに、書き換えてみると
ファイルが開けません
になってしまうのです。

実行結果は下です

CMD>r data1.txt
file open error.



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

typedef struct score Score;

struct score{
char name[40];
int eng ,mat, sci;
Score *next;
};

Score *p, *head, **last;

int main (void){

char cmd[256], fname[20], rank, str[256];
char f_inp[256];
FILE *fp;


while (rank!='q'){
printf("CMD>");
fflush(stdout);
fgets(cmd, 20, stdin);
sscanf(cmd, "%c %s", &rank, fname);


switch(rank){


case 'r':
if((fp = fopen(str, "r")) == NULL){
printf("file open error.\n");
return(1);
}
last = &head;
while(fgets(f_inp, 256 ,fp) != NULL){
p=(Score*)malloc(sizeof(Score));
sscanf(f_inp, "%s %d %d %d", p->name, &p->eng, &p->mat, &p->sci);
*last = p;
last = &(p->next);
*last = NULL;
}
fclose(fp);

break;

case 'd':

p = head;
printf("name/eng/math/sci\n");
while(p != NULL){
printf("%s %d %d %d\n", p->name, p->eng, p->mat, p->sci);
p = p->next;
}
break;


case 'q':
fclose(fp);
printf("File close!\n");
break;


default:
printf("コマンドを正しく入力してください\n");
}
}
return (0);
}



読みこむファイルは下のような感じです
b 10 10 10
d 20 20 20
c 30 30 30
a 40 40 40
e 50 50 50

どこがどう間違っているのか教えていただけないでしょうか?
お願いします。


742ポイント を手に入れた。


Name: Justy  ..ハッカー(112,902ポイント)   Date: 2007/06/07(木) 01:48   No:8369     
Title: Re:今回もよろしくお願いします    
>書き換えてみると ファイルが開けません
 そりゃぁ、fname変数にファイル名が入ってるのに開こうとしているのが str変数じゃぁ・・・・。


 あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、読み出そうとしている
ものがいくつかあるようです。


137ポイント を手に入れた。

Name: sub  ..初心者(6,414ポイント)   Date: 2007/06/07(木) 02:19   No:8371     
Title: Re:今回もよろしくお願いします    
うぁ、こんなところをミスするなんて・・・

ありがとうございます!


>あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、読み出そうとしている
ものがいくつかあるようです。

これはどういうことなのでしょうか?


100ポイント を手に入れた。

Name: フリオ  ..初心者(8,401ポイント)   Date: 2007/06/07(木) 02:28   No:8372     
Title: Re:今回もよろしくお願いします    
 
 それから、"fopen"と、"fclose"の数が合ってないのでは?
 


11ポイント を手に入れた。

Name: sub  ..初心者(6,455ポイント)   Date: 2007/06/07(木) 08:13   No:8386 解決!     
Title: Re:今回もよろしくお願いします    
ぁぁ、ほんとだ・・・

'r'のときのfcloseが多かったです、ありがとうございます!


41ポイント を手に入れた。

Name: Justy  ..ハッカー(113,249ポイント)   Date: 2007/06/07(木) 10:03   No:8391     
Title: Re:今回もよろしくお願いします    
>>あと直接的には関係ないですが、変数に値を初期化 or 代入する前に、
>>み出そうとしている ものがいくつかあるようです。
>これはどういうことなのでしょうか?

 rank変数が、未初期化のまま rank!='q'と比較しようとしているところです。
 このときの rank値は不定なので、たまたま 'q'が入っていたりすると、
一度も while()内を実行することなく、終わってしまうかもしれません。
(fpも いきなり'q'を実行すると未初期化のまま、fcloseを実行していました)


214ポイント を手に入れた。



Name: yy  ..ぴよぴよ(105ポイント)   Date: 2007/06/03(日) 16:47   No:8259       
Title: include fileを開けません。について    
 どうも、始めて利用させていただきます。プログラミング初心者のYYです。
 DxLibを解凍してウィンドウを表示するプログラムをコピー&ペーストして実行したのですが、

エラー 1 fatal error C1083: include ファイルを開けません。'DxDirectX.h': No such file or directory c:\documents and settings\○○○\my documents\visual studio 2005\projects\プロジェクト\dxlib.h 53

 とでてきてプログラムを実行できません。使用している環境はVisualStudio2005アカデミックエディションです
 何故include ファイルを開けません、と言うエラーが出てくるのでしょうか?
よろしくお願いします。


105ポイント を手に入れた。


Name: box  ..比類無きプログラマー(69,834ポイント)   Date: 2007/06/03(日) 17:58   No:8261     
Title: Re:include fileを開けません。について    
とりあえず、半角英数字だけから成るフォルダに
環境を作った方がいいのではないかと思います。

今回の「プロジェクト」のように、フォルダ名にいわゆる
全角文字を含んでいると、何かと不都合が起きることがあります。


105ポイント を手に入れた。

Name: YY  ..ぴよぴよ(78ポイント)   Date: 2007/06/06(水) 18:50   No:8352     
Title: Re:include fileを開けません。について    
 ご返答感謝します。
 まったくもって、馬鹿な間違いでした。
 DxLib.slnを開いた後で、プロジェクトを新しく作っていました。
 とりあえずこれで実行できたのですが、
 
 私はユーザー名まで全角でした

 やはり半角文字にした方が良いんでしょうか。