AからJの10名分のテストの成績を記載したファイルTEST.txtを読み込み, 10名の合計点,10名の平均点,最高点(人と点数),最低点(人と点数) を別のファイルに出力するプログラムを作りなさい
解決済
回答 4
投稿
- 評価
- クリップ 0
- VIEW 1,573
コード
#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;
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;
a = str;
printf("最大%s\n", a);
}
if (min > sc) {
min = sc;
b = str;
printf("最小%s\n", b);
}
printf(" 最大%s\n", a);
printf(" 最小%s\n", b);
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;
}
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関数から出たときにおかしくなっています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
最大値と最小値の人の部分が最後のKになります
:
a = str;
:
b = str;
:
a も b も str を指すだけだからです.
ポインタや文字列のコピーについて学習・復習されては如何でしょうか.
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
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;
ただし、この方法では文字列が一文字の場合しか対応できません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
VSCode等の統合開発環境で該当プログラムを動かして、デバッグを行い、
ステップ実行で変数の値を確認してください。
そうすれば想定と違っている部分が見えるはずです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
名前を保存する領域を別に用意して、名前をコピーする手もありますよ。
#include <stdio.h>
#include <string.h>
int main(void) {
int score, sum_score = 0, max_score = 0, min_score = 100;
char name[100] = "", max_name[100] = "" , min_name[100] = "" ;
FILE *rfp = fopen("TEST.txt", "r");
FILE *wfp = fopen("RESULT.txt", "w");
if (rfp == NULL || wfp == NULL) {
printf("Cannot Open File\n");
return 1;
}
printf("File Opened\n");
int n = 0;
while (fscanf(rfp, "%s", name) == 1 &&
fscanf(rfp, "%d", &score) == 1) {
if (max_score < score) {
max_score = score;
strcpy(max_name, name);
printf("Max %s\n", max_name);
}
if (min_score > score) {
min_score = score;
strcpy(min_name, name);
printf("Min %s\n", min_name);
}
printf(" Max %s\n", max_name);
printf(" Min %s\n", min_name);
sum_score += score;
fprintf(wfp, "%s %d\n", name, score);
n++;
}
fprintf(wfp, "Sum %d, Ave %d\nMax %s %d\nMin %s %d\n",
sum_score, sum_score / n, max_name, max_score, min_name, min_score);
fclose(rfp);
fclose(wfp);
return 0;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
bluesky1224
2020/01/21 13:51
a,bがKになるところがわかりません。
2020/01/22 16:16
複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。