前提・実現したいこと
ファイルから読み込んだ塩基配列(2000文字)の中に標準入力した文字列は何か所に入っているかを求めるプログラム。
めちゃくちゃ初心者なので分かりやすく教えていただけると嬉しいです。
自分で考えたこと:
1.塩基配列中に、入力した文字列の1文字目と同じ文字があるか1文字目から順々に見ていく。
2.同じ文字が出た時、入力した文字列の2文字目とその文字の次の文字が一致するか調べる。もし違ったら1に戻り、同じだったらまたその次の文字が一致するかを調べる。これを繰り返す。
3.入力した文字列の端まで一致したらカウントする。
4.1へ戻る
もっと良いやり方がある場合、そのやり方も教えてください。
発生している問題・エラーメッセージ
実行結果が2000か所になります。確実に途中部分の計算が変なのだと思います。``` ###該当のソースコード #include<stdio.h> int str_length(const char s[]) { int len = 0; while (s[len]) len++; return len; } int main(void) char ch[2000]; FILE *fp; fp=fopen("file.txt","r"); if(fp == NULL){ perror("ファイルの読み込みに失敗\n"); return 1; } printf("▼=====テキストファイルの内容=====▼\n"); while((ch[2000] = fgetc(fp))!=EOF){ printf("%c",ch[2000]); } char str[2000]; printf("\nパターンを入力してください。*a,t,g,cのみ\n"); scanf("%s",str); /*ここからおかしい*/ int i=0,k=0,m=1,count=0; for(i=0;i<=2000;i++){ if( ch[i]=str[k] ){ for(m=1; m <= str_length(str); m++){ if(ch[i+m]!=str[k+m]){ break;} } if(m=str_length(str)){ count++; } } } printf("パターン「\"%s\"」は%d箇所に含まれています。",str,count); return 0; } ### 試したこと 肝心の計算部分以外は合っていました。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
コンパイル・エラーになります。
Cは、関数(main) 内で 関数(str_length) を定義することはできません。
なので
> 肝心の計算部分以外は合っていました。
は 信じられません
[追記] str_length を main外に追い出すことでコンパイルできました。
まず、ch[] にファイルのナカミがコピーされたか確認しましたか?
``` の使い方が間違っています。余計なものを削除してください。質問は編集できます。
#include <stdio.h> の直前に ```C だけの行を追加してください。
ソースコードの最後の } の直後に ``` だけの行を追加してください。
他の言語の方がいいんじゃない? の流れで。
Pythonならこんな感じ?
import re
try:
__allSeq=open(r'file.txt','r').read()
__print('テキストファイルの内容')
__print(allSeq)
__partSeq = input('\nパターンを入力してください。*a,t,g,cのみ :')
__match=re.findall(partSeq,allSeq)
__print('パターン「"{0}"」は{1}箇所にふくまれています。'.format( partSeq, len(match)))
except:
__print('File Error!')
Cで塩基配列のお題って何故かよく聞きますけど、なんなんでしょうね。
> コンパイル・エラーになります。
gcc だと通っちゃいます。だからそれでいいという話じゃないですけれど。
回答4件
あなたの回答
tips
プレビュー