Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формы С++ 
:(
    Опции темы
Marathon
Дата 16.12.2015, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Доброе утро, форумчане. Есть программа,  определяет выпуклый ли многоугольник или нет, и принадлежит ли заданная точка дачному полигону. Но просят сделать ввод координат точки, и координаты вершин через форму, раньше никогда не имел дело с этим, подскажите, пожалуйста, как это можно реализовать. 
PM MAIL   Вверх
math64
Дата 16.12.2015, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



На чем программируешь? (Visual Studio, C++Builder, Qt, etc.)
PM   Вверх
Marathon
Дата 16.12.2015, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Builder
PM MAIL   Вверх
Marathon
Дата 16.12.2015, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Разобрался с вводом точки и координаты,но вот как быть с вершинами, смысл понимаю, прогон по циклу и все такое,но в форме... Понятно, что появляется  "Введите 1 точку" -> запоминается, затем обнуление ->"Введите точку 2" и т.д. Но вот как дело до реализации,что-то не получается.

PM MAIL   Вверх
xvr
Дата 16.12.2015, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Marathon @  16.12.2015,  16:06 Найти цитируемый пост)
смысл понимаю, прогон по циклу и все такое

Не понимаете  smile В Builder'е это надо делать список. Либо через ListBox, либо тупо ввести как текст в Memo и извлекать оттуда построчно (в виде текста)

PM MAIL   Вверх
math64
Дата 17.12.2015, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Либо список, либо таблица.Внизу(или вверху) LineEdit и кнопка Add для ввода и добавления новой точки.
кнопка Delete для удаления текущей точки.
кнопка Calc (или ещё как-то назови) - для вычисления выпуклый ли многоугольник
кнопка Show - чтобы показать многоугольник
PM   Вверх
Marathon
Дата 17.12.2015, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Как делать через Listbox не понял, да и мемо, что-то ткговато, раньше никогда с формами не работал, получается : пользователь вводит координаты в мемо, и они считываются затем strToInt или в цикл это надо?
PM MAIL   Вверх
Marathon
Дата 17.12.2015, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Да и в целом как считывать координаты из мемо, т.е нужно чтобы в строчке было два числа, через пробел
PM MAIL   Вверх
math64
Дата 17.12.2015, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Код

void __fastcall DeleteButtonClick(TObject* Sender)
{
  int index = ListBox1->ItemIndex;
  ListBox1->Items->Delete(index);
}

void __fastcall AddButtonClick(TObject* Sender)
{
  ListBox1->Items->Add(LineEdit->Text);
}

void __fastcall CalcButtonClick(TObject* Sender)
{
  int count = ListBox1->Items->Count;
  struct Point{ int x, int y } * poligon = new Point[count];
  for(int i = 0; i < count; i++) {
     const char* s = ListBox1->Items->String[i].c_str();
     int x, y ; 
     // Выделяем из строки координаты   
     poiligon[i].x = x;
     poiligon[i].y = y;
  }
  // Работаем с полигоном
  delete[] poligon;
}

PM   Вверх
Marathon
Дата 17.12.2015, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64,Спасибо большое,  но, честно, ничего не понимаю, и как соединить с своим кодом,. С вершинами и точкой все просто.
PM MAIL   Вверх
Marathon
Дата 17.12.2015, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Начинает доходить
PM MAIL   Вверх
Marathon
Дата 17.12.2015, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Мне больше не понятно как связать форму эту и код. 
Код

#include <iostream>
#include <vcl.h>
#include <math.h>
#include <stdio.h>
 typedef struct
{
   int x,y;
} point;

int Convex(int n, const point* d)
{
      int i,j,k;
      int flag=0;
      double z;

      if (n<3)
       return (0);

      for (i=0; i<n; i++) {
             j=(i+1)%n;
             k=(i+2)%n;
             z=(d[j].x - d[i].x)*(d[k].y - d[j].y);
             z-=(d[j].y - d[i].y)*(d[k].x - d[j].x);
             if (z<0)
                flag |=1;
             else if (z>0)
                flag |=2;
             if (flag==3)
               return (0);
      }
      if (flag !=0)
          return (1);
}

int main(void)
{
const int n=5;
point d[n]={
        {0,5},     //{200,10},
        {10,8},    // {250,60},
        {10,25},   //  {230,110}, //
        {-15,25},    // {200,130},
        {-15,9}  //  {180,110},
                     //{150,60}
           };
           if(Convex(n,d))
    std:: cout <<"Yes." <<std::endl;
 else
    std:: cout <<"No." <<std::endl;
   system ("pause");
}

PM MAIL   Вверх
Marathon
Дата 17.12.2015, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64,Единственное, что я заменил в Вашем варианте Edit на MaskEdit, чтобы ограничить пользователя только цифрами. Но как их считать в программу выше вместо массива d [n]. Ну и очищение поля после ввода :
MaskEdit1-> Clear (); Не знаю, насколько это грамотно. 

Это сообщение отредактировал(а) Marathon - 17.12.2015, 15:16
PM MAIL   Вверх
xvr
Дата 17.12.2015, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Marathon @  17.12.2015,  14:50 Найти цитируемый пост)
Мне больше не понятно как связать форму эту и код. 

Никак. Для начала создайте в Builder GUI проект (а не консольный, как у вас в коде). Дальше добавьте на форму все органы управления, которые math64 перечислил, создайте для них события (в дезайнере) и скопируйте код от math64 в них.
И только потом можете копировать куски своего кода в готовые обработчики.

PM MAIL   Вверх
Marathon
Дата 17.12.2015, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Мне не понятно как работает CalcButton
PM MAIL   Вверх
math64
Дата 17.12.2015, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Ваш код (с соответствующими модификациями) вставляется или вызывается в CalcButtonClick().
По результату выполнения выполняете одно из действий:
1. Вызывается диалог с результатом и кнопкой OK.
2. Устанавлиается или сбрасывается CheckBox или результат вываоться на Label и устанавливается зелёный или  красный фон.
PM   Вверх
Marathon
Дата 17.12.2015, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Еще вопрос возник,  ввести нужно количество вершин, в кнопке Add, как сделать счетчик, чтобы количество вводимых вершин было равно нажатию кнопки Add, или же как считать количество вершин из ЛистБокса

Добавлено через 5 минут и 27 секунд
Лучше, наверное, чтобы определять количество вершин из листбокса

Добавлено через 7 минут и 22 секунды
Опять же, наверное, через количество клипов по Add...
PM MAIL   Вверх
math64
Дата 17.12.2015, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



число кликов Add - число кликов Delete = число айтемов в ListBox = количество вершин
А можно добавить кпонпки Load и Save - тогда считать клики будет бессмысленно.
PM   Вверх
Marathon
Дата 17.12.2015, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, это понятно, но как записать что число итемов равно, например, n (количеству вершин). Извините, если задаю глупые вопросы, я только учусь и мне важно понимать
PM MAIL   Вверх
math64
Дата 18.12.2015, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Заполнить список, имея полигон:
Очистить список и вызвать Add n раз.
Создать полигон имея список: n определяется по числу итемов в списке, потом итемы перебираются в цикле - примерный код я уже давал.
К сожалению, Билдер не поддерживает разделение Модель-Вид-Контроллер и создавать модель (в Вашем случае - полигон) из вид (ЛистБокс) и наоборот и поддерживать их синхронизацию приходится самостоятельно 

PM   Вверх
Marathon
Дата 18.12.2015, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



При написании строчки
Код

 const char* s = ListBox1->Items->String[i].c_str();
 вылетает ошибка : Unable to invoke Code Completion due to errors in source code. На листбокс1.Да мне важен второй вариант: имея точки, построить полигон. Ругается еще на неправильное объявление 
Код

struct point {int x,int y}*poligon


Это сообщение отредактировал(а) Marathon - 18.12.2015, 10:26
PM MAIL   Вверх
math64
Дата 18.12.2015, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



опечатка: Strings. После ввода "ListBox1->Items->" Билдер выдаст подсказку, какие есть свойства/методы у Items.

Цитата(Marathon @  18.12.2015,  10:15 Найти цитируемый пост)

Код

struct point {int x,int y}*poligon


У тебя уже есть свое объявление struct point {int x,int y}. Нужно просто point*poligon. Не нуджно тупо брать мой код 1:1 - он только иллюстрация, как делать.
PM   Вверх
Marathon
Дата 18.12.2015, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Не показывает, после ввода листбокс1 не выводит подсказку, только ошибку
PM MAIL   Вверх
math64
Дата 18.12.2015, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Ошибку выдает при компиляции, а подсказку - при редактировании, после ввода "->". Если код копипастится, никакой подсказки не будет.
PM   Вверх
Marathon
Дата 18.12.2015, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



Пишу все вручную, и подсказка на этом моменте не выскакивает

Добавлено через 9 минут и 38 секунд
Хоть убей не понимаю, как он должен считывать и присваивать Х или У. Как это работает. Исправил MaskEdit,  просто на Edit, вводить только числа , иначе выскакивает ошибка и пробел между точками. Как это все делать я понял
PM MAIL   Вверх
Marathon
Дата 19.12.2015, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



А если разделить на два поля Эдик Х и У может проще будет
PM MAIL   Вверх
math64
Дата 20.12.2015, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Можно. Но тогда вместо листбокс логичнее будет использовать стринггрид.
PM   Вверх
Marathon
Дата 22.12.2015, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, Организовывается это тоже через цикл,  с отделением координаты Х от У?
PM MAIL   Вверх
math64
Дата 22.12.2015, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Конечно через цикл. Как использовать грид - смотри документацию и примеры, идущие с Билдером.
При использовании грид (не стринггрид) можно организовать разделение модель/вид: в GridDrawCell() рисовать данные из модели. Но число строк грида нужно устанавливать по числу вершин полигона.
PM   Вверх
Marathon
Дата 22.12.2015, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, в цикле, который ты присылал, первые строчки 
Код

int n = ....-> Count;

Понятно что это количество строк, n - целое, 
Код

point * polygon = new Point [n]; 

Т.е с этого момента начинается разделение на координаты,  так а конвертация инт в поинт? И если не сложно, построчно описать что в них собственно происходит

Это сообщение отредактировал(а) Marathon - 22.12.2015, 14:59
PM MAIL   Вверх
math64
Дата 23.12.2015, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Код

   // Число точек полигона
  int n = ListBox1->Items->Count;
  point* poligon = new Point[n];
  for(int i = 0; i < n; i++) {
     // Получаем строку списка. Вместо массива char и sscanf можно пользоваться TAnsiString и функциями билдера
     char str[80];
     strcpy(str, ListBox1->Items->Strings[i].c_str() );
     // Преобразуем координаты из строки в число
     point p;
     sscanf(str, "%d,%d", &p.x, &p.y);
     poiligon[i] = p;
  }
  // Работаем с полигоном
  if (Convex(n, polygon) {
     Label1->Text = "Полигон выпуклый";
     Label1->Font->Color = clBlack;
  } else {
     Label1->Text = "Полигон не выпуклый";
     Label1->Font->Color = clRed;
  }
  // Удаляем полигон
  delete[] poligon;


Это сообщение отредактировал(а) math64 - 23.12.2015, 13:41
PM   Вверх
Marathon
Дата 23.12.2015, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2015

Репутация: нет
Всего: нет



math64, И еще такой вопрос, а как задать, чтобы вводимое число в Edit = количеству заполняем строчек в Stringgrid
PM MAIL   Вверх
math64
Дата 23.12.2015, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Цитата(Marathon @  23.12.2015,  12:19 Найти цитируемый пост)
И еще такой вопрос, а как задать, чтобы вводимое число в Edit = количеству заполняем строчек в Stringgrid 

А зачем?
Если уж очень нужно - используй TSpinEdit. Вешай на OnChange обработчик, в котором изменяй число строк в гриде.
Но обычно используются кнопки Add, Insert и Delete добавляющие и удаляющие строки по одной.

Это сообщение отредактировал(а) math64 - 23.12.2015, 13:44
PM   Вверх
WileyJohn
Дата 11.1.2016, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.1.2016

Репутация: нет
Всего: нет



math64, Вот у меня почти аналогичная задача, но без всяких выпуклых - вогнутых, по примеру делал как тут,но выдавало некоторые ошибки, в итоге сделал так, но тоже кривенько,может подскажите что не так, пожалуйста
Код

  int n = ListBox1->Items->Count;
  TPoint* poligon = new TPoint[n];
  for(int i = 0; i < n; i++) { 
    poligon[i].x = ListBox1->Items->Strings[i].SubString(1, 
                    ListBox1->Items->Strings[i].Pos(",")-1).ToInt();
    poligon[i].y = ListBox1->Items->Strings[i].SubString(
                    ListBox1->Items->Strings[i].Pos(",")+1,
                    ListBox1->Items->Strings[i].Length()).ToInt();
                                    
  } 

PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.