forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Помогите решить задачку (http://forum.boolean.name/showthread.php?t=11057)

Randomize 28.11.2009 18:49

Помогите решить задачку
 
Цитата:

Создайте класс, определяющий некоторый тип вещественных чисел, имеющий конструктор, операторы +, -, * функцию вывода на экран - print. Написать простой пример программы, использующей числа данного типа и операции над ними с выводом результатов на экран.
Одно из выражений должно содержать 2 числа данного типа, а также константу встроенного типа: char, int или float. Для этого выражения объяснить какие и в какой последовательности операции и преобразования используются и почему.
Основной конструктор должен иметь один параметр типа float и формировать объект эквивалентного значения в формате двух int чисел. Также создайте дополнительный конструктор, который получает два параметра типа int, которые представляют собой внутренний формат хранения чисел с возможной нормализацией в случае необходимости..
Плавающей арифметики в реализации не использовать.

Вариант 1.
Вещественное число плавающего формата. Мант. и эксп. - 10 бит целые.
Число представлено в формате: А=0.Мант*2^Эксп

Вариант 2.
Вещественное число плавающего формата. Мант. и эксп. - 10 бит целые.
Число представлено в формате: А=0.Мант*10^Эксп

Вариант 3.
Вещественное число фиксированного формата. Целая и дробная части - 10 бит целые.
Число представлено в формате: А=Цел.Дроб

Вариант 4.
Дробное число. Числитель и знаменатель - 10 бит целые.
Число представлено в формате: А=Числ/Знам
Помогите пожалуйста. Требуется только вариант №4, а я в CИ не силён.
Вобще не представляю как создать такой класс.

Randomize 01.12.2009 05:40

Ответ: Помогите решить задачку
 
Никто не поможет?

impersonalis 09.12.2009 03:31

Ответ: Помогите решить задачку
 
Первое:
я так и невпёр в приматскую шуточку:
как разбить float на два числа о0 я понимаю разбить int - это факторизация.
Для флоата нам досточно узнать число знаков после запятой (1.23 = 123/100)
Попытки поколдовать с последовательным сдвигом FP путём умножения на 10 и вычисления разницы между floor() и получившимся числом проваливаются из-за точности.
Т.е. я хотел бы так:
1.23 преобразуем:
0 1.23-1=0.23 далее
1 12.3-12=0.3 далее
2 123-123=0 готово //хрен!

Прочитал ТЗ ещё раз. Собственно индусоидность кода нигде не фиксируется (как и используемые функции СИ++). Нахреначил говнокодище.
Код:

        char t[30];
        sprintf(t,"%f",x);
        char* ptr=strstr(t,".");
        int n=ptr-(char*)t;
        int m;
        for(m=strlen(t)-1;m>n;m--){
                if(t[m]!='0')break;
        }
        int d=m-n;
        this->up=x*pow(10,d);
        this->down=pow(10,d);

единственное что напрягает - во всех ли платформах юзается точка как десятичный разделитель?

Второе:
Цитата:

Дробное число. Числитель и знаменатель - 10 бит целые.
Это чо-чо? Битовые поля что-ли?
Код:

        short up:10;
        short down:10;

Проблема перемещается в функцию вывода - необходимо выковрять 10 значащих бит из 16-битного слова. Просто замаскировать их не вышло - хрен его знает как оргнизовал это дело компилятор (или же надо круить rfc для шортов?), но ождиаемый эффект конструкция &1023 не дала.
Потому я просто забил =\

Вот что вышло в итоге:

файл NUMBER.h
Код:

#ifndef _NUMBER_H_
#define _NUMBER_H_

class NUMBER{
private:
        short up;
        short down;
public:
        NUMBER(float x);
        NUMBER(int Up,int Down);
        NUMBER operator+(const NUMBER &x);
        NUMBER operator-(const NUMBER &x);
        NUMBER operator*(const NUMBER &x);
        NUMBER operator*(int x);
        void PRINT();
};
#endif

файл NUMBER.cpp
Код:

#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include"NUMBER.h"


NUMBER::NUMBER(int Up,int Down){
        this->down=Down;
        this->up=Up;
}


NUMBER::NUMBER(float x){
        char t[30];
        sprintf(t,"%f",x);
        char* ptr=strstr(t,".");
        int n=ptr-(char*)t;
        int m;
        for(m=strlen(t)-1;m>n;m--){
                if(t[m]!='0')break;
        }
        int d=m-n;
        this->up=x*pow(10,d);
        this->down=pow(10,d);       
}

void NUMBER::PRINT(){
        cout<<(this->up)<<" / "<<(this->down)<<endl;
}

NUMBER NUMBER::operator +(const NUMBER &x){
        return NUMBER(x.up*this->down+this->up*x.down,x.down*this->down);
}

NUMBER NUMBER::operator -(const NUMBER &x){
        return NUMBER(x.up*this->down-this->up*x.down,x.down*this->down);
}

NUMBER NUMBER::operator *(const NUMBER &x){
        return NUMBER(x.up*this->up,x.down*this->down);
}

NUMBER NUMBER::operator *(int x){
        return NUMBER(x*this->up,this->down);
}

файл main.cpp
Код:

#include<iostream.h>
#include<math.h>
#include<conio.h>
#include"NUMBER.h"

void main(){
        NUMBER Q(1.3);
        Q.PRINT();
        NUMBER R=Q*2;
        R.PRINT();
        NUMBER T(6,5);
        T.PRINT();
        NUMBER Z=R-T*2;
        Z.PRINT();
        NUMBER F=Z+T;
        F.PRINT();

        getch();

}


xsnakes 06.01.2010 15:35

Добрые люди :) ПОЖАЛУЙСТА помогите решить задачки.

Пришли задания с учебниками из Ставрополя, получил я их только сегодня (хотя должен был получить 2 декабря, шли долго из института), а cдавать нужно уже 14 января. Я в С++ нуль, выучить не успею, ещё и сделать. :(
Помогите плиз. Там наверняка не сложные задачки для таких профов как вы :) А C++ я буду учить, изучу ваши ответы и следующие задания сделаю сам.

Ответы надо в архиве выложить, чтоб поиском вдруг не нашли меня здесь :)
А схемы алгоритмов можно накарякать где угодно, даже в строчку, я разберу потом.

Скачать задачки (73 Кб)

Ну что мне некто не поможет? :"(

SBJoker 06.01.2010 21:10

Ответ: Помогите решить задачку
 
догадливый :)

impersonalis 06.01.2010 22:09

Ответ: Помогите решить задачку
 
Цитата:

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

xsnakes 08.01.2010 11:17

Так а это не отмазка от того что задание не могу сделть :)

И задержала не почта, а Жаба :) Классный руководитель!

Эх люди вы не добрые :) Придётся за оставшиеся дни выучить то, что за месяц нужно было выучить :)

ISergey 08.01.2010 11:57

Ответ: Помогите решить задачку
 
Цитата:

Сообщение от xsnakes (Сообщение 132620)
Эх люди вы не добрые :) Придётся за оставшиеся дни выучить то, что за месяц нужно было выучить :)

Ты денег людям предложи.. Сразу подобреют.. :)

xsnakes 08.01.2010 15:24

Ответ: Помогите решить задачку
 
А у меня привод деньги не читает! :) Как я отправлю? :D

NitE 08.01.2010 16:02

Ответ: Помогите решить задачку
 
переводом, по эмайлу или заказным письмом.

xsnakes 08.01.2010 16:16

Ответ: Помогите решить задачку
 
От делать нечего :) Я лучше ещё на 100 форумах напишу такое, кто-то да решит.
А этот форум в чёрный список :) тут не помогают.
А если б я по одной задаче спрашивал, то решили б, но поисковик найдёт меня тут :)

Android 08.01.2010 16:52

Ответ: Помогите решить задачку
 
Цитата:

Сообщение от xsnakes (Сообщение 132669)
А этот форум в чёрный список :)

Одним попрошайкой меньше.
Следующий! (с) :crazy:

xsnakes 24.01.2010 19:02

Ответ: Помогите решить задачку
 
Помогите :)
Идет k-я секунда суток. Определить сколько полных часов X и полных минут Y прошло к этому моменту.

NitE 24.01.2010 19:15

Ответ: Помогите решить задачку
 
былы-бы власть, сам-бы тебя выкинул нафиг, чтоб в армию забрали, и ты не мог поганить отечественный игрострой или что-либо другое

xsnakes 24.01.2010 19:24

Ответ: Помогите решить задачку
 
ты че флудишь :)


Часовой пояс GMT +4, время: 00:37.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot