一定の周期で111100001111000

[戻る]
わいわい 2002/10/25(金) 17:30:35
質問させていただきます。
ある一定の周期で
(入力)1111000011110000・・・と入力されています。これを
(出力)1000000010000000という風に1がくれば1が来て、これ以降1がきても0を出力します。
また0がきたときも0を出力し、また1がくれば1を出力すると言った感じです。
このようなプログラムができないでしょうか?選択処理・反復処理・配列・関数でなんとか作
れないものでしょうか?お願いいたします。

wood 2002/10/25(金) 17:38:57
>選択処理・反復処理・配列・関数でなんとか作
>れないものでしょうか?お願いいたします。

まずは自分で作ってみてから、動かないとか、
コンパイルエラー出るとか
そうなってから質問しても遅くないんじゃないですかね


おもいっきり 学校の宿題みたいですけど

tib 2002/10/25(金) 17:39:45
要するに、直前の入力を覚えておいて、
・直前の入力が0,現在の入力が1→1を出力、
・それ以外なら0を出力
とすればいいだけですね。

あれ? 2002/10/25(金) 17:42:26
>お願いいたします。

質問じゃなくて作ってくださいって事かな?
そうならそうといってくれれば作りますけど?

PATIO 2002/10/25(金) 18:00:42
なんか学校の宿題を変わりにやってくれといわれているみたいでかなりいやな感じですが、
せめて自分の努力の後ぐらいは見せるべきでは?
丸々人から教えてもらって果たして自分の身になるかどうか。
自分で勉強する気が無いなら、学校に行っても意味が無いような気がします。

わいわい 2002/10/25(金) 18:10:36
if(入力==1&&値==0)
{
出力=1;
値=1;
}
else if(入力==0&&値==1)
{
出力=0;
値=0;
}
これでは、00000000000000000になります。
出力を1を出した時点で、値を決めてしまうとすぐにelse ifにいってしまいます。
出力と値の間に何か時間稼ぎができるようなものがないでしょうか?
for()を使ってもだめでした。

wood 2002/10/25(金) 19:24:43
INT 値;
値=0;
データ入力 

FOR (;EOF;) 
{
IF(入力 == 1 && 値==0){
   出力=1
   値=1
}   
ELSE {
      IF(入力 == 0){
        値=0
        出力=0
      }
      ELSE { 出力=0}

}
データ入力 
}
こんな感じですかね

tib 2002/10/25(金) 22:16:34
「選択処理・反復処理・配列・関数でなんとか」というのはこういうことかな?

結局のところ命題は、「1文字の入力に対し一定のルールで1文字出力する」です。まずは
この「一定のルール」を明確にしましょう。

入力は「0もしくは1」以外ないことが保証されている、ならば、
状態A:直前の入力が「0」だった場合
 入力が「0」→「0」を出力
 入力が「1」→「1」を出力
状態B:直前の入力が「1」だった場合
 入力が「0」→「0」を出力
 入力が「1」→「0」を出力
という風にルール付けすることができます。このルールを一つの表で表すと、

状態 入力 出力 新状態
A  0  0  A
A  1  1  B
B  0  0  A
B  1  0  B

という風に書くことができます。例えば2行目は「状態がAで、入力が1だったら、1を出力
して状態Bに移行する」という感じで読めると思います。初期状態はAです。これがルール
の定義です。この表は「状態・入力・出力・新状態からなる構造体の『配列』」として表
現することができますね?

上記のルールに沿って入力に応じた出力を返す、という一連の処理は1つの「関数」にま
とめることができます。状態をその関数の中で覚えさせておき(初期状態はAでしたね?)、
関数に与えられた入力と突き合わせて上記ルールのどのパターンが適用できるのか、の
「選択処理」を作ります。選択ができてしまえば出力も決まりますし、その関数の中で状
態をどう更新すればいいのかも解ろうという物です。

1つの入力に対して1つの出力を得る、という命題はこれでクリアできました。後は複数の
入力に対して順次同じルールを適用していくだけです。全ての入力に対して先程の「関
数」を呼ぶ、という「反復処理」を行えばいいのです。

わいわい 2002/10/27(日) 01:05:17
みなさん、いろいろとアドバイスありがとうございます。
tibさんからの考え方からここまでできました。

int zyoutai,n,s;    
    for(;;){
        scanf("%d",&n);    
        //状態A//
    if(zyoutai==1)
    {
        if(n==0)
        {
            s=0;
            zyoutai=1;
        }
        else if(n==1)
        {
            s=1;
            zyoutai=0;
        }

    }
    //状態B//
    if(zyoutai==0)
    {
        if(n==0)
        {
            s=0;
            zyoutai=1;
        }
        else if(n==1)
        {
            s=0;
            zyoutai=0;
        }
    }
    else
    {
       zyoutai=1;
    }
printf("出力=%d",s);
}

しかし状態Aで入力を1としても出力が0とでてしまうことです。
これはzyoutai=0;が関係しているのでしょうか?
そこだけがどうしても、わかりません。何か良い方法はないのでしょうか?

tib 2002/10/27(日) 19:59:40
if文が2つ存在している理由を説明してください。

アイススケーター 2002/10/27(日) 20:26:22
tibさんへ

>if文が2つ存在している理由を説明してください。

これは、最初のifでzyoutaiが0になったら、次のifで再度処理をしてしまう
バグです。

たぶん、わいわいさんは、ここまで書いてあげないと解ってないと思いますよ。

wood 2002/10/28(月) 21:26:16
tibさんの文章をそのままコーディングしちゃったんじゃないの
>状態A:直前の入力が「0」だった場合
> 入力が「0」→「0」を出力
> 入力が「1」→「1」を出力
>状態B:直前の入力が「1」だった場合
> 入力が「0」→「0」を出力
> 入力が「1」→「0」を出力
この部分だけ分けてコーディングすると「IF」 2つになるんではないですか

つまり「状態」の意味がわかっていないのではないでしょうか?

tib 2002/10/30(水) 13:38:22
>tibさんの文章をそのままコーディングしちゃったんじゃないの
...私の言葉が足りませんでしたか。私はあれだけ書いていれば
    typedef enum
    {
        STATE_A,
        STATE_B,
        STATE_X
    }   State_t;

    typedef struct
    {
        State_t eState;
        char    cInput;
        char    cOutput;
        State_t eNewState;
    }   StatusShift_t;

    StatusShift_t   aStatusShiftTable[] =   
    {   //  eState      cInput  cOutput eNewState
        {   STATE_A,    '0',    '0',    STATE_A },
        {   STATE_A,    '1',    '1',    STATE_B },
        {   STATE_B,    '0',    '0',    STATE_A },
        {   STATE_B,    '1',    '0',    STATE_B },
        {   STATE_X,    '\0',   '\0',   STATE_X }
    };
こんなコードが頭に浮かぶだろう、と期待していたのですが...。まぁそれはともかく、
当の質問者の方のレスがちっともありませんが、アイススケーターさんのレスで解決した
のでしょうか。もしくは宿題の期限がきてこの問題には興味が無くなってしまったので
しょうか。いずれにせよ問題が解決したのならちゃんとチェックをいれてほしいものです。

古いスレッドには追加発言できません。