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

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

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

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

ファイル

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

プログラミング言語

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

2579閲覧

構造体やファイルの入力が絡んだ関数呼び出しが出来ません。

Masa_55

総合スコア0

C

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

ファイル

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

プログラミング言語

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/07/05 07:36

前提・実現したいこと

プログラミングC言語初心者です。
構造体で表された個人データをファイルから読み込んで、データ処理として科目の平均やGPAなどを作成するプログラムを作っており、最初に必要な科目別の合計を求める関数がうまくmain関数に反映されません。
どうすればいいのでしょうか。ご協力お願いします。

該当のソースコード

C

1/* 2  学生の成績管理システムを作成 3*/ 4#include <stdio.h> 5#include <stdlib.h> 6#include <math.h> 7#define NUMBER 5 8 9typedef struct { 10 char str[128]; /*在籍番号*/ 11 char name[64]; /*氏名*/ 12 double Japanese; /*国語の点数*/ 13 double math; /*数学の点数*/ 14 double English; /*英語の点数*/ 15} Student; 16 17int main(void){ 18 FILE *fp; 19 int i; 20 Student std[NUMBER]; 21 if((fp = fopen("File1.dat", "r")) == NULL){ 22 printf("\aファイルをオープン出来ません。\n"); 23 } 24 else{ 25 for(i = 0;i < NUMBER; i++){ 26 while (fscanf(fp, "%s %s %lf %lf %lf\n", std[i].str, std[i].name, 27 &std[i].Japanese, &std[i].math,&std[i].English) == 5){ 28 printf("%-10s %-10s %5.1f %5.1f %5.1f\n", std[i].str, std[i].name, 29 std[i].Japanese, std[i].math,std[i].English); 30 31 } 32 33 } 34 printf("------------------------------------------\n"); 35 sum(std, NUMBER); 36 printf("科目別の合計点      %5.1f %5.1f %5.1f\n",std[i].Japanese , std[i].math, std[i].English); 37 38 } 39 fclose(fp); 40 return 0; 41 } 42 43 44double sum(Student a[], int n) 45{ 46 int i; 47 double jsum = 0.0; 48 double msum = 0.0; 49 double esum = 0.0; 50 51 for(i = 0; i < n; i++){ 52 jsum += a[i].Japanese; 53 msum += a[i].math; 54 esum += a[i].English; 55 } 56 57}

補足情報(ファイルの入力)

C

1T19H100a DAICHI_ARAI 60 70 55 2T19H134j RIKU_TAKAMA 70 95 70 3T18H236k YUYA_ASAKA 55 75 69 4E19C554m DAIKI_TOTSUKA 100 50 95 5L15U934o KAITO_ARAI 40 30 58

前提・実現したいこと

科目別の合計点を求める関数をmain関数に反映させたいです。

エラーコード

C

1Main.c:35:9: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration] 2 sum(std, NUMBER); 3 ^ 4Main.c:43:8: error: conflicting types for 'sum' 5double sum(Student a[], int n) 6 ^ 7Main.c:35:9: note: previous implicit declaration is here 8 sum(std, NUMBER); 9 ^ 101 warning and 1 error generated.

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

paiza.ioで製作しています。

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

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

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

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

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

cateye

2020/07/05 07:44 編集

error: conflicting types for 'sum'・・・ sum()が2重定義 ・・・・標準ライブラリある関数名は使わない方が・・・どっちが、使われるか分からない。
Masa_55

2020/07/05 07:51

科目別の合計点を求める関数名をtotalにしてやってみます! ご指摘ありがとうございます!
guest

回答1

0

sum関数のプロトタイプ宣言を置く必要があります

C

1double sum(Student a[], int n); 2 3int main(void){ 4 FILE *fp; 5 ...

結果を返す関数の一例ですが

C

1 2void gokei(Student a[], int n,Student* result) 3{ 4 int i; 5 result->Japanese=0; 6 result->math=0; 7 result->English=0; 8 9 for(i = 0; i < n; i++){ 10 result->Japanese += a[i].Japanese; 11 result->math += a[i].math; 12 result->English += a[i].English; 13 } 14}

投稿2020/07/05 07:42

編集2020/07/05 09:10
y_waiwai

総合スコア87774

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

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

Masa_55

2020/07/05 07:52

回答ありがとうございます。 出力結果が以下のようになってしまったのですが、どうすればいいですか? T19H100a DAICHI_ARAI 60.0 70.0 55.0 T19H134j RIKU_TAKAMA 70.0 95.0 70.0 T18H236k YUYA_ASAKA 55.0 75.0 69.0 E19C554m DAIKI_TOTSUKA 100.0 50.0 95.0 L15U934o KAITO_ARAI 40.0 30.0 58.0 ------------------------------------------ 科目別の合計点      0.0 0.0 0.0
y_waiwai

2020/07/05 07:54

それをどうしたいというはなしでしょうか。 質問が変わってしまっていますが。。
Masa_55

2020/07/05 08:00

申し訳ありません。 合計点が何で0.0と表示されてしまうのか教えていただきたいです。
y_waiwai

2020/07/05 08:04

sum関数というのは計算の結果をどこにも返していません。 ただ計算して捨てているだけです んで、もひとつ、 提示のコードでは、std配列の範囲を超えてアクセスしています。 不正アクセスとなってますね。
Masa_55

2020/07/05 08:35

関数使って求めるのできなさそうなので、普通にmain関数で計算するプログラム作ろうと思います。 ありがとうございました。
y_waiwai

2020/07/05 08:40

やり方がまずいだけで、関数使ってでもできますよ。 まあ、とりあえず関数使わないで思うようになるようにコードを組んでみてください。 んで、C言語でコードを組むなら、デバッグできる環境を揃えましょう Eclipseや、WindowsならVisualStudioなど。 コードの任意の行で実行を止め、変数の中身を参照できます。 また、そこから1行づつ実行させてコードの流れや変数の変化を見ることができます
Masa_55

2020/07/05 08:57

一応関数使わないで出来たのですが、この先標準偏差なども求めようと思っているのでやっぱり関数は必要です。 関数使った場合の科目別の合計点を求めるプログラムを見せていただけませんか? 参考にさせていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問