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

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

ただいまの
回答率

90.48%

  • C

    3835questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 389
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

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

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

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

 該当のソースコード

#include<stdio.h>

void maxmin(int data[], int *max, int *min);

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

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

  maxmin(data, &max, &min);


  return 0;
}

void maxmin(int data[], int *max, int *min){

  int i=0;
  *max=0; 
  *min=100;

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

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • a_saitoh

    2018/04/24 13:13

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/04/25 15:55

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

    キャンセル

回答 4

checkベストアンサー

+1

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

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

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


ここに問題があります。

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

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

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


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

int data[10]={};


でよいかと思います。

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 16:11

    コメントありがとうございます。&&と||がごっちゃになってました。

    キャンセル

  • 2018/04/17 16:13

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

    キャンセル

  • 2018/04/17 16:27

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

    キャンセル

  • 2018/04/17 16:50

    あ、ごめんなさい 1. 2. 3. と書くつもりが 1. 1. 2. になっちゃいました。

    キャンセル

  • 2018/04/17 22:58

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

    キャンセル

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 16:12

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

    キャンセル

  • 2018/04/17 21:53

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

    キャンセル

+1

do{
  printf("%d番目の数:", i+1);
  scanf("%d", &data[i]);
  i++;
} 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 16:34

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

    キャンセル

  • 2018/04/17 16:36

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

    キャンセル

  • 2018/04/17 21:53

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

    キャンセル

  • 2018/04/17 21:56

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

    キャンセル

  • 2018/04/17 22:55

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

    キャンセル

  • 2018/04/17 22:57

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

    キャンセル

  • 2018/04/18 03:41

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

    キャンセル

  • 2018/04/18 05:10 編集

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

    キャンセル

  • 2018/04/18 20:52

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

    キャンセル

  • 2018/04/18 21:01

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

    キャンセル

  • 2018/04/18 21:03

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

    キャンセル

0

こんにちは、

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

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 256
#define MAX_NUMBER 10

void maxmin(int data[], int *max, int *min);

int main(void)
{
    char buf[BUFSIZE];  
  int i;
  int data[MAX_NUMBER];
  int max, min;

  for(i = 0; i < MAX_NUMBER; i++){
      printf("%d番目の数->",i + 1);
      fgets(buf,BUFSIZE,stdin);
      data[i] = atoi(buf);
      if(data[i] == -1){
          break;
      }
  }
  maxmin(data, &max, &min);

    printf("最大値: %d 最小値: %d\n",max,min);
  return 0;
}

void maxmin(int data[], int *max, int *min){

  int i = 0;

  *max = 0; 
  *min = 100;

  while(i < 10){
    if(data[i] != -1){
        if(data[i] > *max){
            *max = data[i];
        }
        if(data[i] < *min){
            *min = data[i];
        }
    }
    else{
        break;
    }
    i++;
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 21: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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3835questions

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