塩基配列

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

塩基配列

#1

投稿記事 by K壁 » 11年前

コード:

#include <stdio.h>
unsigned str_length(const char str[])
{
  unsigned len=0;

  while(str[len])
    len++;
  return(len);
}

void const str_dcount(const char str[],int cnt[])(void)
{
    int ch;
    unsigned i=0;

    while (str[i]){
    switch(ch){
    case 'A':cnt[0]++;break;
    case 'T':cnt[1]++;break;
    case 'G':cnt[2]++;break;
    case 'C':cnt[3]++;break;
    default :cnt[4];break;
    }
    if(str[i]=='A' || str[i]=='T' || str[i]=='G' || str[i]=='C')
      cnt[str[i]-'A']++;
    i++;
  }
}

int main()
{
  int i;
  int dcnt[10]={0};
  char st[100];

  printf("塩基配列:");
  scanf("%s",st);

  str_dcount(str,dcnt);

  printf("塩基配列の長さ:\n",st,str_length(st));

  for(i='A','T','G','C'; i<10; i++);
  printf("Adenine:%d\n",ch);
  printf("Guanine:%d\n",ch);
  printf("Cytosine:%d\n",ch);
  printf("Thimine:%d\n",ch);
  printf("Error:%d\n",ch);

  return 0;
}
初心者なのでよろしくお願いします。
塩基配列数を表示し、A,T,G,C別の数も表示するためにこのようなプログラムを作成したのですが、エラーが出ます。
どう直せば良いですか?

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: 塩基配列

#2

投稿記事 by taketoshi » 11年前

VS2008でコンパイルしました

コード:

 : error C2091: 関数は関数を返せません。
 : error C2065: 'str' : 定義されていない識別子です。
 : error C2065: 'ch' : 定義されていない識別子です。
 : error C2065: 'ch' : 定義されていない識別子です。
 : error C2065: 'ch' : 定義されていない識別子です。
 : error C2065: 'ch' : 定義されていない識別子です。
 : error C2065: 'ch' : 定義されていない識別子です。
コードの内容までは精査していませんが、ここを直せばとりあえず動くようになります。
具体的にはmain関数内で変数strと変数chが定義されていないので、定義しなおす事と。
void const str_dcount(const char str[],int cnt[])(void)
の関数定義の最後の(void)は不要です。

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

Re: 塩基配列

#3

投稿記事 by non » 11年前

43行 for(i='A','T','G','C'; i<10; i++);
これは何をしたいのか説明願います。

44行以降の
printf("Adenine:%d\n",ch);
printf("Guanine:%d\n",ch);
printf("Cytosine:%d\n",ch);
printf("Thimine:%d\n",ch);
printf("Error:%d\n",ch);
は、chでなく dcnt[0]~dcnt[4]ではないかと想像できます。
non

K壁

Re: 塩基配列

#4

投稿記事 by K壁 » 11年前

実行結果がすべて0になります。
なにがおかしいのでしょうか?

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

Re: 塩基配列

#5

投稿記事 by non » 11年前

修正したプログラムを貼ってください。
non

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

Re: 塩基配列

#6

投稿記事 by non » 11年前

24行目と25行目

コード:

    if(str[i]=='A' || str[i]=='T' || str[i]=='G' || str[i]=='C')
      cnt[str[i]-'A']++;
これも、何をしたいのか説明してください。
non

K壁

Re: 塩基配列

#7

投稿記事 by K壁 » 11年前

コード:

#include <stdio.h>
unsigned str_length(const char str[])
{
  unsigned len=0;

  while(str[len])
    len++;
  return(len);
}

void const str_dcount(const char str[],int cnt[])
{
    int ch;
    unsigned i=0;

    while (str[i]){
    switch(ch){
    case 'A':cnt[0]++;break;
    case 'T':cnt[1]++;break;
    case 'G':cnt[2]++;break;
    case 'C':cnt[3]++;break;
    default :cnt[4];break;
    }
    if(str[i]=='A' || str[i]=='T' || str[i]=='G' || str[i]=='C')
      cnt[str[i]-'A']++;
    i++;
  }
}

int main()
{
  int i;
  int dcnt[10]={0};
  char st[100];
  int str;

  printf("塩基配列:");
  scanf("%s",st);

  str_dcount(str,dcnt);

  printf("塩基配列の長さ:\n",st,str_length(st));

  for(i='A','T','G','C'; i<10; i++);
  printf("Adenine:%d\n",dcnt[0]);
  printf("Guanine:%d\n",dcnt[2]);
  printf("Cytosine:%d\n",dcnt[3]);
  printf("Thimine:%d\n",dcnt[1]);
  printf("Error:%d\n",dcnt[4]);

  return 0;
}
こんな感じなのですが・・・。

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

Re: 塩基配列

#8

投稿記事 by non » 11年前

17行の chって何?
40行 strはstの間違いでしょう。
42行 は出力書式指定子がありません

質問に対する答えがないところを見ると、他人が作ったプログラムなのでしょうか?
non

K壁

Re: 塩基配列

#9

投稿記事 by K壁 » 11年前

教科書を見ながらやったのであまり理解していません。

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

Re: 塩基配列

#10

投稿記事 by usao » 11年前

自分で書いたものであれば 言語への習熟具合とは関係なく
「何をしようと意図したのか」は答えらえると思うのですが…?
ある一文をわざわざ書いたのには理由があるはず.(その記述の必要性とでもいうか.)

#答える側(?)が逆に各所についての意図を質問するのは,問い詰めようとかいうのではなく
 その意図に沿った状態にするための回答をしようとしているから だと思うのですが.

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

Re: 塩基配列

#11

投稿記事 by non » 11年前

質問には答えてもらえないみたいですので、意味はないと考え、削除して、上で指摘したところを変更し何か数字が出るようにしました。
これでいいですか?

コード:

#include <stdio.h>
unsigned str_length(const char str[])
{
	unsigned len=0;

	while(str[len])
		len++;
	return(len);
}

void const str_dcount(const char str[],int cnt[])
{
	int ch;
	unsigned i=0;

	while (str[i]){
		switch(str[i]){
	case 'A':cnt[0]++;break;
	case 'T':cnt[1]++;break;
	case 'G':cnt[2]++;break;
	case 'C':cnt[3]++;break;
	default :cnt[4];break;
		}
		/*
		if(str[i]=='A' || str[i]=='T' || str[i]=='G' || str[i]=='C')
		cnt[str[i]-'A']++;
		*/
		i++;
	}
}

int main()
{
	int i;
	int dcnt[10]={0};
	char st[100];
	//int str;

	printf("塩基配列:");
	scanf("%s",st);

	str_dcount(st,dcnt);

	//printf("塩基配列の長さ:\n",st,str_length(st));

	//for(i='A','T','G','C'; i<10; i++);
	printf("Adenine:%d\n",dcnt[0]);
	printf("Guanine:%d\n",dcnt[2]);
	printf("Cytosine:%d\n",dcnt[3]);
	printf("Thimine:%d\n",dcnt[1]);
	printf("Error:%d\n",dcnt[4]);

	return 0;
}
non

K壁

Re: 塩基配列

#12

投稿記事 by K壁 » 11年前

提示していただいたものを参考にすると、うまくいきました。
説明不足ですみませんでした。
ありがとうございました。

K壁

Re: 塩基配列

#13

投稿記事 by K壁 » 11年前

Thank you.
Danke.
謝謝.

Blue

Re: 塩基配列

#14

投稿記事 by Blue » 11年前

K壁 さんが書きました:

コード:

	default :cnt[4];break;
K壁 さんが書きました:

コード:

	printf("Error:%d\n",dcnt[4]);
とするなら、(ほかのと同じ様に)カウントアップしたほうがよいのでは?

K壁

Re: 塩基配列

#15

投稿記事 by K壁 » 11年前

それも含め解決しました。
アドバイスありがとうございます。

閉鎖

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