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

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

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

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

10.09.2011, 21:45. Просмотров 719. Ответов 11
Метки нет (Все метки)

Только вчера начал осваивать С++, со многими вопросами разобрался, но с этим никак =(

Данные:
Есть двухмерный массив с тремя видами символов (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";
		}
Очень прошу помочь и указать в чем косяк, задолбался уже с этой частью кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2011, 21:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проблема сравнения данных в массиве с другими данными (C++):

Реализация сравнения данных в массиве в классах - C++
Прошу нравоучения наверн, как организовать можно сравнение веса(weight) спортсменов и вывод в конце программы самого лёгкого.. с массивами...

Проблема ф-ии сравнения элементов списка - C++
День добрый, вот есть такая загогулина (вроде бы и простая, но я уже всю голову себе разнес): Есть список, каждый элемент из которого:...

Проблема сравнения чисел с плавающей точкой - C++
Добрый вечер, развивая тему к которой меня подтолкнул, Байт, посоветуйте ряд лайффаков на тему фикса (кроссплатформенность же ж ) ...

В массиве объектов класса все объекты заполняются данными последнего - C++
Есть задача: напишите программу, которая может выводить список членов по реальным именам, должностям, секретным именам и по предпочтению...

Сравнение данных структуры с данными, введенными с клавиатуры - C++
Есть такая структура: struct spisok { char departure; }; //далее будет использоваться spisok sp В sp.departure записано: 15:00...

Как записать в столбец с логическим типом данных результат сравнения из 2 столбцов с числовыми данными - Delphi БД
Прошу помочь , требуется записать в столбец с логическим типом данных результат сравнения из 2 столбцов с числовыми данными (программно)....

11
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
10.09.2011, 21:47 #2
Выложите полный код, может ошибка не здесь.
0
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;
}
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 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';
1
Bearserker
0 / 0 / 0
Регистрация: 10.09.2011
Сообщений: 5
10.09.2011, 21:57  [ТС] #5
Цитата Сообщение от Dani Посмотреть сообщение
Лучше воспользоваться оператором перечисления, тогда код красивее будет
Спасибо, не знал о такой возможности.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 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;
1
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'))
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 07:54 #8
Цитата Сообщение от Bearserker Посмотреть сообщение
Спасибо, не знал о такой возможности.
Лучше забудь о такой возможности. Проблем от этого гораздо больше, чем якобы пользы.

Добавлено через 1 минуту
Для задания размера map и map_full используй константы x_conssst и y_const.
1
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] != ' ')
1
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 была паралельная ошибка, которую уже исправил.

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



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

Выбрать записи, где поле ФИО из БД с исходными данными равно полю ФИО из БД с данными для сравнения. Сравнение в цикле - MS Access
Доброго времени суток! Есть 2 базы данных. 1. Исходные данные: ФИО, адрес, телефон. 2. Данные для сравнения: ФИО Нужно...

Подсчет количества сравнений в быстрой сортировке, для сравнения ее эффективности с другими сортировками - PascalABC.NET
Вот код процедуры, она сортирует. в процедуру передается n-количество элементов массива. a-сам...

Как дополнить компонент Битрикс другими данными - 1С Битрикс
Здравствуйте. В компоненте корзины в arResult содержится перечь товаров с и другими данными. Возникла необходимость получения ссылки на...

Макрос сравнения текста в массиве - VBA
Есть такая задача: найти в столбике D ячейку и сравнить её с остальными ячейками в этом же столбике на совпадение текста(в процентном...


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

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

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