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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

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

ハッシュ

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

Q&A

解決済

2回答

1536閲覧

Perl初心者(ハッシュ)

ikuo-biyori

総合スコア56

Perl

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

ハッシュ

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

0グッド

0クリップ

投稿2016/11/21 20:24

編集2016/11/21 20:28

いつもお世話になっています。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☀️---
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
以下が、コードです。よろしくお願いします。

Perl

1コード

%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);

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

クリップした質問は、後からいつでもMYページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

Perl

1@weatherList = ('cloudy', 'rainy', 'stormy', 'sunny'); 2%days = (); 3%temperatures = (); 4 5open(IN, "weather.dat") or die("Cannot open file."); 6 7while (<IN>) { 8 chomp; 9 ($day, $temp, $weather) = split(/,/); 10 print("day $day:\t$temp\t$weather\n"); 11 12 $days{$weather}++; 13 $temperatures{$weather} += $temp; 14 15} 16close(IN); 17 18print("---\nDays\n"); 19foreach $weather (@weatherList) 20{ 21 #ここがcloudy:12のように表示したい 22 printf("%s: %d\n", $weather, $days{$weather}); 23} 24 25print("---\nAverage Temperatures\n"); 26foreach $weather (@weatherList) 27{ 28 printf("%s: %f\n", $weather, $temperatures{$weather} / $days{$weather}); 29}

投稿2016/11/23 09:29

naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

perl

1%days = (); 2%tmp = (); 3 4open(IN, "weather.dat") or die("Cannot open file."); 5 6while (<IN>) { 7 chomp; 8 ($day,$temp,$weather) = split(/,/); 9 print("day $day:\t$temp\t$weather\n"); 10 11 $days{$weather}++; 12 $tmp{$weather}+=$temp; 13 14} 15close(IN); 16 17print("---\nDays\n"); 18printf("cloudy:%d\n",$days{'cloudy'});#ここがcloudy:12のように表示したい 19printf("rainy:%d\n",$days{'rainy'});#ここがrainy:9のように表示したい 20printf("stormy:%d\n",$days{'stormy'});#ここがstormy:1のように表示したい 21printf("sunny:%d\n",$days{'sunny'});#ここがsunny:9のように表示したい 22 23print("---\nAverage Temperatures\n"); 24printf("cloudy:%f\n",$tmp{'cloudy'}/$days{'cloudy'}); 25printf("rainy:%f\n",$tmp{'rainy'}/$days{'rainy'}); 26printf("stormy:%f\n",$tmp{'stormy'}/$days{'stormy'}); 27printf("sunny:%f\n",$tmp{'sunny'}/$days{'sunny'});

投稿2016/11/21 23:29

編集2016/11/21 23:35
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuo-biyori

2016/11/24 12: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)
A.Ichi

2016/11/24 12:51

コードの解釈は良いと思います。 ハッシュはキー付きの配列と考えて良いと思います。数字の部分がキーになっている。 キー値は、無ければ作成、有れば更新になります。またexists()関数で有無もチェックできます。 $days{$weather}++は、days['cloudy']++と等しいです。 例えば、データベースの頻繁に参照するテーブルで件数が少ないもので有れば、起動時にテーブルをハッシュテーブルにキャッシュしてこれを利用すると、かなりの速度改善になります。
ikuo-biyori

2016/11/24 20:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問