ページ 11

学校の課題なのですが…

Posted: 2013年6月11日(火) 23:34
by nitori
大学の課題で、「キーボードから"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: 学校の課題なのですが…

Posted: 2013年6月12日(水) 01:14
by YuO
# ソースコードはcodeタグで囲むようにして下さい (投稿時のフォーラムルール欄参考)。

100*content/totalはint型になります。
このため,printfの対応する書式が%fなので未定義の振る舞いとなっています。
%fに対応する,つまりはdouble型にするには,100.0*(double)content/(double)totalのように,式をdouble型で計算します。
まぁ,doubleとintの演算はdoubleなのでキャストを省略可能で,100.0*content/totalのように書けます。

Re: 学校の課題なのですが…

Posted: 2013年6月12日(水) 07:52
by 超絶右留斗羅天才プログラマー
①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型です。

以上の事を踏まえると、以下のプログラムで正しく動くようになります(*´▽`*)
どうしても分からなくなってしまった場合は、スポイラーを表示して自分のプログラムと照らし合わせてみましょう。

► スポイラーを表示

Re: 学校の課題なのですが…

Posted: 2013年6月12日(水) 08:43
by non
%を表示するには%%を使う

Re: 学校の課題なのですが…

Posted: 2013年6月12日(水) 10:55
by usao
その課題文を読むんだら 私は
・gの割合
・cの割合
をそれぞれ出せ という意味に解釈しちゃうけど,違うのかな?