学校の課題なのですが…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nitori

学校の課題なのですが…

#1

投稿記事 by nitori » 11年前

大学の課題で、「キーボードから"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;
}

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

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

#2

投稿記事 by YuO » 11年前

# ソースコードはcodeタグで囲むようにして下さい (投稿時のフォーラムルール欄参考)。

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: 学校の課題なのですが…

#3

投稿記事 by 超絶右留斗羅天才プログラマー » 11年前

①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型です。

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

► スポイラーを表示
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

non
記事: 1097
登録日時: 13年前

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

#4

投稿記事 by non » 11年前

%を表示するには%%を使う
non

アバター
usao
記事: 1889
登録日時: 11年前

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

#5

投稿記事 by usao » 11年前

その課題文を読むんだら 私は
・gの割合
・cの割合
をそれぞれ出せ という意味に解釈しちゃうけど,違うのかな?

閉鎖

“C言語何でも質問掲示板” へ戻る