Попытка преобразовать азбуку Морзе на английский.борющийся - PullRequest
1 голос
/ 16 ноября 2010

Я пытаюсь создать функцию для чтения азбуки Морзе из одного файла, преобразования ее в текст на английском языке, печати преобразованного текста в терминал и записи в выходной файл.Вот грубое начало ...
#define TOTAL_MORSE 91 #define MORSE_LEN 6

void 
morse_to_english(FILE* inputFile, FILE* outputFile, char morseStrings[TOTAL_MORSE][MORSE_LEN])
{ int i = 0, compare = 0;
 char convert[MORSE_LEN] = {'\0'}, *buffer = '\0';
 //read in a line of morse string from file
// fgets(buffer, //then what?
 while(((convert[i] = fgetc(inputFile)) != ' ') && (i < (MORSE_LEN - 1)))
 { i++;
 }
 if (convert[i + 1] == ' ')
  convert[i + 1] = '\0';
 //compare read-in string w/morseStrings
 for (i = 48, compare = strcmp(convert, morseStrings[i]); //48 is '0'
  i < (TOTAL_MORSE - 1) && compare != 0;
  i++) 
 { compare = strcmp(convert, morseStrings[i]);
 }
 printf("%c", (char)i);
}

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

Мой первоначальный план алгоритма был примерно таким:
1. Scan Morse code in from file, character by character, until a space is reached
1.1 save to a temporary buffer (convert)
2. loop while i < 91 && compare != 0

    compare = strcmp(convert, morseString[i])

3. if (test ==0) print ("%c", i); 4. loop through this until eof

но .. Я не могу придумать хороший способ проверить, является ли следующий символ в файле пробелом.Так что это сделало это очень трудным для меня.

Я был довольно разочарован и гуглил на идеи, и нашел предложение использовать этот алгоритм

  1. Читать строку
  2. Петля

    -strchr () для пробела или EOL -копировать символы перед пробелом в другую строку
    -Использовать strcmp () и цикл, чтобы найти букву -Проверить следующий символ для пробела.
    -Если вывести другойпробел -Переход к следующему символу Морзе

  3. Элемент списка

Endloop

Но этот цикл немного запутан.Я бы использовал fgets () (я думаю), но я не знаю, что указать в аргументе длины.

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

Ответы [ 3 ]

1 голос
/ 16 ноября 2010

Ваш оригинальный план выглядит хорошо. Тем не менее, вы отключаетесь на 1, когда проверяете ' ' в буфере. Это на convert[i], а не convert[i + 1]. i++ внутри цикла не происходит при обнаружении пробела.

0 голосов
/ 16 ноября 2010

Если вас беспокоит время процессора, вы можете написать таблицу поиска, чтобы найти значения, например, как переключатель:

case '.-': code =  "A";  break;
case '-...': code =  "B";  break;
case '-.-.': code =  "C";  break;

После того, как вы разделите код Морзе по пробелам и отправитеразные.и - комбинации с переключателем для получения оригинального персонажа.

Надеюсь, это поможет.С наилучшими пожеланиями.

0 голосов
/ 16 ноября 2010

Я бы не использовал strchr (), чтобы усложнить.

  1. Цикл по входному файлу с чтением строки
  2. токенизация строки с помощью [strtok] [1]
  3. цикла по токенам и сохранение (наилучшее добавление) отдельных букв вa Буфер
  4. закрывает циклы и печатает

бит псевдокода для u

while(there is a next line){

tokens = strtok(line);
int i = 0;

while(tokens hasnext){
save to buffer}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...