dポイントプレゼントキャンペーン実施中!

ランダムな数を10000.txtから読み込んだ後,キーボードから二つの数pとqを読み込んで.random10000.txtのp番目からq番目までの数の和を求めるプログラムを再帰関を使って作りたいのですが、どうすればようですか。

ファイルの10000.txtは、以下のように数字がランダムになっています。
56
67778
434
67

28
1087
.....

A 回答 (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には負の数は含まれないだろう、と言う希望的観測でのやっつけ仕事である。
*/
    • good
    • 1
この回答へのお礼

ありがとうございます!
参考にさせていただきました!

お礼日時:2021/06/08 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!