大学の課題で、「キーボードから"jakfkahksgacac"のように塩基配列を入力し、配列に含まれるg,cの割合を出力するプログラミングを作成せよ」というものが出たのですが、実行結果が-nanや浮動小数点演算の例外などとなってうまくいきません。
どこが間違っているのか指摘していただければ幸いです。
#include<stdio.h>
int main(void)
{
int i;
int total=0;
int content=0;
char g,c;
char x[50];
printf("塩基配列を入力してください\n");
scanf("%s", x);
for(i=0;i<=50;i++)
{total=total+1;
if((x='g')||(x='c'))
{content=content+1;}
}
printf("GC含有量は%f%です\n", 100*content/total);
return 0;
}
学校の課題なのですが…
Re: 学校の課題なのですが…
# ソースコードはcodeタグで囲むようにして下さい (投稿時のフォーラムルール欄参考)。
100*content/totalはint型になります。
このため,printfの対応する書式が%fなので未定義の振る舞いとなっています。
%fに対応する,つまりはdouble型にするには,100.0*(double)content/(double)totalのように,式をdouble型で計算します。
まぁ,doubleとintの演算はdoubleなのでキャストを省略可能で,100.0*content/totalのように書けます。
100*content/totalはint型になります。
このため,printfの対応する書式が%fなので未定義の振る舞いとなっています。
%fに対応する,つまりはdouble型にするには,100.0*(double)content/(double)totalのように,式をdouble型で計算します。
まぁ,doubleとintの演算はdoubleなのでキャストを省略可能で,100.0*content/totalのように書けます。
-
- 記事: 44
- 登録日時: 11年前
Re: 学校の課題なのですが…
①if((x='g')||(x='c'))
if文の条件式は、=を使ってもコンパイルが通ってしまうのですが、同じ値であるかどうかの判定には==を使います。
②入力文字列の終端には'\0'が入ります。
例えば、gc00と入力された場合、x[50]にはgc00\0が入っています。
それを使って、もし入力文字列が終端ならfor文を抜ける処理が必要になります。
③int型とint型の式の答えはint型
つまり、100*content\total=int型となってしまい、小数点以下が切り捨てられます。仕様です。
しかし、float型とint型の計算の答えはfloat型になり、(float)100*content\total=float型です。
以上の事を踏まえると、以下のプログラムで正しく動くようになります(*´▽`*)
どうしても分からなくなってしまった場合は、スポイラーを表示して自分のプログラムと照らし合わせてみましょう。
if文の条件式は、=を使ってもコンパイルが通ってしまうのですが、同じ値であるかどうかの判定には==を使います。
②入力文字列の終端には'\0'が入ります。
例えば、gc00と入力された場合、x[50]にはgc00\0が入っています。
それを使って、もし入力文字列が終端ならfor文を抜ける処理が必要になります。
③int型とint型の式の答えはint型
つまり、100*content\total=int型となってしまい、小数点以下が切り捨てられます。仕様です。
しかし、float型とint型の計算の答えはfloat型になり、(float)100*content\total=float型です。
以上の事を踏まえると、以下のプログラムで正しく動くようになります(*´▽`*)
どうしても分からなくなってしまった場合は、スポイラーを表示して自分のプログラムと照らし合わせてみましょう。
► スポイラーを表示
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 学校の課題なのですが…
その課題文を読むんだら 私は
・gの割合
・cの割合
をそれぞれ出せ という意味に解釈しちゃうけど,違うのかな?
・gの割合
・cの割合
をそれぞれ出せ という意味に解釈しちゃうけど,違うのかな?