スケーリング
スケーリング
11個の非負の整数を入力として受け付ける。
これは,0点から10点までの人数だと考える。
このデータを利用して,*を使用したヒストグラムを出力したい。
人数が大きい場合には,*が画面を折り返してしまい,見にくくなってしまう。
そこで,次のようにスケーリング(縮小)を行いたい。
 *の数の最大を40 としたい。
 全データの最大値が,*の数を40個として表すことにする。
 例えば,最大値が80 だとして,それを40個とすることは50%に縮小することになる。
他のデータも同じように縮小する。
人数が20の場合は,*が10個になる。
また人数が25 の場合は,その半分が12.5なるが,小数点以下を四捨五入して*を13個とする。
 なお最大値が40以下の場合は,拡大も縮小も行わない。
出力形式は,最初の2桁が点数,一つ空白,続いて8桁が人数,一つ空白,*を0から40個となる。
下のようなプログラムは書けたのですが、スケーリングのやり方が分かりません。
よかったら教えていただけないでしょうか。
#include<stdio.h>
int main(void){
int i, j, data[11];
for(i = 0; i <= 10; i++){
scanf("%d", &data);
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < data[j]; i++){
printf("*");
}
printf("\n");
}
return(0);
}
これは,0点から10点までの人数だと考える。
このデータを利用して,*を使用したヒストグラムを出力したい。
人数が大きい場合には,*が画面を折り返してしまい,見にくくなってしまう。
そこで,次のようにスケーリング(縮小)を行いたい。
 *の数の最大を40 としたい。
 全データの最大値が,*の数を40個として表すことにする。
 例えば,最大値が80 だとして,それを40個とすることは50%に縮小することになる。
他のデータも同じように縮小する。
人数が20の場合は,*が10個になる。
また人数が25 の場合は,その半分が12.5なるが,小数点以下を四捨五入して*を13個とする。
 なお最大値が40以下の場合は,拡大も縮小も行わない。
出力形式は,最初の2桁が点数,一つ空白,続いて8桁が人数,一つ空白,*を0から40個となる。
下のようなプログラムは書けたのですが、スケーリングのやり方が分かりません。
よかったら教えていただけないでしょうか。
#include<stdio.h>
int main(void){
int i, j, data[11];
for(i = 0; i <= 10; i++){
scanf("%d", &data);
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < data[j]; i++){
printf("*");
}
printf("\n");
}
return(0);
}
Re:スケーリング
最大値を求めるプログラムを追加しました。
ここからがどうしていいか全く分かりません。
よろしくお願いします。
ここからがどうしていいか全く分かりません。
よろしくお願いします。
#include<stdio.h> int main(void){ int i, j, data[11], max = 0; for(i = 0; i <= 10; i++){ scanf("%d", &data); if(data > 0){ max =data; } } for(j = 0; j <= 10; j++){ printf("%2d %8d ", j, data[j]); for(i = 0; i < data[j]; i++){ printf("*"); } printf("\n"); } return(0); }
Re:スケーリング
すみません、間違えていました。
最大値の部分は直せましたが、そのあとがうまくいきません。
最大値の部分は直せましたが、そのあとがうまくいきません。
#include<stdio.h> int main(void){ int i, j, data[11], max = 0; double a; for(i = 0; i <= 10; i++){ scanf("%d", &data); if(data > max){ max =data; } } for(j = 0; j <= 10; j++){ printf("%2d %8d ", j, data[j]); if(max <= 40){ for(i = 0; i < data[j]; i++){ printf("*"); } } else{ a = 40 / max + 0.5; for(i = 0; i < a * data[j]; i++){ printf("*"); } } printf("\n"); } return(0); }
Re:スケーリング
以下のようになったのですが…
出力が若干うまくいきません。
出力が若干うまくいきません。
#include<stdio.h> int main(void){ int i, j, data[11], max = 0; double a; for(i = 0; i <= 10; i++){ scanf("%d", &data); if(data > max){ max =data; } } for(j = 0; j <= 10; j++){ printf("%2d %8d ", j, data[j]); if(max <= 40){ for(i = 0; i < data[j]; i++){ printf("*"); } } else{ a = 40 * data[j] / max; for(i = 0; i < a + 0.5; i++){ printf("*"); } } printf("\n"); } return(0); }
Re:スケーリング
>以下のようになったのですが… >出力が若干うまくいきません。 >a = 40 * data[j] / max; >for(i = 0; a + 0.5; i++){ > printf("*"); >} おそらくscanfで0を入力すると0が入った配列は1になるでしょう。 なぜならi < a + 0.5が原因です。 scanfで0ならaは必然的に0になります。 i < 0 + 0.5 → i < 0.5になります。 i = 0のときは → 0 < 0.5(結果はTRUE) そのため最低一回は 「*」を表示します。 自分なりに作ってみました。あと肝心の式の部分は(double)(~) int(a)などと書いていますが、 便利なので使わせて頂いてます。もし分からなければ質問していただいて結構ですよ。 #define OK1~OK3の部分や#ifndef,#ifdef,#endifは無駄なおまけです。 #include<stdio.h> //#define OK1 //#define OK2 //#define OK3 int main(void) { int i, j, data[11], max = 0; double a; for(i = 0; i <= 10; i++) { #ifdef OK1 scanf("%d", &data); #endif #ifdef OK2 data = i * i; #endif #ifdef OK3 data = i * 100; #endif #ifndef OK1 #ifndef OK2 #ifndef OK3 printf("#defineのOK1かOK2かOK3のコメントをはずしてください\n"); printf("コメントをはずした後コンパイルしてください。\n"); return(0); //コメントははずすだけで結構です。 #endif #endif #endif if(data > max) { max = data; } } printf("max %d\n",max); for(j = 0; j <= 10; j++) { printf("%2d %8d ", j, data[j]); if(max <= 40) { for(i = 0; i < data[j]; i++) { printf("*"); } } else { if( 40 > (a = (double)(data[j]) / (double(max) / 40) ) ) { a += 0.5; } for(i = 0; i < int(a); i++) { printf("*"); } } printf(" %d ", i ); printf("\n"); } return(0); }
Re:スケーリング
皆様、ありがとうございます。
以下のようなプログラムで合っているかと思うのですが…
無駄な処理など入っていますでしょうか?
以下のようなプログラムで合っているかと思うのですが…
無駄な処理など入っていますでしょうか?
#include<stdio.h> int main(void){ int i, j, data[11], max; double a; scanf("%d", &data[0]); max = data[0]; for(i = 1; i <= 10; i++){ scanf("%d", &data); if(data > max){ max = data; } } for(j = 0; j <= 10; j++){ printf("%2d %8d ", j, data[j]); if(max <= 40){ for(i = 0; i < data[j]; i++){ printf("*"); } } else{ a = (int)(max / 40 + 0.5); for(i = 0; i < (int)(data[j] / a + 0.5); i++){ printf("*"); } } printf("\n"); } return(0); }
Re:スケーリング
回答します。(前回は無駄な回答ごめんなさい)
以上です。頑張ってください。
>scanf("%d", &data[0]); >max = data[0]; >for(i = 1; i <= 10; i++){ > scanf("%d", &data); > if(data > max){ > max = data; > } >} scanf("%d, &data[0]); max = data[0]; を分けている意図が分かりません。ここは消してfor文のiの開始を0にするべきです。 >a = (int)(max / 40 + 0.5); aにスケーリングの比率を代入する際、int型でキャストしている部分が謎です。それと比率には四捨五入は必要ないです。(「*」の表示個数をint型でキャストしているのは問題ないですが。)
以上です。頑張ってください。
Re:スケーリング
>点数入力に範囲があるので(0から10点)
上限はなかったですね。
無駄というほどではありませんが、このような解答もあるという例で
上限はなかったですね。
無駄というほどではありませんが、このような解答もあるという例で
#include<stdio.h> int main(void){ int i, j, data[11], max=0; double a; for(i = 0; i <= 10; i++){ scanf("%d", &data); if(data > max){ max = data; } } a=(max>40)? max/40.0:1.0; for(j = 0; j <= 10; j++){ printf("%2d %8d ", j, data[j]); for(i = 0; i < (int)(data[j] / a + 0.5); i++){ printf("*"); } printf("\n"); } return(0); }