「これはヤバかったな」という遅刻エピソード

入力された二つの値の,絶対値が大きいほうの実数値を絶対値が小さいほうの実数値で割った値を表示するプログラムを教えてください。

質問者からの補足コメント

  • 可能であればincludeはstdio.hだけで
    swapとabs関数を別に用意してmain関数で呼び出すという方法だとありがたいです。
    実行例は
    Input n1:-18.9
    Input n2:12.1
    -18.900000/12.100000=-1.561983
    となってほしいです。

      補足日時:2021/12/21 23:05

A 回答 (5件)

「出力する」関数を別に作れば, swap する必要はないと思うんだ. 例えば


#include <stdio.h>
double fabs(double);

void displayMessage(double x, double y)
{
printf("%f/%f=%f\n", x, y, x/y);
}

int main()
{
double a, b;

printf("Input n1:"); fflush(stdout); scanf("%lf", &a);
printf("Input n2:"); fflush(stdout); scanf("%lf", &b);

if (fabs(a) > fabs(b)) {
displayMessage(a, b);
} else {
displayMessage(b, a);
}
}
でいいわけだし.
    • good
    • 0

> くだらないことを言ってすみませんでした。



分かればいいや。

あと、swapなんだけど、これって#defineマクロのネタとしては良く取り上げられるネタなんだけど・・・・・。みんな好きだな、このネタは。
そして確かに使い勝手はある。ただし、殆どのケースから言うと「使わない方がいい」。
Pythonなんかの言語だと、

>>> a , b = 0, 1
>>> a
0
>>> b
1
>>> a, b = b, a
>>> a
1
>>> b
0
>>>

なんか簡単にスワップ出来て「おおーッ」とは思うんだけどね。
ただ、こういうのは基本、最近では「破壊的変更」と言う。
出来れば避けた方が良い動作だ。
変数の中身が簡単に書き換えられると、思わぬバグを招く場合がある。

例えば、今、変数aとbがあって、条件によってa/bかb/aにしたい、とする。
swapでaとbの「中身を取り替えないとならない」ってのは「思い込み」なんだよ。これはどっちかっつーと「危険へと誘導する」考え方、なんだ。
どうせなら例えば

double array[2];

みたいにして配列を用意して

array[0] / array[1];



array[1] / array[0];

と計算式を二つ用意した方が「安全」なんだ。
そうすればデータ型を不必要に「書き換え」する必要がなくなる。
なかなかCじゃ難しいんだけど、「なるたけデータは変更しない」方針でプログラミングしていった方が見通しがいいし、より安全なプログラムになる可能性が高い。

そういう事をキチンと先生が教えなきゃダメなんだけどね。
    • good
    • 0

> 可能であればincludeはstdio.hだけで



そう言うくだらない事を要求しない事。
プロだエキスパートだ、って徘徊する場所で、どうして

「素人がたどたどしく書いたようなプログラムを書いてくれ」

って言えるのか。

恥を知れ、って事だな。
プロのピアニストに

「ピアノをやったことがない幼稚園児が弾くように弾いて下さい」

とか頼めるの?
マトモに考えろ。
プログラミングするとか以前の「人間としての常識の」範疇の話だ。

> swapとabs関数を別に用意してmain関数で呼び出すという方法だとありがたいです。

その辺は自分で苦労しろ。
コードを改造する事くらいやってみろ。
出来なきゃ諦めろ。

出力が想定するプログラムは以下のようになる、と予想はされる。
あとは知らん。自分で「自分が思うようにプログラムを改造しろ」。
それが無理なら誰か「自分の意のままに書いてくれる」プロのプログラマを探して、「お金を払って」解決してもらう事だ。
それがフツーで当たり前なんだよ。

人の善意を当たり前だ、と思うな。

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

int main(void) {
 double n[2];
 char s[11];
 for (int i = 0; i < 2; i++) {
  printf("Input n%d: ", i + 1);
  scanf("%10s%*[^\n]", s);
  getchar();
  n[i] = strtof(s, NULL);
 }
 bool flag = fabs(n[0]) > fabs(n[1]);
 printf("%lf / %lf = %lf\n", flag ? n[0] : n[1],
             flag ? n[1] : n[0],
             flag ? n[0] / n[1] : n[1] / n[0]);
 return EXIT_SUCCESS;
}
    • good
    • 0
この回答へのお礼

あなたの言うとおりもっと自分で苦労するべきでした。
くだらないことを言ってすみませんでした。
こんなくだらない質問にも丁寧に答えていただきありがとうございました。

お礼日時:2021/12/22 00:07

#include <stdio.h>


#include <stdlib.h>
#include <math.h>

int main(int argc, char** argv) {
 if (argc != 3) {
  goto end;
 }
 double m = strtof(argv[1], NULL);
 double n = strtof(argv[2], NULL);
 printf("%lf\n", fabs(m) > fabs(n) ? m / n : n / m);
end:
 return EXIT_SUCCESS;
}
    • good
    • 0

Abs()使え

    • good
    • 0

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


おすすめ情報