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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1934閲覧

ファイル読み込みから配列にいれてそれを順番に画面表示したい

ren_ren_ren

総合スコア1

C

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/10 02:27

前提・実現したいこと

"info.txt"というファイルの中に、名前、出身校、時間、距離が人数分書かれています。
それを読み込んで画面に表示し、平均、標準偏差、相関係数等を求めたいです。

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

共分散:0.00e+000[-]
a0=-1.#Je+000
a1=-1.#Je+000
距離及び所要時間の平均値
距離:0.00e+000 [km]
時間:0.00e+000 [h]
距離及び所要時間の標準偏差
距離:0.00e+000 [km]
時間:0.00e+000 [h]
相関係数:-1.#Je+000[-]

該当のソースコード

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

typedef struct{
char name[100]; //名前
char school[100]; //出身校
double distance; //距離
double time; //所要時間
}Member;

//一次近似式の係数及び相関係数を計算するプログラム
void lsm(double x[], double y[], int N, double *a0, double *a1)
{
int i;
double A00 = 0, A01 = 0, A02 = 0, A11 = 0, A12 = 0;

for (i = 0; i < N; i++) { A00 += 1.0; A01 += x[i]; A02 += y[i]; A11 += x[i] * x[i]; A12 += x[i] * y[i]; } *a0 = (A00 * A12 - A01 * A02) / (A00 * A11 - A01 * A01); *a1 = (A02 * A11 - A01 * A12) / (A00 * A11 - A01 * A01);

}

int main(void) {
Member data[20];
int number, i; //数を調べるための変数
double k; //相関係数
double sum_distance, sum_time; //距離及び時間のそれぞれの合計
double ave_distance, ave_time; //距離及び時間の平均
double stdev_distance, stdev_time; //距離及び時間の標準偏差
double covariance_distance_time; //距離及び時間の共分散
char filename1[256];//filename2[256];
char r_name[100]; //読み込む名前
char r_school[100]; //読み込む出身校
float f1, f2;
char buf[1000], buf1[500],buf2[500];
FILE *fp; // FILE型構造体

//テキストファイルから情報を読み込む。ファイルがない場合は失敗 /*fp = fopen(fname, "r"); if(fp == NULL) { printf("Error"); }*/ printf("ファイル名を入力してください\n"); fflush(stdout); while(1) { fgets(filename1, sizeof filename1, stdin); filename1[strlen(filename1) - 1] = '\0'; if((fp = fopen(filename1, "r")) == NULL) { perror("file is not open!"); } else if((fp = fopen(filename1, "r")) != NULL) { break; } //情報を読み取るプログラム number = 0; while(fgets(buf, 1000, fp) != NULL) { sscanf(buf, "%s %s %f %f", r_name, r_school, &f1, &f2) ; strcpy(data[number].name, r_name); strcpy(data[number].school, r_school); data[number].distance = f1; data[number].time = f2; number++; } fclose(fp); // ファイルを閉じる } //全員の情報を画面に表示するプログラム for(i = 0; i < number; i++) { printf("名前:%s\t",data[i].name); printf("出身校:%s\t",data[i].school); printf("距離:%3.2e[km]\t",data[i].distance); printf("所要時間:%3.2e[h]\n", data[i].time); } printf("\n"); //距離と時間の平均値を計算するプログラム sum_distance = 0; sum_time = 0; ave_distance = 0; ave_time = 0; for(i = 0; i < number; i++) { sum_distance += data[i].distance; sum_time += data[i].time; if(i == number - 1) { ave_distance = sum_distance / (double)number; ave_time = sum_time / (double)number; } } //距離と時間の標準偏差及び共分散を計算するプログラム stdev_distance = 0; stdev_time = 0; covariance_distance_time = 0; for(i = 0; i < number; i++) { stdev_time += pow((data[i].time - ave_time), 2.0); //(data[i].time - ave_time) * (data[i].time - ave_time); stdev_distance += (data[i].distance - ave_distance) * (data[i].distance - ave_distance); covariance_distance_time += (data[i].distance - ave_distance) * (data[i].time - ave_time) / (double)number; if(i == number - 1) { stdev_distance = sqrt(stdev_distance / (double)number); stdev_time = sqrt(stdev_time / (double)number); } } //printf("距離の標準偏差:%3.2e[km]\t", stdev_distance); //printf("時間の標準偏差:%3.2e[h]\n", stdev_time); printf("共分散:%3.2e[-]\t", covariance_distance_time ); printf("\n"); //相関係数を求めるプログラム k = 0; k = covariance_distance_time / (stdev_distance * stdev_time); //最小二乗法で一次近似式を求めるために新たに配列に格納する式 double x[20]={}; double y[20]={}; double a0 = 0, a1 = 0; for (i = 0; i < number; i++) { x[i] = data[i].distance; y[i] = data[i].time; } int N = number;// データの個数 lsm(x, y, N, &a0, &a1);// 最小二乗法の計算 printf("a0=%3.2e\na1=%3.2e\n", a0, a1); sprintf(buf, "距離及び所要時間の平均値\n 距離:%3.2e [km]\n 時間:%3.2e [h]\n", ave_distance, ave_time); sprintf(buf1, "距離及び所要時間の標準偏差\n 距離:%3.2e [km]\n 時間:%3.2e [h]\n", stdev_distance, stdev_time); sprintf(buf2, "相関係数:%3.2e[-]\n", k); strcat(buf, buf1); strcat(buf, buf2); printf(buf); printf("\n");

ちなみにこの後ファイルに書き込みをしたいのでbufにいれていますが、それ以前の問題なのでsprintfは気にしないでください…

試したこと

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

Eclips Neon 4.6.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

Eclipse使ってるなら、デバッグしましょう
ブレークポイントを設定すれば、実行をそこで中断して、変数のナカミを見ることができます
そこから1行づつ実行させて、変数の値の変化やコードの流れを見ることもできます

そうすれば、アテずっぽでコードを書かなくて済むようになるし、動かない原因を探る事ができるようになります

投稿2020/06/10 02:52

y_waiwai

総合スコア87774

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

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

ren_ren_ren

2020/06/10 03:44

回答ありがとうございました。 デバッグで見ていった結果、breakが抜けられていないことが分かり、見たところ、"}"の位置の問題でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問