0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 5
1

Проверка корректности введенного города игра "Города"

17.06.2014, 07:15. Показов 2717. Ответов 7
Метки нет (Все метки)

Здравствуйте, пишу программку "Города", т.е. пользователь называет какой-нибудь город, допустим, "Омск". Компьютер считывает последнюю букву и на нее осуществляет поиск города в векторе (города туда записываются из файла) и выдает этот город, предварительно записав его в "использованные". Все подфункции работают, единственная проблема с проверкой: следует проверить, ввел ли пользователь город на последнюю букву слова компьютера или он ввел просто левый город. Не получается придумать, как это реализовать.

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using namespace std;
struct city {// структура под города пользователя
    char *gorod;
    bool used;
    city(const char* g, bool u) {
        if (g == NULL || strlen(g) == 0)
            cout << "Не верно введен город!\n";
        else {
            gorod = new char[strlen(g) + 1];
            strcpy(gorod, g);
            gorod[strlen(gorod)] = 0;
            used=u;
        }
    }
    ~city() {
        if (gorod != NULL) delete[] gorod;
    }
 
};
 
int FileRead (char* fileName, vector <city*> &vse_goroda) {
    FILE* f;//для хранения всех городов
    f=fopen(fileName, "r"); // FILE -- тип переменной "Файл". fopen -- функция открытия файла для чтения ("r"), перезаписи ("w"),
    if (f == NULL) 
    {
        cout << "Файл не найден " <<fileName<< endl;
        return 0;
    }
    else {
        char* bufCity = new char[50];
        while (fscanf(f, "%s ", bufCity) == 1) {
            vse_goroda.push_back(new city(bufCity, false));
        }
        delete[] bufCity;
    }
    fclose(f);// Закрываем файл.
    return 0;
};
 
bool provCity (char* userCity, vector <city*> &vse_goroda){
    bool znach=false;
    for (int i = 0; i < vse_goroda.size(); i++)
    {
        if (strcmp(vse_goroda.at(i)->gorod, userCity) == 0 &&!vse_goroda.at(i)->used)
        {
            vse_goroda.at(i)->used=true;
            znach=true;
            break;
        }
    }
    return znach;
}
 
char posl_Symvol (char* userCity, vector <city*> &vse_goroda)
{
    char symvol_pos=0;
    for (int i=0; i<strlen(userCity); i++)//возвращает кол-во симвлов в массиве если выполнится оператор sizeof(string), ответ будет 100, а если — функция strlen(string), ответ 6.
    {
        symvol_pos=userCity[strlen(userCity)-1];//проверяем посл букву слова пользователя
 
        if (symvol_pos=='ь'|| symvol_pos=='ы'|| symvol_pos=='й'|| symvol_pos=='ъ')
        { 
            symvol_pos=userCity[strlen(userCity)-2];
        }
    }
    return symvol_pos;
}
 
 
char* findCity_firstSymbol (char symvol_per, vector <city*> &vse_goroda) {
    char* res=0;
    char symvol_perBig=toupper((unsigned char)symvol_per);
    for (int i=0; i<vse_goroda.size(); i++)//возвращает количество элементов в векторе, перебираем все города вектора
    {
        if ((vse_goroda.at(i)->gorod[0] == symvol_perBig) && !vse_goroda.at(i)->used)
        {
            vse_goroda.at(i)->used=true;
            res=vse_goroda.at(i)->gorod;
            break;
        }
    }
    return res;
}
 
int main () {
    setlocale(LC_ALL, "");// включаем в консоли русский язык
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    vector <city*> vse_goroda;
    char* userCity = new char[255]; 
    char symvol_pos=0;
    char symvol_per=0;
    bool znach;
    char* fileName ="E:\\goroda.txt";// строка для хранения имени файла 
    FileRead(fileName, vse_goroda);
    char* compCity;
    printf("Пожалуйста, введите город: \n");
    while(true)
    {
        scanf("%s", userCity);// считывание города пользователя
        if (provCity (userCity,vse_goroda)==true)
        {
            symvol_pos=posl_Symvol(userCity,vse_goroda);// ход компьютера
            compCity=findCity_firstSymbol(symvol_pos,vse_goroda);
            if (compCity!=0)
            {
                cout<<compCity<<"\nВаш ход!"<<endl;
            }
            else 
            {
                cout<<"Вы выиграли!"<<endl;
                system ("pause");
                break;
            }
        }
        else cout<<"Такого города нет в РФ и странах СНГ или его уже называли!"<<endl;
    }
    _getch();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2014, 07:15
Ответы с готовыми решениями:

Решить задачу на файловый ввод/вывод (игра "Города")
Не могу понять задачу и решить её на Си!!! Срочно! Дело в том что я сейчас на зачёте, и мне...

Игра "Города" по сети
Как сделать игру &quot;Города&quot; по сети? нужа начинка которая проверяет правильность слова с формы.

Игра "Города"
Очень нужна игра &quot;в города&quot;, на сях написанная. сам в программировании не силен. с меня небольшое...

Игра "Города" в С++
Здравствуйте) Не так давно мне понадобилось написать написать кое-что, аналогичное игре &quot;Города&quot;....

7
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.06.2014, 07:57 2
Katerinka, заведите переменную last, которая будет хранить последнее слово, использованное в игре. Если последняя буква last равна первой букве введенного слова. значит все в порядке
0
0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 5
17.06.2014, 08:10  [ТС] 3
Хедин, и вставить данную проверку перед проверкой использования города? Программка не заходит в цикл после первой итерации, т.к. первое слово слово пользователя не с чем сравнить. Не могли бы вы подробнее объяснить как и куда?

Добавлено через 4 минуты
и вставить данную проверку перед проверкой использования города? Программка не заходит в цикл после первой итерации, т.к. первое слово слово пользователя не с чем сравнить. Не могли бы вы подробнее объяснить как и куда?
0
220 / 165 / 47
Регистрация: 17.07.2012
Сообщений: 587
17.06.2014, 08:26 4
заводишь счетчик int cnt = 0(сколько ходов сделано, изначально ноль). если ходов было ноль, то город может начинаться на любую букву, иначе он должен начинаться на последнюю букву последнего слова. после каждого успешного хода делаешь cnt++.
1
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.06.2014, 18:03 5
Katerinka, будет как то так...

Добавлено через 8 минут
Katerinka, будет как то так...
string lastWord = "";
а ввод слова будет какой то вот такой:
string userWord;
C++
1
2
3
4
5
do
{
    cin >> userWord;
}
while (lastWord.length() != 0 && lastWord[lastWord.length()-1] != userWord[userWord.length()-1]);
идея этого куска: требовать ввод слова от пользователя, пока последнее слово не равно нулю и последняя буква последнего слова не равна последней букве введенного слова. Если это первый шаг и слова еще нет, то первое же условие не выполнится и программа выйдет из цикла
0
0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 5
17.06.2014, 19:51  [ТС] 6
да, спасибо большое, я уже сделала, цикл - это тема!) Теперь проблема в том, что города составные (из 2 слов, например) не читаются...вместо Нижний Новгород просто Нижний. Вот сижу снова голову ломаю.
0
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.06.2014, 20:00 7
Katerinka, ну тут либо используете функцию getline, которая читает строку с пробелами... либо идем на некоторые костыли и пишем все названия с подчеркиванием вместо пробелов, типа Нижний_Новгород
1
220 / 165 / 47
Регистрация: 17.07.2012
Сообщений: 587
17.06.2014, 20:01 8
string word;
cin >> word; // на некоторых компиляторах читает строку до первого пробела, при этом перевод строки не считывается!!
getline(cin, word); //читает всю строчку, включая перевод строки
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2014, 20:01

Массив структур "Абитуриент", определить количество абитуриентов из каждого города
Структура элемента массива поступающих в вуз: фамилия, имя, отчество, домашний адрес (город, улица,...

Рекурсия: составить цепочку максимальной длины по правилам игры "Города"
Задача: Задана последовательность названий городов. Составить цепочку максимальной длины по...

Структура "АТС": вывести для заданного города общее время разговоров
На междугородной АТС информация о разговорах содержит дату разговора, код и название города, время...

Массив структур "Конференция", создать список участников, которые приехали из заданного города
Создать массив структур, содержащий сведения об участниках конференции. Каждая структура содержит...


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

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

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