2017-12-01 6 views
0
bool testMagicSquare(string str) { 
    int length, sum = 0; 
    length = strlen(str); 

    for (int i = 0; i < length; i++) { 
    sum = sum + str[i]; 
    } 
    if (sum == 120) { 
    return 1; 
    } 

    else return 0; 
} 

私の割り当ては、テキストファイルから16進数の四角形を取得し、それが「マジックスクエア」かどうかをテストすることです。はいの場合は、正方形を別のテキストファイルに印刷して保存します。 テキストファイルを取得してファイルへの印刷が機能していますが、テストに固執しています。テキストファイルから16進文字列をテストする方法は?

アイデア? 16進数の文字列の

例:8 3 4 5 F E 9 2 B 0 7 C 6 D 1

+0

正方形が1桁のHEX番号に基づいている場合は、コード内でASCII値を合計することができます。マジックスクエアかどうかを確認するには、https://stackoverflow.com/questions/47555212/check-if-my-matrix-is-magic-square/47557532#47557532を参照してください。このコードは10進数ですが、数値が魔方陣を表すかどうかを確認する方法を示します。 –

+0

魔法の唯一の条件は120の合計ですか? –

+0

16進文字 'char'または' str [i] 'を" 0-9a-fA-F "としてその値に変換します。 – chux

答えて

0

このコードを試してみてください。 1桁の16進数でしか動かない!

#include <stdio.h> 
#include <ctype.h> 

#define DIMS 4 
#define COLS DIMS 
#define ROWS DIMS 

int convertChar(unsigned char v); 
int checkAndComputeSums(int *s , unsigned char *ms, int dim); 

enum STYPE { 
    SUMROW, 
    SUMCOL, 
    SUMDIAG, 

    //------------------- 

    SUMCNT 
}; 

unsigned char msqr[COLS][ROWS] = { 
    {'8','3','4','F'}, 
    {'5','E','9','2'}, 
    {'B','0','7','C'}, 
    {'6','D','A','1'} 
}; 

int sum[DIMS][SUMCNT]; 

const char * label[SUMCNT] = { 
    "ROWS","COLS","DIAG" 
}; 

int convertChar(unsigned char v) 
{ 
    int x; 

    x = toupper((int)v); 
    x -= 48; /* 48 is the ASCII code of the char 0 */ 
    if (x>9) x-=7; 

    return x; 
} 

int checkAndComputeSums(int *s , unsigned char *ms, int dim) 
{ 
    int i,j,ok=1; 

    /* The sum are cleared */ 
    for(i=0;i<dim;i++) { 
     for(j=0;j<SUMCNT;j++) { 
      s[i*SUMCNT+j] =0; 
     } 
    } 

    for(i=0;i<dim;i++) { 
     for(j=0;j<dim;j++) { 
      s[i*SUMCNT+SUMROW]+=convertChar(ms[i*dim+j]); 
      s[i*SUMCNT+SUMCOL]+=convertChar(ms[j*dim+i]); 

      if (i==j) 
       s[SUMDIAG]+=convertChar(ms[i*dim+j]); 

      if (i==dim - j - 1) 
       s[SUMDIAG+SUMCNT]+=convertChar(ms[i*dim+j]); 

     } 

     if (s[i*SUMCNT+SUMROW]!=s[SUMROW] || s[i*SUMCNT+SUMCOL]!=s[SUMROW]) 
      ok=0; 
    } 

    if (s[SUMDIAG]!=s[SUMROW] || s[SUMDIAG+SUMCNT]!=s[SUMROW]) 
     ok=0; 

    return ok; 
} 

int main(void) 
{ 
    int i,j; 

    i=checkAndComputeSums(sum[0],msqr[0],DIMS); 
    printf("The check was %s\n",(!i)?"KO":"OK"); 

    for (j=SUMROW;j<SUMCNT;j++) { 
     printf("%s: ",label[j]); 
     for(i=0;i<DIMS-((j==SUMDIAG)?2:0);i++) { 
      printf("%d ",sum[i][j]); 
     } 
     puts(""); 
    } 

    return 0; 
} 
関連する問題