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

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

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

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

Q&A

解決済

4回答

1725閲覧

AからJの10名分のテストの成績を記載したファイルTEST.txtを読み込み, 10名の合計点,10名の平均点,最高点(人と点数),最低点(人と点数) を別のファイルに出力するプログラムを作りなさい

bluesky1224

総合スコア6

C

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

0グッド

0クリップ

投稿2020/01/21 04:25

c言語

1コード 2#include<stdio.h> 3int main(void) { 4 FILE *ofp; 5 FILE *wfp; 6 int score = 0, max = 0, min = 100, i = 1, sc; 7 char str[100]; 8 static char *a, *b; 9 ofp = fopen("TEST.txt", "r"); 10 wfp = fopen("RESULT.txt", "w"); 11 if (ofp == NULL || wfp == NULL) { 12 printf("ファイルをオープンできませんでした"); 13 return 1; 14 } 15 else { 16 printf("ファイルをオープンしました\n"); 17 } 18 while (fscanf(ofp, "%s", str) != EOF && 19 (fscanf(ofp, "%d", &sc) != EOF)) { 20 if (max < sc) { 21 max = sc; 22 a = str; 23 printf("最大%s\n", a); 24 } 25 if (min > sc) { 26 min = sc; 27 b = str; 28 printf("最小%s\n", b); 29 } 30 printf(" 最大%s\n", a); 31 printf(" 最小%s\n", b); 32 score += sc; 33 fprintf(wfp, "%s %d\n", str, sc); 34 i++; 35 } 36 37 fprintf(wfp, "合計%d点 平均%d点\n最大値%s %d\n最小値%s %d\n", score, score / (i - 1), a, max, b, min); 38 fclose(ofp); 39 fclose(wfp); 40 return 0; 41}

TEST.txt
A 20
B 40
C 35
D 60
F 70
G 50
H 85
I 65
J 80
K 95

RESULT.txt
A 20
B 40
C 35
D 60
F 70
G 50
H 85
I 65
J 80
K 95
合計600点 平均60点
最大値K 95
最小値K 20

最大値と最小値の人の部分が最後のKになります。どうすればa,bに保存されますか?おそらくif関数から出たときにおかしくなっています。

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

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

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

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

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

bluesky1224

2020/01/21 04:51

a,bがKになるところがわかりません。
guest

回答4

0

最大値と最小値の人の部分が最後のKになります

: a = str; : b = str; :

a も b も str を指すだけだからです.
ポインタや文字列のコピーについて学習・復習されては如何でしょうか.

投稿2020/01/21 04:42

編集2020/01/21 04:43
jimbe

総合スコア12545

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

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

0

名前を保存する領域を別に用意して、名前をコピーする手もありますよ。

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void) { 5 int score, sum_score = 0, max_score = 0, min_score = 100; 6 char name[100] = "", max_name[100] = "" , min_name[100] = "" ; 7 FILE *rfp = fopen("TEST.txt", "r"); 8 FILE *wfp = fopen("RESULT.txt", "w"); 9 if (rfp == NULL || wfp == NULL) { 10 printf("Cannot Open File\n"); 11 return 1; 12 } 13 printf("File Opened\n"); 14 int n = 0; 15 while (fscanf(rfp, "%s", name) == 1 && 16 fscanf(rfp, "%d", &score) == 1) { 17 if (max_score < score) { 18 max_score = score; 19 strcpy(max_name, name); 20 printf("Max %s\n", max_name); 21 } 22 if (min_score > score) { 23 min_score = score; 24 strcpy(min_name, name); 25 printf("Min %s\n", min_name); 26 } 27 printf(" Max %s\n", max_name); 28 printf(" Min %s\n", min_name); 29 sum_score += score; 30 fprintf(wfp, "%s %d\n", name, score); 31 n++; 32 } 33 34 fprintf(wfp, "Sum %d, Ave %d\nMax %s %d\nMin %s %d\n", 35 sum_score, sum_score / n, max_name, max_score, min_name, min_score); 36 fclose(rfp); 37 fclose(wfp); 38 return 0; 39}

投稿2020/01/21 05:39

shiracamus

総合スコア5406

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

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

0

VSCode等の統合開発環境で該当プログラムを動かして、デバッグを行い、
ステップ実行で変数の値を確認してください。
そうすれば想定と違っている部分が見えるはずです。

投稿2020/01/21 04:57

kaina

総合スコア418

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

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

bluesky1224

2020/01/21 05:02

勉強不足でVSCodeがわかりません
bluesky1224

2020/01/21 05:02

Visual Studioを使用しています。
guest

0

ベストアンサー

b = str;とした時点で、bはstrのアドレスを指します。
その後のprintfでstrの先頭アドレスから終端までの文字列が表示されます。

strの中身をbに代入したい場合は以下のようになります(極力ソースを変更しない前提で)。
*すみませ、文字化け対策で勝手に英語に変えてしまいました。

#include<stdio.h> int main(void) { FILE *ofp; FILE *wfp; int score = 0, max = 0, min = 100, i = 1, sc; char str[100]; static char *a, *b, temp; ofp = fopen("TEST.txt", "r"); wfp = fopen("RESULT.txt", "w"); if (ofp == NULL || wfp == NULL) { printf("Cannot Open File\n"); return 1; } else { printf("File Opened\n"); } while (fscanf(ofp, "%s", str) != EOF && (fscanf(ofp, "%d", &sc) != EOF)) { if (max < sc) { max = sc; a = str; printf("Max %s\n", a); } if (min > sc) { min = sc; temp = *str; b = &temp; printf("Min %s\n", b); } printf(" Max %s\n", a); printf(" Min %s\n", b); score += sc; fprintf(wfp, "%s %d\n", str, sc); i++; } fprintf(wfp, "Sum %d, Ave %d\n Max %s %d\nMin %s %d\n", score, score / (i - 1), a, max, b, min); fclose(ofp); fclose(wfp); return 0; }

変更箇所は以下です。

static char *a, *b, temp; temp = *str; b = &temp;

ただし、この方法では文字列が一文字の場合しか対応できません。

投稿2020/01/21 04:54

編集2020/01/21 04:56
YOshim

総合スコア1085

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

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

bluesky1224

2020/01/21 05:04

変更しましたがうまくいきません。 #include<stdio.h> #include<string.h> int main(void) { FILE *ofp; FILE *wfp; int score = 0, max = 0, min = 100, i = 1, sc; char str[100]; static char *a, *b, temp; ofp = fopen("TEST.txt", "r"); wfp = fopen("RESULT.txt", "w"); if (ofp == NULL || wfp == NULL) { printf("ファイルをオープンできませんでした"); return 1; } else { printf("ファイルをオープンしました\n"); } while (fscanf(ofp, "%s", str) != EOF && (fscanf(ofp, "%d", &sc) != EOF)) { if (max < sc) { max = sc; temp = *str; a = &temp; } if (min > sc) { min = sc; temp = *str; b = &temp; } score += sc; fprintf(wfp, "%s %d\n", str, sc); i++; } fprintf(wfp, "合計%d点 平均%d点\n最大値%s %d\n最小値%s %d\n", score, score / (i - 1), a, max, b, min); fclose(ofp); fclose(wfp); return 0; }
YOshim

2020/01/21 05:07

取り急ぎ、 以下の部分は変更しなくてよいで部分です。 最大値はstrに、最小値をtempに入れる形式です。 ``` if (max < sc) { max = sc; temp = *str; a = &temp; } ```
YOshim

2020/01/21 05:14

一文字だけでなく文字列に対応させる場合は以下のようになります。 #include <string.h> ・ ・ char maxStr[100]; char minStr[100]; ・ ・ if (max < sc) { strcpy(maxStr, str); a = maxStr; printf("Max %s\n", a); } if (min > sc) { min = sc; strcpy(minStr, str); b = minStr; printf("Min %s\n", b); } ・ ・ ・
bluesky1224

2020/01/21 05:22

うまくいきました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問