# 本番試験レベル問題2 解答解説 ※メンバー共有用
## 全体の流れ

### 手順
#### 1.キーボードから入力を読み込む
- 数列L1の大きさを読み込むint型変数aを宣言
- 数列L1の大きさをscanfで読み取る
- 領域の大きさaの数列L1を読み込むint型配列L1を宣言
- for文でa回繰り返しscanfを行い、L1の値を読み取る
- 数列L2の大きさを読み込むint型変数bを宣言
- 数列L2の大きさをscanfで読み取る
- 領域の大きさbの数列L2を読み込むint型配列L2を宣言
- for文でb回繰り返しscanfを行い、L2の値を読み取る
#### 2.a, bを適切な変数に代入する・L1, L2を適切なポインタに渡す
- int型変数lva, svaを宣言する
- ポインタ変数pl, psを宣言する
- 適切な変数に値を渡す
- (b<=a)のときの処理
- plにL1を渡す
- psにL2を渡す
- lvaにaの値を渡す
- svaにbの値を渡す
- (b<=a)以外のときの処理
- plにL2を渡す
- psにL1を渡す
- lvaにbの値を渡す
- svaにaの値を渡す
#### 3.plの中にpsがいくつ含まれているか出力する
- 含まれていた数を渡すint型変数ansを宣言する
- plを0字目からlva-sva字目までfor文で繰り返す
- 上記のfor文の中(二重for文)で、psを0字目からsva字目までfor文で繰り返す
- 現在参照しているplとpsの値が一致していないとき
- 内側のfor文を終了する
- 現在参照しているplとpsの値が一致しているとき
- 内側のfor文を続ける
- psの最後の文字まで一致したとき、ansを1増やす
- ansを出力する
## 解答
```
#include <stdio.h>
int main(void) {
int a; //数列L1の大きさを入れる変数
scanf("%d", &a); //数列L1の大きさを読み取る
int L1[a]; //数列L1の値を入れる変数
for (int i = 0; i < a; i++) {
scanf("%d", &L1[i]); //数列L1の値を読み取る
}
int b; //数列L2の大きさを入れる変数
scanf("%d", &b); //数列L2の大きさを読み取る
int L2[b]; //数列L2の値を入れる変数
for (int i = 0; i < b; i++) {
scanf("%d", &L2[i]); //数列L2の値を読み取る
}
int lva, sva; //a,bのうち、大きい方をlva, 小さい方をsvaに代入する
int *pl, *ps; //L1,L2のうち、大きい方をpl, 小さい方をpsに代入する
if(b <= a){
/*L1の方がL2以上のとき*/
pl = L1;
ps = L2;
lva = a;
sva = b;
}else{
/*L2の方が大きい時*/
pl = L2;
ps = L1;
lva = b;
sva = a;
}
int ans = 0; //含まれていた回数を代入する変数
for (int i = 0; i < lva-sva+1; i++) {
/*plを1字ずつ進める. lva-sva+1以降は,plの残りの字数がsva字よりすくなくなるため必要ない*/
for (int j = 0; j < sva; j++) {
/*psを1字ずつ進める*/
if (*(pl+i+j) != *(ps+j)) {
break; //現在指しているplとpsの値が違うときjのfor文を終了し,iのfor文に戻る
}
if (j == sva-1) {
/*現在指しているplの値とpsの値が最後まで同じ*/
ans += 1;
}
}
}
printf("%d\n", ans); //ansの出力
return 0;
}
```