ポインタに触れて、レポートを殺ろう！

ミスなどがあればぜひコメントしてください！

![Scan2022-07-13_221320.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265249/7bee98ff-4bf8-df30-0add-a7300c2e59ef.jpeg)

<iframe width="560" height="315" src="https://www.youtube.com/embed/v5GoWpNSO1I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

あくまで例なので丸写しは勘弁してください🙏

```c:prepare.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100

int main(void){
    int i,a;

    srand(time(NULL));
    for(i=0;i<=N;i++){
        a=rand()%100;
        printf("a=%d\n",a);
    }

    return 0;
}

```

```c:ume.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100

int main(void){
    int i,j,a[5][5],c[100],tmp;

    for(i=0;i<N;i++){
        c[i]=1;
    }

    srand(time(NULL));
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            tmp=rand()%100;
            while(c[tmp]==0){
                tmp=rand()%100;
            }
            a[i][j]=tmp;
            c[tmp]=0;
        }
    }
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    printf("search=");
    scanf("%d",&tmp);
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            if(a[i][j]==tmp){
                printf("i=%d, j=%d\n",i,j);
            }
        }
    }

    return 0;
}
```

```c:take.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100

int main(void){
    int i,j,a[5][5],c[100],tmp;

    for(i=0;i<N;i++){
        c[i]=1;
    }

    srand(time(NULL));
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            tmp=rand()%15 + 1;
            tmp+=15*i;
            while(c[tmp]==0){
                tmp=rand()%15 + 1;
                tmp+=15*i;
            }
            a[i][j]=tmp;
            c[tmp]=0;
        }
    }
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    printf("search=");
    scanf("%d",&tmp);
    i=(tmp-1)/15;
    for(j=0;j<5;j++){
        if(a[i][j]==tmp){
            printf("i=%d, j=%d\n",i,j);
        }
    }

    return 0;
}
```

```c:matsu.c
/* ビンゴマシンから出た番号を人が入れるバージョン */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 5       /* 縦横の大きさ */
#define M 15      /* 同じ列内の数の幅 */
#define HOLE (-1) /* 穴 */

/* numset(): ダブりなく x[][] に乱数を入れ中央に穴を空ける */
void numset(int x[][N])
{
    /* ダブりなく x[][] に乱数を入れ中央に穴を空ける */
    int available[100];
    int i, j, tmp;

    for (i = 0; i < 100; i++)
    {
        available[i] = 1;
    }

    srand(time(NULL));
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            tmp = rand() % M + 1;
            tmp += M * i;
            while (available[tmp] == 0)
            {
                tmp = rand() % M + 1;
                tmp += M * i;
            }
            x[i][j] = tmp;
            available[tmp] = 0;
        }
    }

    x[2][2] = HOLE;
}

/* search(): x[*pi][*pj] = num になる (*pi, *pj) を探す．その有無も
 *pfound に入れて返す */
void search(int num, int x[][N], int *pfound, int *pi, int *pj)
{
    int i, j;

    /* x[*pi][*pj] = num になる (*pi, *pj) を探す．
       その有無も *pfound に入れて返す */
    *pfound = 0;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (x[i][j] == num)
            {
                *pi = i;
                *pj = j;
                *pfound = 1;
            }
        }
    }
}

/* check(): x[inum][jnum] でゲームが継続するかを判定し，継続か否かを
 *pcont に入れて返す */
void check(int x[][N], int inum, int jnum, int *pcont)
{
    int i, j, bingo_cnt;

    /* x[inum][jnum] の縦横対角線方向を調べてBINGOになったか(ゲームが
        継続するか)を判定し，継続か否かを *pcont に入れて返す */

    // bingo j
    bingo_cnt = 0;
    for (j = 0; j < 5; j++)
    {
        if (x[inum][j] == HOLE)
        {
            bingo_cnt++;
        }
    }
    if (bingo_cnt == 5)
    {
        *pcont = 0;
    }

    // bingo i
    bingo_cnt = 0;
    for (i = 0; i < 5; i++)
    {
        if (x[i][jnum] == HOLE)
        {
            bingo_cnt++;
        }
    }
    if (bingo_cnt == 5)
    {
        *pcont = 0;
    }

    // bingo cross
    if (jnum == inum)
    {
        bingo_cnt = 0;
        for (i = 0, j = 0; i < 5; i++, j++)
        {
            if (x[i][j] == HOLE)
            {
                bingo_cnt++;
            }
        }
        if (bingo_cnt == 5)
        {
            *pcont = 0;
        }
    }
    if (jnum + inum == N - 1)
    {
        bingo_cnt = 0;
        for (i = 0, j = 5; i < 5; i++, j--)
        {
            if (x[i][j] == HOLE)
            {
                bingo_cnt++;
            }
        }
        if (bingo_cnt == 5)
        {
            *pcont = 0;
        }
    }
}

/* numout(): 現在の x[][] の状態を出力する */
void numout(int x[][N])
{
    int i, j;

    /* 現在の x[][] の状態(盤面)を出力する */
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (x[i][j] == HOLE)
            {
                printf("  --");
            }
            else
            {
                printf("%4d", x[i][j]);
            }
        }
        printf("\n");
    }
}

/* メインプログラム */
int main(void)
{
    int num;     /* ビンゴマシンから出た番号 */
    int cont;    /* BINGO になっていないかを示す(1：未達; 0: BINGO) */
    int a[N][N]; /* 盤面 */
    /* 他にも必要な変数を加える */
    int pfound, pi, pj;

    /* 最初に numset() で最初の盤面にし，numout() で出力する */
    numset(a);
    numout(a);

    cont = 1;
    while (cont == 1)
    {
        /* (1) 1 <= n <= 75 である num を scanf で入力する */
        printf("num=");
        scanf("%d", &num);
        /* (2) search() で 盤面に num があるか調べる */
        search(num, a, &pfound, &pi, &pj);
        /* (3) (2) で見つかったらその場所に穴を開け，
               check() で BINGO になったか調べ，
               BINGO になったら cont を 0 にする(while 文を抜ける) */
        if (pfound == 1)
        {
            a[pi][pj] = HOLE;
            check(a, pi, pj, &cont);
        }
        /* (4) 毎回 numout() で変化した盤面を表示する */
        numout(a);
        /* 終了表示 */
    }
}
```