←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4572

テーブル処理
投稿者---白宇土(2005/08/29 23:32:07)


点数(0〜100)を入力して、10点きざみに*で表示する
プログラムを作ってるのですがうまくいきません。
 0〜 9→nin[0]に集計
10〜 19→nin[1]に集計
:
99〜100→nin[9]に集計

完成例
 No 1:点数 = 72
 No 2:点数 = 11
    :
 No26:点数 = 24
 No27:点数 = 999 ←999入力で終了します

--- ヒストグラム ---
0〜 9 *
10〜 19 ***
:
80〜 89 ****
90〜100 **

  ↑
このようになればいいのですがどうもヒストグラムのとこが
わかりません。
作ったプログラムも張るのでご教授お願いします


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> これです・・・ 4573 白宇土 2005/08/29 23:34:07


No.4573

これです・・・
投稿者---白宇土(2005/08/29 23:34:07)


#include<stdio.h>
main()
{
   int i,j,n,ten;
   static int nin[10];

   n=1;
   printf("No%2d:点数 = ",n);
   scanf("%d",&ten);
   j=0;
   while(j!=9)
    {
     nin[j]=0;
     j=j+1;
    }
   while(ten!=999)
    {
     i=ten/10;
     nin[i]=nin[i]+1;
     n=n+1;
     printf("No%2d:点数 = ",n);
     scanf("%d",&ten);
    }
     printf("\n");
     printf("------ ヒストグラム ------");
     printf("\n");
     printf(" 0 〜  9 ");
     printf("\n");
     printf("10 〜 19 ");
     printf("\n");
     printf("20 〜 29 ");
     printf("\n");
     printf("30 〜 39 ");
     printf("\n");
     printf("40 〜 49 ");
     printf("\n");
     printf("50 〜 59 ");
     printf("\n");
     printf("60 〜 69 ");
     printf("\n");
     printf("70 〜 79 ");
     printf("\n");
     printf("80 〜 89 ");
     printf("\n");
     printf("90 〜100 ");
}




この投稿にコメントする

削除パスワード

No.4574

Re:これです・・・
投稿者---επιστημη(2005/08/29 23:46:59)


ヒストグラムの部分だけ。

int i;
for ( i = 0; i <10; ++i ) {
  printf("%2d 〜 %2d ", i*10, i*10+9);
  /* nin[i]の数だけ*を打つ */
  printf("\n");
}



この投稿にコメントする

削除パスワード

No.4578

Re:これです・・・
投稿者---Blue(2005/08/30 02:34:35)


> printf("%2d 〜 %2d ", i*10, i*10+9);
90〜100の時(i==9の時),100にならないですね。

printf( "%2d 〜%3d ", i * 10, i * 10 + ( i == 9 ? 10 : 9 ) );みたいにすんのかな。



この投稿にコメントする

削除パスワード

No.4576

Re:これです・・・
投稿者---Blue(2005/08/30 02:19:01)


>     i=ten/10;
>     nin[i]=nin[i]+1;
これって、ten==100の時ヤバイです。(正常値なのにダメ)
nin[ 10 ] を参照して、不正終了します。
# scanfで範囲チェックしてないから0〜99以外の場合全部ダメなんだけどね。

なので、100の時は-1とかするのか、割り算とかの処理せずに、nin[10]を
カウントアップするなりして対処する。



この投稿にコメントする

削除パスワード

No.4577

Re:これです・・・
投稿者---Blue(2005/08/30 02:27:12)


> なので、100の時は-1とかするのか、割り算とかの処理せずに、nin[10]を
> カウントアップするなりして対処する。
あふぉやん。。。nin[ 9 ] をカウントアップするでした。

ちなみに、
>     j=j+1;
>     nin[i]=nin[i]+1;
>     n=n+1;
は、それぞれ
j++;
nin[ i ]++;
n++;
と簡単(?)にかけます。



この投稿にコメントする

削除パスワード

No.4579

Re:これです・・・
投稿者---RAPT(2005/08/30 09:11:48)


> static int nin[10];
> j=0;
> while(j!=9)
> {
>  nin[j]=0;
>  j=j+1;
> }

nin を static にする必要性はありますか?

int nin[10] = {0};
とすれば充分かと。



この投稿にコメントする

削除パスワード

No.4580

Re:これです・・・
投稿者---ゾン兵衛(暫定)(2005/08/30 10:17:41)


 はじめまして。
このサイトで、いつも勉強さしていただいてます。

> i=ten/10;
> nin[i]=nin[i]+1;

の部分ですが、

nin[(ten - 1) / 10] ++

では、どうでしょうか?


この投稿にコメントする

削除パスワード

No.4581

Re:これです・・・
投稿者---YuO(2005/08/30 11:23:28)


>> i=ten/10;
>> nin[i]=nin[i]+1;
>の部分ですが、
>nin[(ten - 1) / 10] ++
>では、どうでしょうか?

だめでしょう。
tenが10の時,Blueさんのコードでは添字が1ですが,ゾン兵衛(暫定)さんのコードでは添字が0になります。
これは,
>>>> 10〜 19→nin[1]に集計
に反します。


この投稿にコメントする

削除パスワード

No.4582

Re:これです・・・
投稿者---Blue(2005/08/30 11:38:05)


> nin[(ten - 1) / 10] ++
ten == 0 の時もやばそう。
# 0点は落ちろという意味なのか(謎)

やはり
nin[ ten / 10 ]++;
にして、ここに来る前にten == 100の時の処理をしたほうが明確ですかね。



この投稿にコメントする

削除パスワード

No.4587

このようにしてみましたが、やっぱりできません・・・・
投稿者---白宇土(2005/08/30 18:27:24)


#include<stdio.h>
main()
{
   int i,j,n,ten;
   static int nin[10];

   n=1;
   printf("No%2d:点数 = ",n);
   scanf("%d",&ten);
   j=0;
   while(j!=9)
    {
     nin[j]=0;
     j++;
    }
   while(ten!=999)
    {
    if(ten==100);
     {
     nin[9]++;
     }
     i=ten/10;
     nin[i]++;
     n++;
     printf("No%2d:点数 = ",n);
     scanf("%d",&ten);
    }
     printf("\n");
     printf("------ ヒストグラム ------");
     printf("\n");
   for(i=0;i<9;++i)
    {
     printf("%2d 〜 %2d",i*10,i*10+9);
     scanf("%d",&nin[i]);
     printf("\n");
    }
     printf("90 〜100");
}



この投稿にコメントする

削除パスワード

No.4588

Re:このようにしてみましたが、やっぱりできません・・・・
投稿者---Blue(2005/08/30 19:18:31)


いろいろと突っ込みどころがありますね。。。

最初にぱっと見でつくったの載せときます。
どこが違うのか、ヒストグラムどうやって作ってるか参考にしてください。

#include <stdio.h> int main( void ) { int nin[ 10 ] = { 0 }; int score, num = 1, i; while ( 1 ) { printf( "No%2d:点数 = ", num++ ); if ( scanf( "%d", &score ) != 1 ) return -1; /* 異常値 */ if ( score == 999 ) break; if ( score > 100 ) return -1; /* 異常値 */ if ( score == 100 ) { nin[ 9 ]++; continue; } nin[ score / 10 ]++; } puts("\n------ ヒストグラム ------"); for ( i = 0; i < 10; ++i ) { printf( "%2d 〜%3d ", i * 10, i * 10 + ( i == 9 ? 10 : 9 ) ); while ( nin[ i ]-- ) { putchar( '*' ); } printf( "\n" ); } return 0; }



この投稿にコメントする

削除パスワード

No.4589

Re:このようにしてみましたが、やっぱりできません・・・・
投稿者---Blue(2005/08/30 19:24:40)


>        if ( score > 100 ) return -1; /* 異常値 */
マイナス処理してなかった。。orz

        if ( score < 0 || score > 100 ) return -1;

に変更しといてください。

# 他にも突っ込みどころあると思いますが。



この投稿にコメントする

削除パスワード

No.4592

Re:このようにしてみましたが、やっぱりできません・・・・
投稿者---白宇土(2005/08/30 20:05:36)


>Blueさん
つくってもらって悪いのですが、知らない書き方ばかりで
全然わかりません・・・


この投稿にコメントする

削除パスワード

No.4593

Re:このようにしてみましたが、やっぱりできません・・・・
投稿者---Blue(2005/08/30 20:08:16)


> つくってもらって悪いのですが、知らない書き方ばかりで
> 全然わかりません・・・
どこがわからないのでしょうか?
それとも知らないやり方でコーディングしてはいけないとか?
(それなら、さいしょに規則として挙げるべき)



この投稿にコメントする

削除パスワード

No.4594

Re:このようにしてみましたが、やっぱりできません・・・・
投稿者---とおり(2005/08/30 20:39:50)


>最初にぱっと見でつくったの載せときます。
>どこが違うのか、ヒストグラムどうやって作ってるか参考にしてください。

んじゃ。私も。
ちなみにロジック(やり方)変えてます。
#バグあるかも。

#include <stdio.h>

int main()
{
  int i, j, cnt, data[256];
  int min, max;

  i = 0;
  while (1) {
    printf("No.%.2d : ", i+1);
    scanf("%d", &data[i]);
    if (data[i] == 999) break;
    i++;
  }
  cnt = i++;

  printf("--------------------\n");
  for (i = 0; i < 10; i++) {
    min = i * 10;
    max = i * 10 + 9;
    if (max == 99) max++;
    printf("%.3d 〜 %.3d : ", min, max);

    for (j = 0; j < cnt; j++) {
      if (min <= data[j] && data[j] <= max)
        printf("*");
    }
    printf("\n");
  }

  return(0);
}



この投稿にコメントする

削除パスワード

No.4595

できました!!!
投稿者---白宇土(2005/08/30 21:01:57)


#include<stdio.h>
main()
{
   int i,j,n,ten;
   static int nin[10];

   n=1;
   printf("No%2d:点数 = ",n);
   scanf("%d",&ten);

   while(ten!=999)
    {
    if(0<=ten&&100>=ten)
     {
     i=ten/10;
     if(i==10)
       nin[9]++;
     else
       nin[i]++;
     }
     printf("No%2d:点数 = ",n++);
     scanf("%d",&ten);
    }
     printf("\n------ ヒストグラム ------");
     printf("\n");
   for(i=0;i<9;i++)
    {
     printf("%2d 〜 %2d",i*10,i*10+9);
       for(j=0;j<nin[i];j++)
        printf("*");
     printf("\n");
    }
    i=9;
    printf("%2d 〜100",i*10);
      for(j=0;j<nin[i];j++)
        printf("*");
}




いろいろ申し訳ありませんでした


この投稿にコメントする

削除パスワード

No.4590

Re:これです・・・
投稿者---ゾン兵衛(暫定)(2005/08/30 19:27:09)


YuO氏へ
>tenが10の時,Blueさんのコードでは添字が1ですが,
>ゾン兵衛(暫定)さんのコードでは添字が0になります。

 御指摘どおりです。"0"と""100"ばかり気にして、
間(10、20、・・・90)を忘れてました。


Blue氏へ
>ten == 0 の時もやばそう。
># 0点は落ちろという意味なのか(謎)

 当方の環境(Win2000sp4、VC++6.0sp5、Borland C++ 5.5.1)では、
ten == 0 のとき、(ten - 1) / 10 == 0 になりましたが、
これは、たまたまそうなっただけなのでしょうか?



この投稿にコメントする

削除パスワード

No.4591

Re:これです・・・
投稿者---Blue(2005/08/30 19:36:33)


> (ten - 1) / 10 == 0
ごめんなさい、完全に勘違いしてました。
-1 / 10 の商は0だから大丈夫でした。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity