ページ 1 / 1
反復構造
Posted: 2014年10月09日(木) 03:54
by とも
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文を使い二重ループにするのでしょうか?
現段階で色々試行錯誤しております。
何かアドバイス頂けたら、、と思います。
宜しくお願い致します。
Re: 反復構造
Posted: 2014年10月09日(木) 08:50
by ookami
入力方法がよく分かりません。
何を入力して何をカウントするのでしょうか?
Eが入力された場合以外の例を書いてもらうといいのかなと。
あと、同じ内容のスレがもうひとつ立っているようなので、そちらは解決にしてもらった方がよいかと。
Re: 反復構造
Posted: 2014年10月09日(木) 08:58
by みけCAT
とも さんが書きました:2進数表現の10桁の数字入力
数値ではなく、文字列として(scanf系なら%s)入力するといいでしょう。
とも さんが書きました:最後どのビットが何回入力されたのか出力
この仕様の意味が良くわからないです。
とも さんが書きました:二次元配列やポインタを使うのでしょうか?
やりたいことにもよりますが、最後にまとめて計算するのではなく、1回読み取ったらすぐに処理をするようにすれば、どちらも入出力以外で使用する必要はないと思います。
とも さんが書きました:while文ではなく、for文を使い二重ループにするのでしょうか?
その方がわかりやすいと思います。
Re: 反復構造
Posted: 2014年10月09日(木) 17:11
by とも
データ: 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: 反復構造
Posted: 2014年10月09日(木) 17:15
by とも
18行目に以下の文が抜けてました。
for(j=0;j<16;j++){
}
重複投稿のご指摘ありがとうございました。
Re: 反復構造
Posted: 2014年10月09日(木) 17:33
by とも
上記抜けてなかったです。
まぎらわしくてすみません
Re: 反復構造
Posted: 2014年10月09日(木) 17:58
by usao
配列サイズの根拠などがはっきりしませんね.([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;
}