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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

933閲覧

csvファイルの一部の平均の出し方

gaku1182

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/01/20 06:29

前提

2017,1,1,1,5.8,1.5,南
などのように左から西暦、月、日、時、気温、風速、風向が書かれており、それが1月31日まで、1時間おきの数値が書かれたcsvファイルから数値を読み取り、各日ごとの平均気温、最高気温、最低気温、平均風速を別のcsvファイルに書き込むプログラムを作成したいです。

実現したいこと

-osaka-hour.csvというcsvファイルから数値を読み取り、24行ごとの平均値、最高値、最低値をosaka-day.csvというcsvファイルに書き出したい。

発生している問題・エラーメッセージ

24行ごとに区切って平均、最高値、最低値を出す方法がわかりません。

該当のソースコード

C

1/* ex1.c */ 2/* fscanfの例 */ 3#define _CRT_SECURE_NO_WARNINGS 4#include <stdio.h> 5#define BUF_NUM 256 6int main(void) { 7 FILE* fin,*fout; 8 char buf[BUF_NUM],hougaku[BUF_NUM]; 9 int i, nen,tuki,hi,ji; 10 double kion=0,fusoku=0,heikin=0,kionwa=0,saikou=0,saitei=0,heifu=0; 11 12 //ファイルオープン 13 fin = fopen("osaka-hour.csv", "r"); 14 if (fin == NULL) { 15 printf("入力ファイルをオープンできません\n"); 16 return 1; 17 } 18 19 //最初の4行は使わないので読み捨てる 20 for (i = 0; i < 4; i++) { 21 fgets(buf, BUF_NUM, fin); 22 } 23 24 fout = fopen("osaka-day.csv", "w"); 25 26 //書式付きで読む 27 while (fscanf(fin, "%d,%d,%d,%d,%lf,%lf,%s", &nen, &tuki,&hi,&ji,&kion,&fusoku,&hougaku) != EOF) { 28 //printf("%d,%d,%d,%d,%.2lf,%.2lf\n", nen, tuki, hi, ji, kion, fusoku); //カンマ付けて標準出力 29 fprintf(fout, "%d,%d,%d,%d,%.2lf,%.2lf\n", nen, tuki, hi, ji, kion, fusoku); 30 31 32 do { 33 kionwa += kion; 34 35 if (saikou < kion) { 36 saikou = kion; 37 } 38 39 if (saitei > kion) { 40 saitei = kion; 41 } 42 } while (ji != 24); 43 44 /*if (ji = 24) { 45 heikin = kionwa / 24; 46 printf( "%d,%d,%d,%.2lf,%.2lf,%.2lf,%.2lf\n", nen, tuki, hi, heikin, saikou,saitei, heifu); 47 } 48 else { 49 kionwa += kion; 50 51 if (saikou < kion) { 52 saikou = kion; 53 } 54 55 if (saitei > kion) { 56 saitei = kion; 57 } 58 }*/ 59 60 } 61 62 63 64 65 66 67 68 69 fclose(fin); 70 fclose(fout); 71 72 return 0; 73}

試したこと

fscanのwhileループの中で出そうとしたのですが、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

int32_t

2023/01/20 06:35

ji の項目は0〜23の数値ですか? CSVデータは必ず「最初の4行 + 24の倍数」行で例外はありませんか?
gaku1182

2023/01/20 06:43

jiは1~24の数値です。 csvデータは最初の4行+jiの列は1~24の数値を繰り返しています。
guest

回答2

0

ベストアンサー

ji が規則正しく 1~24 を繰り返す」というのを前提としてよい(=そうではないイレギュラーな入力を考慮しない)ならば,こんな感じで良いのではないでしょうか.

C

1double Sum, Min, Max; 2 3while (fscanf(fin, "%d,%d,%d,%d,%lf,%lf,%s", &nen, &tuki,&hi,&ji,&kion,&fusoku,&hougaku) != EOF) { 4 if( ji==1 ) //このタイミングでその日の情報を初期化 5 { Sum=Min=Max=kion; } 6 else 7 { 8 Sum += kion; 9 if( Max < kion )Max = kion; 10 if( kion < Min )Min = kion; 11 12 if( ji == 24 ) //このタイミングでその日の集計データを出力 13 { 14 double Average = Sum / 24; 15 /* Min, Max, Average を出力する */ 16 } 17 } 18}

投稿2023/01/20 06:58

fana

総合スコア11632

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

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

0

規則正しいものを行数ベース(つねに同じ日は24行ある)で考えるなら
入力~集計~出力の流れとして、以下のような感じでもできると思います。

C++

1#include <stdio.h> 2 3const int N = 24; // N行毎に出力 4int main(void) { 5 int cur(0), sum(0), cnt(0); 6 while( scanf("%d", &cur) != EOF){ // 適当な入力 7 8 sum += cur; // 集計などの処理 9 cnt++; // 処理済数を増やす 10 11 if( cnt == N){ // 処理済数=出力行数に達した 12 13 printf("sum=%d\n", sum);// 処理結果を出力 14 cnt = 0; sum = 0; // 処理に利用している変数をリセット 15 } 16 } 17 // 「積み残し」=入力行数がNで割り切れないケースを考慮するなら 18 if( cnt > 0){ 19 printf("sum=%d\n", sum); // 処理結果を出力 20 } 21 22 return 0; 23}

投稿2023/01/20 07:17

can110

総合スコア38233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問