Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 03.11.2008, 16:51   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Обнуление переменной

Люди, помогите с задачей. Суть такова:
даны точки: x1, y1, x2,y2 ....xn,yn . Определить, есть ли среди этих точек 4 таких, которые могут составить квадрат.
Я решал её методом векторов, т.е брал 2 вектора, которые могут быть диагоналями и смотрел если они перпендикулярны и точкой пересечения делятся пополам, то это квадрат. Сам код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
int x[100],y[100],sx[1],sy[1],i,n,dv,per,pe,r[100];
int razm(int)
{
   for (i=0;i<n;i++)
    {r[i]=sqrt(pow(x[i+1]-x[i],2)+pow(y[i+1]-y[i],2));}
    return r[i];
}
int perp(int)
{per=x[dv]*x[i]+y[dv]*y[i];
return per;
}
int seredx(int)
{sx[i]=(x[dv]+x[i])/2;
  return sx[i];
}
int seredy(int)
{sy[i]=(y[dv]+y[i])/2;
  return sy[i];
}

void main()
{
  clrscr ();
  printf("Vvedite kolichestvo tochek: \n");
  scanf("%d",&n);
  printf("Vvedite koordinati:\n");
  for (i=0;i<n;i++)
   {printf("x%d,y%d: ",i,i); scanf("%d %d",&x[i],&y[i]);
   }
  dv=0;
  while (dv!=n)
   {for (i=0;i<n;i++)
     {if (razm(r[dv])==razm(r[i]))
       {if (perp(per)==0)
    {if ((seredx(x[dv])==seredx(x[i])) && (seredy(y[dv])==seredy(y[i])))
      printf ("Est takoi kvadrat\n");
    }
       }
     }
     dv++;
     printf("%d\n",dv);
     getch();
   }
  getch();
}
Проблема в том, что в функциях seredx и seredy переменные x[i] и y[i] обнуляют переменную dv, в следствии этого "while (dv!=n)" и dv постоянно равен нулю. Как поправить и из-за чего это происходит?
[MI_nor] вне форума
Старый 04.11.2008, 22:28   #2
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Проблема решилась увеличением размерности массивов, но теперь она вообще не работает)
[MI_nor] вне форума
Старый 05.11.2008, 15:27   #3
Vladko
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 17
По умолчанию

Господи, где это такие профессора.
Извеняюсь, немного подумал, но решил побуручь те остатки мозгов что у меня есть.
Я форум уже некоторое время читаю, и некоторые задачи просто поражают своей дикостью(не пытаюсь оскорбить, просто сложность проблем офигенная, откуда тока откапываете).
В данном случае, количество вариантов являеться факториальной функцией.

Удачи.
Vladko вне форума
Старый 05.11.2008, 18:01   #4
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Да, случай очень тяжёлый...

Не говоря уже о жутко отформатированном коде и куче глобальных переменных, отследить изменение которых в такой каше очень тяжело... Ну скажите, зачем Вам тогда нуден параметр int в каждой функйии? xD ппц

1) Почему все координаты целые? Даже если у Вас квадраты только с вершинами в узлах целочисленной решётки, при вычислении центра вектора может получиться дробное число, далее следует округление до целого и центры векроров могут начать "совпадать" даже если на самом деле это не так.

Решение: используем данные с плавающей точкой, напр. float

2) "Введите кол-во точек". А я введу сто-тыщ-миллионов. Результат - floating point exception в лучшем случае. Где-то после введения 100й координаты ))

Решение: юзаем динам. выделение памяти или ставим проверку n < [размер массива]

3) Не будем влезать в алгоритм, но обратите внимание, например, что Ваши функции никак не используют параметры, им передаваемые. Это вообще нехорошо, так как вы явно пытаетесь, чтоб они использовали нужные вам (см. вызов функции) А берут они значения глоб. переменных, которые там явно не те, которые Вы ожидаете. Например.

Функция int razm(int) на момент своего завершения делает переменную i равной n - 1. Соотв. далее Ваши функции работают не с теми элементами, тк вы везде используете эту i, но забываете, что изменили её. А самый внешний цикл for (который в main внутри while) заканчивается сразу, тк i+1 уже не меньше n. Переменная i не локальная переменная в функции, а глобальная. И она во фсех функциях одна и та же.

Решение: создаём отдельную переменную для циклов "прогона индекса" (если вы хотите продолжать использовать глоб. переменные) или всё же объявляем в каждой функции свою локальную. Лучше вообще индексы внешнего цикла передавать как параметры.

4) Так же функции seredx и seredy на каждом проходе цикла будут возвращать один и тот же результат. Зачем тогда проверка на их равенство? *ехидно улыбается* Вы в этом сомневаетесь?

Решение: см. выше. Используем параметры функции.


Вобщем, подводя итог, скажу, что вам надо почитать книгу по C++, по возможности хорошую и вдумчиво. А так же, в особенности, раздел "функции" этой книги. Обратите внимание на листинги программ. В частности как передаются параметры, и много ли в этих программах глобальных переменных. Да и на общий стиль и оформление. Пригодится.

Если уж будет очень много проблемм с прогой, за пару wmz возьмусь Вам помочь

Последний раз редактировалось theos; 05.11.2008 в 18:10.
theos вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнуление катриджа. Xeon332 Компьютерное железо 2 11.05.2009 07:37
Изменение переменной yura-cat Помощь студентам 7 20.09.2008 17:42
Обнуление автоинкрементного поля azat БД в Delphi 4 29.11.2007 11:44
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 20:47
Обнуление значений $_SESSION[*] при переходе на некоторые страници kkkggg PHP 3 11.09.2007 23:09