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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1744閲覧

ポインタ型と配列型の引数を取る関数を用いたプログラムについて質問させてください。

Akihiro_O

総合スコア20

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/04 11:42

編集2019/01/04 12:36

前提・実現したいこと

書籍:「苦しんで覚えるc言語」の練習問題15の書き取り問題で、「0~100の範囲で入力された複数の数値の中から、最大値と最小値を求めて表示するプログラムを作成する」という課題に取り組んでいます。書籍に書いてある解答を参考にして自分なりのプログラムを書きたいです。そこで、とある問題が生じました。解答頂けると幸いです

問題文の詳細は以下の通りです。
「0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。」

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

最大値と最小値が入力した数値とは異なる数値が表示されてしまいます。
以下のように表示されます。
1番目の数字:4
2番目の数字:3
3番目の数字:5
4番目の数字:3
5番目の数字:6
6番目の数字:7
7番目の数字:3
8番目の数字:2
9番目の数字:54
10番目の数字:4
最大値:2008230864、最小値:-858993460

最大値と最小値がおかしな値になってしまいます。入力した数字の中で最大値と最小値を表示したいです。

該当のソースコード

自分の解答:
#include <stdio.h>
void maxminfunc(int data[], int *pmax, int *pmin);

int main(void)
{
int max, min, i, number[10];

printf("0~100の数字の中から10個の数値を入力してください\n"); for (i = 0;i < 10; i++) { printf("%d番目の数字:",i+1); scanf_s("%d", &number[i]); } maxminfunc(number, &max, &min); printf("最大値:%d、最小値:%d\n",max,min); return 0;

}

void maxminfunc(int data[],int *pmax,int *pmin)
{
int i=0;
*pmax = 0;
*pmin = 100;

while (data[i]!=-1) { if (*pmax<data[i]) { *pmax = data[i]; } if (*pmin>data[i]) { *pmin = data[i]; } i++; }

}

書籍の解答:
#include <stdio.h>

void maxmin(int array[],int max,int min);

int main(void)
{
int i = 0,array[10],max,min;

do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0;

}

void maxmin(int array[],int max,int min)
{
int i = 0;

*max = 0; *min = 100; while (array[i] != -1) { if (array[i] > max) max = array[i]; if (array[i] < min) min = array[i]; i++; }

}

試したこと

書籍の解答と関数のプログラムは一緒にしました。

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

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

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

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

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

episteme

2019/01/04 12:28

「自分なりのプログラムを書きたいです」なんでしょ? だったら何故に質問してるの? 何を質問してるんです?
guest

回答2

0

−1を末尾に入れておかないと、配列の外まで検索することになるのでは?

投稿2019/01/04 11:49

HogeAnimalLover

総合スコア4830

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

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

Akihiro_O

2019/01/04 13:47

ご回答有難うございます。 参考にさせていただきます。
guest

0

ベストアンサー

入力した数字の中で最大値と最小値を表示したいです。

であれば、
「要素の値が-1 または 調べた要素数が10に達する まで繰り返す」ことになるんじゃねぇの?

ついでに:

ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。

これマチガイ。正しくは:

最小値を探すには、最小値を記憶した変数との比較を繰り返せば良い。

投稿2019/01/04 13:32

編集2019/01/04 13:36
episteme

総合スコア16614

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

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

Akihiro_O

2019/01/04 13:46

ご回答有難うございます。 回答通りに、調べた要素数を10に達するまでにプログラムを書き換えましたら、無事に実行され正しい答えを得ることが出来ました。 また、ヒントの誤植を指摘していただき大変助かりました。
episteme

2019/01/04 13:54

あと、このコタエにはアナがある。要素数が0のとき、最大値:0 / 最小値:100 となる。おかしぃやろ。 要素数が0のとき解は「存在しない」となるべき。
Akihiro_O

2019/01/05 02:44

大変貴重なアドバイスを有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問