Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите пожалуйста написать программу на с++ / 24 сообщений из 24, страница 1 из 1
26.01.2015, 19:37
    #38863652
des666sar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа – a, b, c, d, e, f, каждое из которых не превосходит восьми. Определить, сможет ли белый слон, расположенный на поле (a, b), одним ходом пойти на поле (e, f), не попав при этом под удар черного ферзя, находящегося на поле (c, d).
Я написал что-то, но не понимаю, что не так, помогите!

Код: plaintext
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.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
	setlocale(LC_ALL, "rus");
	int a, b, c, d, e, f;
	cout<<"Введите координаты белого слона:";
	cin>>a>>b;
	cout<<"Введите координаты поля, на которое необходимо переместить белого слона:";
	cin>>e>>f;
	cout<<"Введите координаты черного ферзя, под удар которого может попасть белый слон:";
	cin>>c>>d;
	if (a==e || b==f)
	{
		if (c==e || d==f)
		{
			if ((c-d==e-f) || (c+d==e+f))
		cout<<"Белый слон сможет пойти, но попадет под удар черного ферзя.";
		}
		else
		{
		cout<<"Белый слон сможет пойти, и не попадет под удар черного ферзя.";
		}
    }
	else
	{
		cout<<"Белый слон не может пойти одним ходом на поле (e,f).";
	}
	cout<<endl;
	getch();
}
...
Рейтинг: 0 / 0
26.01.2015, 21:01
    #38863699
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
des666sarЯ написал что-то, но не понимаю, что не так, помогите!


Не так то, что ты написал просто какой-то бред.
...
Рейтинг: 0 / 0
26.01.2015, 21:32
    #38863714
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
des666sar
Код: plaintext
1.
2.
3.
4.
5.
	if (a==e || b==f)
	{
...
		cout<<"Белый слон сможет пойти...";
...


Слон не ходит по горизонтали/вертикали, это не ладья.
...
Рейтинг: 0 / 0
26.01.2015, 22:24
    #38863726
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Автор. Считай дельты.

P.S. С конём было бы интереснее...
...
Рейтинг: 0 / 0
27.01.2015, 02:57
    #38863822
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
des666sar,не проверял то что написал, протестируйте сами, и проверьте все ли условия учтены

Код: plaintext
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.
#include <math.h>

struct Point
{
	int x;
	int y;
};

int isAvailableCell_forRunnner(struct Point* cur, struct Point* dest)
{
	if (abs((double)(cur->x - dest->x)) == abs((double)(cur->y - dest->y)))
	{
		return 1;
	}
	return 0;
}

int isQueen_beat_cell(struct Point* cur, struct Point* cell)
{
	if (abs((double)(cur->x - cell->x)) == abs((double)(cur->y - cell->y)) || cur->x==cell->x|| cur->y==cell->y)
	{
		return 1;
	}
	return 0;
}

int task_from_des666sar(struct Point* runner, struct Point* dest, struct Point* queen)
{
	if (isAvailableCell_forRunnner(runner, dest) && !isQueen_beat_cell(queen, dest))
	{
		return 1;
	}
	return 0;
}
...
Рейтинг: 0 / 0
27.01.2015, 10:31
    #38863985
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercury,

проверять double на равенство — плохая идея.
...
Рейтинг: 0 / 0
27.01.2015, 13:49
    #38864219
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
RWolfSashaMercury,

проверять double на равенство — плохая идея.

то есть вы хотите сказать что операция сравнения не применима(некорректна) к типу double ?


Судя по всему это не так:

ISO/IEC 9899:201x 6.5.9 Equality operatorsSyntax
1 equality-expression: relational-expression equality-expression == relational-expression equality-expression != relational-expression
Constraints
2 One of the following shall hold:
— both operands have arithmetic type;


каких-то комментариев в стандарте об особенности использования == к типам double(который принадлежит arithmetic type ) не встретил.
...
Рейтинг: 0 / 0
27.01.2015, 14:02
    #38864230
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercury, double как и float неточно маппят целое число в свой диапазон.

Они в некотором роде напоминают хеш целого числа. Вобщем я щас не готов
указать нужные условия. Возможно для шахмат это и прокатит но в целом
погрешность кастинга к floating-point имеет место уже на этапе присваивания.

Кроме того есть нюансы с грязным нулём. Их два. +0.0 и -0.0. Есть нюансы
со спец-константой типа NaN (не число) и бесконечностями. Они .. понятное
дело не мапятся в обратную сторону.
...
Рейтинг: 0 / 0
27.01.2015, 14:07
    #38864237
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
mayton,
верю. Странно, что в стандарте про это не написали. Тогда вообще нельзя применять операцию сравнения к подмножеству типов float. Если эти проблемы не устранены.

Автор топика, в таком случае проверяйте квадраты.
...
Рейтинг: 0 / 0
27.01.2015, 14:55
    #38864335
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercurymayton,
верю. Странно, что в стандарте про это не написали.
Какой стандарт ты имеешь в виду? Язык программирования не постулирует
алгебры floating-point. Он обычно (99%) поддерживает какую-то существующую
программно-аппаратную архитектуру. И просто ссылается на нее. Нюансы
могут быть в обработке исключений, в кастингах при выполнении операций.
Ну и конечно (хе-хе) вывод на экран. По сабжу - самая коварная вещь
и грабель с топором для новичка.
...
Рейтинг: 0 / 0
27.01.2015, 15:58
    #38864459
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
maytonАвтор. Считай дельты.

P.S. С конём было бы интереснее...

Ты уверен, что фигура в данном случае важна ?
Я вот совсем не уверен. Т.е. даже наоборот -- уверен, не важна.
...
Рейтинг: 0 / 0
27.01.2015, 16:01
    #38864463
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercurymayton,
верю. Странно, что в стандарте про это не написали. Тогда вообще нельзя применять операцию сравнения к подмножеству типов float.


Да, как ни странно. Т.е. на самом деле можно, иногда, если знаешь, что делаешь.

SashaMercuryЕсли эти проблемы не устранены.


Нет, эти "проблемы" не устранены
...
Рейтинг: 0 / 0
27.01.2015, 16:09
    #38864474
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Я просто вспомнил шахматные задачки которые решал на сях. Конь - самая интересная фигура.
Ходя в данной задачке. В один ход. Пожалуй да. Тривиально.
...
Рейтинг: 0 / 0
27.01.2015, 16:44
    #38864533
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Машинальный рефакт. Не компилил. Не знаю работает-ли. Но вроде меньше букв.

Код: plaintext
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.
#include <iostream>
#include <conio.h>
using namespace std;

void input(string comment, int &x, int &y) {
	cout << "Введите координаты " << comment;
	cin >> x >> y;
}

int main() {
	setlocale(LC_ALL, "rus");
	int a, b, c, d, e, f;
	input("белого слона:", a, b);
	input("поля, на которое необходимо переместить белого слона:", c, d);
	input("черного ферзя, под удар которого может попасть белый слон:", e, f);
	cin >> c >> d;
	cout << "Белый слон ";
	if (a == e || b == f) {
		if (c == e || d == f) && ((c - d == e - f) || (c + d == e + f)) {
			cout << "сможет пойти, но ";			
		} else {
			cout << "сможет пойти, и не ";
		}
		count << "попадет под удар черного ферзя."
	} else {
		cout << "не может пойти одним ходом на поле (e,f).";
	}
	cout << endl;
	getch();
}
...
Рейтинг: 0 / 0
28.01.2015, 01:58
    #38864962
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
MasterZivSashaMercurymayton,
верю. Странно, что в стандарте про это не написали. Тогда вообще нельзя применять операцию сравнения к подмножеству типов float.


Да, как ни странно. Т.е. на самом деле можно, иногда, если знаешь, что делаешь.

SashaMercuryЕсли эти проблемы не устранены.


Нет, эти "проблемы" не устранены

1) тогда почему не написали про integer types\enumaration types, вместо aritmetic types=integer types\enumaration types+floating types ?
2) Очень странно. Тип данных подразумевает не только объем памяти выделяемый на объект и способ чтения этой памяти, но операции которые можно к нему применять. А если в случае операции сравнения мы имеем UB, то эту операцию вообще нельзя применять. В ней нет смысла, потому что она недостоверна.
3) Приведите пожалуйста пример, когда сравнение двух наверняка эквивалентных значений даст неверный результат.
fe
Код: plaintext
1.
2.
3.
double a = 0.0;
	double b = -0.0;
	printf("%i\n", a == b);



рисует 1
...
Рейтинг: 0 / 0
28.01.2015, 02:21
    #38864966
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Информация к размышлению.

wiki0x 0000 0000 0000 0000 = 0.0
0x 8000 0000 0000 0000 = –0.0
...
Рейтинг: 0 / 0
28.01.2015, 02:26
    #38864968
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
но сравнил то он их корректно
...
Рейтинг: 0 / 0
28.01.2015, 03:22
    #38864979
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SSMasterZivпропущено...


Да, как ни странно. Т.е. на самом деле можно, иногда, если знаешь, что делаешь.

пропущено...


Нет, эти "проблемы" не устранены

1) тогда почему не написали про integer types\enumaration types, вместо aritmetic types=integer types\enumaration types+floating types ?
2) Очень странно. Тип данных подразумевает не только объем памяти выделяемый на объект и способ чтения этой памяти, но операции которые можно к нему применять. А если в случае операции сравнения мы имеем UB, то эту операцию вообще нельзя применять. В ней нет смысла, потому что она недостоверна.
3) Приведите пожалуйста пример, когда сравнение двух наверняка эквивалентных значений даст неверный результат.
fe
Код: plaintext
1.
2.
3.
double a = 0.0;
	double b = -0.0;
	printf("%i\n", a == b);



рисует 1

1) Непонятно почему. Должны были написать следующее: сравнение FT производится по норме FT.
2) Можно применять сравнение по норме, и это нудно было прокомментировать в стандарте. И хотя в стандарте об этом написано, но намного позже, и по другому:
ISO/IEC 9899:201xDBL_EPSILON 2.2204460492503131E-16 // decimal constant
3)
Код: plaintext
1.
2.
3.
long double a = 0.1;
	long double b = 0.10000000000000001;
	printf("%i\n", a == b);
...
Рейтинг: 0 / 0
28.01.2015, 03:25
    #38864980
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
RWolfSashaMercury,

проверять double на равенство — плохая идея.

Сравнение целых чисел приведенных к FTвсегда будет корректным. Сравнение чисел имеющих различие в 17 знаке после запятой должно быть рассмотрено особым образом.
...
Рейтинг: 0 / 0
28.01.2015, 03:37
    #38864981
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercuryRWolfSashaMercury,

проверять double на равенство — плохая идея.

Сравнение целых чисел приведенных к FTвсегда будет корректным. Сравнение чисел имеющих различие в 17 знаке после запятой должно быть рассмотрено особым образом.

число 17 варьируется в зависимости от конкретного типа FT.
...
Рейтинг: 0 / 0
28.01.2015, 09:57
    #38865103
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
Саш. Скажи пожалуйста. А зачем ты в шахматной задаче использовал кастинг в double?
...
Рейтинг: 0 / 0
28.01.2015, 09:58
    #38865105
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercuryСравнение целых чисел приведенных к FTвсегда будет корректным. Сравнение чисел имеющих различие в 17 знаке после запятой должно быть рассмотрено особым образом.
Спору нет. А вот если из целого числа извлечь корень, а потом возвести в квадрат и сравнить с оригинальным, то сравнение может уже и не дать правильного результата.
...
Рейтинг: 0 / 0
28.01.2015, 10:03
    #38865112
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
maytonСаш. Скажи пожалуйста. А зачем ты в шахматной задаче использовал кастинг в double?

мне показалось что abs принимает FT. Ошибся ? Сейчас в стандарте посмотрел, оказывается нет. А VS выводил подсказу о том, что тип параметра должен быть double
...
Рейтинг: 0 / 0
28.01.2015, 10:14
    #38865131
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста написать программу на с++
SashaMercurymaytonСаш. Скажи пожалуйста. А зачем ты в шахматной задаче использовал кастинг в double?

мне показалось что abs принимает FT. Ошибся ? Сейчас в стандарте посмотрел, оказывается нет. А VS выводил подсказу о том, что тип параметра должен быть double
Какие пустяки. Мы в смежном форуме разработали кучу макросов для abs(...). Готовое (и наверное лучшее решение)
есть в библиотеке std. Для всех типов данных.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите пожалуйста написать программу на с++ / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]