Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
drugan
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 3
#1

Помогите реализовать программу, возможно за денежное вознаграждение - C++

12.10.2011, 15:34. Просмотров 645. Ответов 10
Метки нет (Все метки)

Дано нечто конечного автомата изображенного на картинке. Суть работы программы заключается вот в чем: Воодим любую последовательность чисел и отслеживаем путь из точки S в другие точки. Например Задаем ряд чисел 1, 2, 2, 1, 2, 1, 1. Как видно из рисунка мы не наткнулись на никакие препятствия (Из S->A->A->Z->A->Z->C ) или например мы вводим последовательность 1, 1, 1, 2. Тут как видно получается путь S->A->Z->C-> ?? В этом случае должно выдать сообщение о не выполнении данного пути так как из блока С не выходит никакой стрелочки с цифрой 2. Вобщем задача не такая сложная, но уже голову сломал как ее можно реализовать.
0
Миниатюры
Помогите реализовать программу, возможно за денежное вознаграждение  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 15:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Помогите реализовать программу, возможно за денежное вознаграждение (C++):

Возможно ли реализовать шаблон?
Здравствуйте! написал код на тему такой задачи... Условие (Система...

Возможно ли реализовать аналог функции Read из Паскаля?
Здравствуйте. Возможно ли в C++ реализовать аналог функции read() из паскаля....

Помогите реализовать программу с использование рекурсии
Составить программу с использованием рекурсивной функции. Найти n-ое число...

Помогите реализовать программу вычисляющую значение многочлена
Нужна программа вычисляющую значение функции у =an Xn + an-1Xn-1+ …… +c...

возможно вознаграждение в обмен на знания. VBA Access в поле формы необходимо определить начала нескольких последовательных работ
Всем добрый день! Прошу помочь мне, так как сама что-то никак не могу...

Возможно ли реализовать
Насколько возможно и возможно ли реализовать добавление теории в готовую...

10
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
12.10.2011, 16:53 #2
перемещение должно быть конкретно по этой карте?

Добавлено через 2 минуты
задача прикольная мой скайп van113377 добавляйся обсудим ВСЁ
1
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
12.10.2011, 16:53 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include<iostream>
#include<string>
 
 
enum state{S='S', A='A', C='C', B='B', Z='Z'};
 
int main(){
    std::string str;
    std::cout<<"Enter a sequence of numbers: ";
    std::cin>>str;
    state st = S;
    std::cout<<"S->";
    for(int i=0; i<str.length(); i++){
        switch(st){
            case S:
                switch(str[i]){
                    case '1':
                        st = A;
                        break;
                    case '2':
                        st = C;
                        break;
                    case '3':
                        st = B;
                        break;
                    default:
                        std::cout<<"There is no way"<<std::endl;
                        return 0;
                }
                break;
            case A:
                switch(str[i]){
                    case '1':
                        st = Z;
                        break;
                    case '2':
                        break;
                    default:
                        std::cout<<"There is no way"<<std::endl;
                        return 0;
                }
                break;
            case C:
                switch(str[i]){
                    case '1':
                        st = Z;
                        break;
                    case '3':
                        break;
                    default:
                        std::cout<<"There is no way"<<std::endl;
                        return 0;
                }
                break;
            case B:
                switch(str[i]){
                    case '1':
                        break;
                    case '2':
                        st = Z;
                        break;
                    default:
                        std::cout<<"There is no way"<<std::endl;
                        return 0;
                }
                break;
            case Z:
                switch(str[i]){
                    case '1':
                        st = C;
                        break;
                    case '2':
                        st = A;
                        break;
                    case '3':
                        st = B;
                        break;
                    default:
                        std::cout<<"There is no way"<<std::endl;
                        return 0;
                }
                break;
        }
        std::cout<<(char)st<<(i+1 != str.length() ? "->":"\n");
    }
    std::cout<<std::endl;   
    return 0;
}
Цитата Сообщение от drugan Посмотреть сообщение
Задаем ряд чисел 1, 2, 2, 1, 2, 1, 1. Как видно из рисунка мы не наткнулись на никакие препятствия (Из S->A->A->Z->A->Z->C )
Неправильно, результат будет S->A->A->A->Z->A->Z->C, подумай.
1
drugan
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 3
12.10.2011, 21:55  [ТС] #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
Неправильно, результат будет S->A->A->A->Z->A->Z->C, подумай.
Спасибо, была такая вероятность что напутал, когда сообщение писал на работе отвлекали может и напутал. Но в любом случае суть осталась прежней.
0
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
13.10.2011, 16:21 #5
хм хм хм я так понял у каждой буквы есть свои номера путей
ну надо сделать масив двухмерный
int baza[5][3]; тут хронится номера путей
int sbaza[5][3]; тут хронится нозвание тех букв к которым преведут пути(базам с разными буквами можно присвоить имена от 1 до пяти вместо букв)

Добавлено через 10 минут
а вобще можно создать класс
class baza{
private:
int puti[];
char nameputi[][3]; - а вдруг будет супер большая карта где базы будут состоять аж из трёх букв
public:
baza(int,char *);
set_puti_baza()// функция установки пути и имени базы к которой приводит путь
add_puti_baza()// функция добавления пути и имени базы к которой приводит путь
}
конструктор база получает колво путей и строку де будут записаны названия через пробел к которым можно прийти по путям
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
13.10.2011, 17:06 #6
Сделал через таблицу переходов.

Последовательность переходов задается как первый аргумент командной строки без пробелов, последовательности "112" соответствуют переходы 1, 1, 2.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
 
/* Если будет больше 9, то начнутся проблемы */
#define TRANSITION_COUNT 3
 
enum state
{
    S, A, C, B, Z,
    STATE_COUNT
};
 
static int transitions[STATE_COUNT][TRANSITION_COUNT] =
{
    {A, C,  B},         /* переходы для S */
    {Z, A, -1},         /* переходы для A */
    {Z, -1, C},         /* переходы для C */
    {B, Z, -1},         /* переходы для B */
    {C, A,  B}          /* переходы для Z */
};
 
static const char* state_set = "SACBZ";
 
#define NEXT_STATE(STATE, TRANSITION) (transitions[STATE][TRANSITION])
 
int next_trans(const char* trans_seq)
{
    char c = *trans_seq;
 
    if(c >= '1' && c <= TRANSITION_COUNT + '0')
    return (c - '0' - 1);
 
    return -1;
}
 
int main(int argc, char* argv[])
{
    int state;
    int last_state = S;
    int trans;
        
    if(argc != 2)
    {
    fputs("Expected transitions array\n", stderr);
    exit(1);
    }
 
    putchar('S');
    
    while(*argv[1])
    {
    trans = next_trans(argv[1]);
 
    if(trans == -1)
    {
        printf(" <Unexpected transition %c>\n", *argv[1]);
        exit(1);
    }
 
    state = NEXT_STATE(last_state, trans);
 
    if(state == -1)
    {
        printf(" <Transition %c is undefined for state %c>\n",
           *argv[1], state_set[last_state]);
        exit(1);
    }
 
    printf("->%c", state_set[state]);
 
    last_state = state;
    ++argv[1];
    }
 
    putchar('\n');
    
    exit(0);
}
Пример:
Код
[nameless@desktop c]$ ./sample 1131213
S->A->Z->B->B->Z->C->C
[nameless@desktop c]$ ./sample 22
S->C <Transition 2 is undefined for state C>
[nameless@desktop c]$ ./sample 24
S->C <Unexpected transition 4>
[nameless@desktop c]$
1
Kastaneda
13.10.2011, 17:30
  #7

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Сделал через таблицу переходов.
У меня тоже первая мысль была через таблицу переходов сделать, но потом подумал, что со switch() доходчевей будет

0
Nameless One
13.10.2011, 17:31
  #8

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
У меня тоже первая мысль была через таблицу переходов сделать, но потом подумал, что со switch() доходчевей будет
а если бы там было 50 состояний?

0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
13.10.2011, 17:42 #9
если бы было 50 состояний, или пришлось бы писать с расчетом на расширение программы, то конечно switch() не вариант

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
а если бы там было 50 состояний?
Цитата Сообщение от Nameless One
C
1
/* Если будет больше 9, то начнутся проблемы */

0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
13.10.2011, 17:46 #10

Не по теме:

Kastaneda, так то ж не состояния, а переходы
Да и проблемы эти легко решаются.


Ну ладно, на этом закончим офтоп
0
drugan
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 3
13.10.2011, 19:52  [ТС] #11
Всем спасибо, я воспользовался уже вариантом Kastaneda, через switch как то понятнее, сегодня узнал что немного доработать надо, чтобы при пустом вводе (при отсутствии введенной строки) при нажатии Enter выводилось сообщение о требовании ввести числа, и сегодня узнал о том что конечное состояние Z, даже если всякая последовательность бедет введена правильно и иметь конечный пункт, но им будет не Z, то должно выпасть сообщение об этой ошибке. Но это я сам сейчас додумаю, самое главное что костяк есть, Всем спасибо.

Добавил в тот код еще библиотеку #include "conio.h" и getch(); в конце каждой ветки, чтобы после выполнения программа не вылетала, а ожидала нажатия клавиши
0
13.10.2011, 19:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 19:52
Привет! Вот еще темы с решениями:

Возможно ли реализовать?
Например есть страница index.html, когда пользователь открывает эту страницу,...

Возможно ли реализовать?
Всем привет, можно ли сделать на php оболочку для чтения книг, при помощи ООП?...

Возможно ли реализовать?
Добрый день товарищи, я в аксесе чайник. Мне необходимо перенести систему...

Возможно ли реализовать?
Доброй ночи, меня интересует вопрос, возможно ли реализовать рулетку (игровую,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru