生半可な ど素人の パソコン資格 :)

趣味で、資格学修を しています。 自分に 出来ることを 増やしていきたいです ^^

2016年02月

こんにちは、

fuku です、皆さんいかが

お過ごしでしょうか。


昨日は、暖かかったですね。

今日は 一転、雪が 降っています。

カラフルな 天気なので、

体調には くれぐれも お気をつけ下さい。


ところで。

又、プログラムを

作成しました。^^


〈 裏返しゲーム。〉

3桁の 2進数 数字を

入力し、

パターンに 合わせて

変換、全部 0 0 0

又は、1 1 1 にするという、

手順を 示す PG です。

( 1 を表、 0 を裏と 仮定しました )


パターンが 見つかれば、

found = 1

となり、場所を

i

で、表します。

今回は、パターンは

1 0

で、設定しています。

見つかったら、

0 1

に 変換、

続きの 数字を

変換して、

全部 同じ 数字にします。

( 最短 1手、最長 2手で
出来るみたいです )


参考図書
基本情報技術者予想問題集 [ アイテック ]
 文字列の探索… p588


… (人工知能入門)
p21
3枚の コインの パズル

〈 裏表のある コインが3枚、一列に並んでいます。
今、隣り合う2枚のコインを 同時に裏がえす操作だけで、
ある並び方の コインを 全て 表または裏にする方法を 示してください。〉


ちょっと、コードが

冗長ですが、

もしあれでしたら、

改善してみてください。;)

( バグなど ありましたら、

ご連絡下さい )




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

int i;
int j;
int found;
int n,m;
int x;

char T[4];
char P1[3];

char TS[4];
char PS[4];
char S0[2] = "0";
char S1[2] = "1";

char TK[2];

int ptn();

void hant(int y){
TK[0] = T[2];
if((y == 0) && (strcmp(TK, S0)==0)){
TS[0] = T[0];
TS[1] = S1[0];
TS[2] = S1[0];
printf("Text = %s\n", TS);}

   if((y==0) && (strcmp(TK, S1)==0)){
   TS[0] = S0[0];
   TS[1] = S1[0];
   TS[2] = TK[0];
   printf("Text = %s\n", TS);
   TS[0] = S0[0];
   TS[1] = S0[0];
   TS[2] = S0[0];
   printf("Text = %s\n", TS);}

TK[0] = T[0];
if((y == 1) && (strcmp(TK, S1)==0)){
TS[0] = S0[0];
TS[1] = S0[0];
TS[2] = T[2];
printf("Text = %s\n", TS);}

   if((y==1) && (strcmp(TK, S0)==0)){
   TS[0] = TK[0];
   TS[1] = S0[0];
   TS[2] = S1[0];
   printf("Text = %s\n", TS);
   TS[0] = S1[0];
   TS[1] = S1[0];
   printf("Text = %s\n", TS);}

}

int main(){

strcpy(P1, "10");

scanf("%s", T);
int x = ptn();
printf("i = %d\n", x);
hant(x);

}


ptn(){

i = 0;
found = -1;
n = 2;
m = 1;

while((found == -1) && (i <= (n - m + 1))){
   j = 0;
   PS[0] = P1[j];
   TS[0] = T[i+j];
    while((j <= m) && (strcmp(TS, PS) == 0)){
    j = j + 1;
   PS[0] = P1[j];
   TS[0] = T[i+j];}

   if( j > m ){
   found = 1;}
 else{
   i = i + 1;
  TS[0] = T[i];}
}


if( found == -1 ){
   i = -1;}

printf("found = %d\n", found);
return i;

}


c言語の サンプルプログラムです。

参考 : 基本情報技術者試験の アルゴリズム問題が
ちゃんと 解ける本  p 64

 西暦を 入力して頂くと、
うるう年か どうかを
判定します。^^

バグなど ありましたら、
連絡お願いします


#include <stdio.h>
#include <string.h>
#define true 1
#define false 0

int isLeapYear(int year);
int ans;
int a;
int n;
char answer[6];

int main(){

scanf("%d", &n);
a = isLeapYear(n);

if ( a == 1 )
{ strcpy(answer , "うるう年"); }
else
{ strcpy(answer, "ふつうの年"); }

printf("今年は %s です。", answer);
}


isLeapYear(year){
if ( year%4 == 0 && !(year%100 == 0))
{ ans = true; }
else
  if(year%400 == 0)
  { ans = true; }
  else
  { ans = false; }
return ans;
}
 

2015年 秋 FE 問9、
 設問2
f, g。


Level  %d  --> %d

この、%d に、何が 入るかという とい。


印字結果を 見ると、

○Level  1  --> 2

Level  3  --> 2

と ありました。


○レベル 1 の 部屋から、

レベル2の 部屋に 入る データが

ありませんよ、という 表示。


普通なら、

before  -->  after

ですが、ちょっと 込み入って まして、

level  -->  beforeLevel

が、正解でした。


さすがに、

after  -->  before

では、おかしい。

なので、

最初の after ではなく、

他のもの。

doorLevel 

は、固有名詞なので、

変数の

level  …  現在の部屋レベル  (注記より)

が、妥当かなと。


アバウトですが、

そういう 解答群の 読み方も

あるのかな、と思いました。;)

 追伸 1

level  -->  beforeLevel

後ろが before に なるのは、

論理で。ここは 丁寧に 見ていきます。


サンプル プログラム

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

FILE *logFile;
int logEOF = 0;
char cardID[5] = "----", date1[9] = "--------", time1[7] = "------",door[3] = "--",
dir[2] = "-", act[2] = "-", name[11] = "----------";
char lastID[5] = "----";
int level = 0;

void getRecord();
void putRecord();
void checkLevel();
void clearLevel();


int main()
{

logFile = fopen("Access.Log", "r");
getRecord();
while (logEOF != EOF){
     putRecord();
     getRecord();
     clearLevel();

}
fclose(logFile);

}

void getRecord(){
 if (fscanf(logFile, "%4c %8c %6c %2c %1c %1c %10c\n",cardID, date1, time1, door,
dir, act, name) == EOF)
{logEOF = EOF;}
}

void putRecord(){
     int putSpace;

     if (strcmp(cardID, lastID) == 0)
         {printf("%18s", " ");}
     else {
         printf("%4s   %10s   ", cardID, name);
         strcpy(lastID, cardID);}
         checkLevel();

putSpace = door[0] - '0' - 1;
while (0< putSpace--){
     printf("%20s", " ");
}
printf("%.2s-%.2s  %.2s:%.2s %2s ",date1+4, date1+6, time1, time1+2, door);
if (strcmp(act, "R") == 0){ printf("%s",    "(R)");}
if (strcmp(dir, "I") == 0){ printf("%s\n",   "IN");}
else { printf("%s\n",    "OUT");}

}

void checkLevel(){
 int afterLevel, beforeLevel, doorLevel;

 doorLevel = door[0] - '0';
 beforeLevel = doorLevel;
 afterLevel = doorLevel;
if ( strcmp( dir, "I" ) == 0)
{ beforeLevel = doorLevel - 1; }
else
{ afterLevel = doorLevel - 1;}
if ( strcmp( act, "R" ) == 0 )
{ afterLevel = beforeLevel; }
if ( level != beforeLevel )
{ printf("***** Level %d-->%d\n%18s", level, beforeLevel, " "); }
level = afterLevel;
}


void clearLevel(){
 if ( logEOF == EOF || ( strcmp( cardID, lastID ) != 0 ))
{ if ( level > 0 ) { printf("%18s***** Level %d-->0\n", " ", level);
level = 0;}
}
}


データ ファイル ( C言語 )
 Access.Log

T001 20151018 100024 11 I A Test Use 1
T001 20151018 102028 31 I A Test Use 1
T001 20151018 104032 21 O A Test Use 1
 





↑このページのトップヘ