Группа: Новички
Сообщений: 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 нужно только организовать всё это дело...
Группа: Новички
Сообщений: 2
Регистрация: 23-December 06
Пользователь №: 693
Имя: Fk
Заходит на форум с гостевика.
А я не знаю! Должно! Проверь! Могут быть незначительные ошибки... Ибо Билдера у меня нема, и написано все было в блокноте... =))))) Один Х.. с тя пиво!!! 3 БУТЫЛКИ!!!!!!! Efes пожалуйста!
Группа: Новички
Сообщений: 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. То есть, возможна ошибка на целую единицу
Группа: Advanced
Сообщений: 2 524
Регистрация: 24-August 05
Из: Белые столбы
Пользователь №: 91
Заходит на форум с гостевика или полного инета.
дрюша я к преподу подходил он сказал так делать.... а он типа в программировании пипец как шарит.... говорят он даже прочитал кернигана и ритчи или как их там мля........... ну те ебланы которые си придмали
Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.
Ну... Те, наверно, просто Си придумывали... Это где-то 1971 год... Там никаких классов и в помине не было. А где классы, - это уже С++. Его придумал еблан по фамилии Страуструп. (а чё, легко запоминается: страус - труп).
Группа: 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");
1) Не получилось реализвать через ввод с клавы (хз надо ли это- завтра скажут, но все равно нужно) вроде написал все правильно, но при вводе начинает конфликтовать с sqrt.....(domain error) т.е. я так понимаю там с числами что то не так, да? либо в инте дело, либо в чем???
2) там вторая часть задания- типа "Перегрузить операцию проверки на равенство чтобы можно было узнать равны ли периметры 2х четырехугольников?" вот тут чего то ваще напряг..... не мог бы помочь?
Сообщение отредактировал Tassadar - Dec 27 2006, 03:35
Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.
Насчёт sqrt. Эта функция вычисляет вещественную величину (с плавающей точкой). Компилятор Си делает так, что значение такого типа возвращается в топе стека сопроцессора (FPU). Там значение сидит в формате long double - 80-битное представление с 64-битной мантисой.
Если ты не хочешь пользоваться макросом ABS (без всяких sqrtов), то делай преобразование типа. Для этого есть набор функций типа roundХХХ - ну, посмотри там по хелпу.
Группа: Новички
Сообщений: 520
Регистрация: 16-June 06
Пользователь №: 431
Заходит на форум с гостевика.
Большая. Ну, про неявное преобразование типа я уже писал. Там може возникнуть ашыпка на целую единицу. И ещё есть такая засада. Компилятор Си позволяет применять функции, которые не объявлены. Ну, h-ник, положим, забыли подцепить. Паскаль такого не пропустил бы... А Си позволяет. Когда функция объявляется неявно (по факту первого употребления) она по дефолту считается типа int. Значения типа int возвращаются через регистр EAX. Так вот, может быть, а топе FPU сидит чё-то своё? в EAX - своё... Там всегда чё-то сидит... А компилятор, ничтоже не сумнявшись, берёт это в качестве возвращённого значения...