質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.86%

  • Perl

    293questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • ハッシュ

    20questions

    ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Perl初心者(ハッシュ)

解決済

回答 2

投稿 2016/11/22 05:24 ・編集 2016/11/22 05:28

  • 評価
  • クリップ 0
  • VIEW 267

ikuo-biyori

score 48

いつもお世話になっています。perl初心者でただいま勉強中です。課題でweather.datというファイルを読み込んで、if文を使わず、ハッシュを使って、1ヶ月分の天気を集計するプログラムを作りたいんですが、cloudy:
rainy: stormy: sunny: というようになってしまい、データの個数が表示できません。気温についても同様の結果になってしまいます。どのようにすればいいですか?
自分の実行結果
day 1:    15.0    rainy
day 2:    20.4    cloudy
day 3:    20.1    sunny
day 4:    22.5    cloudy
day 5:    21.8    sunny
day 6:    23.7    sunny
day 7:    21.8    cloudy
day 8:    17.1    cloudy
day 9:    19.4    rainy
day 10:    23.1    sunny
day 11:    20.2    sunny
day 12:    13.6    rainy
day 13:    15.8    cloudy
day 14:    22.6    sunny
day 15:    19.8    cloudy
day 16:    20.4    sunny
day 17:    20.2    rainy
day 18:    15.4    rainy
day 19:    15.0    cloudy
day 20:    22.9    cloudy
day 21:    17.4    cloudy
day 22:    15.8    cloudy
day 23:    18.8    cloudy
day 24:    22.1    rainy
day 25:    16.0    rainy
day 26:    15.4    rainy
day 27:    22.0    sunny
day 28:    18.7    stormy
day 29:    23.0    cloudy
day 30:    19.0    sunny

day 31:    21.9    rainy

Days
cloudy:rainy:stormy:sunny:---
Average Temperatures
Illegal division by zero at scr2-3.pl line 26.

正しい実行結果
day 1:    15.0    rainy
day 2:    20.4    cloudy
day 3:    20.1    sunny
day 4:    22.5    cloudy
day 5:    21.8    sunny
day 6:    23.7    sunny
day 7:    21.8    cloudy
day 8:    17.1    cloudy
day 9:    19.4    rainy
day 10:    23.1    sunny
day 11:    20.2    sunny
day 12:    13.6    rainy
day 13:    15.8    cloudy
day 14:    22.6    sunny
day 15:    19.8    cloudy
day 16:    20.4    sunny
day 17:    20.2    rainy
day 18:    15.4    rainy
day 19:    15.0    cloudy
day 20:    22.9    cloudy
day 21:    17.4    cloudy
day 22:    15.8    cloudy
day 23:    18.8    cloudy
day 24:    22.1    rainy
day 25:    16.0    rainy
day 26:    15.4    rainy
day 27:    22.0    sunny
day 28:    18.7    stormy
day 29:    23.0    cloudy
day 30:    19.0    sunny

day 31:    21.9    rainy

Days
cloudy: 12
rainy: 9
stormy: 1

sunny: 9

Average Temperatures
cloudy: 19.1916666666667
rainy: 17.6666666666667
stormy: 18.7
sunny: 21.4333333333333
以下が、コードです。よろしくお願いします。

コード


%days = ();
%tmp = ();      

open(IN, "weather.dat") or die("Cannot open file.");

while (<IN>)  {
chomp;
($day,$weather,$tmp) = split(/,/);
print("day $day:\t$tmp\t$weather\n");

$days{$_}++;
$tmp{$_}++;

}
close(IN);

print("---\nDays\n");
printf("cloudy:",$_);#ここがcloudy:12のように表示したい
printf("rainy:",$_);#ここがrainy:9のように表示したい
printf("stormy:",$_);#ここがstormy:1のように表示したい
printf("sunny:",$_);#ここがsunny:9のように表示したい

print("---\nAverage Temperatures\n");
printf("cloudy:",$_/$days);
printf("rainy:",$_/$days);
printf("stormy:",$_/$days);
printf("sunny:",$_/$days);

  • 気になる質問をクリップする

    クリップした質問に回答があった場合に通知・メールを受け取ることができます。

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

このような感じでしょうか (weather.datのレイアウトは、出力と同じにしています)

%days = ();
%tmp = ();

open(IN, "weather.dat") or die("Cannot open file.");

while (<IN>)  {
    chomp;
    ($day,$temp,$weather) = split(/,/);
    print("day $day:\t$temp\t$weather\n");

    $days{$weather}++;
    $tmp{$weather}+=$temp;

}
close(IN);

print("---\nDays\n");
printf("cloudy:%d\n",$days{'cloudy'});#ここがcloudy:12のように表示したい
printf("rainy:%d\n",$days{'rainy'});#ここがrainy:9のように表示したい
printf("stormy:%d\n",$days{'stormy'});#ここがstormy:1のように表示したい
printf("sunny:%d\n",$days{'sunny'});#ここがsunny:9のように表示したい

print("---\nAverage Temperatures\n");
printf("cloudy:%f\n",$tmp{'cloudy'}/$days{'cloudy'});
printf("rainy:%f\n",$tmp{'rainy'}/$days{'rainy'});
printf("stormy:%f\n",$tmp{'stormy'}/$days{'stormy'});
printf("sunny:%f\n",$tmp{'sunny'}/$days{'sunny'});

投稿 2016/11/22 08:29

編集 2016/11/22 08:35

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/11/24 21:15

    ちょっと確認したいんですが、コードの解釈は、以下でよろしいでしょうか。
    %days = ();#変数配列宣言(ハッシュ)
    %tmp = (); #変数配列宣言(ハッシュ)

    open(IN, "weather.dat") or die("Cannot open file.");

    while (<IN>) {
    chomp;
    ($day,$weather,$tmp) = split(/,/);
    print("day $day:\t$tmp\t$weather\n");

    $days{$weather}++;#days[cloudy],days[rainy],days[stormy],days[sunny]の配列の要素にデータを足す(たとえば、cloudyならdays[cloudy]の個数が1増える)
    $tmp{$weather}+=$tmp;#tmp[cloudy],tmp[rainy],tmp[stormy],tmp[sunny]の配列の要素にデータを格納し、その格納した値を足す


    }
    close(IN);

    print("---\nDays\n");
    printf("cloudy: %d\n",$days{'cloudy'});#days[cloudy]を表示する。(int型だから%d)
    printf("rainy: %d\n",$days{'rainy'});#days[rainy]を表示する。(int型だから%d)
    printf("stormy: %d\n",$days{'stormy'});#days[stormy]を表示する。(int型だから%d)
    printf("sunny: %d\n",$days{'sunny'});#days[sunny]を表示する。(int型だから%d)


    print("---\nAverage Temperatures\n");
    printf("cloudy: %f\n",$tmp{'cloudy'}/$days{'cloudy'});#tmp[cloudy]をdays[cloudy]を割ったものを表示する(double型だから%f)
    printf("rainy: %f\n",$tmp{'rainy'}/$days{'rainy'});#tmp[rainy]をdays[rainy]を割ったものを表示する(double型だから%f)
    printf("stormy: %f\n",$tmp{'stormy'}/$days{'stormy'});#tmp[stormy]をdays[stormy]を割ったものを表示する(double型だから%f)
    printf("sunny: %f\n",$tmp{'sunny'}/$days{'sunny'});#tmp[sunny]をdays[sunny]を割ったものを表示する(double型だから%f)

    キャンセル

  • 2016/11/24 21:51

    コードの解釈は良いと思います。
    ハッシュはキー付きの配列と考えて良いと思います。数字の部分がキーになっている。
    キー値は、無ければ作成、有れば更新になります。またexists()関数で有無もチェックできます。

    $days{$weather}++は、days['cloudy']++と等しいです。

    例えば、データベースの頻繁に参照するテーブルで件数が少ないもので有れば、起動時にテーブルをハッシュテーブルにキャッシュしてこれを利用すると、かなりの速度改善になります。

    キャンセル

  • 2016/11/25 05:16

    ありがとうございます。分かりました。

    キャンセル

0

A.Ichiさんのコードを簡略化しました。

@weatherList = ('cloudy', 'rainy', 'stormy', 'sunny');
%days = ();
%temperatures = ();

open(IN, "weather.dat") or die("Cannot open file.");

while (<IN>)  {
    chomp;
    ($day, $temp, $weather) = split(/,/);
    print("day $day:\t$temp\t$weather\n");

    $days{$weather}++;
    $temperatures{$weather} += $temp;

}
close(IN);

print("---\nDays\n");
foreach $weather (@weatherList)
{
    #ここがcloudy:12のように表示したい
    printf("%s: %d\n", $weather, $days{$weather});
}

print("---\nAverage Temperatures\n");
foreach $weather (@weatherList)
{
    printf("%s: %f\n", $weather, $temperatures{$weather} / $days{$weather});
}

投稿 2016/11/23 18:29

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

teratailには29人のエキスパートがいます

今すぐはじめる

もっと詳しく

関連した質問

  • 解決済

    【Python】TypeError: &#039;str&#039; does not suppor...

    「みんなのPython Wevアプリ編」という本を見ながら、下記コードを書きました。 (ただ、この本が2007年に書かれた古い本で、Python2をベースにしているので、自分なりに

  • 解決済

    Deflateされたファイルの伸張

    Deflateされたファイルを伸張し、すべてprintするにはどうすればいいですか? ファイル: aaa.dat use strict; use warnings; use IO:

  • 解決済

    perlの変数について

    当方perlの知識が浅いですが、よろしくお願いします。 perlの勉強中でして、 perlで書かれたスクリプトを読んでいるのですが、 いまいち理解できない文がありましたので、それ

  • 解決済

    コードをもう少しシンプル(綺麗)に書けないか

    以下の通り、@@分前に、@@時間前、@@日前といった形になるようにコードを書いています。 これで問題なく表記されるのですが、なんとなく原始的、冗長で、もう少しシンプル(綺麗)にか

同じタグがついた質問を見る

  • Perl

    293questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • ハッシュ

    20questions

    ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

閲覧数の多いPerlの質問