2016年8月22日月曜日

エディットグラフ

 エディットグラフを理解するのに、まずその目的を知る必要がある。エデットグラフは、2つのドキュメントがどの程度相違しているかを調べる際に、比較過程を落としたグラフのことである。この文書比較(diff)は、2つの文書A,Bの最長共通部分(LCS Longuest Common Subsequence)、または最小編集距離(SED Shotest Edit Distance)を求める問題と同じ問題として認識できる。編集距離は、2つの文字列が相違している度合い(相違度)を示す尺度とも言える。
 エディットグラフの具体的なやり方は、このようになっている。文書A、Bの各要素(A1 A2 ... AM, B1 B2 ... BN)をX軸Y軸上に並べ、それらの交点を縦横の辺で結合し、Aのx番目の要素とBのy番目の要素が等しい場合のみ (x-1, y-1) から (x, y) を結合したものである。

2016年8月19日金曜日

基数変換プログラム

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


char RadixConversion(void){
 char num1[10]={0};
 int num2[10]={0};
 int size=0;
 int w=0;
 int w2=0;
 int rdx1=0;
 int rdx2=0;
 int quo=0;
 int rem=0;
 double base=0;
 int i=0;
 double j=0;
 char ans='N';
 while(ans=='N'){
 printf("Enter a number:");
 scanf("%s",num1);
 printf("Enter the radix:");
 scanf("%d",&rdx1);
 size=strlen(num1);
 if(rdx1==2){
  j=0;
  w=0;
  for(i=size-1;i>=0;i--){
   num2[i]=num1[i]-0x30;
   base=pow(2,j);
   w=num2[i]*base+w;
   j++;
  }
 }else if(rdx1==8){
  j=0;
  w=0;
  for(i=size-1;i>=0;i--){
   num2[i]=num1[i]-0x30;
   base=pow(8,j);
   w=num2[i]*base+w;
   j++;
  }
 }else if(rdx1==10){
  j=0;
  w=0;
  for(i=size-1;i>=0;i--){
   num2[i]=num1[i]-0x30;
   base=pow(10,j);
   w=num2[i]*base+w;
   j++;
  }
 }else if(rdx1==16){
  j=0;
  w=0;
  for(i=size-1;i>=0;i--){
   if(num1[i]>0x2f&&num1[i]<0x3a){
    num2[i]=num1[i]-0x30;
   }else if(num1[i]>0x40&&num1[i]<0x46){
    num2[i]=num1[i]-0x37;
   }else if(num1[i]>0x60&&num1[i]<0x67){
    num2[i]=num1[i]-0x57;
   }
  
   base=pow(16,j);
   w=num2[i]*base+w;
   j++;
  }
 }
 w2=w;
 //入力データが2進数の場合
 if(rdx1==2){
  //8進
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 8;
   w = w / 8;
   i++;
   size++;
  }
  printf("Octal:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
  //10進
  printf("Decimal:%d\t",w2);
  //16進
  w=w2;
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 16;
   w = w / 16;
   i++;
   size++;
  }
  printf("Hexadecimal:");
  for(i=size-1;i>=0;i--){
   if(num2[i]==10){
    printf("A");
   }else if(num2[i]==11){
    printf("B");
   }else if(num2[i]==12){
    printf("C");
   }else if(num2[i]==13){
    printf("D");
   }else if(num2[i]==14){
    printf("E");
   }else if(num2[i]==15){
    printf("F");
   }else{
   printf("%d",num2[i]);
   }
  }
 }
 //入力データが8進数の場合
  if(rdx1==8){
  //2進
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 2;
   w = w / 2;
   i++;
   size++;
  }
  printf("Binary:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
  //10進
  printf("Decimal:%d\t",w2);
  //16進
  w=w2;
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 16;
   w = w / 16;
   i++;
   size++;
  }
  printf("Hexadecimal:");
  for(i=size-1;i>=0;i--){
   if(num2[i]==10){
    printf("A");
   }else if(num2[i]==11){
    printf("B");
   }else if(num2[i]==12){
    printf("C");
   }else if(num2[i]==13){
    printf("D");
   }else if(num2[i]==14){
    printf("E");
   }else if(num2[i]==15){
    printf("F");
   }else{
   printf("%d",num2[i]);
   }
  }
 }
 //入力データが10進数の場合
 if(rdx1==10){
  //2進
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 2;
   w = w / 2;
   i++;
   size++;
  }
  printf("Binary:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
  //8進
  w=w2;
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 8;
   w = w / 8;
   i++;
   size++;
  }
  printf("Octal:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
  //16進
  w=w2;
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 16;
   w = w / 16;
   i++;
   size++;
  }
  printf("Hexadecimal:");
  for(i=size-1;i>=0;i--){
   if(num2[i]==10){
    printf("A");
   }else if(num2[i]==11){
    printf("B");
   }else if(num2[i]==12){
    printf("C");
   }else if(num2[i]==13){
    printf("D");
   }else if(num2[i]==14){
    printf("E");
   }else if(num2[i]==15){
    printf("F");
   }else{
   printf("%d",num2[i]);
   }
  }
 }
 //入力したデータが16進数の場合
 if(rdx1==16){
  //2進
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 2;
   w = w / 2;
   i++;
   size++;
  }
  printf("Binary:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
  //8進
  w=w2;
  i=0;
  size=0;
  while(w!=0){
   num2[i] = w % 8;
   w = w / 8;
   i++;
   size++;
  }
  printf("Octal:");
  for(i=size-1;i>=0;i--){
   printf("%d",num2[i]);
  }
  printf("\t");
 }

 printf("\nDo you want to end?(Y/N)");
 scanf("%s",&ans);
}
  //10進
  printf("Decimal:%d\t",w2);
 return 0;
}


int main(void){

 RadixConversion();


 return 0;
}