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

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

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

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

ファイル

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

Q&A

解決済

3回答

2952閲覧

1000個の整数が格納されているファイルを読み込み、最大値と最小値を表示したい

buriburizaemon

総合スコア23

C

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

ファイル

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

0グッド

2クリップ

投稿2021/04/12 12:23

編集2021/04/12 12:32

1000個の整数が格納されているファイルを読み込み、最大値と最小値を表示したいのですが、コンパイルすると最大値と最小値の値がとても大きくなって表示されてしまいます。どうすれば良いでしょうか?
プログラミング初心者です。よろしくお願いします。
c言語を使っています。コンパイラーはcpad for borland c++を使用しています。

コード
#include<stdio.h> int main(){ int i,a[1000],max,min; FILE*fp; fp=fopen("data1.txt","r"); max=a[0]; min=a[0]; for (i=1;i<1000;i++){ if(max<a[i]){ max=a[i]; } if(min>a[i]){ min=a[i]; } } fclose(fp); printf("最大値=%d\n",max); printf("最小値=%d\n",min); return 0; }

お手数をおかけしますがよろしくお願いします

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

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

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

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

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

buriburizaemon

2021/04/12 12:33

申し訳ございませんでした。只今、修正いたしました。 ファイルのデータを読むのにはどうすればよいのでしょうか? 初歩的な質問で申し訳ございません。
guest

回答3

0

ファイルの中身を読み込んでいない。
fopen の使い方を調べた後で、ファイルの中身を”一行づつ”読み込む方法を調べてみてください。

max=a[0];
min=a[0];

この部分ですが、aの配列は宣言されているだけで、初期化されていない状態です。
aの配列に、ファイルの中身を読み込んで使う設定だと思うので、ファイルの読み込み部分を作成してください。

最大値と最小値の初期値は、int で想定される数値を入れておくのがベターだと思います。
max には、想定される最小値を代入して、min には、想定される最大値を代入しておけば、良いと思います。

これって、宿題や課題ですか?

投稿2021/04/12 12:39

nfox

総合スコア229

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

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

buriburizaemon

2021/04/12 12:47

そうです。自力で調べたりしましたが、なかなか理解できないため、質問させていただきました。 ファイルの読み込みは fscanf(fp,”%d”,&a); を用いればよろしいのでしょうか? aの初期化とは、fopenのあとにa=0;と入力するのでしょうか? また、初期値はファイル内の値を入力するのでしょうか? 質問ばかりで申し訳ございません。
nfox

2021/04/12 12:56

ファイルの形式がわかりませんが、数値が連続しているのではなく、1行に数値が並んでいる形 例 100 102 65535 とかなら、fgets を調べてみてください。 fscanf でも出来ます。構文の使い方は大丈夫です。意味がわかっていれば、うまく使えるでしょう。 aは配列です。a=0では初期化出来ません。配列の初期化を調べるか、読み込み時に初期化されるから無視しましょう。 質問は悪い事では無いのですが、ご自分で試してみて、エラーが出て調べてを繰り返すほうが、実力が上がると思いますし、他の問題の時には対応ができるようになると思います。
buriburizaemon

2021/04/12 13:05

申し訳ございません。 最後に1つだけよろしいでしょうか? fscanfを入れる位置ですが、if(min>a[i]){            min=a[i]; のあとに挿入する形にするとエラーが出てしまいます。 ご教授願えないでしょうか?申し訳ございません
nfox

2021/04/12 13:09

ファイルの中身が、1000個の数字が必ずあると言うのなら、for文の最初に入れるのが良いかもしれません。 そして、1000個の数字が必ずあるという保証が無いのなら、ファイルから読み込む部分と最大値と最小値を求めるループは別にした方が無難だと思います。
buriburizaemon

2021/04/12 13:18

ファイルの中身に1000個必ず数字があるため、for文の最初にscanfを持ってきましたが、コンパイル結果の数字は8桁表示されました(ファイル内の数字は1から3桁) やはりプログラミングは難しいですね。
buriburizaemon

2021/04/12 13:20

#include<stdio.h> int main(){ int i,a[1000],max,min; FILE*fp; fp=fopen("data1.txt","r"); max=a[0]; min=a[0]; for(i=1;i<1000;i++){ fscanf(fp,"%d",&a); if(max<a[i]){ max=a[i]; } if(min>a[i]){ min=a[i]; } } fclose(fp); printf("最大値=%d\n",max); printf("最小値=%d\n",min); return 0; } このようにしました
nfox

2021/04/12 13:27

もう少しだと思います。 fscanf(fp,"%d",&a); の、最後の&a が曲者です。 何度か、書いていますが、a は配列です。&a は、aの配列のポインタを示しています。どこを刺しているのか考えれば、修正箇所は解ると思います。 わからなければ、&a ではなく、別にデータをファイルから取得するためだけど、変数を宣言してから、aの配列に順番に入れるようにすれば出来ます。 その前に、今の場所に読み込みを作るとなると、maxとminの初期値の問題と、配列の意味がなくなります。
buriburizaemon

2021/04/12 13:41

いろいろなところを変えましたが、思うように行きません。 修正箇所が本当にわかりません。どうしても&aを用いて実行したいです。 何度も申し訳ございません。
txty

2023/11/14 04:49 編集

削除
maisumakun

2021/04/12 13:57

> 修正箇所が本当にわかりません。どうしても&aを用いて実行したいです。 どのような理由でこだわるのですか?
nfox

2021/04/12 13:57

配列のaは、int a[1000]で、1000個の変数が作られています。 &a では、最初の a[0] を示されるだけです。 配列のポインターで調べてください。 この手の課題や宿題では、動かすだけなら簡単です。 &a が、配列の先頭部分を示しています。配列の次を示すようにすれば、動き出すでしょう。 それでも、このプログラムは正しい結果を示さないでしょう。 私が、最初の頃に指摘した部分が修正されていません。
buriburizaemon

2021/04/12 14:05

何度もすみません。 何をどう変更すればよろしいのでしょうか? 知識不足で申し訳ございません
buriburizaemon

2021/04/12 14:06

もう一度考え直してみます。 また、わからなければ質問させていただきます。
txty

2023/11/14 04:49 編集

削除
buriburizaemon

2021/04/12 14:24

やはり、わかりません #include<stdio.h> int main(){ int i,a[1000],max,min; FILE*fp; fp=fopen("data1.txt","r"); max=a[0]; min=a[0]; for(i=1;i<1000;i++){ fscanf(fp,"%d",&a[i]); if(max<a[i]){ max=a[i]; } if(min>a[i]){ min=a[i]; } } fclose(fp); printf("最大値=%d\n",max); printf("最小値=%d\n",min); return 0; } このようにしてもだめでした あとの解決策が思い浮かびません。
txty

2023/10/25 05:45 編集

削除
buriburizaemon

2021/04/12 15:15 編集

このようにすると最小値は合っており、最大値はだいぶ値に近づいてきたのでもう少しやってみます。 #include<stdio.h> int main(){ int i,a[1000],max,min; FILE*fp; fp=fopen("data1.txt","r"); for(i=1;i<1000;i++){ fscanf(fp,"%d",&a[0]); if(max<a[i]){ max=a[1000]; } if(min>a[0]){ min=a[0]; } } fclose(fp); printf("最大値=%d\n",max); printf("最小値=%d\n",min); return 0; } 皆様ありがとうございました。
txty

2023/10/25 05:45 編集

削除
buriburizaemon

2021/04/12 15:23

承知しました もう一度、ゆっくりと考えてみます。
txty

2021/04/12 15:28

頑張ってください
buriburizaemon

2021/04/12 15:30

ありがとうございます お手数をお掛けしました
dodox86

2021/04/12 17:26

コードをいじくりまわして望みの結果を出そうとするのではなく、1行1行何をやっているが自分で把握しましょう。例えば以下のコードで fscanfでは常にa[0]に値を入れていますが、比較しようとしているのはa[i]です。取り出す位置はa[1000]と固定で、これもまた変です。 > for(i=1;i<1000;i++){ > fscanf(fp,"%d",&a[0]); > > if(max<a[i]){ > max=a[1000]; > }
dodox86

2021/04/12 17:31

考える際は、a[0]~a[999]の配列やi、max, minなどの変数を紙に、for文の動きとともに描いてみると良いです。
txty

2023/10/25 05:48 編集

該当部分を削除しました。
dodox86

2021/04/13 00:08

@txtyさん > 数字の,とかの書式指定文字列になるのかとdodoxさん&a[0]の答え合わせがしたい。 本件はtxtyさんの質問ではありませんし、回答でもありません。当の質問者さんが混乱するので、txtyさんの要望を勝手に絡めるのはお控えいただいた方が良いと思います。
txty

2021/04/13 00:24 編集

すいません。printf("%d",a[0]);などしてください。なんかいくらやっても自信がつかない
Zuishin

2021/04/13 00:44

いや、自分で正しいかどうかわからないことを教えなくて大丈夫です。わかってる人が何人もいますから。
dodox86

2021/04/13 00:45

@txtyさん ですから、なぜ自分で自信が無いと思えるコードを提案するのですか。「printf("%d",a[0]);など」と、そこだけ見ても、私も分かりません。
txty

2023/10/25 05:46 編集

私が一番fscanf書いてる気がしたのですが、はいわかりました
buriburizaemon

2021/04/13 01:12

皆様、お騒がせして申し訳ございませんでした。 今朝ゆっくり考えてみると解決できました。 本当に皆様ありがとうございました。 また、今後ともよろしくお願いします。
fana

2021/04/13 01:42

(minとmaxが知りたいだけなら配列を用いる必要がないよね,…っていうのは言っちゃダメな雰囲気?)
nfox

2021/04/13 01:47

宿題や課題だと判断しています。 そのために、配列を用いるのは、出題者が出しているのだと解釈して、黙っていました。 最大と最小を求めたあとに、私なら、ソートさせたり、最大から5個の数字を出力せよとか、奇数を数えろとか、配列を使った課題を出すと思います。
dodox86

2021/04/13 01:48

>@質問者 buriburizaemonさん 解決した場合、どのように解決したのか。いただいた回答が直接的に解決に役立ったのであればBAを差し上げるなり、自己解決であればコードなどの解決方法とともに自分で解答を投稿して閉じるのがまぁ、マナーです。 [質問を解決済みにしたい] https://teratail.com/help#resolve-question
K_3578

2021/04/13 01:57

この手の質問見てると 宿題やら課題やらにしてもストレートに言わずに上手いこと部分的に切り取って質問すれば いいのになーと思う。 ただの独り言です。
Zuishin

2021/04/13 02:11

この質問に関しては、普通なら「ファイルを読み込んでいない」で解決するはずで、ファイルをどう読み込むかが本当に知りたいことになるわけですが、それを聞く能力がないように思います。 ファイルの読み込み方はファイル形式やデータの扱いによって違いますが、それをきちんと切り取れる能力があるなら、そもそもこのような質問をせずに済むのではないでしょうか。
K_3578

2021/04/13 02:26

>それを聞く能力がないように思います。 成程、生きていく中でそれが磨かれなかったのか。 質問としては正直このコメント欄の問答どころか質問文書いてる時間で解決出来そうですしね。
nfox

2021/04/13 02:31

質問者のことや、質問の仕方に関する話をする場所ではないと思うので、止めませんか? 自分で始めたことですが、質問者に申し訳なくて・・・。
K_3578

2021/04/13 02:40

>nfoxさん 場所もそうですし、立場を考えるべきでしたね、申し訳ない。
guest

0

自己解決

コード ```ここに言語を入力 ```ここに言語を入力 #include<stdio.h> int main(){ int i,j,MAX,MIN; FILE*fp; fp=fopen("data1.txt","r"); for(i=1;i<1000;i++){ fscanf(fp,"%d",&j); if(MAX<j){ MAX=j; } if(MIN>j){ MIN=j; } } fclose(fp); printf("最大値=%d\n",MAX); printf("最小値=%d\n",MIN); return 0; }
```お騒がせして申し訳ありませんでした。 皆様ありがとうございました。

投稿2021/04/13 03:42

編集2021/04/13 06:33
buriburizaemon

総合スコア23

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

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

int32_t

2021/04/13 03:46

どのように解決したか書いてくださいませ。
buriburizaemon

2021/04/13 06:34

上記のようにコードを変更すると、最大値と最小値が正確に表示されました
dodox86

2021/04/13 06:39

[2021/04/12 21:32]に編集された回答を読んで: > int i,j,MAX,MIN; int MAXもint MINも適切に初期化されていないので、初期値としてゴミを使うことになります。ですので得られた結果は不安定になります。ここは別回答でnfoxさんが提案してくださったように、適切な初期値を入れるべきですね。
fana

2021/04/13 06:43

> for(i=1;i<1000;i++) これだと 1000個 を処理していないのでは.
buriburizaemon

2021/04/13 06:53

では初期値を入力し、改善したいと思います。 今回は、すべて三桁以内の正負の数がファイルに入っているので、それを踏まえて初期値の入力を行いたいと思います。 ありがとうございました。
fana

2021/04/13 07:07

例えば for( i=1; i<3; i++ ){ printf( "%d\n", i ); } とすると,出力されるのは 1 と 2 だけです.3 は出力されません. つまり,printf の実行は2回です. 同様に,現状の for(i=1;i<1000;i++) { fscanf(fp,"%d",&j); ...(略) } という記述では,fscanf等は 999 回しか実施されない という話です.
buriburizaemon

2021/04/13 07:12

ということは、for(i=0;i<1000;i++)でよろしいでしょうか? ご丁寧にありがとうございます。
fana

2021/04/13 07:35

> for(i=0;i<1000;i++)でよろしいでしょうか? OK. 「forの方は999回のままにしておいて,forよりも前に1回読み込んでその値を MinとMax に入れてやる」みたいな方針でも良いと思う. (元々の質問文内のコードはそういう方向でやろうとした書き方に見える)
buriburizaemon

2021/04/13 07:40

承知しました 本当にありがとうございました。
guest

0

無事に解決することができました。
お騒がせして申し訳ありませんでした。

投稿2021/04/13 03:41

buriburizaemon

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問