【C言語】平成24年秋 基本情報技術者試験 午後 問9

```c:001a.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LOT_DNUM 6 // くじの桁数
#define LOT_GNUM 6 // くじの等級数

void check_winning_lot(char *[], char **[LOT_GNUM], int [LOT_GNUM]);
int check_lot(char *, char *);

void check_winning_lot(char *lots[], char **win_list[LOT_GNUM], int winner[LOT_GNUM]){
  int i, j, k;

  for (i = 0; i < LOT_GNUM; i++) {
    winner[i] = 0;
    for (j = 0; lots[j] != NULL; j++) {
      for (k = 0; win_list[i][k] != NULL; k++) {
		 winner[i] += check_lot(lots[j], win_list[i][k]);
      }
    }
}

  /* 結果を表示 */
  printf("winner(当選)\n");

  for (i = 0; i < LOT_GNUM; i++) {
    printf("%d等は%d本\n", i + 1, winner[i]);
  }

}

int check_lot(char *lot, char *win){
  int lenw, result = 1, i;

  lenw = strlen(win);

  win += lenw;
  lot += LOT_DNUM;

  for (i = 0; (i < lenw)&&(result == 1); i++) {
    if (*(--lot) != *(--win)) {
      result = 0;
    }
  }
  
  return result;
}

void main() {

char *lots[4] = {"314159","111292","123492",NULL};// 確認するくじのくじ番号表

char *k1[2]={"223692",NULL};
char *k2[3]={"141421","314159",NULL};
char *k3[3]={"27182","00145",NULL};
char *k4[3]={"3301","1028",NULL};
char *k5[4]={"243","101","144",NULL};
char *k6[3]={"03","92",NULL};

char **win_list[LOT_GNUM];

int winner[LOT_GNUM];// 当選本数表

win_list[0] = k1;
win_list[1] = k2;
win_list[2] = k3;
win_list[3] = k4;
win_list[4] = k5;
win_list[5] = k6;

check_winning_lot(lots, win_list, winner);

}

```



```c:002a.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LOT_DNUM 6 // くじの桁数
#define LOT_GNUM 6 // くじの等級数

void check_winning_lot(char *[], char **[LOT_GNUM], int [LOT_GNUM], int [LOT_GNUM]);
int check_lot(char *, char *);

void check_winning_lot(char *lots[], char **win_list[LOT_GNUM], int winner[LOT_GNUM],int special[LOT_GNUM]){
  int i, j, k;
  int pflg,nflg,m;
  char pnum[LOT_DNUM+1],nnum[LOT_DNUM+1];

  for (i = 0; i < LOT_DNUM+1; i++) {
    pnum[i]=NULL;
	nnum[i]=NULL;
  }

  for (i = 0; i < LOT_GNUM; i++) {
    winner[i] = 0;
	special[i]=0;
	for (j = 0; lots[j] != NULL; j++) {
	   //初期化
	   pflg=nflg=0;
	   for(m=LOT_DNUM-1;m>=0;m--){
	     pnum[m]=nnum[m]=*(lots[j]+m);
		 if(pflg==0){
		     if(pnum[m]=='0'){
			     pnum[m]='9';
			 }else{
			     pnum[m]--;
			     pflg=1;
			 }
		 }
		 if(nflg==0){
		     if(nnum[m]=='9'){
			     nnum[m]='0';
			 }else{
			     nnum[m]++;
			     nflg=1;
			 }
		 }
	   }
	   pnum[LOT_DNUM]=nnum[LOT_DNUM]='\0';
      for (k = 0; win_list[i][k] != NULL; k++) {
		 winner[i] += check_lot(lots[j], win_list[i][k]);
		 if(strlen(win_list[i][k])==LOT_DNUM){
		   special[i] += check_lot(pnum, win_list[i][k]);
		   special[i] += check_lot(nnum, win_list[i][k]);
		 }
      }
    }
}

  /* 結果を表示 */
  printf("winner(当選)\n");

  for (i = 0; i < LOT_GNUM; i++) {
    printf("%d等は%d本\n", i + 1, winner[i]);
  }

  printf("special\n");

  for (i = 0; i < LOT_GNUM; i++) {
    printf("%d等の前後賞は=%d本\n", i + 1, special[i]);
  }
}

int check_lot(char *lot, char *win) {
  int lenw, result = 1, i;
  
  lenw = strlen(win);

  win += lenw;
  lot += LOT_DNUM;

  for (i = 0; (i < lenw)&&(result == 1); i++) {
    if (*(--lot) != *(--win)) {
      result = 0;
    }
  }
  
  return result;
}

void main() {

char *lots[7] = {"314159","314160","314158","111292","123492","987103",NULL};// 確認するくじのくじ番号表

char *k1[2]={"223692",NULL};
char *k2[3]={"141421","314159",NULL};
char *k3[3]={"27182","00145",NULL};
char *k4[3]={"3301","1028",NULL};
char *k5[4]={"243","101","144",NULL};
char *k6[3]={"03","92",NULL};

char **win_list[LOT_GNUM];

int winner[LOT_GNUM];// 当選本数表
int special[LOT_GNUM];//前後賞の当選本数表

win_list[0] = k1;
win_list[1] = k2;
win_list[2] = k3;
win_list[3] = k4;
win_list[4] = k5;
win_list[5] = k6;

check_winning_lot(lots, win_list, winner, special);

}

```




##環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32

##解説
平成24年秋 基本情報技術者試験 午後 問9 C言語
001a.c:複数本のくじのくじ番号を当選番号と比較し、当たりを確認するプログラムである。
002a.c:前後賞あり版
問題文の関数が動くようにmain関数を追加した。

ポインタのポインタのwin_listに当選番号を入れるのってこれでいいのだろうか？

nnumとpnumって、char型なのに
nnum[m]++
pnum[m]--
っで何で加算と減算できんだ？解せない。こんな挙動するのか。

C言語は勉強不足でよく分からんことが多い。

##コンパイルと実行結果
上記ソースを
c:\2015\0326\001a.c
c:\2015\0326\002a.c
としてコンパイルして実行する。

```

c:\2015\0326>bcc32 001a.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
001a.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\2015\0326>001a.exe
winner(当選)
1等は0本
2等は1本
3等は0本
4等は0本
5等は0本
6等は2本

c:\2015\0326>bcc32 002a.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
002a.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\2015\0326>002a.exe
winner(当選)
1等は0本
2等は1本
3等は0本
4等は0本
5等は0本
6等は3本
special
1等の前後賞は=0本
2等の前後賞は=2本
3等の前後賞は=0本
4等の前後賞は=0本
5等の前後賞は=0本
6等の前後賞は=0本

```