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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

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

Q&A

解決済

3回答

18304閲覧

C言語で printf が表示されない

mtyz06

総合スコア5

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

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

0グッド

0クリップ

投稿2016/01/01 13:03

編集2016/01/01 13:11

###前提・実現したいこと
teratail初心者であり、C言語初心者です。
環境は、OS X 10.11.2です。
同じ結果になるように書いたつもりの下の2つのプログラムが、結果が同じにならない理由がわかりません。
ご教授お願い致します。

###発生している問題・エラーメッセージ
ソースコード2がうまくいってないように思います。

ソースコード1の実行結果:
まず入力する実数の個数を入力せよ。3
1個目の実数を入力せよ: 63
2個目の実数を入力せよ: 56
3個目の実数を入力せよ: 3
最大値は1番目である。
最小値は3番目である。
最大値は63.000000である。
最小値は3.000000である。
最大値と最小値の差は60.00である。

ソースコード2の実行結果:
1つ目の実数を入力してください。:63
まだ入力しますか?・・・Yes=1, No=0)
1
2つ目の実数を入力してください。:56
まだ入力しますか?・・・Yes=1, No=0)
1
3つ目の実数を入力してください。:3
まだ入力しますか?・・・Yes=1, No=0)
0
最大値は1番目です。
最大値は63.000000です。
最小値は0.000000です。

###ソースコード1

#include <stdio.h> int main(void) { int i, n, j, maxc, minc; double min, max, sa, num[n+1]; printf("まず入力する実数の個数を入力せよ。"); scanf("%d", &n); for(i = 0; i < n; i++) { printf("%d個目の実数を入力せよ: ", i + 1); scanf("%lf", &num[i]); } min = max = num[0]; for(i = 1; i < n; i++) { if (num[i] < min) { min = num[i]; } if (num[i] > max) { max = num[i]; } } for (j = 0; j < i; j++) { if (num[j] == max) { printf("最大値は%d番目である。\n", j+1); break; } } for (j = 0; j < i; j++) { if (num[j] == min) { printf("最小値は%d番目である。\n", j+1); break; } } printf("最大値は%lfである。\n", max); printf("最小値は%lfである。\n", min); sa = max - min; printf("最大値と最小値の差は%.2lfである。", sa); return 0; }

###ソースコード2

#include <stdio.h> int main(void) { int count, maxc, minc; int i = 0; int j = 0; double num[i], min, max, sa; do { printf("%dつ目の実数を入力してください。:", i+1); scanf("%lf", &num[i]); i = i + 1; printf("まだ入力しますか?・・・Yes=1, No=0)\n"); scanf("%d", &count); } while (count == 1); printf("%d\n", i); max = min = num[0]; for(j = 1; j <= i; j++) { if (num[j] <= min) { min = num[j]; } if (num[j] >= max) { max = num[j]; } } for (j = 0; j < i; j++) { if (num[j] == max) { printf("最大値は%d番目です。\n", j+1); break; } } for (j = 0; j < i; j++) { printf("%d\n", j); if (num[j] == min) { printf("最小値は%d番目です。\n", j+1); } } printf("最大値は%lfです。\n", max); printf("最小値は%lfです。\n", min); sa = max - min; printf("最大値と最小値の差は%.2lfです。", sa); return 0; }

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

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

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

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

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

argius

2016/01/01 13:20

コンパイラーは何を使っていますか?
guest

回答3

0

C言語の配列は固定サイズなので、num[n]では配列サイズが0や1になってしまっていると思います。
これだと他の環境では正しく動作しない可能性があります。

実行時に任意のサイズの配列を作るには、malloc関数などを使って動的に確保する必要があります。

投稿2016/01/01 13:38

argius

総合スコア9388

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

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

mtyz06

2016/01/01 14:42

自分の使っているコンパイラ(gcc)では、配列の要素数をプログラム中に変更できるようなためたまたまできていると言った感じでしょうか。 迅速な回答に感謝します。
guest

0

ソース1にもソース2にも、根本的な間違いがあります。

C言語では、要素が追加される毎に配列が勝手に拡張されることはありません。
C言語での変数の宣言はメモリの確保を意味しますので、配列は必ず必要な大きさで宣言する必要があります。

C

1#define INPUTLIMIT 100 2double num[INPUTLIMIT];

などとしてください。

投稿2016/01/01 13:36

chun

総合スコア324

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

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

mtyz06

2016/01/01 14:43

自分の全くの勉強不足に恥ずかしい限りです。 今後のc言語学習に役立つ知識をご教授下さりありがとうございます。
guest

0

ベストアンサー

num は num[0] から num[2] に値が入っていますが、min を求めるための for は
for(j = 1; j <= i; j++) {
if (num[j] <= min) {
min = num[j];
}
となっており、num[1] から num[3] をチェックしているのがおかしいです。
それで、値の入っていない num[3] をチェックでゴミと比較することになり、それがもし0など、これまでの最小値より小さいものが入っておれば、それが最小値になってしまいます。

投稿2016/01/01 13:29

yoshi777

総合スコア674

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

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

mtyz06

2016/01/01 14:47

修正したところ、正しく表示されました。 迅速な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問