ページ 1 / 1
逆数、絶対値について
Posted: 2010年7月11日(日) 17:24
by ttt
はじめまして。分からないことがあるのでお願いします。
以下のような問題が出されました。
実数値dxの逆数(1/dx)を返す関数invertを作成せよ。
これをサンプルプログラムに追加してnに負の数が入力された場合は
1/(x^|n|)(|n|はnの絶対値)を計算できるよう修正せよ。
サンプルプログラムは
#include <stdio.h>
/*---dxのno乗を返す---*/
double power(double dx,int no)
{
int i;
double tmp = 1.0;
for ( i=1; i<= no; i ++ )
tmp *= dx;
return (tmp);
}
int main(void)
{
int n;
double x;
printf("実数を入力してください:"); scanf("%lf",&x);
printf("整数を入力してください:"); scanf("%d",&n);
printf("%.2fの%d乗は%.2fです。\n",x,n,power(x,n));
return(0);
}
という感じです。以下のように作ったのですが…
1/(x^|n|)のところがよくわかりません。絶対値のfabsは使わない指定です。
そもそも考え方もあっているのかよくわからないのでご意見お願いします。
#include <stdio.h>
/*---1/(dx^|no|)を返す---*/
double power(double dx,int no)
{
int i;
double tmp = 1.0;
no=-no;
for ( i=1; i<= no; i ++ )
tmp *= 1/dx;
return (tmp);
}
double invert(double dx)
{
double tmp;
tmp = 1/dx;
return (tmp);
}
int main(void)
{
int n;
double x;
printf("実数xを入力してください:"); scanf("%lf",&x);
printf("整数nを入力してください:"); scanf("%d",&n);
if(n<0){
printf("1/(x^|n|)は%.2fです。\n",x,power(x,n));
}
else
printf("%.2fの逆数は%.2fです。\n",x,invert(x));
return(0);
}

Re:逆数、絶対値について
Posted: 2010年7月11日(日) 18:22
by ドラ
power関数の第二引数が負値の場合にも対応できるように改造するのではないですか?
考え方としては、まず x^|n| を計算しておいて、
・n が0以上ならそのまま返す。
・n が負なら(invert関数を呼び出し)逆数にして返す。
という感じでいいと思います。
Re:逆数、絶対値について
Posted: 2010年7月11日(日) 18:46
by ttt
>>ドラさん
返答有難うございます。
>>考え方としては、まず x^|n| を計算しておいて、
>> ・n が0以上ならそのまま返す。
>> ・n が負なら(invert関数を呼び出し)逆数にして返す。
こういうことでしょうか?
しかしxに2、nに-2を代入しても1/(x^|n|)は2となってしまいます・・・
なぜでしょうか?
#include <stdio.h>
double invert(double dx)
{
double tmp;
tmp = 1/dx;
return (tmp);
}
double power(double dx,int no)
{
int i,x;
double tmp = 1.0;
if (no<0) no = -no;
for ( i=1; i<= no; i ++ )
tmp *= dx;
if(no>=0) return (tmp);
else return(invert(tmp));
}
int main(void)
{
int n;
double x;
printf("実数xを入力してください:"); scanf("%lf",&x);
printf("整数nを入力してください:"); scanf("%d",&n);
if(n<0){
printf("1/(x^|n|)は%.2fです。\n",x,power(x,n));
}
else
printf("%.2fの逆数は%.2fです。\n",x,power(x,n));
return(0);
}
Re:逆数、絶対値について
Posted: 2010年7月11日(日) 19:16
by box
3の-2乗のように、負数のべき乗(答えは1/9)を求める場合は、
1)まずは9(3の2乗)を求める
2)9をinvert()に渡して、逆数を求める
3)求めた逆数(1/9)を返す。
という考え方をとります。

Re:逆数、絶対値について
Posted: 2010年7月11日(日) 19:37
by ttt
>>boxさん
返答ありがとうございます。
>>invert()の中で
>> ・power()を呼び出して、まずは9を求める
>> ・求めた9の逆数を返す
以下のようでしょうか?
何度も申し訳ありませんが3の-2乗としたら3と出てしまいます。
なにがいけないのでしょうか?
#include <stdio.h>
double power(double dx,int no)
{
int i;
double tmp = 1.0;
for ( i=1; i<= no; i ++ )
tmp *= dx;
return (tmp);
}
double invert(double dx,int no)
{
double tmp;
tmp = 1/(power(dx,no));
return (tmp);
}
int main(void)
{
int n;
double x;
printf("実数xを入力してください:"); scanf("%lf",&x);
printf("整数nを入力してください:"); scanf("%d",&n);
if(n<0){
printf("1/(x^|n|)は%.2fです。\n",x,invert(x,n));
}
else
printf("%.2fの逆数は%.2fです。\n",x,power(x,n));
return(0);
}
Re:逆数、絶対値について
Posted: 2010年7月11日(日) 19:38
by ドラ
double power(double dx,int no)
{
int i,x;
double tmp = 1.0;
if (no<0) no = -no; // これを実行すると
for ( i=1; i<= no; i ++ )
tmp *= dx;
if(no>=0) return (tmp); // こっちしか返さなくなる
else return(invert(tmp));
}
Re:逆数、絶対値について
Posted: 2010年7月11日(日) 19:54
by box
No.56504におけるinvert関数の実装と、もともとの仕様である
>実数値dxの逆数(1/dx)を返す関数invertを作成せよ。
とが食い違っています。
invert関数の中でpower関数を呼び出す、という仕様ではないはずです。
Re:逆数、絶対値について
Posted: 2010年7月11日(日) 20:17
by box
>>>invert()の中で
>>> ・power()を呼び出して、まずは9を求める
>>> ・求めた9の逆数を返す
これは、たぶん、私の56503の編集前の状態を引用されたのだと思いますが、
この時点では、
>実数値dxの逆数(1/dx)を返す関数invertを作成せよ。
というもともとの仕様を見落としておりました。
現時点での私の見解は、56506で書いたとおりです。
Re:逆数、絶対値について
Posted: 2010年7月12日(月) 15:44
by ttt
>>ドラさん
>>boxさん
返事遅れて申し訳ないです。親切に有難うございます。一応完成しました。
何度もすみませんが、以下のような感じでよろしいでしょうか?
改善した方がよいところがあればご指摘お願いします。
/*
実数値dxの逆数(1/dx)を返す関数invertを作成。
教科書p.120のプログラムに追加してnに負の数が入力された場合は
1/(x^|n|)(|n|はnの絶対値)を計算できるよう修正せよ。
*/
#include <stdio.h>
double invert(double dx)
{
double tmp;
tmp = 1/dx;
return (tmp);
}
double power(double dx,int no)
{
int i;
double tmp = 1.0;
if(no>=0)
{
for ( i=1; i<= no; i ++ )
tmp *= dx;
return (tmp);
}
else{
no=-no;
for ( i=1; i<= no; i ++ )
tmp *= dx;
return (tmp);
}
}
int main(void)
{
int n;
double x,y;
printf("実数xを入力してください:"); scanf("%lf",&x);
printf("整数nを入力してください:"); scanf("%d",&n);
if(n<0){
y=power(x,n);
printf("%.2fの%d乗は%.2fです。\n",x,n,invert(y));
}
else
printf("%.2fの%d乗は%.2fです。\n",x,n,power(x,n));
return(0);
}
Re:逆数、絶対値について
Posted: 2010年7月12日(月) 21:58
by box
power関数の中に、全く同じfor文ループが2個ありますね。
1個にできるはずです。考えてみてください。