掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24049

どうもはじめまして、階乗のプログラムをつくってみました
投稿者---ボンゴレ(2005/11/09 20:18:18)


はじめまして、ボンゴレです。
さっそくですが、階乗のプログラムを作ってみました
(大学の授業の一環なのですが)
作ってみたのですが、かならずエラーがでてしまいます
どこが間違っているのか指摘していただけますか?
#include<stdio.h>

long fact(int n);

int main(void)
{
int a , b ;

printf("Enter one integer\n");
scanf("%d",&a);
b=(long)fact( a );
printf("The fact is %lf\n", b );

}

long fact(int n)
{
long m;
m=1;

if(n>=1)
{
while(n>=1)
m*=n;
n--;
{

return m;
}

ちなみにロング型にしているのは、その講義の設定です。
13以上の階乗はできないことはわかっています。
なにぶんC言語をはじめてみたばかりなので、お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:どうもはじめまして、階乗のプログラムをつくってみました 24050 名前はまだない 2005/11/09 21:22:19
<子記事> Re:どうもはじめまして、階乗のプログラムをつくってみました 24052 RAPT 2005/11/10 00:06:53


No.24050

Re:どうもはじめまして、階乗のプログラムをつくってみました
投稿者---名前はまだない(2005/11/09 21:22:19)


「どんなエラーが起こっているか」も書いた方が、的確な回答が得られますよ。
とりあえず、検討すべきところを挙げてみます。

> b=(long)fact( a );

1) fact() は long を返すから、キャストは必要ない(あっても困りませんが)
2a) b が int なので、キャストするなら int にキャストすべきですが、
2b) むしろ、b を long で確保(宣言)すれば良いでしょう。

> printf("The fact is %lf\n", b );

3) %lf は浮動小数の書式なので、int である b を与えると期待どおりの表示はしません。
3a) 上記 2b) の通り b を long と宣言して、書式を %ld に変える
3b) int のままなら %d とする (ことになるけど、たぶん 3a) が
本来書きたかったはずのコードであろうと私は思っています)
3c) %lf で表示したいのなら (double)b のようにキャストする

> while(n>=1)
> m*=n;
> n--;

4) while の後ろを中括弧 '{','}' で囲んでいない場合は、
1つの文 (m *= n;) だけがループの本体になります。
このままでは n--; がループの外なので n は不変で、
(nが1以上のときは)無限ループとなります。

> {

5) これがコンパイルしようとしたソースそのものなら、
ここで(if を)閉じていないせいで、「プログラムが終わってないのに
ファイルの末尾に来ちゃったよ」という意味のエラーが出ているはずです。 '{' を '}' に修正しましょう。


この投稿にコメントする

削除パスワード

No.24061

Re:どうもはじめまして、階乗のプログラムをつくってみました
投稿者---ボンゴレ(2005/11/10 11:57:41)


返答ありがとうございます。修正してみました。
えっと遅いと思いますが、コンパイラはgccです。

#include<stdio.h>

long fact(int n);

int main(void)
{
    int a ;
    long b ;

    printf("Enter one integer\n");
    scanf("%d",&a);
    b=fact( a );
    printf("The fact is %ld\n", b );

}

long fact(int n)
{ 
    long m; 
    m=1;

    if(n>=1)
    { 
        while(n>=1) 
        {
        m*=n;
        n--;
        }
    }
    
    return m;
}



これで大丈夫でしょうか?
あともうひとつ質問していいですか?
ここで得られた数字(例、5!→120)に3桁ごとにコンマを
するような関数を作りたいのですが、下に一応作ってみました
これも間違っているところがあればおしえていただきたいのですが。
これを上のものと関連して使いたいのですが、printfの中に関数っていれてもいいのですか?
下はまだコンパイルしていません、正直間違っていると自分でわかっているので・・・学校の人にヒントとしておしえてもらったのは、1000で何回われるかを考えればいいといわれたので次のようになりました
void printcomma(long c) 
{ 
    int b=0 ; 
    long a ; 
    while(a>1000) 
    { 
        c=a%1000; 
        a=a/1000; 
        b++; 
        printf(",%03d\n",c) 
    } 

return a; 

}


質問ばかりすいません。


この投稿にコメントする

削除パスワード

No.24052

Re:どうもはじめまして、階乗のプログラムをつくってみました
投稿者---RAPT(2005/11/10 00:06:53)


> どこが間違っているのか指摘していただけますか?
それ以前に約束が守られていないようですが。
・ソースの添付は「HTML変換ツール」で字下げします。
・環境(OSとコンパイラ)や症状は具体的に詳しく書きます。

元ソースをVC++6IDEで[Alt+F8]してソースコード変換しました。

#include<stdio.h>

long fact(int n);

int main(void)
{
    int a , b ;
    
    printf("Enter one integer\n");
    scanf("%d",&a);
    b=(long)fact( a );
    printf("The fact is %lf\n", b );
    
}

long fact(int n)
{ 
    long m; 
    m=1;
    
    if(n>=1)
    { 
        while(n>=1) 
            m*=n;
        n--;
        {
            
            return m;
        }



この投稿にコメントする

削除パスワード

No.24062

Re:どうもはじめまして、階乗のプログラムをつくってみました
投稿者---ボンゴレ(2005/11/10 11:59:09)


ご指摘ありがとうございます。
すいません、一応上の返信のほうでHYML形式でやってみました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧