Помогите доделать задачу

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Ввести количество глав в книге и сколько страниц в каждой главе. Вывести сколько в каждом томе страниц и какие там главы. Нужно разложить так, чтобы разница между наименее толстым томом и самым толстом была минимальна.

Я дошел только до этого, а дальше не знаю, помогите пожалуйста!

Код: Выделить всё

#include <conio.h>
#include <iostream.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int I, J, B, C, V, P[100];
	cout<<"Enter Chapters Amount : ";
	cin>>C;
	for (I = 1; I < C; I++)
	{
		cout<<"Enter Pages Amount In Chapter #";
		cout<<I;
		cout<<" : ";
		cin>>P[I];
	}
	cout<<"Enter Volumes Amount : ";
	cin>>V;



	getch();
	return 0;
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Если задача стоит только количество глав (без названия) и к-во страниц в каждой, то каждую книгу можно представить в виде массива, где: размер массива - это количество глав, а содержание массива - число страниц.
Вывести сколько в каждом томе страниц и какие там главы.
Это не совсем понятно, я о томах, - значит книга не одна? А "какие главы" - текст или цифры? Если текст то нужно структурировать, то есть определить тип "Книга", после загнать все книги в контейнер и произвести окончательную обработку данных.
чтобы разница между наименее толстым томом и самым толстом была минимальна.
Что понимается под разницей? Соотношение количества глав и страниц? Желательно на примере из 4х-5и книг.
PS Чем лучше поймёшь задачу, тем легче её решать.
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Насчет томов, там так : не нужно их вводить, их нужно вывести, тоесть эти главы разбить на тома, так сказать оптимальные, чтобы разница между наименее толстым томом и самым толстом была минимальна. У меня есть готовые ответы, вот они во вложении.
Вложения
1.zip
(65.13 КБ) 35 скачиваний
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Вот так, например.

Код: Выделить всё

#include <iostream>
#include "algorithm"
using namespace std;
void printarray(int * pStart, int * pEnd)
{
    int * pi=pStart;
    int i=1;
    while(pi<pEnd)
    {
        cout<<"Volume #"<<i<<" consist of "<<*pi<<" pages"<<endl;
        ++pi;
        ++i;
    }
    cout<<endl;
}
void input_pages(int * pStart, int * pEnd)
{
    int * pi=pStart;
    int i=1;
    while(pi<pEnd)
    {
        cout<<"Pages ammount in chapter #"<<i<<"\t";
        cin>>*pi;
        ++pi;
        ++i;
    }
    cout<<endl;
}
int * max_elem(int * pStart, int * pEnd)
{//находим макс. элемент и возвращаем указатель на него
    int * pi=pStart;
    int * pMax=pi++;
    while(pi<pEnd)
    {
        if(*pi>*pMax) pMax=pi;
        ++pi;
    }
// так как число страниц не может быть <0
// возвращаем 0, если макс. элемент отрицательный
    return *pMax>-1?pMax :( int *)0;
}
int * min_elem(int * pStart, int * pEnd)
{// находит мин. элемент и возвращает указатель на него
    int * pi=pStart;
    int * pMin=pi++;
    while(pi<pEnd)
    {
        if(*pi<*pMin) pMin=pi;
        ++pi;
    }
    return pMin;
}
void main()
{
    int * pChapters;//указатель на части
    int nChapters;//кол-во частей
    cout<<"Enter chapters amount:\t";//просим ввод
    cin>>nChapters;//получаем

    int nVolumes;//кол-во томов
    int * pVolumes;//указатель на тома
    cout<<"Enter volumes amount:\t";//просим ввод
    cin>>nVolumes;//получаем
    cout<<endl;

    if(nVolumes>nChapters) cout<<"error"<<endl;//если томов > чем частей, то это ошибка
    else
    {
        pChapters=new int[nChapters];
        input_pages(pChapters,pChapters+nChapters);
        if(nVolumes<nChapters)
        {
            pVolumes=new int[nVolumes];
            fill(pVolumes,pVolumes+nVolumes,0);//инициализируем массив томов нулями
            int * pMax;
            int * pMin;
            while((pMax=max_elem(pChapters,pChapters+nChapters))!=0)
            {
                pMin=min_elem(pVolumes,pVolumes+nVolumes);// ищем мин в выходном массиве
                *pMin+=*pMax;//добавляем к нему макс из исходного массива
                *pMax=-1;//затираем найденное макс значение в исходном массиве
            }
            printarray(pVolumes,pVolumes+nVolumes);//печать результата
            delete pVolumes;//освобождаем память, выделенную под части
        }
        else
        {//сюда попадаем, если тома равны частям
            printarray(pChapters,pChapters+nChapters);//печатаем исходное как результат
        }
        delete pChapters;//освобождаем память, выделенную под части
    }
}
В программе нет защиты "от дурака", то бишь - от ввода неверных значений. Возможно заставят избавиться от #include <algorithm>. Найди где, подумай как и сделай это сам.
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Огромнейшее спасибо вам :) :) :)
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Первого января проснулась компания, собрала деньги и купила выпивку на все деньги - все выпила. Второго января пошла, сдала все бутылки и снова купила выпивку на все, и снова все выпила. Вопрос - сколько надо иметь было первого января денег, чтобы было что выпить 31 декабря нового года. Вводим цену покупки бутылки и сдачи.
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Вводим сколько дней в месяце, сколько каждый день стоит обед и начиная с какой цены выдается бесплатный талончик на обед. Надо узнать сколько минимально надо денег на этот месяц чтобы кушать каждый день.
Реализовал вот так, но преподаватель сказал - не верно ! Почему ?

Код: Выделить всё

#include <conio.h>
#include <iostream.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int I, D, A[31];
	float C, F, K, S;
	K = 0;
	S = 0;

	// Количество дней

	cout<<"Enter Quantity Of Days - ";
	cin>>D;

	// Стоимость обеда

	for (I = 0; I < D; I++)
	{
		cout<<"\n";
		cout<<"Enter Dinner Cost - ";
		cin>>C;
		A[I] = C;
	}

	// Бесплатный талончик

	cout<<"\n";
	cout<<"Enter The Free Coupon - ";
	cin>>F;

	for (I = 0; I < D - 1; I++)
	{
		K = K + A[I];
		if (K > F)
		{
		   K = 0;
		   cout<<"\n";
		   cout<<"The Coupon Has Been Used In The ";
		   cout<<I;
		   cout<<" Day";
		   cout<<"\n";
		}
		else
		   S = S + K;
	}
	cout<<"\n";
	cout<<"It Is Necessary Money - ";
	cout<<S;
	getch();
	return 0;
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Наверное потому, что не учитываешь стоимость в последний день. Последний цикл крутится до D-1, а не D. Обрати внимание на индекс массива в циклах - i вместо I, это точно ошибка.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Devilzzz писал(а):Первого января проснулась компания...
Для точного подсчёта нужно ещё знать сколько бутылок осталось после 31 декабря прошедшего года (только не говорите, что компания на 00 часов 1 января была трезвая :) ).Навскидку, до 2-го января вряд-ли кто из них доживёт.
Devilzzz
Сообщения: 6
Зарегистрирован: 28 май 2009, 14:24

Нет, задача с бухариками немного не такая, типа у них все есть начиная с первого января, и вот они начиная с первого января начинают квасить, квасят, квасят, и так 365 дней, и вот в конце считается сколько им нужно денег :)
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Devilzzz писал(а): и вот в конце считается сколько им нужно денег :)
Наверное, задачу нужно решать в обратном порядке, предполагая, что на последний день должно остаться денег на одну бутылку, а дальше, вычитая по дню, рассчитывать необходимую сумму. Налицо геометрическая прогрессия, где знаменателем является целая часть от отношения стоимости_продукта к стоимости_бутылки, остаток от этой операции нужно иметь в виде наличных.
Ответить