アプリ版:「スタンプのみでお礼する」機能のリリースについて

まずはこれを見てください()
#include<stdio.h>
void maxmin(int array[],int max,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++;
}
}
このプログラムが書いてあり疑問に思った点が2つあります。
[1]while(array[i-1]!=-1のところのi-1とはdo~while文では条件式が後判定なため、プログラムが一回は行われるからi-1なのですか?
[2]maxmin関数の呼び出し部分、maxmin(array[],&max,&min)では&max,&minと渡しているのに、maxmin関数での宣言部分の引数が(int max,int min);と書いてあり、ポインターの(int*max,int *min)
でないのはどうしてですか?ポインター引数でないとアドレスが書き換えられないのでは?

A 回答 (5件)

本気でエラー処理をしだすと「入門」の範疇をはるかに逸脱しちゃうような気しかしませんしね>#4.



printf の返り値のチェック, したことないなぁ....

あとよく見たら maxmin の宣言もおかしい感じがする.
    • good
    • 0

示されているプログラムは、どういう位置づけのものでしょうか?


どこかのHPに例示されたもの?

このプログラムが正しい前提で疑問を持たれているようですが、
疑問を持たれるとおり、変なところがあります。

動かした実績のないプログラムだと思います。
(テキストとして、書いただけという感じがします。)
    • good
    • 0

疑問となっている部分は既に回答があるので、その他のツッコミを。



>printf("%d番目”i+1);

たぶんコピペミスでしょうが、「,」が足りない。

>do
>{
> printf("%d番目”i+1);
> scanf("%d",&array[i]);
> i++;
>}while(array[i-1]!=-1);

バッファオーバーランを実施できるお手本のようなコードです。
11回以上数字を入力しよう!!
# scanf()で数字以外を入力してみるのもいいかも。(まぁ、入門じゃそういうエラー処理省かれるんですけど)
    • good
    • 0

[1] は条件判定の前に i++; が入っているから, だね. 各変数の値がどのように変化するかをじっと追っていけばわかるはず.



i++; をなくしてそのあとの判定を
} while (array[i++] != -1);
にした方がシンプルだけど, 「入門」だとどこで扱おうかねぇ.

[2] は, 「ポインター引数でないとアドレスが書き換えられないのでは?」という文はおかしい (「アドレス」は書き換えられない) けど宣言/定義の部分ではポインタにしないとまずい. まともなコンパイラでは「関数を呼び出す」部分ではエラーにならないと思うけど関数 maxmin の中でエラーが出る.

まあこのままだと main の中でもエラーになる.
    • good
    • 0

> do~while文では条件式が後判定なため、プログラムが一回は行われるからi-1なのですか?



もっと言うと、そのdo~whileの中で、初期値が0だったiをi++してるから。


> ポインター引数でないとアドレスが書き換えられないのでは?

その通りで、まともなコンパイラならエラーにしてくれます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!