07/11/15 18:56:30
>>550
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int get_value(void){
char buf[4+1+1]; // 4文字オーバーチェック + 終端 \0
int i, value=0, buflen;
fgets(buf, sizeof(buf), stdin);
buflen=strlen(buf);
if(buf[buflen-1]=='\n') buf[--buflen]='\0';
if(buflen<=0){ puts("入力されていません"); return -1; }
if(buflen>4){ puts("4文字以内で入力してください"); return -1; }
for(i=0;buf[i];i++){
if(!isdigit(buf[i])){ puts("半角数字以外入力できません"); return -1; }
value=value*10+buf[i]-'0';
}
if(value==0) puts("0は入力できません");
return value;
}
int main(void){
int value;
value=get_value();
if(value>0) printf("\n%d\n", value);
return 0;
}
553:デフォルトの名無しさん
07/11/15 19:41:05
[1] 授業単元:プログラミング実習
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
サンプルプログラムは、窓口が1個で,行列が窓口の前にできる場合に,時間と共に窓口の前にできる行列の様子を調べるものである.
(1)サンプルプログラム内の乱数処理を srand関数とrand関数を使用するように書き換えなさい。
(2)参考プログラムを元に,パラメータs, q, aを構造体のメンバ として扱うプログラムBに変更しなさい.
(3)作成したプログラムを変更し,窓口が2個の場合にも(すなわち1個または2個の場合に)対応できるようにしなさい。
このとき,窓口の個数(1または2)もパラメータLやM, シミュレーション時間と同様に入力して指定できるようにしなさい.
なお,新しく到着した客は,最も短い行列(待っている人が少ない窓口)に並ぶものとする.
全ての窓口の行列が同じ長さの場合には,一様な確率 (窓口が2個の場合は1/2の確率)で並ぶ窓口を決定するものとする.
(4)窓口が3個以上にも対応できるようにしなさい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: bcc32
[3.3] 言語: C
[4] 期限: 明日までです…
[5] その他の制限: 特に無いと思います
554:デフォルトの名無しさん
07/11/15 20:10:23
>>547
実際はね、重きじゃなくて入力データなんです。
入力データ(配列でいうとdata[50][5])が移動間を動く感じなんですけど
各状態にデータがあって、その入力データを各状態のデータによって
計算して出された値を各移動確率とかけるというわけなんですけど。
で書いてくださったプログラムにおいて、
for(cnt=0;cnt<50;cnt++){それを50回
for(i=0;i<7;i++)cal_next_gs(list[i]);は7つの状態間で1回の移動につき確率計算
}
ってのはわかるんです。1次元配列として引数として渡せば
できるのかなーと今思いました。
for(cnt=0;cnt<50;cnt++){それを50回
for(i=0;i<7;i++)cal_next_gs(list[i],data[cnt]);は7つの状態間で1回の移動につき確率計算
}
void cal_next_gs(struct gstate *gs,float data[5])
{
//計算して移動確率を計算
}
でいけそうな感じがします。
555:デフォルトの名無しさん
07/11/15 21:27:17
>>527
ありがとうございました。
556:デフォルトの名無しさん
07/11/15 21:38:48
>>554
何をいいたいのか、いまいち分からないんだが、
どんな入力に対してどんな出力が欲しいの?
電気回路上の電流のシミュレーション?
557:デフォルトの名無しさん
07/11/15 21:58:18
入力に対して隠れマルコフモデル(HMM)を使って確率を出すんですけど、
この例では3状態のHMMと2状態のHMMを使って最終的にendにたどりつくとこの
状態の確率が出力値となるんです。
で1つの移動に対して入力1フレームを正規分布によって評価し確率を出す。
その正規分布をHMMで評価するんです。
そのHMMには平均分散、移動確率とあるんですけど、
平均分散を正規分布で用いて確率をだして、移動確率をかけて
最終的な移動の確率となるんです。
前につくってもらったのが移動確率でのみの計算でした
558:デフォルトの名無しさん
07/11/15 22:01:52
神経衰弱を行うゲームを作成すること。
ただし、カードは52枚全て使用し、絵柄の
区別は無いものとする。
このプログラムをお願いします。(^_^)
559:デフォルトの名無しさん
07/11/15 22:02:55
すみません、どなたか>>489をお願いします。
自分でもあつかましいと承知しているのですが、
どうにも分からないので・・・。
コンパイラ名はVS2005のようです。
よろしくお願いします。
560:デフォルトの名無しさん
07/11/15 22:12:59
557ですけど
頼んだのは移動してくる確率が2つだったらグリッドで計算できたんですけど
3つの場合どうすればいいのかわからなくて。
しかも下のやつも計算しなくてはならなくて。
なので質問させていただきました
561:デフォルトの名無しさん
07/11/15 22:30:13
>>543
>この(startから状態1への移動確率)X(重き)と
>(状態1の状態確率)X(状態1から状態1への移動確率)X(重き)と、(状態11の状態確率)X(状態11
>から状態1への移動確率)X(重き)の和が状態1の状態確率となります。
状態1ってループしてるけど単純にこれでいいの?
(状態1の状態確率)X(状態1から状態1への移動確率)X(状態1から状態1への移動確率)X(重き)
...
とかは考えなくてもよし?
562:デフォルトの名無しさん
07/11/15 22:36:35
>>543
>>246 の問題だと矢印にくっつく数値(状態遷移確率)が固定だったのを
時間(移動回数)によって矢印にくっつく数値(状態遷移確率)を変化させたいと言う事でいい?
563:デフォルトの名無しさん
07/11/15 22:40:42
>>561
考えなくていいです。
>>562
そうです。
実際は入力に対して各HMMの1つの状態の平均分散から
正規分布により出力確率を出してそのHMMから移動確率を出して
確率X移動確率なんですけど
簡単のために、出力確率を重きとしてるわけです。
564:デフォルトの名無しさん
07/11/15 22:43:05
移動確率を出す関数だけ。
enum states { START, FIRST, SECON, THIRD, TENTH, ELEVE, E_N_D };
enum states movProbMap( enum states from, enum states to )
{
return from == START ? (to == FIRST ? 0.5 : to == TENTH ? 0.5 : 0.0) :
from == FIRST ? (to == FIRST ? 0.6 : to == SECON ? 0.3 : to == ELEVE ? 0.1 : 0.0) :
from == SECON ? (to == SECON ? 0.7 : to == THIRD ? 0.3 : 0.0) :
from == THIRD ? (to == THIRD ? 0.8 : to == E_N_D ? 0.2 : 0.0) :
from == TENTH ? (to == TENTH ? 0.6 : to == ELEVE ? 0.4 : 0.0) :
from == ELEVE ? (to == ELEVE ? 0.7 : to == FIRST ? 0.2 : to == E_N_D ? 0.1 : 0.0) :
0.0;
}
565:デフォルトの名無しさん
07/11/15 22:44:10
激しく無意味だな。スマン無視してくれ。
566:デフォルトの名無しさん
07/11/15 22:47:07
>>564
これは一体何でしょう?
実数を返したいんじゃないの???
567:デフォルトの名無しさん
07/11/15 22:55:57
enum states -> double
で。
568:デフォルトの名無しさん
07/11/15 23:10:49
>>543
使い方は data.txt をリダイレクトするだけ
lzh 内のファイル名間違えたけど気にしない
ans478 < data.txt
URLリンク(kansai2channeler.hp.infoseek.co.jp)
569:デフォルトの名無しさん
07/11/15 23:32:51
>>568
ありがたいんですけど
これちょっと使いかたわからなくて。
gcc ans478.cして実行のときになにか入力しないといけないんですか?
570:デフォルトの名無しさん
07/11/15 23:35:27
本来なら
ans478
と打って実行するところを
ans478 < data.txt
のようにしてdata.txtを標準入力にリダイレクト
571:デフォルトの名無しさん
07/11/15 23:36:42
>>489
#include<stdio.h>
int main(void){
int i, num, max=0;
for(i=20071114;i<=20071114+6-1;i++){
scanf("%d", &num);
if(num>max) max=num;
}
printf("%d\n", max);
return 0;
}
572:デフォルトの名無しさん
07/11/15 23:39:49
>>570
できました。。。
さっきできなかったのに。
ありがとうございます。
自分で作りなおしてから
できなかったらこれも試してみます