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

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

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

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

Q&A

解決済

4回答

1509閲覧

関数の引数に配列を使うことが難しい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2018/04/17 05:23

前提・実現したいこと

0~100の整数を10個入力して、最大値と最小値を求めて表示するプログラムをかきたいです。ただし、-1が入力されると処理を中止する、最大値最小値を求める関数は一つにしてmain以外でつくる、という制約のもとです。

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

実行すると11番目の数と表示されるのと、11回以上の入力を受け付けるという問題。エラーメッセージは出ていません。

該当のソースコード

C

1#include<stdio.h> 2 3void maxmin(int data[], int *max, int *min); 4 5int main(void){ 6 int i=0; 7 int data[10]; 8 int max, min=0; 9 10 for(i=0; i<10; i++){data[i]=0;} 11 do{ 12 printf("%d番目の数:", i+1); 13 scanf("%d", &data[i]); 14 i++; 15 }while(data[i-1]!=-1 || i<10); 16 17 maxmin(data, &max, &min); 18 19 20 return 0; 21} 22 23void maxmin(int data[], int *max, int *min){ 24 25 int i=0; 26 *max=0; 27 *min=100; 28 29 while(data[i]!=-1){ 30 if(data[i]>*max) *max=data[i]; 31 if(data[i]<*min) *min=data[i]; 32 i++; 33 } 34}

試したこと

何分エラーが出てないもんですから、手出しできませんでした。。。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

a_saitoh

2018/04/24 04:13

「-1が入力されると処理を中止する」とありますが、コードの動作は、「-1が入力されると入力を終了する」になっています。どちらをやりたいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/25 06:55

入力を終了したかったです。。僕の書き方だとどっちか分からないですね、ご指摘ありがとうございます。
guest

回答4

0

C

1do{ 2 printf("%d番目の数:", i+1); 3 scanf("%d", &data[i]); 4 i++; 5} while(data[i-1]!=-1 || i<10);

ここ、こーすればよくね?

for ( i = 0; i < 10; ++i ) { int val; printf("%d番目の数:", i+1); scanf("%d", &val); if ( val == -1 ) break; data[i] = val; }

投稿2018/04/17 05:33

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 07:34

コメントありがとうございます。仰せのを実行したのですが、これって変数valを間に挟む?というのは何かいいことがあるのでしょうか?(無知なので教えていただけると嬉しいです)
episteme

2018/04/17 07:36

不正な値にもかかわらず配列に格納されるのがキモチ悪かった。
pepperleaf

2018/04/17 12:53

これでは、-1 は、data[]に格納されませんが、、、。
episteme

2018/04/17 12:56

言い直す。 「不正な値にもかかわらず配列に格納されるのがキモチ悪かった」から、一旦valに読みこんで云々。
退会済みユーザー

退会済みユーザー

2018/04/17 13:55

冒頭に小さくありますが、-1が入力されたらプログラムを中止するという制約ありです。。(なんでこの制約?というのはごもっともです)
退会済みユーザー

退会済みユーザー

2018/04/17 13:57

不正な値っていうのは、例えば配列がint型なのに入力の時にint以外の型が入力される可能性があって、まだintであっても変数の方がマシってことですか?(推測でものを言ってます。。)
episteme

2018/04/17 18:41

たとえ使われないとしても、この配列に納められるのはふさわしくないと考えた。
episteme

2018/04/17 20:12 編集

あー、そかそか。-1を配列の終端マーカーとして使っているのか。 ならば僕のやり方は間違ってるですね。 # だったら配列は全部-1で初期化しておけばいいのに...
episteme

2018/04/18 11:52

...あれ? 終端マーカー使うんなら int data[11] じゃなきゃダメちゃうか?
can110

2018/04/18 12:01

入力は10回ループ。途中-1なら格納して終了。 minmaxも10回ループ。途中-1なら終了。 なら配列サイズ10で足りますね。
episteme

2018/04/18 12:03

ですね。minmax側もいぢくればOK.
guest

0

ベストアンサー

いくつか問題がありそうですが・・・。

11回以上受け付けるということに絞れば

C

1}while(data[i-1]!=-1 || i<10);

ここに問題があります。

入力値が -1 でないか i が 10 より小さいという条件なので 11回目以降に -1 を入力しない限りループを抜けません。

その他の追記
1.初期化の問題

C

1for(i=0; i<10; i++){data[i]=0;}

は、既に指摘がありますが・・・。
配列全体を0で初期化するのであれば、宣言部で

C

1int data[10]={};

でよいかと思います。

  1. 入力値の問題

課題では 入力値は 0~100 とありますので、-1 は途中で抜けるとしても
100 より大きい入力があれば 再入力を促すようにすべきかと思います。

  1. 最大値と最小値を求めて表示する

 「最大値と最小値を求めて表示する」とありますので、最後に min と max を表示しなければならないのでは?

投稿2018/04/17 05:30

編集2018/04/17 07:49
showkit

総合スコア1638

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 07:11

コメントありがとうございます。&&と||がごっちゃになってました。
退会済みユーザー

退会済みユーザー

2018/04/17 07:13

聞くの忘れていましたが、いくつかというのは何を指しますか?改善したいので教えていただきたいです。
退会済みユーザー

退会済みユーザー

2018/04/17 07:27

check関数もwhile文の中身がおかしかったことにようやく気づきました。これ以外であれば教えてほしいです!よろしくお願いします。
showkit

2018/04/17 07:50

あ、ごめんなさい 1. 2. 3. と書くつもりが 1. 1. 2. になっちゃいました。
退会済みユーザー

退会済みユーザー

2018/04/17 13:58

あっそれは全然気にしてませんでした。
guest

0

実行すると11番目の数と表示されるのと、11回以上の入力を受け付けるという問題。エラーメッセージは出ていません。

for文で配列を初期化したあと、変数iを初期化していないからでしょう。

c

1for(i=0; i<10; i++){data[i]=0;} 2i = 0; // 追加 3do{

※質問内容とタイトルがあってません。

投稿2018/04/17 05:30

ttyp03

総合スコア16998

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 07:12

コメントありがとうございます。ほんとですね、ここで値が保存されてたのか(前にも同じミスしました。。)
pepperleaf

2018/04/17 12:53

data[10] の宣言に対し、i を初期化してないので、data[10] とか、data[11]とか、アクセスしてます。これはメモリ破壊ですね。異常終了してもおかしくない状況。
guest

0

こんにちは、

1.最大で10個入力するところの10は、記号定数にしましょう。
2.入力はscanfよりはfgetsをおすすめします。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5#define MAX_NUMBER 10 6 7void maxmin(int data[], int *max, int *min); 8 9int main(void) 10{ 11 char buf[BUFSIZE]; 12 int i; 13 int data[MAX_NUMBER]; 14 int max, min; 15 16 for(i = 0; i < MAX_NUMBER; i++){ 17 printf("%d番目の数->",i + 1); 18 fgets(buf,BUFSIZE,stdin); 19 data[i] = atoi(buf); 20 if(data[i] == -1){ 21 break; 22 } 23 } 24 maxmin(data, &max, &min); 25 26 printf("最大値: %d 最小値: %d\n",max,min); 27 return 0; 28} 29 30void maxmin(int data[], int *max, int *min){ 31 32 int i = 0; 33 34 *max = 0; 35 *min = 100; 36 37 while(i < 10){ 38 if(data[i] != -1){ 39 if(data[i] > *max){ 40 *max = data[i]; 41 } 42 if(data[i] < *min){ 43 *min = data[i]; 44 } 45 } 46 else{ 47 break; 48 } 49 i++; 50 } 51}

投稿2018/04/17 12:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 12:26

出力結果 <例1>-1を入力しない場合 1番目の数->4 2番目の数->8 3番目の数->7 4番目の数->5 5番目の数->1 6番目の数->45 7番目の数->9 8番目の数->48 9番目の数->54 10番目の数->13 最大値: 54 最小値: 1 <例2>-1を入力する場合 1番目の数->4 2番目の数->8 3番目の数->6 4番目の数->-1 最大値: 8 最小値: 4
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問