数字を小さい順に並べるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
youaaaaaa

数字を小さい順に並べるプログラム

#1

投稿記事 by youaaaaaa » 2年前

どこが間違っているのか教えて欲しいです。

/* 三つのint型整数を小さい順に表示する関数
  int min3(int x, int y, int z)
を作成せよ.但し,動作を確認するための適当なmain関数も併せて作成せよ.*/

#include <stdio.h>

void swap(int *k,int *l)
{int temp;
temp=*k;
*k=*l;
*l=temp;
return;
}

void min3(int x,int y,int z)
{
int data[]={x,y,z};

if(data[0]>data[1]){
swap(&data[0],&data[1]);
}

if(data[1]>data[2]){
swap(&data[1],&data[2]);
}

if(data[2]>data[3]){
swap(&data[2],&data[3]);
}

printf("%d,%d,%d",data[0],data[1],data[2]);

return;
}


int main(void)
{int i;
int data[];
printf("数字を入力してください");
for(i=0;i<=2;i++){
printf("i=");
scanf("%d",data);}

printf("小さい順に並べると%dとなります。");min3(&data[0],&data[1],&data[2]);

return 0;

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を小さい順に並べるプログラム

#2

投稿記事 by みけCAT » 2年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
オフトピック
他の回答者さんへ:
掲示板の配慮を欠いた設計により、[​i]が終了タグが無いにも関わらず斜体のタグと解釈され、
隠されているようです。
コードは引用画面から読むのが良いです。
youaaaaaa さんが書きました:
2年前
どこが間違っているのか教えて欲しいです。
まずはコンパイラ様に教えてもらいましょう

コード:

prog.c: In function 'main':
prog.c:39:5: error: array size missing in 'data'
   39 | int data[];
      |     ^~~~
prog.c:43:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
   43 |     scanf("%d",data[i]);}
      |            ~^  ~~~~~~~
      |             |      |
      |             int *  int
prog.c:45:32: warning: format '%d' expects a matching 'int' argument [-Wformat=]
   45 |     printf("小さい順に並べると%dとなります。");min3(&data[0],&data[1],&data[2]);
      |                               ~^
      |                                |
      |                                int
prog.c:45:53: warning: passing argument 1 of 'min3' makes integer from pointer without a cast [-Wint-conversion]
   45 |     printf("小さい順に並べると%dとなります。");min3(&data[0],&data[1],&data[2]);
      |                                                     ^~~~~~~~
      |                                                     |
      |                                                     int *
prog.c:15:15: note: expected 'int' but argument is of type 'int *'
   15 | void min3(int x,int y,int z)
      |           ~~~~^
prog.c:45:62: warning: passing argument 2 of 'min3' makes integer from pointer without a cast [-Wint-conversion]
   45 |     printf("小さい順に並べると%dとなります。");min3(&data[0],&data[1],&data[2]);
      |                                                              ^~~~~~~~
      |                                                              |
      |                                                              int *
prog.c:15:21: note: expected 'int' but argument is of type 'int *'
   15 | void min3(int x,int y,int z)
      |                 ~~~~^
prog.c:45:71: warning: passing argument 3 of 'min3' makes integer from pointer without a cast [-Wint-conversion]
   45 |     printf("小さい順に並べると%dとなります。");min3(&data[0],&data[1],&data[2]);
      |                                                                       ^~~~~~~~
      |                                                                       |
      |                                                                       int *
prog.c:15:27: note: expected 'int' but argument is of type 'int *'
   15 | void min3(int x,int y,int z)
      |                       ~~~~^
ただし、コンパイラ様もすぐには気付けない間違いもあります。
致命的に間違っている場所にコメントを書きました。

コード:

#include <stdio.h>

void swap(int *k,int *l)
{int temp;
    temp=*k;
    *k=*l;
    *l=temp;
    return;
}

void min3(int x,int y,int z)
{
    int data[]={x,y,z};

    if(data[0]>data[1]){
        swap(&data[0],&data[1]);
    }

    if(data[1]>data[2]){
        swap(&data[1],&data[2]);
    }

    if(data[2]>data[3]){ /* 範囲外の data[3] にアクセスしている (コンパイラ様の指摘には無い) */
        swap(&data[2],&data[3]); /* 範囲外の data[3] にアクセスしている (コンパイラ様の指摘には無い) */
    }
    
    printf("%d,%d,%d",data[0],data[1],data[2]);

    return;
}
    

int main(void)
{int i;
int data[]; /* 要素数を指定せず(明示的な指定も、初期化による暗黙の指定も無い)配列を定義しようとしている */
    printf("数字を入力してください");
for(i=0;i<=2;i++){
    printf("i=");
    /* int型のデータへのポインタを渡すべき所に、ポインタではなく整数を渡している */
    /* (data[i] の前に & が抜けている) */
    scanf("%d",data[i]);}

    /* int型のデータを出力する書式 %d が使われているのに、対応するデータを渡していない */
    printf("小さい順に並べると%dとなります。");
    /* int型のデータを渡すべき所に、整数ではなくポインタを渡している */
    /* (余計な & が入っている ) */
    min3(&data[0],&data[1],&data[2]);
   
    return 0;
    
}
プログラムとしては致命的ではないですが、
youaaaaaa さんが書きました:
2年前
int min3(int x, int y, int z)
を作成せよ.
と書かれているのに、返り値の型が違う

コード:

void min3(int x,int y,int z)
しか作成していないのも間違いといえますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を小さい順に並べるプログラム

#3

投稿記事 by みけCAT » 2年前

みけCAT さんが書きました:
2年前
まずはコンパイラ様に教えてもらいましょう
ごめんなさい、リンク先間違いです。
(編集の制限時間ギリギリでリンクが抜けていることに気がついたのででよく確認せずにリンクを貼り、
そのまま時間切れになってしまいました)
正しくは https://wandbox.org/permlink/rcRUewltC5f1jSwk
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る