Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2008, 01:56
Новичок

Отправить личное сообщение для Alexander_ua Посмотреть профиль Найти все сообщения от Alexander_ua
 
Регистрация: 30.08.2008
Сообщений: 24

Таблица умножения дробей с использованием класса
Цитата:
Задача.
Используйте преимущество ООП, заключающееся в том, что однажды созданный класс можно помещать в другие программы. Создайте новую программу, которая будет включать класс fraction, созданный в упражнении 11. Программа должна выводить аналог целочисленной таблицы умножения для дробей. Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя так, чтобы значения получаемых дробей находилось между 0 и 1. Дроби из получившегося таким образом набора перемножаются друг с другом во всевозможных комбинациях, в результате чего получается таблица следующего вида (для значения, равного 6):

1/6 1/3 1/2 2/3 5/6
------------------------------------
1/6 1/36 1/18 1/12 1/9 5/36
1/3 1/18 1/9 1/6 2/9 5/18
1/2 1/12 1/6 1/4 1/3 5/12
2/3 1/9 2/9 1/3 4/9 5/9
5/6 5/36 5/18 5/12 5/9 25/36
Если абстрагироваться от содержания класса fraction, как программа будет подбирать всевозможные целые значения числителя так, чтобы значения получаемых дробей находились между 0 и 1.
Как получается ряд дробей: 1/6 1/3 1/2 2/3 5/6 ?

На всякий случай прилагаю английский вариант текста:

Последний раз редактировалось Alexander_ua, 16.10.2008 в 02:04.
  #2  
Старый 16.10.2008, 11:04
Аватар для Schemer
Пользователь

Отправить личное сообщение для Schemer Посмотреть профиль Найти все сообщения от Schemer
 
Регистрация: 26.07.2008
Адрес: Moscow
Сообщений: 93

Сообщение от Alexander_ua Посмотреть сообщение
Если абстрагироваться от содержания класса fraction, как программа будет подбирать всевозможные целые значения числителя так, чтобы значения получаемых дробей находились между 0 и 1.
Ну, очевидно, 0 <= x/y <= 1 если x=0,1,2,...,y.

Цитата:
Как получается ряд дробей: 1/6 1/3 1/2 2/3 5/6 ?
Это сокращенные дроби 1/6, 2/6, 3/6, 4/6, 5/6.
  #3  
Старый 16.10.2008, 17:20
Новичок

Отправить личное сообщение для Alexander_ua Посмотреть профиль Найти все сообщения от Alexander_ua
 
Регистрация: 30.08.2008
Сообщений: 24

Спасибо!

Задачу решил, но мне не нравится как это получилось, слишком громоздко.
Скажу сразу массивы использовать пока нельзя, т.к. до них ещё не дошел.
Изучено:
- Структуры, перечисления
- Функции
- Классы и объекты
Прилагаю содержание задачи и .cpp листинг. Как можно рационализировать код без применения массивов?

Вложения:
Тип файла: zip 6.12.zip (1.4 Кб, 83 просмотров)

Последний раз редактировалось Alexander_ua, 16.10.2008 в 19:07.
  #4  
Старый 11.04.2009, 18:40
Новичок

Отправить личное сообщение для CarassiusAratus Посмотреть профиль Найти все сообщения от CarassiusAratus
 
Регистрация: 11.04.2009
Сообщений: 3

Без классов решить просто
Без классов решить просто. Вот с классами пока не справился. Мой алгоритм следующий:
Код:
#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    int res1, res2;
    cout << "Vvedite znamenatel i najmite  <Enter> ";
    cin >> b;
    if(b == 0)
    {
        cout << "Na nol' delit' nel'zia";
        exit(1);
    }

    a = 1;
    for(c = 1; c < b; c++)
    {
        res1 = a*c;
        res2 = b*b;
        cout << "Umnojenie ravno " << res1 << '/' << res2 << endl;
    }
    return 0;
}
Есть еще какие-нибудь варианты?
  #5  
Старый 12.04.2009, 18:48
Новичок

Отправить личное сообщение для CarassiusAratus Посмотреть профиль Найти все сообщения от CarassiusAratus
 
Регистрация: 11.04.2009
Сообщений: 3

Вариант решения
В приложении результат решения.
Но в программе есть странный глюк - не работает со значениями больше 6. Как будто происходит переполнение, но не пойму почему.
Подскажите, пожалуйста, что не так. Уже нет сил смотреть на эти fractions
Вложения:
Тип файла: zip table_fraction.zip (1.7 Кб, 55 просмотров)
  #6  
Старый 20.11.2009, 08:21
гость

 
Сообщений: n/a

// fraction_table.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "iostream"
#include "cmath"
using namespace std;

class fraction
{
private:
int numerator;
int denominator;
public:
fraction() : numerator(1), denominator(0)
{}
void getFrac()
{
cout << "Enter denominator: ";
cin >> denominator;
}
int FracCompare()
{
if (numerator < denominator)
return 1;
else
return 0;
}
void showFrac()
{
cout << numerator << "/" << denominator << " ";
}
void addFrac(fraction frac1, fraction frac2)
{
numerator = frac1.numerator * frac2.denominator + frac1.denominator * frac2.numerator;
denominator = frac1.denominator * frac2.denominator;
}
void mullFrac(fraction frac1, fraction frac2)
{
numerator = frac1.numerator * frac2.numerator;
denominator = frac1.denominator * frac2.denominator;
}
void lowterms()
{
long tnum, tden, temp, gcd;
tnum = labs(numerator);
tden = labs(denominator);
if(tden == 0)
{
cout << "Unpossible denominator!" << endl;
exit(1);
}
else if(tnum == 0)
{
numerator = 0;
denominator = 1;
return;
}
while(tnum!=0)
{
if(tnum < tden)
{
temp = tnum;
tnum = tden;
tden = temp;
}
tnum = tnum - tden;
}
gcd = tden;
numerator = numerator/gcd;
denominator = denominator / gcd;
}
};

int main()
{
fraction frac, temp1, temp2, result;
frac.getFrac();
for(temp1 = frac; temp1.FracCompare() != 0; temp1.addFrac(frac, temp1))
{
temp1.lowterms();
temp1.showFrac();
for(temp2 = frac; temp2.FracCompare() !=0; temp2.addFrac(frac, temp2))
{
result.mullFrac(temp1, temp2);
result.lowterms();
result.showFrac();
}
cout << endl;
}
}
  #7  
Старый 20.11.2009, 08:35
гость

 
Сообщений: n/a

Сообщение от гость Посмотреть сообщение
// fraction_table.cpp: определяет точку входа для консольного приложения.
купи себе резиновый член для своей точки входа.

неужели так сложно убирать этот дурацкий комментарий? и использовать тег code при отправке кода на форуме?
  #8  
Старый 20.11.2009, 08:38
гость

 
Сообщений: n/a

Цитата:
cout << "Unpossible denominator!" << endl;
me fail english? that's unpossible!
  #9  
Старый 19.02.2010, 00:56
ptaxa

 
Сообщений: n/a

тема: Алгоритм отжига
на информатике дали тему для написания статьи,может кто нибудь помочь понять о чём нужно писать О теме: "алгоритм отжига"???
  #10  
Старый 19.02.2010, 02:20
гость

 
Сообщений: n/a

Сообщение от ptaxa Посмотреть сообщение
на информатике дали тему для написания статьи,может кто нибудь помочь понять о чём нужно писать О теме: "алгоритм отжига"???
а в гугл, чё влом было заглянуть?

simulated annealing (имитация отжига) - да, есть такой популярный алгоритм
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сокращение дробей с++ гость Реализация, исходники, языки 5 22.08.2008 19:20
для 3 класса гость Вычислительная геометрия 2 28.05.2008 15:24
Автоматизированное составление расписаний с использованием генетических алгоритмов. GreatWizard Математические алгоритмы 1 28.04.2008 14:41
проблема с использованием русского алфавита в с++ elle Реализация, исходники, языки 9 17.03.2008 21:19
метод отжига для одного класса задач Korduban Математические алгоритмы (другое) 2 30.11.2007 15:16