отладка кода проверки орфографии конечного автомата - PullRequest
0 голосов
/ 13 марта 2010

Мне нужен кто-то для отладки строк кода на C ++, которые я написал ниже, чтобы он мог работать. Он предназначен для проверки правописания слова «и» с использованием перехода между состояниями.

#include<iostream>
#include<string>

using namespace std;

string in_str;
int n;
void spell_check()
{
     int i;
     FILE *in_file;

     while (!EOF(in_file))
     {
           fscanf(in_str);
           n = strlen(in_str);
           start(in_str,n);
     }
}

void start()
{
     char next_char;

     int i = 0;
     if (n == 0)
     {
           cout<<"This is an empty string";
           exit();//do something here to terminate the program
     }
     else{
          next_char = in_str[i];

          if(next_char == 'a')
          {
                       i++;
                       if(i >= n) error();
                       else state_A(i);
          }
          else error();
     }
}

void state_A(int i)
{
     if(in_str[i] == 'n')
     {
                  i++;
                  if(i<n) state_AN(i);
                  else error();
     }
     else error();
}

void state_AN(int i)
{
     if(in_str[i] == 'd')
     {
                  if(i == n-1)
                       cout<<" Your keyword spelling is correct";
                  else
                      cout<<"Wrong keyword spelling";
     }
}

int main()
{
    spell_check();
    return 0;
}

Ответы [ 3 ]

1 голос
/ 13 марта 2010

Вот программа на C, которую вы можете использовать для проверки своего кода:

// -*- coding: utf-8 -*-
#include <stdio.h>
#include <stdlib.h> // EXIT_*

#define log(msg) do { \
  puts(msg); \
  } while(0)

/** $ graph-easy --input=fsm.dot --as=boxart

         ┌─────────────────────────────────────────┐
         │                                         │
         │               [^a]                      │
         │       ┌───────────────────┐             │
         │       ▼                   │             │
         │     ╔═══════╗   [^a]    ╔════╗          │
         │     ║       ║ ───────┐  ║    ║          │
         │     ║ START ║        │  ║ O  ║          │ a
         └──── ║       ║ ◀──────┘  ║    ║ ─┐       │
               ╚═══════╝           ╚════╝  │       │
                 │                   │     │       │
                 │                   │ a   │       │
                 │                   ▼     │       │
                 │                 ╔════╗  │       │
                 │        ┌─────── ║ A  ║ ◀┼───────┘
                 │        │        ╚════╝  │
                 │        │          │     │
                 │        │          │ n   │
                 │        │          ▼     │
                 │        │        ╔════╗  │
                 │        │        ║ N  ║ ─┼───────┐
                 │        │        ╚════╝  │       │
                 │        │          │     │       │
                 │        │          │ d   │       │
                 │        │          ▼     │       │
╔═════╗  EOS     │        │        ╔════╗  │       │
║ END ║ ◀────────┼────────┼─────── ║ D  ║  │       │
╚═════╝          │        │        ╚════╝  │       │
                 │        │          │     │       │
                 │        │ [^n]?    │ .   │ EOS   │ [^d]?
                 │        │          ▼     ▼       ▼
                 │        │        ╔══════════════════════╗
                 │        └──────▶ ║                      ║
                 │                 ║        ERROR         ║
                 │       EOS       ║                      ║
                 └───────────────▶ ║                      ║
                                   ╚══════════════════════╝
*/
typedef enum State {
  O, START, A, N, D, ERROR
} State;

static int next_token(void) {
  int ch = getchar();
  if (ch == '\n') // consider newline as EOS
    return EOF;
  return ch;
}

static int spell_check(void) {
  State state = O;
  int token = -1;
  while ((token = next_token()) != EOF) {
    switch(state) {
    case START:
      log("I am comming");
      // fall through
    case O:
      state = token == 'a' ? A : START; break;
    case A:
      state = token == 'n' ? N : ERROR; break;
    case N:
      state = token == 'd' ? D : ERROR; break;
    case D:
      state = ERROR; break;
    case ERROR:
      return EXIT_FAILURE;
    default:
      log("can't happen");
      return EXIT_FAILURE;
    }
  }
  if (state == O)
    log("This is an empty string");
  return state == D ? EXIT_SUCCESS : EXIT_FAILURE;
}

int main(void) {
  int rc = spell_check();
  if (rc == EXIT_SUCCESS)
    log(" Your keyword spelling is correct");
  else
    log("Wrong keyword spelling");
  return rc;
}

Использование:

$ gcc *.c && (echo and | ./a.out; echo $?)

Выход:

 Your keyword spelling is correct
0
0 голосов
/ 13 марта 2010
  1. Вы должны определить свои функции, прежде чем использовать их
  2. Нет функции с именем error
  3. exit, fscanf и strlen определены в библиотеках, которые не включены.
  4. fscanf имеет еще несколько параметров
  5. тест на EOF неверен, посмотрите на fscanf для этого

вы можете добавить -Wall к вашей инструкции по компиляции, чтобы найти все дефекты самостоятельно в будущем. Также в Интернете можно легко найти хороший справочный материал, например cplusplus.com .

И потому что я чувствую себя щедрым сегодня:
Коммутатор в сочетании с рекурсией - гораздо более элегантное решение для вашего конечного автомата ...

0 голосов
/ 13 марта 2010

Несколько комментариев:

  • Определение объекта FILE недостаточно. Вам нужно позвонить fopen, чтобы фактически открыть файл, и только тогда вы сможете читать из него, используя fscanf или что-то подобное.

  • strlen() возвращает size_t - тип без знака. Они работают с нулевыми строками в стиле C. std::string - это строковый класс C ++. Чтобы использовать strlen, сначала получите строку в стиле C:

например:

  strlen(in_str.c_str());
  • Как правило, fstream объекты используются для обработки файлов.

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

  • Функция error не определена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...