2016-09-12 3 views
0

Я пытаюсь заполнить многомерный массив, который соответствует структуре другого массива.Заполнение многомерного массива на языке C

Я один массив initilized следующим образом:

static char frequencyEn[][7] = 
{ 
    ['A'] = ".082", 
    ['B'] = ".015", 
    ['C'] = ".028", 
    ['D'] = ".043", 
    ['E'] = ".127", 
    ['F'] = ".022", 
    ['G'] = ".020", 
    ['H'] = ".061", 
    ['I'] = ".070", 
    ['J'] = ".002", 
    ['K'] = ".008", 
    ['L'] = ".040", 
    ['M'] = ".024", 
    ['N'] = ".067", 
    ['O'] = ".075", 
    ['P'] = ".019", 
    ['Q'] = ".001", 
    ['R'] = ".060", 
    ['S'] = ".063", 
    ['T'] = ".091", 
    ['U'] = ".028", 
    ['V'] = ".010", 
    ['W'] = ".024", 
    ['X'] = ".002", 
    ['Y'] = ".020", 
    ['Z'] = ".0O1" 
}; 

Этот массив содержит значения средних частот букв на английском языке. Второй массив, который я пытаюсь инициализировать и заполнять, будет содержать фактические частоты букв предоставленного текста.

Конечная цель - сравнить значения двух разных массивов. Я еще не работаю над кодом, который будет сравнивать два массива - только часть, где я заполняю второй массив с подсчитанными значениями.

Частота слов в строке подсчитывается таким образом. Как я могу инициализировать новый массив и заполнить его этими значениями частоты букв? Я ищу, чтобы создать массив с той же структурой, что и ранее представленным массив:

char *count(char *eText) 
{ 
    char * cryptText = "Some encrypted text."; 
    char string[100]; 
    int c = 0, count[26] = {0}; 
    int accum = 0; 

    while (cryptText[c] != '\0') 
    { 

     if (cryptText[c] >= 'a' && cryptText[c] <= 'z'){ 
     count[cryptText[c]-'a']++; 
     accum++; 
     } 

     else if (cryptText[c] >= 'A' && cryptText[c] <= 'Z'){ 
      count[cryptText[c]-'A']++; 
      accum++; 
     } 
     c++; 
    } 

    for (c = 0 ; c < 26 ; c++) 
    { 
     if(count[c] != 0) 
      printf("%c %f\n", c +'a', ((double)count[c])/accum); 
    } 
} 

Я пытаюсь понять, как я могу заполнить новый массив с той же структурой, что и первым массивом. В настоящее время код дает мне этот тип печатной продукции:

b 0.103448 
c 0.034483 
d 0.034483 
e 0.034483 
g 0.034483 
i 0.068966 
j 0.068966 
k 0.068966 
l 0.034483 
n 0.034483 
p 0.034483 
q 0.137931 
r 0.103448 
s 0.034483 
u 0.034483 
v 0.034483 
x 0.034483 
z 0.068966 

Как я могу добавить эти значения в массив таким образом:

char frequencyCurrent[][]= 
{ 
    ['A'] = ".000", 
    ['B'] = ".103" 
    ... 
} 

В случае полезно видеть вещи в контексте, это больше кода, чтобы показать, как используется инициализированная матрица:

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

char * cryptText = 0; 

static char clef[][7] = 
{ 
    ['A'] = "X", 
    ['B'] = "Y", 
    ['C'] = "Z", 
    ['D'] = "A", 
    ['E'] = "B", 
    ['F'] = "C", 
    ['G'] = "D", 
    ['H'] = "E", 
    ['I'] = "F", 
    ['J'] = "G", 
    ['K'] = "H", 
    ['L'] = "I", 
    ['M'] = "J", 
    ['N'] = "K", 
    ['O'] = "L", 
    ['P'] = "M", 
    ['Q'] = "N", 
    ['R'] = "O", 
    ['S'] = "P", 
    ['T'] = "Q", 
    ['U'] = "R", 
    ['V'] = "S", 
    ['W'] = "T", 
    ['X'] = "U", 
    ['Y'] = "V", 
    ['Z'] = "W" 

}; 

static char frequencyEn[][7] = 
{ 
    ['A'] = ".082", 
    ['B'] = ".015", 
    ['C'] = ".028", 
    ['D'] = ".043", 
    ['E'] = ".127", 
    ['F'] = ".022", 
    ['G'] = ".020", 
    ['H'] = ".061", 
    ['I'] = ".070", 
    ['J'] = ".002", 
    ['K'] = ".008", 
    ['L'] = ".040", 
    ['M'] = ".024", 
    ['N'] = ".067", 
    ['O'] = ".075", 
    ['P'] = ".019", 
    ['Q'] = ".001", 
    ['R'] = ".060", 
    ['S'] = ".063", 
    ['T'] = ".091", 
    ['U'] = ".028", 
    ['V'] = ".010", 
    ['W'] = ".024", 
    ['X'] = ".002", 
    ['Y'] = ".020", 
    ['Z'] = ".0O1" 
}; 

enum { MAX_CLEF = sizeof(clef)/sizeof(clef[0]) }; 

static char *prompt(FILE *fp, const char *prompt, char *buffer, size_t buflen) 
{ 
    printf("%s", prompt); 
    fflush(0); 
    return fgets(buffer, buflen, fp); 
} 

static void substitute(FILE *fp, const char *buffer, const char *pad1, const char *pad2) 
{ 
    int c; 
    const char *pad = pad1; 
    int col = 0; 
    for (int i = 0; (c = buffer[i]) != '\0'; i++) 
    { 
    if (col == 0) 
    { 
     fputs(pad, fp); 
     col += strlen(pad); 
     pad = pad2; 
    } 

    col++; 
    c = toupper(c); 
    if (c < MAX_CLEF && clef[c][0] != '\0') 
    { 
     fputs(clef[c], fp); 
     col += strlen(clef[c]); 
    } 
    else 
    { 
     putc(c, fp); 
     col++; 
    } 
    if (col > 72) 
    { 
     putc('\n', fp); 
     col = 0; 
    } 
    } 
} 

char *count(char *eText) 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 
    int accum = 0; 
    char *frequencies[2] 

    while (cryptText[c] != '\0') 
    { 

     if (cryptText[c] >= 'a' && cryptText[c] <= 'z'){ 
     count[cryptText[c]-'a']++; 
     accum++; 
     } 

     else if (cryptText[c] >= 'A' && cryptText[c] <= 'Z'){ 
      count[cryptText[c]-'A']++; 
      accum++; 
     } 
     c++; 
    } 

    for (c = 0 ; c < 26 ; c++) 
    { 
     if(count[c] != 0) 
      printf("%c %f\n", c +'a', ((double)count[c])/accum); 
    } 
} 


int main(void) 
{ 
    char * buffer = 0; 

    long length; 
    FILE * plainTextFile = fopen ("plaintext.txt", "rb"); 
    FILE * cipherTextFile = fopen("ciphertext.txt", "w+"); 

    if (plainTextFile) 
    { 
    fseek (plainTextFile, 0, SEEK_END); 
    length = ftell (plainTextFile); 
    fseek (plainTextFile, 0, SEEK_SET); 
    buffer = malloc (length); 
    if (buffer) 
    { 
     fread (buffer, 1, length, plainTextFile); 
    } 
    fclose (plainTextFile); 
    } 

    if (buffer) 
    { 
    printf("%s", buffer); 
    } 
    else { 
    printf("failure"); 
    } 

    substitute(cipherTextFile, buffer, "", "  "); 

    if (cipherTextFile) 
    { 
    fseek (cipherTextFile, 0, SEEK_END); 
    length = ftell (cipherTextFile); 
    fseek (cipherTextFile, 0, SEEK_SET); 
    cryptText = malloc (length); 
    if (cryptText) 
    { 
     fread (cryptText, 1, length, cipherTextFile); 
    } 
    fclose (cipherTextFile); 
    } 

    if (cryptText) 
    { 
    printf("%s", cryptText); 
    } 
    else { 
    printf("failure"); 
    } 

} 
+2

Укажите, какой массив? Этот вопрос непонятен. Что ты хочешь делать? –

+1

Массив 'frequencyEn' выглядит очень странно. Какую проблему вы пытаетесь решить? Он также никогда не используется в следующем коде, который вы показали. – 5gon12eder

+0

@ 5gon12eder Мне интересно узнать, как это странно и что я могу сделать, чтобы улучшить его. Я новичок в C. См. Правки – user25976

ответ

0

Предопределенный массив, который у вас есть, не очень удобен. Вы сохраняете значения с плавающей точкой в ​​виде строк, а индекс массива от 0 до значения ASCII от «Z» вместо 0 до 25.

Вместо определения frequencyEn вроде этого:

double frequencyEn[] = { 
    .082, .015, .028, .043, .127, .022, 
    .020, .061, .070, .002, .008, .040, 
    .024, .067, .075, .019, .001, .060, 
    .063, .091, .028, .010, .024, .002, 
    .020, .001 }; 

вы то можно сравнить следующим образом:

if (frequencyEn[c] == ((double)count[c]/accum)) 

Однако с плавающей точкой математике не является точным, так что вместо этого нужно проверить, если это «близко»

if (fabs(frequencyEn[c] - ((double)count[c]/accum)) < 0.00001) 
+0

Это хорошее представление о том, как в конечном итоге сравнить значения двух массивов. Тем не менее, мне все же интересно узнать, как получить массив, который будет иметь структуру double frequencyCurrent [] = {.010, .345, ...} где значения ((двойной) счет [c]/accum)) – user25976

+0

@ user25976 В этом случае определите 'count' как массив' double', затем разделите каждый элемент 'acc' после того, как вы прочтете текст. – dbush

+0

из-за замены алфавита, счетчик [c] не будет близок к частотеEn [c]. Есть ли способ сравнить два массива и определить способ сдвига алфавита? – user25976

Смежные вопросы