HLFX.Ru Forum Страницы (4): « 1 2 [3] 4 »
Показать все 60 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Очередная тема о программировании (https://hlfx.ru/forum/showthread.php?threadid=2348)


Отправлено Дядя Миша 28-10-2010 в 13:17:

Ну вот, наконец-то циклы правильные.

Добавлено 28-10-2010 в 17:17:

ЗЫ. % 2 можно по идее заменить на & 1.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено DEAD MAN 08-11-2010 в 18:36:

Ещё один вопрос по массивам назрел. Скажем у меня есть матрица 5 на 5, допустим такая:

1 6 8 4 9
5 3 9 4 5
9 3 7 5 1
0 0 8 6 6
6 7 2 0 4

И скажем с клавиатуры я задаю 4 строку и 2 столбец. При этом 4 строка должна поменяться местами со 2ым столбцом. Т.е. новая матрица должна выглядеть так (там где знак вопроса может стоять любая цифра, например 100):

1 0 8 4 9
5 0 9 4 5
9 8 7 5 1
6 ? 3 0 7
6 6 2 0 4

Как это реализовать?


Отправлено Дядя Миша 08-11-2010 в 20:11:

Ну обычно быдлокодингом, по типу:

C++ Source Code:
1
void Matrix3x3_Transpose( matrix3x3 out, const matrix3x3 in )
2
{
3
  out[0][0] = in[0][0];
4
  out[1][0] = in[0][1];
5
  out[2][0] = in[0][2];
6
  out[0][1] = in[1][0];
7
  out[1][1] = in[1][1];
8
  out[2][1] = in[1][2];
9
  out[0][2] = in[2][0];
10
  out[1][2] = in[2][1];
11
  out[2][2] = in[2][2];
12
}

Операция называется транспонированием матрицы (если конечно надо все ячейки поменять, а не только одну).
Операция достаточно ответственная, поэтому в цикле её лучше не делать, чтобы потом не гадать отчего всё глючит.
Если одну ячейку - то принцип тот же.

Добавлено 08-11-2010 в 23:11:

ЗЫ. Для твоего примера вышеприведенный код будет выглядеть приблизительно вот так:
C++ Source Code:
1
matrix3x3 tmp;
2
int row= 1, column=2;
3
memcpy( tmp, mat, sizeof( matrix3x3 ));
4
mat[row][0] = tmp[0][column];
5
mat[row][1] = tmp[1][column];
6
mat[row][2] = tmp[2][column];

Что-то типа того. Но надо как следует разобраться где у тебя строки. а где столбцы, то есть скорее тест на внимательность, нежели на умение кодить.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено DEAD MAN 08-11-2010 в 20:34:

Дядя Миша Извини, что я не совсем понимаю как это можно связать с началом моего кода:

code:
#include <stdio.h> #include <stdlib.h> int main() { int A[5][5]; int i=0,j=0; for (i=0;i<5;i++) { for (j=0;j<5;j++) { A[i][j] = rand() % 100; printf("%d\t",A[i][j]); } printf("\n"); } printf("Stroka, Stolbec: "); scanf("%d %d",&i,&j); return 0; }


Не мог бы чуть подробней объяснить?


Отправлено Дядя Миша 08-11-2010 в 21:24:

DEAD MAN тебе для удобства надо функцию завести, которая будет свапать выбранную строку и столбец, и вынести туда код, по типу того что я привёл. Тогда не запутаешься: получаешь из консоли строку, столбец, кормишь их функции, она сама всё свапает. А в одном майне и запутаться недолго.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено DEAD MAN 15-11-2010 в 20:05:

Новый вопрос.

Пользователь вводит координаты некой четырёхугольной фигуры. Программа должна сказать по этим точкам является ли фигура прямоугольником.
Проблема в том, что я понимаю как это надо делать: найти углы между векторами, найти длину векторов и сравнить противоположные стороны(если конечно они параллельны). Но тут возникает 2 проблемы. Тонны переменных, которые меня несколько напрягают(поскольку вводить координаты надо для 3ёх разных фигур) . И честность пользователя, будет ли он вводить координаты по часовой стрелке, или в случайном порядке, т.к. во втором случаи понятия не имею для каких векторов находить углы и длины.
В общем, есть ли более простой способ решения задачи?


Отправлено Skaarj 15-11-2010 в 20:24:

Кирпичами не кидайтесь. %)
Я бы всю фигуру передвинул бы в начало кооординат одной точкой и 2 раза повернул бы вокруг этой первой точки так, что бы сначала эта первая точка и, например, 2-я легли на одну ось и затем ещё раз, что бы уже 1 и 3-я опять же легли на одну ось.
Осталось бы за эти 2 поворота сравнить координаты точек, у прямоугольника будут по 2 парные точки с одинаковыми координатами по одной из осей за один из 2х вариантов поворота.


Отправлено Дядя Миша 15-11-2010 в 20:42:

DEAD MAN это школьная программа геометрии )

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SiPlus 20-11-2010 в 14:43:

Я бы так сделал:
1) Нашел бы верхнюю левую точку.
2) Нашел бы верхнюю правую точку.
3) Нашел бы нижнюю левую точку.
4) Нашел бы нижнюю правую точку.
5) Сравнил бы X левой верхней и левой нижней точек.
6) Сравнил бы X правой верхней и правой нижней точек.
7) Сравнил бы Y левой верхней и правой верхней точек.
8) Сравнил бы Y левой нижней и правой нижней точек.
И если либо в 5, либо в 6, либо в 7, либо в 8 получаются не равные результаты, значит фигура - не прямоугольник.


Отправлено Government-Man 20-11-2010 в 18:58:

SiPlus а если он повернут на 34°?


Отправлено CrazyRussian 20-11-2010 в 19:13:

первое что на ум пришло:

C++ Source Code:
1
bool IsRectangle(int x1,int y1,int x2,int y2)
2
{
3
  // x1,y1		x2,y1
4
  //
5
  // x1,y2		x2,y2
6
 
7
  Vector edge1,edge2,edge3,edge4;
8
 
9
  edge1=Vector(x2-x1,y1-y1);
10
  edge2=Vector(x1-x1,y2-y1);
11
 
12
  edge3=Vector(x1-x2,y2-y2);
13
  edge4=Vector(x2-x2,y1-y2);
14
 
15
  float angle_11=arccos(DotProduct(edge1,edge2));
16
  float angle_22=arccos(DotProduct(edge3,edge4));
17
 
18
  return ((angle_11==90) && (angle_22==90));
19
}

__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов


Отправлено Government-Man 20-11-2010 в 19:15:

DEAD MAN координаты должны вводиться только по часовой или только против часовой стрелки. Потом поверяешь противоположные стороны на равенство и один (любой) из углов на равенство 90° (результат скалярного произведения векторов-сторон должен быть равен 0).

Добавлено 20-11-2010 в 14:15:

Цитата:
CrazyRussian писал:
float angle_11=arccos(DotProduct(edge1,edge2);
float angle_22=arccos(DotProduct(edge3,edge4);

return ((angle_11==90) && (angle_22==90));


arccos нахрен не нужен - если угол равен 90 градусов то его косинус равен 0.


Отправлено SiPlus 21-11-2010 в 09:31:

CrazyRussian, откуда ты знаешь, что точка 2 будет поставлена человеком обязательно справа от точки 1?


Отправлено CrazyRussian 21-11-2010 в 10:10:

Цитата:
Government-Man писал:
arccos нахрен не нужен

это да, я сходу не вспомнил чему косинус 90 градусов равняется

__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов


Отправлено Дядя Миша 21-11-2010 в 10:14:

Надо заюзать RotatePointAroundVector, построить четырёхугольник завращать вокруг центра, визуализировать его и вывести диалог для юзера: Эта фигура является прямоугольником? Да\Нет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 22:29. Страницы (4): « 1 2 [3] 4 »
Показать все 60 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024