main関数以外が作れない
main関数以外が作れない
文字列中から指定した文字列パターンをすべて探し出し、その文字列を「*」に置換する関数を
作成し、つぎの塩基配列から指定した文字列パターンを探し出し、それらをすべて「*」に置き換
えるプログラムを作成せよ。ただし、関数の引数は、文字列および検索したい文字列パターンと
し、関数の戻り値は、その文字列パターンが出現した回数とせよ。
実行結果
塩基配列を入力してください:
CTGCGCTAGGTCTCCTATAACACGTTTCCCGTTTGCGACTGGGCAGTACTGTCAAGTTAGGGACAGTGGGACTGTCTACTCA
ATAACCTCAAAACATTTCCTTTCGGTGAAAGATGGGACAGCGGCGCGCCAGGTGTCCAACAGCCTAACAGACTGTCGCCAAA
GTGATAATCACCCGCAACGACCTGTCGGCGTACCAGAACCGTTAATAAGGGAACTCTCAGATGCTTGTTAGCCAACTACCTA
ATCTGGGTTGAAATTGAATTAGTAAAACCTACGCGTGTACCGCACGGATCTTAATAATACGACTCAAACGATTCTGGAGCCC
GACCACGACTATAATGAGTAAAATGGTCATTGTTATGGCAACTACGGATCATCAGGGCAGGTTCATTTAGTAAGAATTAAGA
CGGATTCTAGATAGGTCGCGGATGAACAGGAATGAAACTAATTGCCCTACAGCTCCCTCACCAGGAGGCCGATCGGCAACCA
GTTAGGTAGTAGCGGGTGACGTTTAGTAGTATATT
塩基配列パターンを入力してください: ATT
検索結果:
CTGCGCTAGGTCTCCTATAACACGTTTCCCGTTTGCGACTGGGCAGTACTGTCAAGTTAGGGACAGTGGGACTGTCTACTCA
ATAACCTCAAAAC***TCCTTTCGGTGAAAGATGGGACAGCGGCGCGCCAGGTGTCCAACAGCCTAACAGACTGTCGCCAAA
GTGATAATCACCCGCAACGACCTGTCGGCGTACCAGAACCGTTAATAAGGGAACTCTCAGATGCTTGTTAGCCAACTACCTA
ATCTGGGTTGAA***GA***AGTAAAACCTACGCGTGTACCGCACGGATCTTAATAATACGACTCAAACG***CTGGAGCCC
GACCACGACTATAATGAGTAAAATGGTC***GTTATGGCAACTACGGATCATCAGGGCAGGTTC***TAGTAAGA***AAGA
CGG***CTAGATAGGTCGCGGATGAACAGGAATGAAACTA***GCCCTACAGCTCCCTCACCAGGAGGCCGATCGGCAACCA
GTTAGGTAGTAGCGGGTGACGTTTAGTAGTAT***
指定した塩基配列パターンが10 箇所見つかりました。 提出期限が迫っているので助けてください。
作成し、つぎの塩基配列から指定した文字列パターンを探し出し、それらをすべて「*」に置き換
えるプログラムを作成せよ。ただし、関数の引数は、文字列および検索したい文字列パターンと
し、関数の戻り値は、その文字列パターンが出現した回数とせよ。
実行結果
塩基配列を入力してください:
CTGCGCTAGGTCTCCTATAACACGTTTCCCGTTTGCGACTGGGCAGTACTGTCAAGTTAGGGACAGTGGGACTGTCTACTCA
ATAACCTCAAAACATTTCCTTTCGGTGAAAGATGGGACAGCGGCGCGCCAGGTGTCCAACAGCCTAACAGACTGTCGCCAAA
GTGATAATCACCCGCAACGACCTGTCGGCGTACCAGAACCGTTAATAAGGGAACTCTCAGATGCTTGTTAGCCAACTACCTA
ATCTGGGTTGAAATTGAATTAGTAAAACCTACGCGTGTACCGCACGGATCTTAATAATACGACTCAAACGATTCTGGAGCCC
GACCACGACTATAATGAGTAAAATGGTCATTGTTATGGCAACTACGGATCATCAGGGCAGGTTCATTTAGTAAGAATTAAGA
CGGATTCTAGATAGGTCGCGGATGAACAGGAATGAAACTAATTGCCCTACAGCTCCCTCACCAGGAGGCCGATCGGCAACCA
GTTAGGTAGTAGCGGGTGACGTTTAGTAGTATATT
塩基配列パターンを入力してください: ATT
検索結果:
CTGCGCTAGGTCTCCTATAACACGTTTCCCGTTTGCGACTGGGCAGTACTGTCAAGTTAGGGACAGTGGGACTGTCTACTCA
ATAACCTCAAAAC***TCCTTTCGGTGAAAGATGGGACAGCGGCGCGCCAGGTGTCCAACAGCCTAACAGACTGTCGCCAAA
GTGATAATCACCCGCAACGACCTGTCGGCGTACCAGAACCGTTAATAAGGGAACTCTCAGATGCTTGTTAGCCAACTACCTA
ATCTGGGTTGAA***GA***AGTAAAACCTACGCGTGTACCGCACGGATCTTAATAATACGACTCAAACG***CTGGAGCCC
GACCACGACTATAATGAGTAAAATGGTC***GTTATGGCAACTACGGATCATCAGGGCAGGTTC***TAGTAAGA***AAGA
CGG***CTAGATAGGTCGCGGATGAACAGGAATGAAACTA***GCCCTACAGCTCCCTCACCAGGAGGCCGATCGGCAACCA
GTTAGGTAGTAGCGGGTGACGTTTAGTAGTAT***
指定した塩基配列パターンが10 箇所見つかりました。 提出期限が迫っているので助けてください。
Re: main関数以外が作れない
例えば,
・文字列が "AAAAA"
・探して置換するパターンが "AA"
だった場合,どういう結果になれば良いのでしょうか?
・文字列が "AAAAA"
・探して置換するパターンが "AA"
だった場合,どういう結果になれば良いのでしょうか?
Re: main関数以外が作れない
funyuに文字列を入力したいのに%cだとだめですよね.
文字列"AAAAA",検索パターン"AA"だと何が難しいかというと...
文字列を先頭から検索し,パターンを見つけたら随時*で置き換えるようなシンプルな実装にしてしまうと
"****A"となってしまって,最後のAが*に置換されません.
文字列"TATAT",検索パターン"TAT"のような場合も同様の問題があります.
文字列"AAAAA",検索パターン"AA"だと何が難しいかというと...
文字列を先頭から検索し,パターンを見つけたら随時*で置き換えるようなシンプルな実装にしてしまうと
"****A"となってしまって,最後のAが*に置換されません.
文字列"TATAT",検索パターン"TAT"のような場合も同様の問題があります.
Re: main関数以外が作れない
とりあえず最初はこんなのを実装してみるといいんじゃないでしょうか
//str1で先頭位置が示される文字列と
//str2で先頭位置が示される文字列とが
//先頭からstr_length文字(byte)の範囲で一致しているかどうかを調べる
bool StrEq( const char *str1, const char *str2, int str_length )
{
...
return (一致していたらtrue, そうでないならfalse);
}
//用例
int main()
{
const char StrA[] = "_Hello";
const char StrB[] = "Hel";
printf( "%s\n", ( StrEq(StrA+1, StrB, 3) ? "一致", "不一致" ) );
}
Re: main関数以外が作れない
mainプログラムのレベルからして、かなり時間がかかりそうですが、提出期限はいつでしょうか?
とりあえず、main関数からなおしていきましょう。
3行目 int sagasu(
これが作りたい関数のような気もしますが、
17行目 str_dcount(hage,funyu);
この関数は何でしょうか?もし、これが作りたい関数なら、こちらの名前をsagasuにしなくてはいけませんね。
また、この関数は返値としてintを返すので、
ret=sagasu(hage,funyu); のように値を受ける必要があります。
もちろん、retは宣言しておいてください。
14行目 printf("塩基配列パターンを入力してください:%d\n",);
%dは不要です、最後のカンマも。
15行目 scanf("%c",funyu);
beatleさんから指摘があった通りです。
19行目 printf("検索結果:%d\n",);
検索結果は文字列を出力するのだから %sです。また、最後に変数名がありません。
20行目 printf("指定した塩基配列パターンが%d箇所見付かりました。\n",);
これも、最後に文字数が入った変数名を書かなくてはいけません。
前も、DNAの塩基配列の課題を質問された方がいましたが、これって何という教科ですか?
「プログラミング演習」などのプログラムの教科ではないわけですよね。
とりあえず、main関数からなおしていきましょう。
3行目 int sagasu(
これが作りたい関数のような気もしますが、
17行目 str_dcount(hage,funyu);
この関数は何でしょうか?もし、これが作りたい関数なら、こちらの名前をsagasuにしなくてはいけませんね。
また、この関数は返値としてintを返すので、
ret=sagasu(hage,funyu); のように値を受ける必要があります。
もちろん、retは宣言しておいてください。
14行目 printf("塩基配列パターンを入力してください:%d\n",);
%dは不要です、最後のカンマも。
15行目 scanf("%c",funyu);
beatleさんから指摘があった通りです。
19行目 printf("検索結果:%d\n",);
検索結果は文字列を出力するのだから %sです。また、最後に変数名がありません。
20行目 printf("指定した塩基配列パターンが%d箇所見付かりました。\n",);
これも、最後に文字数が入った変数名を書かなくてはいけません。
前も、DNAの塩基配列の課題を質問された方がいましたが、これって何という教科ですか?
「プログラミング演習」などのプログラムの教科ではないわけですよね。
non
Re: main関数以外が作れない
プログラム全体を貼り付けるのは教育上どうかとも思いましたけども,コーディングが楽しかったのでつい書いてしまいました.
#include<stdio.h>
#include<string.h>
/* sの先頭から'*'をn文字書き込む */
void replace_with_asterisk(char *s, int n)
{
memset(s, '*', n);
}
/* sの中に登場するすべてのpatternを'*'で置き換える */
void replace(char *s, const char *pattern)
{
char *p = strstr(s, pattern);
int len_pattern = strlen(pattern);
while (p != NULL)
{
replace_with_asterisk(p, len_pattern);
p = strstr(p + len_pattern, pattern);
}
}
/* 実験用便利関数 */
void test(char *s, const char *pattern)
{
printf("(%s,%s) -> ", s, pattern);
replace(s, pattern);
printf("%s\n", s);
}
int main(void)
{
char s0[] = "CATTTCGAATTA";
char s1[] = "AAAAA";
char s2[] = "TATAT";
test(s0, "ATT");
test(s1, "AA");
test(s2, "TAT");
return 0;
}