前提
このサイトで初めて質問させていただきます。
C言語で簡易的なNussinovのアルゴリズムのプログラムを作成しています。
文字列中にある文字の組み合わせが発見された回数を出力する機能を実装する際に問題が発生しました。
実現したいこと
- 最初にC,G,A,Uで構成された文字列(RNAとする)を入力する。
- 入力された文字列RNAの字数をカウントする。その字数をcount1として、count1×count1の配列gammaを作成する。
- 配列に数値を代入する手順は、「gamma[i+1][i]に0を代入する(0≦i<count1)」「gamma[i][i]に0を代入する(0≦i≦count1)」「gamma[i][j]にgamma[i][j-1],gamma[i+1][j],gamma[i+1][j+1]+deltaのうち一番大きい数値を代入する(0≦i≦count1)。繰り返し条件は(j=1; j≦count1; j++)」とする。ここで、deltaは(RNA[i],RNA[j])=(A,U),(U,A),(G,C),(C,G),(U,G),(G,U)のとき1の値をとる。
- (RNA[i],RNA[j])=(A,U),(U,A),(G,C),(C,G),(U,G),(G,U)のときcount2に1を代入していき、配列への数値の代入が終わったら最後にcount2を出力する。
発生している問題・エラーメッセージ
> ./(ファイル名) RNA:GGGGCCCCGGGGAAACCCCGGGGCCCCC >
実行してもエラーは出ないのですが、プログラム後半に記述したprintf文が適用されません。
該当のソースコード
C言語
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5int main(void){ 6 char RNA[256]; 7 int count1, count2; 8 int i, j, max, delta; 9 10 printf("RNA:"); 11 scanf("%s", RNA); 12 13 count1 = strlen(RNA); 14 15 int **gamma; 16 gamma = (int**)malloc(sizeof(int*)*count1); 17 for(i = 0; i < count1; i++){ 18 gamma[i] = (int*)malloc(sizeof(int)*count1); 19 } 20 21 for(i = 0; i < count1; i++){ 22 gamma[i + 1][i] = 0; 23 } 24 for(i = 0; i <= count1; i++){ 25 gamma[i][i] = 0; 26 } 27 28 for(j = 1; j <= count1; j++){ 29 for(i = 0; i <= count1 - j; i++){ 30 if(RNA[i] == 'A' && RNA[j] == 'U'){ 31 delta = delta + 1; 32 count2 = count2 + 1; 33 } else if(RNA[i] == 'U' && RNA[j] == 'A'){ 34 delta = delta + 1; 35 count2 = count2 + 1; 36 } else if(RNA[i] == 'G' && RNA[j] == 'C'){ 37 delta = delta + 1; 38 count2 = count2 + 1; 39 } else if(RNA[i] == 'C' && RNA[j] == 'G'){ 40 delta = delta + 1; 41 count2 = count2 + 1; 42 } else if(RNA[i] == 'U' && RNA[j] == 'G'){ 43 delta = delta + 1; 44 count2 = count2 + 1; 45 } else if(RNA[i] == 'G' && RNA[j] == 'U'){ 46 delta = delta + 1; 47 count2 = count2 + 1; 48 } 49 50 if(gamma[i][j - 1] > gamma[i + 1][j] && gamma[i][j - 1] > gamma[i + 1][j - 1] + delta){ 51 gamma[i][j] = gamma[i][j - 1]; 52 } else if(gamma[i + 1][j]> gamma[i][j - 1] && gamma[i + 1][j] > gamma[i + 1][j - 1] + delta){ 53 gamma[i][j] = gamma[i + 1][j]; 54 } else if(gamma[i + 1][j - 1] + delta > gamma[i][j - 1] && gamma[i + 1][j - 1] + delta > gamma[i + 1][j]){ 55 gamma[i][j] = gamma[i + 1][j - 1] + delta; 56 } 57 58 delta = 0; 59 60 } 61 } 62 63 for(i = 0; i < count1; i++) 64 { 65 free(gamma[i]); 66 } 67 free(gamma); 68 69 printf("Max:%d\n", count2); 70 printf(""); 71 72 return 0; 73}
試したこと
「for(i = 0; i < count1; i++)」、「for(i = 0; i <= count1; i++)」、「 for(j = 1; j <= count1; j++)」の3つのfor文を//で消してコンパイル、実行してみたところ、
> ./(ファイル名) RNA:GGGGCCCCGGGGAAACCCCGGGGCCCCC Max:4201168 >
という結果になり、数値はともかく「printf("Max:%d\n", count2);」の文を出力できました。従ってこれらのfor文が何かしらの問題を抱えていることになるのだと推測できますが、なぜ3つのfor文が入るとprintf文が反映されなくなるのかが分かりません。
補足情報(FW/ツールのバージョンなど)
このプログラムはVScodeで作成しました。
プログラム内で配列の動的確保を行っていますが、今まで配列の動的確保を行ったことがあまりなく今回作成した時は様々なサイトを見ながら見様見真似で書きました。その為その部分でも書き間違いがあるかもしれません。もし2次元配列の動的確保の書き方が間違っている場合そちらに関しても回答をいただけると幸いです。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/12/01 04:08
2022/12/01 04:48 編集
2022/12/01 07:29
2022/12/01 07:31
2022/12/01 07:38
2022/12/01 07:41
2022/12/01 08:17
2022/12/01 16:49