Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Katerinka
0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 5
#1

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

17.06.2014, 07:15. Просмотров 601. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 07:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка корректности введенного города игра "Города" (C++):

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

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

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

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

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

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

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

Добавлено через 4 минуты
и вставить данную проверку перед проверкой использования города? Программка не заходит в цикл после первой итерации, т.к. первое слово слово пользователя не с чем сравнить. Не могли бы вы подробнее объяснить как и куда?
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
17.06.2014, 08:26 #4
заводишь счетчик int cnt = 0(сколько ходов сделано, изначально ноль). если ходов было ноль, то город может начинаться на любую букву, иначе он должен начинаться на последнюю букву последнего слова. после каждого успешного хода делаешь cnt++.
1
Хедин
74 / 69 / 36
Регистрация: 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
Katerinka
0 / 0 / 0
Регистрация: 29.05.2014
Сообщений: 5
17.06.2014, 19:51  [ТС] #6
да, спасибо большое, я уже сделала, цикл - это тема!) Теперь проблема в том, что города составные (из 2 слов, например) не читаются...вместо Нижний Новгород просто Нижний. Вот сижу снова голову ломаю.
0
Хедин
74 / 69 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.06.2014, 20:00 #7
Katerinka, ну тут либо используете функцию getline, которая читает строку с пробелами... либо идем на некоторые костыли и пишем все названия с подчеркиванием вместо пробелов, типа Нижний_Новгород
1
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
17.06.2014, 20:01 #8
string word;
cin >> word; // на некоторых компиляторах читает строку до первого пробела, при этом перевод строки не считывается!!
getline(cin, word); //читает всю строчку, включая перевод строки
1
17.06.2014, 20:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 20:01
Привет! Вот еще темы с ответами:

Реализовать функцию поиска по заданному полю в массиве структур "Info", содержащих информацию о жителях города - C++
1) Фамилия+имя / разделенные пробелами на одной строчке 2) Город; 3) Адрес /улица,квартира,дом/. 4) Дата рождения 5)...

Задача "Города и дороги" - C++
Здравствуйте! :) Решаю задачу, но моё решение не проходит на 100%, а всего лишь на 50%. Помогите-подскажите, что я делаю не так. ...

Найти количество всевозможных маршрутов от города до города - C++
Имеется n городов пронумерованных с 1 до n и m соединяющих дорог. Найти количество всевозможных маршрутов с города с номером start до...

Игра в города - C++
Несколько (2-15) игроков по очереди вводят строки. Основное правило, чтобы первый символ очередной строки был равен последнему из...


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

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

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