一定の周期で111100001111000 – プログラミング – Home

一定の周期で1111000011110...
 
通知
すべてクリア

一定の周期で111100001111000


わいわい
 わいわい
(@わいわい)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

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


引用解決済
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

>選択処理・反復処理・配列・関数でなんとか作
>れないものでしょうか?お願いいたします。

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

要するに、直前の入力を覚えておいて、
・直前の入力が0,現在の入力が1→1を出力、
・それ以外なら0を出力
とすればいいだけですね。


返信引用
あれ?
 あれ?
(@あれ?)
ゲスト
結合: 23年前
投稿: 1
 

>お願いいたします。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 5年前
投稿: 2660
 

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


返信引用
わいわい
 わいわい
(@わいわい)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

INT 値;
値=0;
データ入力

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

「選択処理・反復処理・配列・関数でなんとか」というのはこういうことかな?

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


返信引用
わいわい
 わいわい
(@わいわい)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

みなさん、いろいろとアドバイスありがとうございます。
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
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 24年前
投稿: 280
 

tibさんへ

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

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

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 24年前
投稿: 468
 

>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 }
};
こんなコードが頭に浮かぶだろう、と期待していたのですが...。まぁそれはともかく、
当の質問者の方のレスがちっともありませんが、アイススケーターさんのレスで解決した
のでしょうか。もしくは宿題の期限がきてこの問題には興味が無くなってしまったので
しょうか。いずれにせよ問題が解決したのならちゃんとチェックをいれてほしいものです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました