スケーリング
-
愛川
スケーリング
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型でキャストしているのは問題ないですが。)以上です。頑張ってください。
-
non
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);
}