階乗を求めるプログラムを作りたいのですが、どうも上手くいきません・・・。下のプログラムを作ってみたのですが、エラーになってしまいます。どなたか教えてください、お願いします!!

#include <stdio.h>

void main(void)
{
int i,j;
long a=1;

for (i=1; i<=10; i++){
for(j=1 ;j <=i; j++){
a=a*j;
}

printf("%3d %ld \n",i,a);
}
}

A 回答 (3件)

これって 1~10までの階乗を出力するってプログラムですよね?


実際に階乗の計算を行ってるのは2つ目のforループで行っていると
思いますが、その前にaを初期化してない為に前に計算した階乗の値が
残ってしまってるからじゃないかと思います。

for (i=1; i<=10; i++){
 a = 1; //←初期化
 for(j=1 ;j <=i; j++){
  a=a*j;
 }
 printf("%3d %ld \n",i,a);
}

もしくは...
int num = 10; //求める階乗数
int a,i;
for(i=1,a=1;i<=num;i++,a=a*i) printf("%3d %ld \n",i,a);

こんな感じになると思います。
    • good
    • 4

 回答は他のかたがなさっているので、アドバイスと称して苦言を一つ。



 プログラムが仕様通りの動作をしないとき、「どうも上手くいきません」「エラーになってしまいます」で片付けていたら、永久にプログラミングは上達しませんよ。

 プログラムを書いてみたが、思い通りに動かない。それは、プログラミングでは当たり前です。むしろそれからが始まりです。「どうも上手くいきません」とは、具体的にどういう現象が起きるのでしょう。「エラーになってしまいます」とは、どんなエラーメッセージが出るのでしょう。得られる手がかりを駆使してバグの原因を絞り込んでいくのがプログラミングです。

 また、エラーメッセージすら示さずに質問をするなんて、他人に対するものの聞き方も覚えてください。
    • good
    • 1

aの初期化のタイミングがおかしいのではないでしょうか。


各iについて出たaの値をそのまま(i+1)について使っていますから、
このままでは
1!
1!×2!
1!×2!×3!
  :
1!×2!×3!×・・・10!
を計算することになって、多分オーバーフローを起こします。
外側のforループと内側のforループの間で毎回
a=1
を実行すべきだと思います。
    • good
    • 1

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q漸近線を求めるときの場合分け

タイトルの通りなのですが、漸近線の求め方について質問です。よろしくお願いします。
漸近線の基本的な求め方は、1、y軸に平衡な漸近線、2、y軸に平衡でない漸近線、とあります。

これを使って
問題1、y=(x^2-x+1)/(x-1)の漸近線を求めよ。
問題2、y=2x+(x^2-1)^(1/2)の漸近線を求めよ。
です。

解答は、問題1では式を変形して、漸近線を予想して、解いています。問題2では、明らかに、y軸に平行な漸近線はない、として、y軸に平行でない漸近線を求めています。

ですが、ここで質問です。問題1では、予想して求めていますが、これは入試の解答方法としていいのでしょうか。また、問題
で、明らかにy軸に平行な漸近線はない、としていますが、グラフもかけないで、どうしてそのようにいいきれるのでしょうか。ただ、これには、注として、グラフの概形は、y=2xとy=(x^2-1)^(1/2)の和曲線を考えるとありました。が、これの意味もよくわからないのです。

勉強不足ですが、どなたか存知の方、アドバイスをいただけませんか。よろしくお願いします。

タイトルの通りなのですが、漸近線の求め方について質問です。よろしくお願いします。
漸近線の基本的な求め方は、1、y軸に平衡な漸近線、2、y軸に平衡でない漸近線、とあります。

これを使って
問題1、y=(x^2-x+1)/(x-1)の漸近線を求めよ。
問題2、y=2x+(x^2-1)^(1/2)の漸近線を求めよ。
です。

解答は、問題1では式を変形して、漸近線を予想して、解いています。問題2では、明らかに、y軸に平行な漸近線はない、として、y軸に平行でない漸近線を求めています。

ですが、ここで質問で...続きを読む

Aベストアンサー

y=ax+bがy=f(x)の漸近線であれば、必ず

f(x)-(ax+b)→0 (x→∞) ・・・★
(当然、x→-∞の漸近線を考えるのであれば、x→-∞です。以下同様)

が成り立ちます。逆に、これが成り立てば、ほぼy=ax+bは漸近線であると考えて差し支えありません。(ほぼと書いたのはy=f(x)とy=ax+bが交わる可能性があるから)

したがって、このようなa,bが(何らかの予想をたてて)見つかったのであれば、y=ax+bが漸近線として大きな問題は起こりません。
>問題1では、予想して求めていますが、これは入試の解答方法としていいのでしょうか。
具体的にどのような解答なのか分かりませんが、多分、問題ありません。

ちなみに、実際に、このようなa,bを計算で求めるとしたら、
a=lim[x→∞]f(x)/x (★をxで割ってx→∞としたもの)
としてaを求めます。このaを元に
b=lim[x→∞](f(x)-ax)
としてbを求めます。(もちろん、これらが収束する保証はありませんが、収束しないのなら、漸近線を持たないという事です)


>また、問題
>で、明らかにy軸に平行な漸近線はない、としていますが、グラフもかけないで、どうしてそのようにいいきれるのでしょうか。
y軸に平行な漸近線というのは、y=1/xにおけるy軸とか、y=tanxにおける、直線x=π/2のような奴です。
要するにf(x)がx→α(有限の値)で発散するような奴です。ほぼ100%、分母が0になるような奴です。
>y=2x+(x^2-1)^(1/2)
は、途中で発散することがないので(いたるところで連続ですから)、y軸に平行な漸近線を持ちません


>ただ、これには、注として、グラフの概形は、y=2xとy=(x^2-1)^(1/2)の和曲線を考えるとありました。

「南京玉すだれ」って分かりますか?
http://www.eonet.ne.jp/~tosimaru/
↑こんなのです。これの竹串(?)って、何か竹串に平行な方向にずれますよね。
※各竹串は、普通全部同じ長さですが、それぞれ長さが違うとしましょう(y=f(x)の形)

この竹串が垂直になるように、水平な面に置くと、すだれの上端はy=f(x)という形状になっているはずです。

でも、坂道に置くと(各竹串の下端を地面につける)、すだれの上端はy=f(x)という形にはなってませんよね。
坂道の高さ(?)+すだれの高さ(=f(x))
っていう感じの形になっているのがイメージできませんかね?

これと同じように、
y=2xという「坂道」の上に、√(x^2-1)という形の「すだれ」を置いている、というイメージで
y=2x+√(x^2-1)というグラフの形状をイメージしてみよう、
という感じの意味ですね。
(・・・って、上手く説明できません。。。図は書けないし、日本語は下手なので、分からなかったら、やんわりとスルーしてあげてくださいw)

y=ax+bがy=f(x)の漸近線であれば、必ず

f(x)-(ax+b)→0 (x→∞) ・・・★
(当然、x→-∞の漸近線を考えるのであれば、x→-∞です。以下同様)

が成り立ちます。逆に、これが成り立てば、ほぼy=ax+bは漸近線であると考えて差し支えありません。(ほぼと書いたのはy=f(x)とy=ax+bが交わる可能性があるから)

したがって、このようなa,bが(何らかの予想をたてて)見つかったのであれば、y=ax+bが漸近線として大きな問題は起こりません。
>問題1では、予想して求めていますが、これは入試の解答方法としていいのでし...続きを読む

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q漸近線の求めかた??

y=x+1+1/(x-1)のグラフを描く問題なんですが、増減表(添付図)を書いた後教科書では次のように漸近線を求めています。

lim[x]→1+0]y=∞, lim[x→1-0]y= ー∞であるからx=1はこの曲線の漸近線である。
さらに
lim[x→∞]{y-(x+1)}=0
lim[x→-∞]{y-(x+1)}=0
だからy=x+1もこの曲線の漸近線である。

[質問1] どういうわけで増減表を書いた後漸近線を求めたいと考えたのでしょうか?双曲線であると分かった上での判断ですか?
 
[質問2] 漸近線を求めるとき、なぜ、まるでy=x+1が漸近線であるとあらかじめしっているかのように
リミットの中の式をlim[x→∞]{y-(x+1)}=0 という形にしているのでしょうか?
(これで確かにy=x+1は漸近線ということがわかりますけど・・)

漸近線を求める上での考え方がよくわかりません。意味不明な箇所があるかもしれませんが、教えてください。

Aベストアンサー

> [質問1] どういうわけで増減表を書いた後漸近線を求めたいと考えたのでしょうか?双曲線であると分かった上での判断ですか?

増減表を描いた後に漸近線がある事に気付いたわけではなく、
y = x + 1 + 1/(x-1)という式を見た瞬間に気付くんです。

> [質問2] 漸近線を求めるとき、なぜ、まるでy=x+1が漸近線であるとあらかじめしっているかのように

ちょっと大雑把な考え方かもしれませんが、
y = x + 1 + 1/(x-1)がx → ∞の時(また、x → -∞の時)に
どうなるのかを想像してみるとよいです。
特に、右辺のそれぞれの項がどうなるかを考えると良いです。

x がどんどん大きくなると、x + 1 + 1/(x-1)の中の3つの項のうち、
1/(x - 1)だけは0に収束して消えていってしまいませんか?
そうなると残るのはxと+1の項だけになります。
なのでy = x + 1 + 1/(x-1)は、xがどんどん大きくなると
y = x + 1に近づくと考える事ができます。

y = (2x^2 + 5) / (x + 2)のような形の関数だと、
そのままではこのような考え方ができません。
この場合は割り算をして
y = 2x - 4 + (13/(x + 2))と変形してやると、
同じように考える事ができます。

他にも例えば、y = 2x + 3 + 2^xはx → -∞の時、
y = 2x + 3に漸近します(x → +∞では漸近しません)。
後は「漸近放物線」みたいのも考えられます。
例えばy = x^2 + 2x + (1/x)は、x → +∞とx → -∞の時、
放物線y = x^2 + 2xに漸近します。

> [質問1] どういうわけで増減表を書いた後漸近線を求めたいと考えたのでしょうか?双曲線であると分かった上での判断ですか?

増減表を描いた後に漸近線がある事に気付いたわけではなく、
y = x + 1 + 1/(x-1)という式を見た瞬間に気付くんです。

> [質問2] 漸近線を求めるとき、なぜ、まるでy=x+1が漸近線であるとあらかじめしっているかのように

ちょっと大雑把な考え方かもしれませんが、
y = x + 1 + 1/(x-1)がx → ∞の時(また、x → -∞の時)に
どうなるのかを想像してみるとよいです。
特...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q数IIIグラフ・漸近線に関する質問です。

いつもお世話になり、ありがとうございます。今回も宜しくお願い致します。

今回は問題ではなく、私自身の疑問についてなのですが、数IIIのグラフを描く際に求める漸近線についてです。

例えば、f(x)=(x^2+x-5)/(x-2)のグラフの漸近線を求める場合、
f(x)=(x+3) + {1/(x-2)} という形に変形させて、漸近線はy=x+3とx=2だと求められると思います。

そこで質問なのですが、漸近線の関数は上のように必ず1次関数なのでしょうか。

解いていた問題の中で、

y= x^2 + (1/x^2) のグラフを求める問題があって、この場合、1/x^2という分数関数の前のx^2は漸近線になるのではないかと思いました。
理由は、x→∞のとき、{f(x)-x^2}→0 になるからです。
でも、(確実に私の経験不足ですが)いままでに漸近線は1次関数以外見たことがないため、私が間違っているのか分からず困っています。

数IIIのグラフを描く際の漸近線は必ず1次関数までなのでしょうか。

お手数をおかけしますが、宜しくお願い致します。

Aベストアンサー

漸近線の定義に1次関数に限るとは決して書いていません。いかに高校数学といえどもそんなに理不尽ではありません。教科書をよく見なおしてください。

>y= x^2 + (1/x^2) のグラフを求める問題があって、この場合、1/x^2という分数関数の前のx^2は漸近線になるのではないかと思いました。

その通りです。似たような話がurlに出ています。

参考URL:http://ja.wikipedia.org/wiki/%E6%BC%B8%E8%BF%91%E7%B7%9A

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Q漸近線について

「Y=1/x+logxのグラフをかけ」という問題で、グラフの増減表は書くことができるのですが漸近線の求め方がわかりません。回答にはY軸が漸近線だと書いてありlim x→0(1/x+logx)の1/xをtとおき回答してありました。そこで1/xをtと置かずに「lim x→0(1/x+logx)」を解き漸近線がY軸であると導びこうとしたのですがうまくいきません。どう考えればよいか教えてください。また漸近線を求める場合はいろんな場合を計算してみて初めて、どれが漸近線だ、と分かるのですか。それとも問題をみてすぐに分かるものなのでしょうか。お願いします。

Aベストアンサー

lim x→0(1/x+logx)を求めるのは難しいですね。
まずは1/xをくくり出して、
1/x・(1+xlogx)

(1/x)→∞なので、xlogxが何か値に収束すればy軸が漸近線だといえます。

(xlogx)→0なのですが、これを説明するのは難しく、結局、x=1/tとおいて「はさみうちの原理」を使うことになります。

x→0よりもt→∞の方が極限が考えやすいので、このように置き換えるんだな、と思ってください。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q斜めの漸近線について

方程式のグラフを書くときに、分子の多項式の次数が、分母の多項式の次数よりも大きい時のみ、斜めの漸近線を考えれば良いと思っていたのですが、ある問題の解答を見ると、x + arctan(x)のグラフの時も、斜めの漸近線を求めて、それをグラフに書いています。

どのようなときに斜めの漸近線を考えるべきなのでしょうか?

Aベストアンサー

どんなときに書くべきか決まってはいないでしょうが。

x + arctan(x)
の漸近線は、arctan(x)の形を思い浮かべればすぐにわかるわけで、書き加えるのはたいした手間ではない。

一番丁寧には、漸近線が存在するか調べて、存在するなら書けばよいのでは。
f(x) - (ax + b) が、x→∞で、0に近づくような実数a,bが存在するかを調べればよい。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。


人気Q&Aランキング

おすすめ情報