Перевод фрагмента в c в псевдокод - PullRequest
0 голосов
/ 06 февраля 2019

Я только изучаю Java, и у меня есть задание, в котором мне нужно перевести фрагмент кода C на Java.Кто-нибудь может мне помочь, переведя фрагмент в псевдокод?Я хочу сделать Java-кодирование самостоятельно, но я не знаю C, и я не могу получить много смысла из фрагмента.Это задание:


Вы ищете простой метод сопоставления с образцом.Подобно strstr (...) в C, он должен искать строку поиска в строке.Строка поиска должна содержать «*» (замена нескольких символов) и «?».У вас есть пример, но он написан на C:

int match ( char *pat, char *str ) {
 switch ( *pat ) {
  case '\0' : return !*str;
  case '*'  : return match( pat+1, str ) || *str && match( pat, str+1 );
  case '?'  : return *str && match( pat+1, str+1 );
  default   : return *pat == *str && match( pat+1, str+1 );
 }
}

Переведите его на Java.


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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я пытался комментировать это для вас.Прочитайте и посмотрите, поможет ли это вам понять:).

/* Returns an integer (nonzero if the strings match, zero if they don't).
 * - pat: A string (char *) which is your pattern.
 * - str: A string (char *) which is your source string.
 * Note: All strings end in the null-character ('\0') which has integer value zero. 
*/
int match ( char *pat, char *str ) {

 /* The switch extracts the first character of the string "pat" (*pat).
  * Then, it will run the code in the case to which that character matches:
 */
 switch ( *pat ) {

  /* If you match null-character, then return nonzero only if the value 
   * of the leading character in str (*str) is zero (!*str) This means
   * that it returns a match if the leading character in str is also 
   * the null character
  */ 
  case '\0' : return !*str;

  /* If you match an asterisk '*', then return nonzero in two cases:
   * (1) Calling your own function recursively having dropped the asterisk from
   *     the pattern returns nonzero (match(pat+1, str)).
   * ... OR ... 
   * (2) The leading character of str is nonzero (*str) AND calling
   *     this very function having dropped the leading character of str returns
   *     nonzero (match(pat, str + 1)).
  */
  case '*'  : return match( pat+1, str ) || *str && match( pat, str+1 );

  /* If you match '?', then return nonzero if both cases are true:
   * (1) *str is not the null-char (it is nonzero).
   * (2) Calling match recursively having skipped the current character
   * in both the pattern AND the string returns nonzero (match(pat+1, str+1)).
  */                             
  case '?'  : return *str && match( pat+1, str+1 );


  /* Otherwise, if you didn't match on any of the above patterns, return
   * nonzero only if both the following conditions are true:
   * (1) The current character at the head of pat is the same as that of str
   *      (*pat == *str)
   * (2) calling match recursively having skipped both the current character
   *     at the head of pattern AND the string also returns nonzero. 
   *     match(pat + 1, str + 1)
  */
  default   : return *pat == *str && match( pat+1, str+1 );
 }
}
0 голосов
/ 06 февраля 2019

C и Java - похожие языки, поэтому вы можете понимать части программы.

Есть несколько важных отличий.C использует массив char для строк и отмечает конец строки завершающим '\0'.Аналогично массивам указатели.

В функции

int match ( char *pat, char *str )

pat - указатель на строку шаблона, str - строка, с которой нужно сопоставить.

В теле функции *pat - первый символ шаблона.Аналогично для *str.

pat+1 - указатель на следующий символ строки, за которым могут следовать другие символы.Следующим символом также может быть маркер конца '\0'.

. В C вы можете использовать числа для логических операций.

!*str

- логическое отрицание значения первого символа, гдеstr указывает на.'\0' - это значение 0 (конец строки), которое рассматривается как false.Любой символ в строке имеет ненулевое значение и считается true.

Тип возвращаемого значения int используется как логическое значение.в C нет определенного типа boolean или bool.Например,

case '\0' : return !*str;

означает: Когда мы достигли конца шаблона (case '\0':), мы возвращаем true (не 0), если str указывает на конец строки ('\0')в противном случае мы возвращаем false, потому что логическое отрицание чего-либо != 0 (true) равно 0 (false).

...