Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2017, 11:25   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию аналог целочисленной таблицы умножения для дробей. Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя

Здравствуйте!
Я не прошу помочь решить задачу!
Помогите пожалуйста понять задачу. В книге Р.Лафоре есть задача:
Программа должна выводить аналог целочисленной таблицы умножения для дробей.Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя так, чтобы значения получаемых дробей находились между 0 и 1.
Дроби из получившегося таким образом набора перемножаются друг с другом во всевозможных комбинациях, в результате чего получается таблица следующего вида (для знаменателя равного 6):
1/61/31/22/35/6
-----------------------------------------
1/61/361/181/121/95/36
1/31/181/91/62/95/18
1/21/121/61/41/35/12/
2/31/92/91/34/95/9/
5/65/365/185/125/925/36

Эта задача на 260 странице книги Р.Лафоре "Объектно ориентированное программирование в С++" (4 издание)
Для знаменателя равного 6 возможны дроби:
1/6, 2/6, 3/6, 4/6, 5/6.
Всё.
При перемножении этих дробей никак не могут появиться цифры типа 925!!! (как в последней строке приведенного автором примера)

Прежде чем обратиться к форумчанам я написал программу делающую перемножение как казалось бы по замыслу задачи.
Код:
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
	setlocale(LC_ALL,"rus");
	int chis=1, chis1, znam, a,b,c;
	cout<<"Программа вывода перемноженных дробей.\n"
		<<"Введите знаменатель\n";
	cin>>znam;
	while(znam==0)
	{
		cout<<"Знаменатель не может быть равен нулю. Попробуйте еще.\n";
		cin>>znam;
	}
	for(int j=1; j<znam; j++)
	{
		for(int i=1; i<znam; i++)
		{
			cout<<chis*i<<"/"<<znam*znam<<" ";

		}
		cout<<endl;
		chis++;
	}
	getch();
	return 0;
}
Прошу учесть, что для решения этой задачи могут применяться только знания, предоставленные книгой Р.Лафоре до появления данной задачи.
Это:основные типы данных, циклы и ветвления, структуры и перечисления, функции, объекты и классы. Массивы я уже изучил, но применять их нельзя, ибо задача до темы"Массивы".
Кто может, помогите пожалуйста понять, что хочет автор.

Последний раз редактировалось Alex11223; 05.05.2017 в 11:36.
KAMLS вне форума Ответить с цитированием
Старый 05.05.2017, 11:39   #2
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Не понял, где Вы там 925 нашли?

Upd. Форматирование решает все проблемы, 5/925/36 чудесным образом превращается в 5/9 25/36, да?)
Изображения
Тип файла: jpg Снимок.jpg (52.9 Кб, 163 просмотров)
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 05.05.2017, 11:54   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да вот.
Изображения
Тип файла: jpg Дроби.jpg (66.6 Кб, 129 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 05.05.2017, 11:55   #4
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

В том то и фокус, что я не понял вообще что это такое. как читается.
KAMLS вне форума Ответить с цитированием
Старый 05.05.2017, 11:59   #5
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Хм.. Редактора книги на кол =)
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 05.05.2017, 12:02   #6
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Ладно, буду доводить до состояния запроса задачи. А то ведь эту короткую программу я так написал, чтобы ясно было что могу то что вроде понятно. Сейчас надо выточить то что требуется, с классами, с приведением к несократимому виду и т.д и т.п..))
Спасибо за участие)))
KAMLS вне форума Ответить с цитированием
Старый 05.05.2017, 14:45   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Нагородил семь вёрст до небёс и всё лесом, но зато получилось)))
Код:
#include<iostream>
#include<conio.h>
#include<cmath>
#include<iomanip>
using namespace std;
class fraction
{
private:
	float chis, znam, s, a, b, c;
public:
	fraction(): chis(1), znam(0), s(0), a(0), b(0), c(0)
	{}
	void vvod()
	{
		cout<<"Введите знаменатель: ";
		cin>>znam;
		while(znam==0)
		{
			if(znam==0)
				cout<<"Знаменатель не должен быть равен нулю. Попробуйте еще.\n";
			cin>>znam;
		}
	}
	void cikl1()
	{
		s=znam;
		for(int j=1; j<s; j++)
		{
			chis=j;
			b=znam;
			long tchis, tznam, temp, gcd;
			tchis=labs(chis);
			tznam=labs(znam);
			if(tznam==0)
			{cout<<"Недопустимый знаменатель!"; exit(1);}
			else if(tchis==0)
			{chis=0; znam=1; return;}
			while(tchis!=0)
			{
				if(tchis<tznam)
				{temp=tchis; tchis=tznam; tznam=temp;}
				tchis=tchis-tznam;
			}
			gcd=tznam;
			chis=chis/gcd;
			b=b/gcd;
			cout<<setw(8)<<chis<<"/"<<b<<" ";
		}
		cout<<endl;
	}
	void cikl2()
	{
		s=znam;
		a=znam;
		for(int j=1; j<s; j++)
		{
			chis=j;
			b=znam;
			long tchis, tznam, temp, gcd;
			tchis=labs(chis);
			tznam=labs(znam);
			if(tznam==0)
			{cout<<"Недопустимый знаменатель!"; exit(1);}
			else if(tchis==0)
			{chis=0; znam=1; return;}
			while(tchis!=0)
			{
				if(tchis<tznam)
				{temp=tchis; tchis=tznam; tznam=temp;}
				tchis=tchis-tznam;
			}
			gcd=tznam;
			chis=chis/gcd;
			b=b/gcd;
			cout<<chis<<"/"<<b<<" ";
			for(int i=1; i<s; i++)
			{
				chis=j;
				chis=chis*i;
				c=a;
				c=c*c;
				long tchis, tznam, temp, gcd;
				tchis=labs(chis);
				tznam=labs(znam);
				if(tznam==0)
				{cout<<"Недопустимый знаменатель!"; exit(1);}
				else if(tchis==0)
				{chis=0; znam=1; return;}
				while(tchis!=0)
				{
					if(tchis<tznam)
					{temp=tchis; tchis=tznam; tznam=temp;}
					tchis=tchis-tznam;
				}
				gcd=tznam;
				chis=chis/gcd;
				c=c/gcd;
				cout<<setw(6)<<chis<<"/"<<c<<" ";
			}
			cout<<endl;
		}
	}
	void cikl3()
	{
		for(int j=0; j<55; j++)
			cout<<"-";
		cout<<endl;
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	cout<<"Программа вывода перемноженных дробей.\n";
	fraction f1;
	f1.vvod();
	f1.cikl1();
	f1.cikl3();
	f1.cikl2();
	getch();
	return 0;
}
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 05.05.2017 в 15:14.
KAMLS вне форума Ответить с цитированием