# 本番試験レベル問題2 解答解説 ## 解説 ### 全体の流れ ![](https://i.imgur.com/MW60uGz.png) ### 手順 #### 1.キーボードから入力を読み込む - 文字列L1の長さを読み込むint型変数L1_sizeを宣言 - 文字列L1の長さをscanfで読み取る - 長さL1_sizeの文字列L1を読み込むchar型配列L1を宣言 - scanfを行い、L1の値を読み取る - 文字列L2の長さを読み込むint型変数L2_sizeを宣言 - 文字列L2の長さをscanfで読み取る - 長さL2_sizeの文字列L2を読み込むchar型配列L2を宣言 - scanfを行い、L2の値を読み取る #### 2.L1の長さ, L2の長さを適切な変数に代入する・L1, L2を適切なポインタに渡す - int型変数large_value, small_valueを宣言する - char型ポインタ変数pointer_large, pointer_smallを宣言する - if分を使って条件分岐を行い、適切な変数に値を渡す - (L2_size <= L1_size)のときの処理 - ポインタ変数pointer_largeにL1を渡す - ポインタ変数pointer_smallにL2を渡す - 変数large_valueにL1_sizeの値を渡す - 変数small_valueにL2_sizeの値を渡す - (L2_size <= L1_size)以外のときの処理 - ポインタ変数pointer_largeにL2を渡す - ポインタ変数pointer_smallにL1を渡す - 変数large_valueにL2_sizeの値を渡す - 変数small_valueにL1_sizeの値を渡す #### 3.L1の中にL2がいくつ含まれているか出力する - ポインタ変数pointer_large内のpointer_smallの個を代入するint型変数countを宣言する - ポインタ変数pointer_largeを0字目から(large_value $-$ small_value)字目までfor文で繰り返す - 上記のfor文の中(二重for文)で、ポインタ変数pointer_smallを0字目からsmall_value字目までfor文で繰り返す - 現在参照しているpointer_largeとpointer_smallの値が一致していないとき - 内側のfor文を終了する - 現在参照しているpointer_largeとpointer_smallの値が一致しているとき - 内側のfor文を続ける - pointer_smallの最後の文字まで一致したとき、countを1増やす - countを出力する ## 解答 ``` #include <stdio.h> int main(void) { //文字列L1の長さを入れる変数 int L1_size; //文字列L1の長さを読み取る scanf("%d", &L1_size); //文字列L1の値を入れる変数 char L1[L1_size]; //文字列L1の値を読み取る scanf("%s", L1); //文字列L2の長さを入れる変数 int L2_size; //文字列L2の長さを読み取る scanf("%d", &L2_size); //文字列L2の値を入れる変数 char L2[L2_size]; //文字列L1の値を読み取る scanf("%s", L2); /*L1_size,L2_sizeのうち、大きい方をlarge_value, 小さい方をsmall_valueに代入する*/ int large_value, small_value; /*L1,L2のうち、大きい方をpointer_large, 小さい方をpointer_smallに代入する*/ char *pointer_large, *pointer_small; if(L2_size <= L1_size){ /*L1の方がL2以上のとき*/ pointer_large = L1; pointer_small = L2; large_value = L1_size; small_value = L2_size; }else{ /*L2の方が大きい時*/ pointer_large = L2; pointer_small = L1; large_value = L2_size; small_value = L1_size; } //含まれていた回数を代入する変数 int count = 0; for (int i = 0; i < large_value - small_value + 1; i++) { /*pointer_largeを1字ずつ進める. large_value - small_value + 1以降は, pointer_largeの残りの字数がsmall_value字よりすくなくなるため必要ない*/ for (int j = 0; j < small_value; j++) {   /*pointer_smallを1字ずつ進める*/ if (*(pointer_large + i + j) != *(pointer_small + j)) { /*現在指しているpointer_largeとpointer_smallの値が違うとき jのfor文を終了し,iのfor文に戻る*/ break; } if (j == small_value-1) { /*現在指しているpointer_largeの値とpointer_smallの値が最後まで同じ*/ count += 1; } } } //countの出力 printf("%d\n", count); return 0; } ```