No.1ベストアンサー
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
int sum(int x[], int from, int to, int acc);
int main(void) {
FILE* fp;
int x[50000], p, q;
char s[5];
if ((fp = fopen("10000.txt", "r")) == NULL) {
puts("can't open file");
return EXIT_FAILURE;
}
for (int i = 0; i < 50000; i++) {
if (feof(fp) != 0) {
x[i] = -1;
break;
} else {
fscanf(fp, "%d", &x[i]);
}
}
scanf("%4s%*[^\n]%*c", s);
p = strtol(s, NULL, 10);
scanf("%4s%*[^\n]%*c", s);
q = strtol(s, NULL, 10);
printf("%d\n", sum(x, p - 1, q - 1, 0));
fclose(fp);
return EXIT_SUCCESS;
}
int sum(int x[], int from, int to, int acc) {
if ((from > to) || x[from] == -1) {
return acc;
} else {
return sum(x, from + 1, to, acc + x[from]);
}
}
/ * 注意事項
実は10000.txtの仕様が良く分からない。
・各行が何個の値を持つのか
・最大何行なのか
全く分かってないので、
・各行は最小で1つ、最大で5つの値を持つ
・行数は10,000行である
と仮定しておいて、用意する配列の要素数を最大数10,000行×5で50,000と仮定してる。
動的配列を使わない限り、C言語では自由に配列の大きさを設定出来ない故のやっつけ仕事である。
(と言うより、C言語では現代的な意味で言う「配列」と言う素敵なデータ型があるわけではなく、そこにただ、剥き出しのメモリが転がってるだけ、である)
当然ファイルから読まれる値がここで設定した配列を全部埋めきるとは限らないので、「余りの部分」が出る。
そこで、終端記号代わりにファイルの最後に来ると配列に-1の値をセットしてる。これが暫定的な配列の「終端記号」の役割を果たしているわけだ。
これも、恐らく10000.txtには負の数は含まれないだろう、と言う希望的観測でのやっつけ仕事である。
*/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Visual Basic(VBA) エクセルVBAでメールの自動作成の モジュールを作ったのですが、txtファイルから読み込んだ本文が文 2 2022/07/20 15:01
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Ruby パイソンでテキストファイルが読み込めない 1 2022/11/14 16:42
- C言語・C++・C# c言語の質問です。 ランダムに4桁の暗証番号を出力するプログラムを作ったのですが、4947→4973 3 2022/04/16 16:47
- Ruby ruby 1 2022/06/10 13:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報