反復構造

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
とも

反復構造

#1

投稿記事 by とも » 10年前

2進数表現の10桁の数字入力
最後どのビットが何回入力されたのか出力
終了は先頭に'E'または入力回数が9回以上

というプログラムで、ざっくりとしたプログラムのイメージ段階です。

コード:

#include <stdio.h>
int main (void)
{
        int data[11];
        int sum;

        sum = 0;    //初期化
 
        while(1){
                printf("データ:");
                scanf("%d",&data);
                
                if ( Eが入力された || 入力回数が9回以上 ){
                        どのビットが何回入力されたか計算
                        結果
                }
        }
}
二次元配列やポインタを使うのでしょうか?
while文ではなく、for文を使い二重ループにするのでしょうか?
現段階で色々試行錯誤しております。
何かアドバイス頂けたら、、と思います。
宜しくお願い致します。

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: 反復構造

#2

投稿記事 by ookami » 10年前

入力方法がよく分かりません。
何を入力して何をカウントするのでしょうか?
Eが入力された場合以外の例を書いてもらうといいのかなと。

あと、同じ内容のスレがもうひとつ立っているようなので、そちらは解決にしてもらった方がよいかと。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 反復構造

#3

投稿記事 by みけCAT » 10年前

とも さんが書きました:2進数表現の10桁の数字入力
数値ではなく、文字列として(scanf系なら%s)入力するといいでしょう。
とも さんが書きました:最後どのビットが何回入力されたのか出力
この仕様の意味が良くわからないです。
とも さんが書きました:二次元配列やポインタを使うのでしょうか?
やりたいことにもよりますが、最後にまとめて計算するのではなく、1回読み取ったらすぐに処理をするようにすれば、どちらも入出力以外で使用する必要はないと思います。
とも さんが書きました:while文ではなく、for文を使い二重ループにするのでしょうか?
その方がわかりやすいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

とも

Re: 反復構造

#4

投稿記事 by とも » 10年前

データ: 0101000101
データ: 0101100010
データ: 0111100101
データ: S

結果 = 0313200212

となるように表示したいです。
またエラー処理ですが、0と1以外を入力するとエラーになるようにしたいです。
言葉不足で申し訳ございません。
以下、作成したプログラムです。

コード:

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

int main()
{
	char data[9][17];	// 入力時の配列
	int data2[16] = {0};// 結果時の配列,初期化
	int i,j;			
	//int sum;			// 合計結果
	//int n;

	for (i=0;i<9;i++){
		printf("データ:");
		scanf("%s",&data[i]);

		if(data[i][0] == 'S'){	// 先頭に"S"があった時
			break;
			
			if (data[9][17] == ('1' ||'0')){
				for(j=0;j<16;j++){

				}
			}
			else{
				printf("error");
			}
		}

	}

	//n = atoi(j);
	for (j=0;j<9;j++){		// ビット回数計算
		for (i=0;i<16;i++){
			if(data[j][i] == '1'){
				data2[i]++;
			}
			//sum += data2[j];
		}
	}
	printf("結果 =%d\n",data2[i]);
	
}
エラー処理と最後の計算が出来てません。

とも

Re: 反復構造

#5

投稿記事 by とも » 10年前

18行目に以下の文が抜けてました。
for(j=0;j<16;j++){

}

重複投稿のご指摘ありがとうございました。

とも

Re: 反復構造

#6

投稿記事 by とも » 10年前

上記抜けてなかったです。
まぎらわしくてすみません

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 反復構造

#7

投稿記事 by usao » 10年前

配列サイズの根拠などがはっきりしませんね.([17]とか[16]とかいう.)

各回で入力された内容を覚えておく必要が無いのであれば,
入力用のバッファは各回で使いまわせば良いように思います.

コード:

int main()
{
    char InputBuffer[11];   //入力用バッファ : (10桁+終端文字'\0')分で[11]とかで良い?
    int Counter[10] = { 0 };    //各ビットが何回'1'とされたのかを数えるカウンタ.全て0で初期化.
    
    int iInput; //入力回数用
    int iBit;   //ビット位置用

    //最大9回の入力処理ループ
    for( iInput=0; iInput<9; iInput++ )
    {
        //(1)入力
        //InputBuffer[]に入力させる.
        scanf( "%s", InputBuffer ); //※仮.(こんなんだと100文字とか入力されたらどうなるの?とかあるけど.)
        
        //(2)終了判定
        //入力が正規の終了判定(先頭が'E'とかいう条件)を満たしていたらループを抜ける
        if( 終了判定満たす )
        {   break;  }
        
        //(3)エラー判定
        //InputBufferに,正規の入力('0'と'1'だけで構成された10文字な文字列である)がされたかどうかを判定.
        //エラーの場合は……どうするのでしょう?
        if( エラー )
        {
            //※エラーの時はどうする???
            return 0;
        }
        
        //(4)カウント
        //入力された文字列のうち,'1'だった箇所について,カウンタを加算する.
        for( iBit=0; iBit<10; iBit++ )
        {
            if( InputBuffer[iBit] == '1' )
            {   ++Counter[iBit];    }
        }
    }
    
    //結果表示
    //ここに来たとき,Counter[]には各ビット位置の結果回数が記録されているから,単にそれを並べて表示する
    printf( "結果 = " );
    for( iBit=0; iBit<10; iBit++ )
    {   printf( "%d", Counter[iBit];    }
    printf( "\n" );
    
    //
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る