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

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

ただいまの
回答率

90.83%

  • C

    3331questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 295

BONERer

score 11

 前提・実現したいこと

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が入力されると入力を終了する」になっています。どちらをやりたいのでしょうか?

    キャンセル

  • BONERer

    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.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    解決策が分かりません・・・

    5人の点数をキーボードから読み込んで、合計点、平均点、最高点、最低点を表示したいのですが(点数は0以上100以下)、 実行例 5人の点数を入力してください。 1番:95 2

  • 解決済

    fgets関数を用いた文字列の判定

    fgets関数を利用して文字列を入力し、その文字列に含まれている最初のaが何番目にあるのかを判定したいのですが、実行すると入力を3回させられ、3回目に入力した文字列で結果が判定

  • 解決済

    AOJの問題。2行目に、指定された数のデータを一度にinputする方法がわからない。

    前提・実現したいこと 只今、PCKに向けてAOJを頑張っている高専生です。 言語はCを使っています。 そこで質問なのですが、 1行目に入力するデータ(整数)の数を提示し、 2行目に

  • 解決済

    C言語:整数の小数点以下切り上げ方法

    ceilは使わずに整数型aの+20%した値を小数点以下切上げで求めるにはどうしたらよいでしょうか?

  • 解決済

    C言語 ポインタ 関数

    ** C言語で引数として3つの整数値 min, max, *pをとり *p の値が min と max の範囲にあればなにもせず, minより小さければ *p の値をminに, m

  • 解決済

    C言語の入門書の問題

    二つの整数値を読み込んで、小さい方の数以上で大きい数以下の全整数を加えた数を表示するプログラムを作成せよ  という問題で、do文を使いたいのですがよく分かりません。  整数

  • 解決済

    並列処理を行うプログラムのコンパイルエラー。

    <環境> Windows10 64bit gcc(Mingw) https://qiita.com/Syo_pr/items/cca512d1043f33a3da2c

  • 解決済

    標準入力から最小最大値を求める

    コンパイルがうまくいきません。 どこが間違っているか教えてください。 宜しくお願い致します。 【問題】 標準入力されている数字の最大と最小を求める 【標準入力されている数字

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

  • C

    3331questions

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