Форум программистов, компьютерный форум CyberForum.ru

Проблема сравнения данных в массиве с другими данными - C++

Восстановить пароль Регистрация
 
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
10.09.2011, 21:45     Проблема сравнения данных в массиве с другими данными #1
Только вчера начал осваивать С++, со многими вопросами разобрался, но с этим никак =(

Данные:
Есть двухмерный массив с тремя видами символов (char - 'X', 'O', ' '), все переменные объявлены и инициированы. Х и У - int.

Проблема:
При попытке сравнить данные имеющиеся в массиве по определенному адресу (причем, по любому) с другими данными, условия указанные в if игнорируются, как будто бы просто не находит в этой ячейке точно такого же значения.

Часть шапки:
Код
#include "stdafx.h" // требует MVS
#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")

using namespace std;

char map_full[3][3];
Варианты, которые использовал безрезультатно:

Код
		if ((map_full [x][y] == 'X') && (map_full [x][y] == 'O'))
		{
			cout << "Сюда ставить уже нельзя\n";
		}
Код
		if (map_full [x][y] != ' ')
		{
			cout << "Сюда ставить уже нельзя\n";
		}
Очень прошу помочь и указать в чем косяк, задолбался уже с этой частью кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2011, 21:45     Проблема сравнения данных в массиве с другими данными
Посмотрите здесь:

C++ Реализация сравнения данных в массиве в классах
проблема с проверкой вводимых данных C++
Научиться работать с векторными данными языка «С»: структурами и объединениями. Изучить правила объявления структур и объединений, обращение к их полям, построение вложенных векторных типов данных. C++
C++ Проблема с типами данных
Проблема ф-ии сравнения элементов списка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
10.09.2011, 21:47     Проблема сравнения данных в массиве с другими данными #2
Выложите полный код, может ошибка не здесь.
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
10.09.2011, 21:50  [ТС]     Проблема сравнения данных в массиве с другими данными #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
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// XO.cpp: создаем Крестики-нолики .
//
 
#include "stdafx.h"
#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")
 
using namespace std;
 
int x_const=3;
int y_const=3;
char act;
int ch;
int z;
int x=1;
int y=1;
int x_old;
int y_old;
char map[3][3];
char map_full[3][3];
int i;
int j;
char gamer;
char gamer1 = 'X';
char gamer2 = 'O';
 
inline void plus (int& x, int& y)
{
    
    if (x==x_const)
    {
        x=x_const-1;
    }
    if (y==y_const)
    {
        y=y_const-1;
    }
    if (x<0)
    {
        x=0;
    }
    if (y<0)
    {
        y=0;
    }
 
    //z=' ';
}
 
inline void map_move (int& x, int& y)
{
    plus (x, y);
    map [x][y] = gamer; 
}
 
 
int main()
{
    setlocale (LC_CTYPE,"Russian");
    
    cout << "Введите кто первый ходит Х или О?\n";
 
        act = _getch();
        ch = static_cast<int>(act);
 
        //cout << ch;
        //_getch();
 
 
        switch (ch)
        {
 
        case -32:
            break;
 
        case 120:
            gamer = gamer1;
            break;
 
        case -27:
            gamer = gamer1;
            break;
 
        case 111:
            gamer = gamer2;
            break;
 
        case -82:
            gamer = gamer2;
            break;
        }
 
 
    for (i=0; i<x_const; i++)
    {
        for (j=0; j<y_const; j++)
        {
            map[i][j]=' ';
            map_full[i][j]=' ';
        }
    }
 
map[x][y] = gamer;
 
while (1)
{
    system("cls");
    cout <<"Координаты х="<<x<<", у="<<y<<"\n";
 
    for (i=0; i<x_const; i++)
    {
        for (j=0; j<y_const; j++)
        {
            cout << map[i][j];
        }
    cout << "\n";
    }
 
    act = _getch();
    ch = static_cast<int>(act);
 
    //cout << ch;
    //_getch();
 
 
    switch (ch)
    {
    case -32: // от двойного вывода на экран
        break;
 
    case 27:
            exit(0);
        break;
 
    case 80:
        map [x][y] = ' ';
        x_old=x;
        x++;
        map_move(x, y);
        break;
 
    case 72:
        map [x][y] = ' ';
        x_old=x;
        x--;
        map_move(x, y);
        break;
 
    case 75:
        map [x][y] = ' ';
        y_old=y;
        y--;
        map_move(x, y);
        break;
 
    case 77:
        map [x][y] = ' ';
        y_old=y;
        y++;
        map_move(x, y);
        break;
 
    case 13:
        if ((map_full [x_old][y_old] == gamer1) && (map_full [x_old][y_old] == gamer2))
        {
            cout << "Сюда ставить уже нельзя\n";
            _getch();
        } 
        else
        {
            map_full[x_old][y_old] = gamer;
            
            cout << "Запомнил\n";
            
            if (gamer == gamer1)
            {
                gamer = gamer2;
            } 
            else
            {
                gamer = gamer1;
            }
 
            _getch();
        }
        break;
         
    }
 
 
}
 
 
 
    return 0;
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
10.09.2011, 21:54     Проблема сравнения данных в массиве с другими данными #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int x_const=3;
int y_const=3;
char act;
int ch, z;
int x=1;
int y=1;
int x_old;
int y_old;
char map[3][3];
char map_full[3][3];
int i;
int j;
char gamer;
char gamer1 = 'X';
char gamer2 = 'O';
Лучше воспользоваться оператором перечисления, тогда код красивее будет.

Добавлено через 1 минуту
C++
1
2
int x_const=3, y_const=3, ch, z, x=1, y=1, x_old, y_old, i, j;
char act, map[3][3], map_full[3][3], gamer, gamer1 = 'X', gamer2 = 'O';
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
10.09.2011, 21:57  [ТС]     Проблема сравнения данных в массиве с другими данными #5
Цитата Сообщение от Dani Посмотреть сообщение
Лучше воспользоваться оператором перечисления, тогда код красивее будет
Спасибо, не знал о такой возможности.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
10.09.2011, 22:02     Проблема сравнения данных в массиве с другими данными #6
Еще вот:
C++
1
2
3
4
5
6
7
8
 if (gamer == gamer1)
                        {
                                gamer = gamer2;
                        } 
                        else
                        {
                                gamer = gamer1;
                        }
Не надо делать блок (хотя это и правильно), когда стоит 1 выражение:
C++
1
2
 if (gamer == gamer1)   gamer = gamer2;
                        else  gamer = gamer1;
Liebe
...
 Аватар для Liebe
891 / 74 / 5
Регистрация: 21.02.2010
Сообщений: 2,196
Записей в блоге: 1
11.09.2011, 02:42     Проблема сравнения данных в массиве с другими данными #7
Цитата Сообщение от Bearserker Посмотреть сообщение
Варианты, которые использовал безрезультатно:

Код
		if ((map_full [x][y] == 'X') && (map_full [x][y] == 'O'))
		{
			cout << "Сюда ставить уже нельзя\n";
		}
а как у вас одновременно в одной ячейке может быть и 'X' и 'О' ? попробуйте вместо && использовать ||
C++
1
if ((map_full [x][y] == 'X') || (map_full [x][y] == 'O'))
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 07:54     Проблема сравнения данных в массиве с другими данными #8
Цитата Сообщение от Bearserker Посмотреть сообщение
Спасибо, не знал о такой возможности.
Лучше забудь о такой возможности. Проблем от этого гораздо больше, чем якобы пользы.

Добавлено через 1 минуту
Для задания размера map и map_full используй константы x_conssst и y_const.
antid0t
 Аватар для antid0t
4 / 4 / 0
Регистрация: 23.02.2011
Сообщений: 42
11.09.2011, 11:32     Проблема сравнения данных в массиве с другими данными #9
Варианты, которые использовал безрезультатно:

Код
		if ((map_full [x][y] == 'X') && (map_full [x][y] == 'O'))
		{
			cout << "Сюда ставить уже нельзя\n";
		}
Код
		if (map_full [x][y] != ' ')
		{
			cout << "Сюда ставить уже нельзя\n";
		}
Очень прошу помочь и указать в чем косяк, задолбался уже с этой частью кода.[/QUOTE]

Как уже сказали выше, ошибка в первом коде: в одной ячейке не может быть одновремено записано Х и О, используйте оператор || (логическое ИЛИ).
Второй код выглядит правильным, но я не уверен что разрешаются пробелы перед размерностью масива, попробуйте if (map_full[x][y] != ' ')
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
11.09.2011, 12:46  [ТС]     Проблема сравнения данных в массиве с другими данными #10
Цитата Сообщение от Dani Посмотреть сообщение
Не надо делать блок (хотя это и правильно), когда стоит 1 выражение
Об этой возможности знаю, но для новичка так легче читается код.

Цитата Сообщение от liebe Посмотреть сообщение
а как у вас одновременно в одной ячейке может быть и 'X' и 'О' ? попробуйте вместо && использовать ||
Спасибо, как раз здесь и была ошибка. Я не правильно понимал функцию && и ||.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Лучше забудь о такой возможности. Проблем от этого гораздо больше, чем якобы пользы.
Вы не могли бы написать чем эта функция плоха?

Цитата Сообщение от Deviaphan Посмотреть сообщение
Для задания размера map и map_full используй константы x_conssst и y_const.
Изначально для этого и вводил константные переменные, но у меня возникли сложности в какой-то момент, но после подстановки чисел вместо переменных код заработал и я пока отложил это и вывел почти все переменные в шапку.

Цитата Сообщение от antid0t Посмотреть сообщение
Второй код выглядит правильным, но я не уверен что разрешаются пробелы перед размерностью масива, попробуйте if (map_full[x][y] != ' ')
Сейчас попробовал и код заработал =/ Единственное с чем я это связываю: перезапуск MSV, либо в момент запуска этой версии if была паралельная ошибка, которую уже исправил.

Проверил: наличие и отсутствие пробела перед размерностью массива никак не сказывается на результате.



Еще раз всем спасибо, вы мне очень помогли =)
Думаю я не последний раз к Вам обращаюсь за помощью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 15:14     Проблема сравнения данных в массиве с другими данными #11
Цитата Сообщение от Bearserker Посмотреть сообщение
Вы не могли бы написать чем эта функция плоха?
Сложно читать и поддерживать. Чтобы найти определение переменной х, нужно читать строки полностью, невозможно сразу её увидеть. Ещё сложнее поменять тип отдельных переменных. В данной программе это всё пофиг, а вот в реальных программах очень не пофиг.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 17:18     Проблема сравнения данных в массиве с другими данными
Еще ссылки по теме:

C++ Проблема с typedef.... не виден новый тип данных!
Сравнение данных структуры с данными, введенными с клавиатуры C++
C++ Проблема сравнения чисел с плавающей точкой

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

Или воспользуйтесь поиском по форуму:
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
11.09.2011, 17:18  [ТС]     Проблема сравнения данных в массиве с другими данными #12
Спасибо, нечто подобное я и предлагал, но думал - вдруг есть еще и техническая сторона.
Yandex
Объявления
11.09.2011, 17:18     Проблема сравнения данных в массиве с другими данными
Ответ Создать тему
Опции темы

Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru