ページ 11

塩基配列

Posted: 2013年6月26日(水) 11:35
by K壁

コード:

#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別の数も表示するためにこのようなプログラムを作成したのですが、エラーが出ます。
どう直せば良いですか?

Re: 塩基配列

Posted: 2013年6月26日(水) 11:47
by taketoshi
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)は不要です。

Re: 塩基配列

Posted: 2013年6月26日(水) 12:05
by non
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]ではないかと想像できます。

Re: 塩基配列

Posted: 2013年6月26日(水) 12:15
by K壁
実行結果がすべて0になります。
なにがおかしいのでしょうか?

Re: 塩基配列

Posted: 2013年6月26日(水) 12:16
by non
修正したプログラムを貼ってください。

Re: 塩基配列

Posted: 2013年6月26日(水) 12:20
by non
24行目と25行目

コード:

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

Re: 塩基配列

Posted: 2013年6月26日(水) 12:27
by K壁

コード:

#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;
}
こんな感じなのですが・・・。

Re: 塩基配列

Posted: 2013年6月26日(水) 12:43
by non
17行の chって何?
40行 strはstの間違いでしょう。
42行 は出力書式指定子がありません

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

Re: 塩基配列

Posted: 2013年6月26日(水) 12:45
by K壁
教科書を見ながらやったのであまり理解していません。

Re: 塩基配列

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

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

Re: 塩基配列

Posted: 2013年6月26日(水) 14:00
by non
質問には答えてもらえないみたいですので、意味はないと考え、削除して、上で指摘したところを変更し何か数字が出るようにしました。
これでいいですか?

コード:

#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;
}

Re: 塩基配列

Posted: 2013年6月26日(水) 14:46
by K壁
提示していただいたものを参考にすると、うまくいきました。
説明不足ですみませんでした。
ありがとうございました。

Re: 塩基配列

Posted: 2013年6月26日(水) 14:48
by K壁
Thank you.
Danke.
謝謝.

Re: 塩基配列

Posted: 2013年6月26日(水) 15:08
by Blue
K壁 さんが書きました:

コード:

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

コード:

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

Re: 塩基配列

Posted: 2013年6月26日(水) 15:14
by K壁
それも含め解決しました。
アドバイスありがとうございます。