Здравствуйте, гость ( Вход | Регистрация )



Гостевой доступ к форуму из Москвы: Телефоны: +7(495)7859696,7376201,7376233,7868796,7390241 Login: demo Password: demo
 
ОтветитьСоздать новую тему
> создание класса в С++, мдям
Tassadar
сообщение Dec 21 2006, 09:54
Сообщение #1


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.




в общеим нужно


Создать класс, описывающий выпуклый 4-х угольник и определить можно ли в него вписать окружность.
все это в 6-м билдере в консоли.

карочь как делать ваще не воткнул,может кто поможет? ohmy.gif


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
gesper
сообщение Dec 21 2006, 10:15
Сообщение #2


Постоянный пользователь
Group Icon

Группа: Advanced
Сообщений: 155
Регистрация: 26-August 05
Пользователь №: 98
Заходит на форум с гостевика или полного инета.



учебник геометрии возьми и воткнеш... ток хз.. сможеш ли потом вытащить)))

в примитиве.. ты должен определить расстояние между четерьмя парами крайних точек выпуклой байды... и сравнить его с диаметром окружности.

имхо, яб попробовал так сначало. а потом.. как повезет.

как описать этот четырехугольник выпуклый, как раз в учебнике геометрии должно быть.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 21 2006, 10:30
Сообщение #3


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



дык мне ж на си нужно. координаты вершин заданы.

в общем я понял что нужно сравнить суммы противоположных сторон и если они равны, то вписать мона... а вот как это записать- хз


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 22 2006, 01:31
Сообщение #4


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



#include <stdio.h>
#include <math.h>
#define SQR(x) (x)*(x)
void main()
{int m,x1,x2,x3,x4,y1,y2,y3,y4,d1=0,d2=0,d3=0,d4=0,k;
printf ("Vvedite koord. 4-x ygolnika x1,x2,y1,y2\n") ;
scanf ( "%d%d%d%d",&x1,&x2,&y1,&y2);
d1=sqrt(SQR(x1-x2))+sqrt(SQR(y1-y2));
d2=sqrt(SQR(x3-x4))+sqrt(SQR(y3-y4));
///d3=sqrt(SQR(x1-x3))+sqrt(SQR(y1-y3));
///d4=sqrt(SQR(x2-x4))+sqrt(SQR(y2-y4));
k=d1+d2;
m=d3+d4;

printf ("%d%d%d%d",d1 ,d2 ,d3 ,d4);
if (k==m)
printf ("Mogno vpisat");
else
{ printf ("Nelzya"); }



}


вот что наваял.... как из этого класс сделать хз


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Dec 22 2006, 11:44
Сообщение #5


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Цитата(Tassadar @ Dec 22 2006, 02:31) *

void main()

Консольное приложенин? Или под DOS?
Цитата(Tassadar @ Dec 22 2006, 02:31) *

printf ("%d%d%d%d",d1 ,d2 ,d3 ,d4);

Чё? Прям так и выводишь? Подряд без разделителей?

Кстати, и насчёт порядка ввода... Обычен вводят по точкам, ну, то есть, скажем, X1,Y1, а потом X2,Y2... А не так, что сначала все X-координаты, а потом - все Y...

Потом... Вводишь ты только X1, X2, Y2, Y2... А откуда берутся X3 X4 Y3 Y4? А D3, D4 ты закомментарил, то есть, не вычисляешь, но применяешь... Фигня, короче... Я уж не говорю про типы, что все они у тебя описаны как int, но в результате SQRT получаются float (double)... Тут если надо преобразовать к int, то по-хорошему надо бы грамотно привести тип. Есть разные способы округления (по умолчанию - в меньшую сторону, то есть, обрубанием дробной части, но есть функции, которые округляют в ближайшую сторону...). А если сравнивать вещественные числа типа float (double), то это тоже нужно очень аккуратно. Потому что даже если взять (1.0/3.0)*3.0 то получится 0.333333333333333*3.0 == 0.99999999999999999 /= 1.0 . При сравнении на равенство лучше взять модуль или квадрат разности и сравнить его, например, с 1.0Е-15 или 1.0E-18.
Цитата(Tassadar @ Dec 22 2006, 02:31) *

вот что наваял.... как из этого класс сделать хз

А для чего? Для примера как классы делать? Или под конкретную задачу?

Ведь класс - это, по сути, просто такая структурка данных. В C++ любая struct и даже union уже, по сути, является классом. Кроме того, для класса МОЖНО определить МЕТОДЫ - то есть, такие подпрограммы (а в С/С++ подпрограммы бывают только функции), которые принадлежат этому классу и предназначены для работы с объектами этого класса. Методы не просто вызываются, а ПРИМЕНЯЮТСЯ к объекту (т.е. конкретному экземпляру данных этого типа-класса) Реализовано это так, что подпрограмме(функции)-методу, когда она вызывается, неявно передаётся скрытый параметр this - адрес того объекта, к которому она применяется.

В нашем случае можно сделать такой класс

class tetrangle
{public:
int X1, Y1, X2, Y2, X3, Y3, X4, Y4; // вместо int можно взять float или double...
// Всё остальное определяется методами
tetrangle(void); // Конструктор по умолчанию
~tetrangle(void); // деструктор
void Read(Stream & src); // Ввод данных из потока
void Read(char * src); // Ввод данных из ASCIIZ-строки
void Read(AnsiString src); // Ввод из ANSI-строки (применяется в Borlsnd C++ Builder)
void Write(Stream & dct); // Вывод в поток
void Write(char * dct); // Вывод с массив чаров как ASCIIZ-строку (без контроля размера буфера)
void Write(AnsiString & dct); // Вывод в ANSI-строку
double D1(void) {return sqrt (SQR(X1-X2))+sqrt(SQR(Y1-Y2))}; // Это inline-описание
double D2(void) ... ;
double D3(void) ... ;
double D4(void) ... ;
BOOL IsInscribeable(viod) ;
};

Далее, если методы не описаны как inline, а только объявлены в определении класса, их надо определить отдельно.

Например,

BOOL tetrangle::IsInscribeable(void)
{double k, m;
k=D1()+D2();
m=D3()+D4();
return ((SQR(k-m))<1.0E-18);
}

Кстати, на примере Read и Write определены ПОЛИМОРФНЫЕ методы, которые различаются типом папаметра. Называются они одинаково, но компилятор С++ (не просто С--) умеет с ними разбираться, и применяет такой, который соответствует типу фактического параметра. Так, вводить и выводить можно из/в потоки, ASCIIZ-стоки и ANSI-строки. Я уж не помню, но вроде бы, в консольных приложениях стандартный вод-вывод связан с предопределёнными потоками, которые представлены глобальными пременными... Не помню какими. Но можно стандартно вводить-выводить ASCIIZ-строку, отведя под неё заведомо достаточный буфер, а потом её читать/писать...

Ну, а в main нужно только организовать всё это дело...


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
DJ_LeXyS
сообщение Dec 23 2006, 01:10
Сообщение #6


Гость


Группа: Новички
Сообщений: 2
Регистрация: 23-December 06
Пользователь №: 693
Имя: Fk
Заходит на форум с гостевика.



В общем то вот, че просил:



///--------------------------Пишется в File1.h
#include <stdio.h>
#include <math.h>
#define SQR(x) (x)*(x)

class chetygo
{
int x1, y1 ,x2, y2, x3, y3, x4, y4;

public:
chetygo (int a1, a2, a3, a4, a5, a6, a7, a8, d1, d2, d3, d4)
{
x1=a1;
y1=a2;
x2=a3;
y2=a4;
x3=a5;
y3=a6;
x4=a7;
y4=a8;
}

proverka1()
{
int k;
d1=sqrt(SQR(x1-x2))+sqrt(SQR(y1-y2));
d2=sqrt(SQR(x3-x4))+sqrt(SQR(y3-y4));
k=d1+d2;
return k;
}

proverka2()
{
int m;
d3=sqrt(SQR(x1-x3))+sqrt(SQR(y1-y3));
d4=sqrt(SQR(x3-x4))+sqrt(SQR(y3-y4));
m=d3+d4;
return m;
}
};


///--------------------------Пишется в main() - Unit1.cpp
#include <conio.h>
#include "File1.h"
void main()
{
clrscr();
printf ("Введите координаты вершин по формату:\n
X1 Y1 X2 Y2 X3 Y3 X4 Y4\n");
int ab1, ab2, ab3, ab3, ab4, ab5, ab6, ab7, ab8;
scanf ("%d%d%d%d%d%d%d%d", &ab1, &ab2, &ab3, &ab3, &ab4, &ab5, &ab6, &ab7, &ab8);
chetygo A1 (ab1, ab2, ab3, ab3, ab4, ab5, ab6, ab7, ab8, 0, 0, 0, 0);
k=A1.proverka1;
m=A1.proverka2;
printf ("%d%d%d%d",d1 ,d2 ,d3 ,d4);
if (k==m)
printf ("Mogno vpisat");
else
printf ("Nelzya");
}

Made by -=DJ_LeXyS=- on KorLab

Tassadar, с тебя пиво!!! 3 бутылки!!! biggrin.gif
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 23 2006, 01:12
Сообщение #7


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



а это работает????????????


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
DJ_LeXyS
сообщение Dec 23 2006, 01:14
Сообщение #8


Гость


Группа: Новички
Сообщений: 2
Регистрация: 23-December 06
Пользователь №: 693
Имя: Fk
Заходит на форум с гостевика.



А я не знаю! Должно! Проверь! Могут быть незначительные ошибки... Ибо Билдера у меня нема, и написано все было в блокноте... =)))))
Один Х.. с тя пиво!!! 3 БУТЫЛКИ!!!!!!! Efes пожалуйста! xaxa.gif
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 23 2006, 01:19
Сообщение #9


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



гы гы гы=) как тока я сдам это носу- г. вопрос=)


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Dec 23 2006, 16:37
Сообщение #10


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Да, но, как я понял,
sqrt(SQR(x1-x2)) - это для вычисления абсолютной величины? Для математики это так (и то, не совсем), а для программирования - безграмотно. Для вычисления модкля (абсолютной величины) есть функция (или макрос) ABS
кажись,
#define ABS(__VALUE__) ((__VALUE__)<0)?(-(__VALUE__)):(__VALUE__)

и никаких там корней, квадратов... Работает со всеми int (short, long, long long или _int64), а так же char, float, double, long double... и при этом оставляет тип как он есть. Он будет работать даже для всех классов, для которых определён оператор сравнения с целым числом и унарный минус.

А то, корень возвращает значение вещественного типа (long double), когда оно присваивается целочисленной переменной, то происходит приведение к целому типу путём ОТБРАСЫВАНИЯ ДРОБНОЙ ЧАСТИ. То есть, если ттам, скажем, будет получаться 7.99999999999999786435 (почти 8), то при приведении к целому получится 7, а не 8. То есть, возможна ошибка на целую единицу


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 23 2006, 23:42
Сообщение #11


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



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


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Dec 25 2006, 10:30
Сообщение #12


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Ну... Те, наверно, просто Си придумывали... Это где-то 1971 год... Там никаких классов и в помине не было. А где классы, - это уже С++. Его придумал еблан по фамилии Страуструп. (а чё, легко запоминается: страус - труп).


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Tassadar
сообщение Dec 27 2006, 03:33
Сообщение #13


Гиперактивный пользователь
Group Icon

Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.



Код



      
      
#include <conio.h>
#include "file.h"
void main ()



  ///kysok s 3adannblmi
{
int m=0;
int x1 = 4;

int y1 = 5;

int x2 = 3;

int y2 = 18;

int x3 = 17;

int y3 = 21;

int x4 = 27;

int y4 = 42;
                                          //////Kysok so scanf`//////
////{ int x1, x2, x3, x4, y1, y2, y3, y4;

  /// scanf ("%d,%d,%d,%d,%d,%d,%d,%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
/// int m=0;
Time t (x1,y1,x2,y2,x3,y3,x4,y4);
   ///////////kysok okon4ilsya////////
//



//
m=int(t);
         if (m==1)
         printf ("Mogno vpisat`\n");
         else
             printf("Nelzya\n");


getch();
}




////////////////////////////////


#include <stdio.h>
#include <math.h>
#define SQR(x) (x)*(x)

class Time { int a1, a2, a3, a4, a5, a6, a7, a8;

public:

Time(int x1, int y1,int x2,int y2,int x3,int y3,int x4,int y4 ): a1(x1), a2(y1), a3(x2), a4(y2),a5(x3),a6(y3),a7(x4),a8(y4) {}

// konstructor

operator int();

// preobrazovanie iz classa v int

};

Time::operator int() {

// yslovie vivoda
  if (  (sqrt(SQR(a1-a3))+sqrt(SQR(a2-a4))+sqrt(SQR(a5-a7))+sqrt(SQR(a6-a8))== sqrt(SQR(a1-a5))+sqrt(SQR(a2-a6))+sqrt(SQR(a3-a7))+sqrt(SQR(a4-a8) )  ))
return 1;
else return 2;



}









вроде работает но два вопроса

1) Не получилось реализвать через ввод с клавы (хз надо ли это- завтра скажут, но все равно нужно)
вроде написал все правильно, но при вводе начинает конфликтовать с sqrt.....(domain error) т.е. я так понимаю там с числами что то не так, да? либо в инте дело, либо в чем???


2) там вторая часть задания- типа "Перегрузить операцию проверки на равенство чтобы можно было узнать равны ли периметры 2х четырехугольников?" вот тут чего то ваще напряг..... не мог бы помочь?

Сообщение отредактировал Tassadar - Dec 27 2006, 03:35


--------------------
ОуКС
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
aler
сообщение Dec 27 2006, 09:36
Сообщение #14


Постоянный пользователь
Group Icon

Группа: Moderators
Сообщений: 204
Регистрация: 4-July 06
Пользователь №: 462
Имя: aler
Настроение: ^^
Заходит на форум с полного инета.



1)
Код
  if (  (sqrt(SQR(a1-a3))+sqrt(SQR(a2-a4))+sqrt(SQR(a5-a7))+sqrt(SQR(a6-a8))== sqrt(SQR(a1-a5))+sqrt(SQR(a2-a6))+sqrt(SQR(a3-a7))+sqrt(SQR(a4-a8) )  ))

это что blink.gif
2)Перегрузить операцию проверки на равенство:

Код
int Time::operator==(Time t2){
  if(.........проверка на равенство периметра с t2...............)return 1;
  else return 0;
}

периметр по формуле sqrt(sqr(x2-x1)+sqr(y2-y1))+sqrt(sqr(x3-x2)+sqr(y3-y2))+sqrt(sqr(x4-x3)+sqr(y4-y3))+sqrt(sqr(x1-x4)+sqr(y1-y4))


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Dec 27 2006, 11:23
Сообщение #15


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Насчёт sqrt.
Эта функция вычисляет вещественную величину (с плавающей точкой). Компилятор Си делает так, что значение такого типа возвращается в топе стека сопроцессора (FPU). Там значение сидит в формате long double - 80-битное представление с 64-битной мантисой.

Если ты не хочешь пользоваться макросом ABS (без всяких sqrtов), то делай преобразование типа. Для этого есть набор функций типа roundХХХ - ну, посмотри там по хелпу.


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
aler
сообщение Dec 27 2006, 11:40
Сообщение #16


Постоянный пользователь
Group Icon

Группа: Moderators
Сообщений: 204
Регистрация: 4-July 06
Пользователь №: 462
Имя: aler
Настроение: ^^
Заходит на форум с полного инета.



dry.gif какая разница как оно представлено


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
drusha
сообщение Dec 27 2006, 11:57
Сообщение #17


Постоянный пользователь
*****

Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.



Большая. Ну, про неявное преобразование типа я уже писал. Там може возникнуть ашыпка на целую единицу. И ещё есть такая засада. Компилятор Си позволяет применять функции, которые не объявлены. Ну, h-ник, положим, забыли подцепить. Паскаль такого не пропустил бы... А Си позволяет. Когда функция объявляется неявно (по факту первого употребления) она по дефолту считается типа int. Значения типа int возвращаются через регистр EAX. Так вот, может быть, а топе FPU сидит чё-то своё? в EAX - своё... Там всегда чё-то сидит... А компилятор, ничтоже не сумнявшись, берёт это в качестве возвращённого значения...


--------------------
Теперь всё, я сюда больше не приду. Никогда.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение

ОтветитьСоздать новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия Сейчас: 12th April 2021 - 23:34
 
     
Rambler's Top100 службы мониторинга серверов
Gentoo Powered Lighttpd Powered