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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2584閲覧

[C言語] 配列を使用した最小値を求めるプログラムについて

Sophian

総合スコア36

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/02/13 04:33

編集2016/05/15 12:19

###前提・実現したいこと
C言語です。数字3つを配列に代入して、For分によって最小値を求めるプログラムを作っているのですが、うまくいきません。原因は何でしょうか。よろしくお願いします。
###発生している問題・エラーメッセージ
For文による比較代入を行った後に最小値が毎回”2”になり、配列最後の値がなぜか”3”になるという意味不明な事態に陥っています。
For文の直前で変数の中身をすべて表示させてみたところ、num[2]も含み全て正常値が代入されていました。
なのでFor文に原因があるとは思うのですが…。
非常に初歩的なことをお聞きして申し訳ないのですが、当方全く見当がつきません。

###ソースコード

C

1#include<stdio.h> 2 3int main(void){ 4 5 int num[2]; 6 int mini=0; 7 int i; 8 9 printf("Input First number.\n"); 10 fflush(0); 11 scanf("%d",&num[0]); 12 printf("Input First number.\n"); 13 fflush(0); 14 scanf("%d",&num[1]); 15 printf("Input First number.\n"); 16 fflush(0); 17 scanf("%d",&num[2]); 18 19 mini=num[0]; 20 for(i=0;i<=2;i++){ 21 if(mini>num[i]){ 22 mini=num[i]; 23 } 24 } 25 printf("Minimum number is %d.\n",mini); 26 printf("1st number is %d. ",num[0]); 27 printf("2nd number is %d. ",num[1]); 28 printf("3rd number is %d.\n",num[2]); 29 return 0; 30}

以下コンソール

Input First number. 43 Input First number. 52 Input First number. 43 Minimum number is 2. 1st number is 43. 2nd number is 52. 3rd number is 3.

###補足情報(言語/FW/ツール等のバージョンなど)
Eclipse Cpp Mars
MinGW

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

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

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

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

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

guest

回答3

0

ベストアンサー

配列数が足りてません。

c

1int num[2]; -> int num[3];

確保していないメモリを読んでるので、値は不定になっています。
上記のコードでコンピュータを再起動してからもう一度やってみると、また値が変わったりしますよ。

投稿2016/02/13 04:41

K_S_

総合スコア419

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

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

Sophian

2016/02/13 04:54 編集

なるほど!確保していないメモリもエラーが発生せず読み込めてしまうのですね。解答ありがとうございますm( _ _)m
guest

0

num 変数がnum[2]で宣言されているのに3つ目にアクセスしていますね。アクセス違反です。

配列の添字は0から始まるので2と宣言した場合にはnum[0]、num[1]しかアクセスできません。
num[3]と宣言したら直ると思います。

投稿2016/02/13 04:42

編集2016/02/13 04:43
chinyato

総合スコア241

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

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

Sophian

2016/02/13 04:56

丁寧な解答ありがとうございます!解決しました!
guest

0

配列の宣言は要素が3つなので、

c

1int num[3];

ではないでしょうか。

また最小値を求めるので

c

1 if(mini<num[i]){ // ここを変更 2 mini=num[i]; 3 }

ではないでしょうか。

投稿2016/02/13 04:39

sekitaka_1214

総合スコア509

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

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

K_S_

2016/02/13 04:43

mini>num[i] は正しいと思いますよ。
Sophian

2016/02/13 04:51

迅速な対応ありがとうございます!解決しました!当方の認識不足でした。
sekitaka_1214

2016/02/13 05:59

あ、ホントだ。あってますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問