main関数以外が作れない

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

main関数以外が作れない

#1

投稿記事 by CBX400F » 6年前

文字列中から指定した文字列パターンをすべて探し出し、その文字列を「*」に置換する関数を
作成し、つぎの塩基配列から指定した文字列パターンを探し出し、それらをすべて「*」に置き換
えるプログラムを作成せよ。ただし、関数の引数は、文字列および検索したい文字列パターンと
し、関数の戻り値は、その文字列パターンが出現した回数とせよ。

実行結果
塩基配列を入力してください:
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 箇所見つかりました。

コード:

#include <stdio.h>

int sagasu(

int main()
{
  int i;
  char hage[1000];
  char funyu[1000];
 
  printf("塩基配列を入力してください:");
  scanf("%s",hage);
  
  printf("塩基配列パターンを入力してください:%d\n",);
  scanf("%c",funyu);

  str_dcount(hage,funyu);

  printf("検索結果:%d\n",);
  printf("指定した塩基配列パターンが%d箇所見付かりました。\n",);
  
  return 0;
 }
提出期限が迫っているので助けてください。

アバター
usao
記事: 1552
登録日時: 6年前

Re: main関数以外が作れない

#2

投稿記事 by usao » 6年前

例えば,
・文字列が "AAAAA"
・探して置換するパターンが "AA"
だった場合,どういう結果になれば良いのでしょうか?

CBX400F

Re: main関数以外が作れない

#3

投稿記事 by CBX400F » 6年前

すべて*になるようにしたいです。

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

Re: main関数以外が作れない

#4

投稿記事 by non » 6年前

CBX400F さんが書きました:すべて*になるようにしたいです。
おっと、難しくなりましたね。
ところで、main関数も間違ってますけど。
non

CBX400F

Re: main関数以外が作れない

#5

投稿記事 by CBX400F » 6年前

すみません・・・。
どこが間違っていますか?

beatle
記事: 1280
登録日時: 7年前
住所: 埼玉
連絡を取る:

Re: main関数以外が作れない

#6

投稿記事 by beatle » 6年前

funyuに文字列を入力したいのに%cだとだめですよね.

文字列"AAAAA",検索パターン"AA"だと何が難しいかというと...
文字列を先頭から検索し,パターンを見つけたら随時*で置き換えるようなシンプルな実装にしてしまうと
"****A"となってしまって,最後のAが*に置換されません.

文字列"TATAT",検索パターン"TAT"のような場合も同様の問題があります.

アバター
usao
記事: 1552
登録日時: 6年前

Re: main関数以外が作れない

#7

投稿記事 by usao » 6年前

とりあえず最初はこんなのを実装してみるといいんじゃないでしょうか

コード:

//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) ? "一致", "不一致" )   );
}

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

Re: main関数以外が作れない

#8

投稿記事 by non » 6年前

開発環境(コンパイラ)は何ですか?
non

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

Re: main関数以外が作れない

#9

投稿記事 by non » 6年前

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の塩基配列の課題を質問された方がいましたが、これって何という教科ですか?
「プログラミング演習」などのプログラムの教科ではないわけですよね。
non

CBX400F

Re: main関数以外が作れない

#10

投稿記事 by CBX400F » 6年前

beatleさん
シンプルな方のプログラムを教えてください。
そこから考えてみます。

beatle
記事: 1280
登録日時: 7年前
住所: 埼玉
連絡を取る:

Re: main関数以外が作れない

#11

投稿記事 by beatle » 6年前

プログラム全体を貼り付けるのは教育上どうかとも思いましたけども,コーディングが楽しかったのでつい書いてしまいました.

コード:

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

CBX400F

Re: main関数以外が作れない

#12

投稿記事 by CBX400F » 6年前

これを参考にしてみます。
ありがとうございます。

閉鎖

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