質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2267閲覧

C言語プログラムが思うように動きません

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/05/28 10:08

c言語でコードを書きましたが、コンパイルしたところ何も起きません
どこが間違っているのか教えてください。

lang

1コード#include<stdio.h> 2 3double power(double x, int y){ 4 double p = 1; 5 int i = 0; 6 while(i < y){ 7 p = p * x; 8 i = i + 1; 9 } 10 return p ; 11} 12 13double fact(int a ){ 14 int i = 1; 15 int s = 1; 16 while(i <=a ){ 17 s = s * i; 18 i = i + 1; 19 } 20return s ; 21} 22 23double binomial_dist(double p , int n , int k ){ 24 double ans ; 25 double n1 = fact(n) ; 26 double nk1 = fact(n-k); 27 double k1 = fact(k); 28 double pk = power(p,k); 29 double pnk = power(1-p,n-k); 30 ans = n1*pk*pnk/(nk1*k1); 31 return ans ; 32} 33 34void print_asters(int n){ 35 int k = 1; 36 while(k <= n){ 37 printf("*"); 38 k = k + 1; 39 } 40} 41 42 43main(){ 44 double p ; 45 int n; 46 int k = 0; 47 int ans = 100*(int)binomial_dist(p,n,k); 48 scanf("%lf",&p); 49 scanf("%d",&n); 50 printf("%lf",100*binomial_dist(p,n,k)); 51 print_asters(ans); 52 53 54 } 55

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kutsulog

2015/05/29 02:54

コンパイルしても何も起きませんとありますが ・どのようにコンパイルしたか ・コンパイラは何かメッセージをだしたのか(出したならそのメッセージも) ・作成した実行ファイルをどのように実行したか このあたりも情報として提供していただけませんか?
kutsulog

2015/05/29 03:00

ついでにscanfの前にprintf("hoge\n")を入れた場合hogeは出力されるかもお願いします
guest

回答3

0

少し遠回りにはなりますが、以下のことを試してください。

  1. fact, main の2つしかない関数、fact_test.c を作る
  2. fact については、現在あるファイルから、中身をそのままコピーする
  3. main については、以下のようにする(動作確認してません、ごめんなさい)

lang

1#include<stdio.h> 2 3double fact(int a ){ 4 int i = 1; 5 int s = 1; 6 while(i <=a ){ 7 s = s * i; 8 i = i + 1; 9 } 10return s ; 11} 12 13int main(){ 14 int from = 0, to = 9, i; 15 printf("Begin test fact.\n"); 16 for(i = from; i < to; ++i) { 17 printf("fact(%d) = %f\n", i, fact(i)); 18 } 19 return 0; 20}

上記結果は、求めている fact の挙動と一致するでしょうか。
一致した場合、power についても似たように、テストするファイルを作って、テストしてみましょう。
最後に binomial_dist の動作を確かめてみましょう。

ひとつひとつ、クリアしていくのが大事です。

ちなみに、現在提示されているコードでは
int ans = 100*(int)binomial_dist(p,n,k);
printf("%lf",100*binomial_dist(p,n,k));
が良くないです。
0. ans は p, n, k が決まった後に計算すべきです。
0. printf には %lf は使わず、%f を用います。
修正例:

lang

1main(){ 2 double p ; 3 int n; 4 int k = 0; 5 int ans; 6 scanf("%lf",&p); 7 scanf("%d",&n); 8 ans = = 100*(int)binomial_dist(p,n,k); 9 printf("%f", ans); 10 print_asters(ans); 11}

投稿2015/05/28 10:46

takotakot

総合スコア1111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デバッガの使い方を習得したり、
プログラムに assert 文を埋める、 print 文を埋める,
といった事を習得するとよいと思います。

参考情報:

投稿2015/05/28 13:42

katoy

総合スコア22322

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。質問に記載されているプログラムを私のLinux環境で実行してみたのでその結果を紹介します。

まず、「実行後に何もおきない」と記載されていますが、プログラムは正常に起動しています。
main関数にscanfがあるため、キーボードからの入力待ち状態となっている状態となっています。
ですので、適当な数字を入力すれば、命令がprintfまで進み、画面上に文字列が表示されるはずです。

参考程度に私が実行した結果を記載しておきます。

[user@localhost teratail]$ ./a.out
2
3
-100.000000 ** (中略) *[user@localhost teratail]$

投稿2015/05/28 11:21

lanmaru

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問