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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

3677閲覧

ポインタを用いた配列の最大値と最小値

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2018/07/05 09:18

編集2018/07/05 09:25

前提・実現したいこと

teratailを初めて使わせて頂きます。
大学でC言語のプログラムを勉強している者です。
要素数 num の整数型配列 array に対して,その配列要素の最大値と最小値を同時に求める関数
void max_and_min ( const int array[], int num, int *max, int *min )
を作成する問題が出たのですが、コンパイルできても実行時にエラーとなってしまい困っています。

発生している問題・エラーメッセージ

実行時にSegmentation fault (core dumped)と出てきてしまいます。

該当のソースコード

C言語

1include <stdio.h> 2define NUM 64 3 4void max_and_min (const int array[], int num, int *max, int *min) 5{ 6 int i; 7 *max = *min = array[0]; 8 9 for (i=0; i<num; i++) { 10 if (array[i] > *max) 11 *max = array[i]; 12 if (array[i] < *min) 13 *min = array[i]; 14 } 15 } 16} 17 18int main(void) 19{ 20 int i, n, array[NUM], max, min; 21 do { 22 scanf("%d\n", &n); 23 scanf("%d",&array[i]); 24 i++; 25 } while (n != 0); 26 27 max_and_min(array, n, &max, &min); 28 29 printf("%d %d\n", max, min); 30 31 return 0; 32} 33 34

試したこと

関数max_and_min内でforをなくしてwhile文も考えたのですが、どのように使えばいいか分かりませんでした。

補足情報(FW/ツールのバージョンなど)

ツールのバージョンはすみません、分かりませんでした。
整数の個数と整数は全て自分で入力したものを読み込み、個数が0と入力されたら終了です。

具体例
(入力)↓
5
-80 90 130 7 0
8
-14 10 5 7 16 24 36 -47
3
-34 -16 7
0

(出力)↓
130 -80
36 -47
7 -34

長々と質問してしまい、すみません。
まだプログラミングを始めたばかりで、正直何度プログラムを書きなおしてもできず困っています。
質問に回答していただけると幸いです。よろしくおねがいします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/05 09:28

すみません、囲みました。ご指摘ありがとうございます。エラーメッセージは実行時この文しか出て来なかったです、すみません。コンパイル時のエラーはありませんでした。
guest

回答1

0

ベストアンサー

C

int i, n, array[NUM], max, min;
do {
scanf("%d\n", &n);
scanf("%d",&array[i]);
i++;
} while (n != 0);

iが初期化されていません。宣言時に0に初期化すると良いでしょう。


また、n(データ数)の入力はループ前に受け取るべきです。
そうすれば次のように巡回できますね。

C

1for(int i = 0; i < n; ++i) { 2 scanf("%d", &array[i]); 3}

nが大きすぎる際にプログラムを終了させるのも簡単です。

コードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
C

投稿2018/07/05 09:19

編集2018/07/05 09:41
LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2018/07/05 09:21

回答有り難うございます。 main関数内のiを初期化すればいいのでしょうか?何度もすみません。
LouiS0616

2018/07/05 09:27

そうです。 初期化しないとどんな値が入るかわかりませんから、その状態でarray[i]にアクセスすると範囲外アクセスを踏みます。
退会済みユーザー

退会済みユーザー

2018/07/05 09:28

分かりました。丁寧なご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/07/05 09:44

プログラムを変更してみたのですが、入力をしてEnterキーを押しても結果が出ず、そのまま改行になってしまうのですが、どうすればいいでしょうか?本当に何度もすみません。
LouiS0616

2018/07/05 09:46

たぶん scanf("%d\n", &n); の部分が問題です。\n を取ってみてください。
退会済みユーザー

退会済みユーザー

2018/07/05 09:56

すみません、\nを消したのですが直りませんでした。
LouiS0616

2018/07/05 09:58

現状のコードを見せてください。
退会済みユーザー

退会済みユーザー

2018/07/05 09:59

#include <stdio.h> #define NUM 64 void max_and_min (const int array[], int num, int *max, int *min) { int i; *max = *min = array[0]; for (i=0; i<num; i++) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; } } int main(void) { int i=0, n, array[NUM], max, min; do { scanf("%d", &n); scanf("%d", &array[i]); } while (n != 0); max_and_min(array, i-1, &max, &min); printf("%d %d\n", max, min); return 0; } すみません、ここに貼り付けさせていただきます。
LouiS0616

2018/07/05 10:05

この部分ですね。 do {   scanf("%d", &n);   scanf("%d", &array[i]); } while (n != 0); これだとnに0を入力しない限りループから脱出しないです。 まずは、『入力した数値の最大値/最小値を求めるプロセス』を一回だけ実行できるようにしましょう。 何回も繰り返し実行できるようにするのは後からで良いです。
退会済みユーザー

退会済みユーザー

2018/07/05 10:22

できました! その部分のみを scanf("%d", &n); for (i=0; i<n; i++) scanf("%d", &array[i]); に変えたところ、一回分は実行できました。ありがとうございます。 繰り返しはwhileでいいのでしょうか?
LouiS0616

2018/07/05 10:25

意味合い的には、こんなふうに書くのがわかりやすいでしょうね。 while(1) {   nの入力を受け付ける;   if(n == 0) {     break;   }   略 }
退会済みユーザー

退会済みユーザー

2018/07/05 10:36

while (1) { scanf("%d", &n); if (n == 0) { break; } for (i=0; i<n; i++) scanf("%d", &array[i]); } と入力してみたのですが、 5 -80 90 130 7 0 8 -14 10 5 7 16 24 36 -47 3 -34 -16 7 0 と入力しても -34 -34 と一行しか出力されません。何度もすみません。
退会済みユーザー

退会済みユーザー

2018/07/05 10:39

すみません、whileの範囲が違っていました。できました!
退会済みユーザー

退会済みユーザー

2018/07/05 10:42

多くの質問に丁寧に答えていただいて本当にありがとうございました。しっかり復習しておきます。ありがとうございます!
LouiS0616

2018/07/05 10:57

解決されたようで何よりです。 問題をできるだけ細分化するのがコーディングのコツです。 このコツはこれからも大いに役立つと思いますので、今回の経験を活かして頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問