Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Задача про Форт Нокс


Автор: Мизеракль 3.11.2012, 11:55
Доброго времени суток.
У меня возникла не большая проблема с кодом, решил посоветоваться у вас на форуме.
На С++(пишу на Visual Studio 2010 Ultimate) написать программу которая моделирует загрузку инопланетного корабля золотыми слитками Форт Нокса.
Суть задачи: 
Програма случайным образом генерирует значение для переменных: Vmax (объем трюма) и Mmax (грузоподъемность инопланетного корабля).
После генерации значений программа начинает загружать трюм инопланетного корабля золотыми слитками. Она будет выполняться (загружать трюм слитками), пока выполняется условие: if ((V <Vmax) and (M <Mmax))
Если условие не выполняется, то программа завершает свое выполнение.
Если условие выполняется, загружается на конвейер новый слиток.
Программа генерирует случайные параметры слитка (линейные размеры и среднюю плотность: X, Y, Z, ρ).
Если слиток не может поместиться в трюме, т.е. условие
if ((V + x * y * z <= Vmax) and (M + ρ * x * y * z <= Mmax)) не выполняется, то мы его выбрасываем (drop) и загружаем новый слиток.
Если слиток помещается в трюме, то мы должны проверить условие прохождения слитка через окошко в трюм:
if(((a>=x)and(b>=y))or((a>=y)and(b>=x))or((a>=x)and(b>=z))or((a>=z)and(b>=x))or((a>=z)and(b>=y))or((a>=y)and(b>=z))or((a>=y)and(b>=z)))
a и b - размеры окошка генерируються случйно.
Если условие не выполняется, мы его выбрасываем (drop) и загружаем новый слиток.
Если слиток проходит в окошко, то дальше мы поворачиваем слиток на конвейере так, чтобы он прошел сквозь окошко, используя действия «rotate» (повернуть по оси y) и «turn» (повернуть по оси х).
Если слиток прошел сквозь окошко в трюм, то загружается новый слиток на конвейер.
Программа заканчивает выполнение, когда невозможно загружать больше слитков в трюм корабля.
Вот код:
#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;
using std::srand;
using std::rand;
int main () {
    double Mmax,Vmax,x,y,z,r,a,b,V,M,m,v;
    srand(time(0));
    Mmax=1000+rand()%10000;
    Vmax=100+rand()%2000;
    a=4+rand()%3;
    b=4+rand()%6;
    V=0;
    M=0;
    m=Mmax*(7+rand()%7)/100;
    v=Vmax*(7+rand()%7)/100;
    cout<<"(Mmax,Vmax):('<<Mmax<<','<<Vmax<<')"<<endl;
    cout<<"(A,B):('<<a<<','<<b<<')"<<endl;
    cout<<endl<<"(x,y,z,r):"<<endl;
    //------------------------------------------------
    while (M<=Mmax-m, V<=Vmax-v); {
        x=4+rand()%4;
        y=4+rand()%4;
        z=4+rand()%4;
        r=4+rand()%4;
        cout<<endl;
        cout<<"('<<x<<','<<y<<','<<z<<','<<r<<')"; 
        cout<<"(Actions with gold: put)";
        if ((M+x*y*z*r<=Mmax)&&(V+x*y*z<=Vmax)) {
            if((x<=a)&&(z<=b)) {cout<<"->Accept"<<endl;M=M+x*y*z*r;V=V+x*y*z;}
            else if((x<=a)&&(y<=b)){cout<<"->Turn->Accept"<<endl;M=M+x*y*z*r; V=V+x*y*z;}
            else if((y<=a)&&(z<=b)){cout<<"->Turn->Rotate->Turn->Accept"<<endl;M=M+x*y*z*r;V=V+x*y*z;}
        else if((x<=b)&&(y<=a)){cout<<"->Turn->Accept"<<endl;M=M+x*y*z*r;V=V+x*y*z;}
        else if((x<=b)&&(z<=a)){cout<<"->Rotate->Accept"<<endl;M=M+x*y*z*r;V=V+x*y*z;}
        else cout<<"->Drop"<<endl;
        }
    }

Не могу понять где ошибка, при запуске кода не могу вводить значения переменных отвечающие за параметры слитка и вместо случайных значений пишуться названия переменных.
Заранее спасибо за помощь.

Автор: feodorv 3.11.2012, 12:28
Цитата(Мизеракль @  3.11.2012,  12:55 Найти цитируемый пост)
Вот код:

Это не код. Вот код:
Код

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;
using std::srand;
using std::rand;

int main () 
{
    double Mmax, Vmax, x, y, z, r, a, b, V, M, m, v;

    srand(time(0));
    Mmax=1000+rand()%10000;
    Vmax=100+rand()%2000;
    a=4+rand()%3;
    b=4+rand()%6;
    V=0;
    M=0;
    m=Mmax*(7+rand()%7)/100;
    v=Vmax*(7+rand()%7)/100;

    cout << "(Mmax,Vmax):( "<< Mmax << "," << Vmax << ")" << endl;
    cout << "(A,B):(" << a << "," << b << ")" << endl;
    cout<< endl << "(x,y,z,r):" << endl;

    //------------------------------------------------
    while ( M <= Mmax-m && V<=Vmax-v )/* ; */
    {
        x=4+rand()%4;
        y=4+rand()%4;
        z=4+rand()%4;
        r=4+rand()%4;
        cout<<endl;

        cout << "(" << x << "," << y << "," << z << "," << r <<")"; 
        cout << "(Actions with gold: put)";
        if( (M+x*y*z*r) <= Mmax && (V+x*y*z) <= Vmax ) 
        {
            if( x <= a &&  z <= b ) 
            {
               cout << "->Accept" << endl;
               M = M+x*y*z*r;
               V=V+x*y*z;
            }
            else if( x<=a && y<=b )
            {
               cout << "->Turn->Accept" << endl;
               M = M+x*y*z*r; 
               V = V+x*y*z;
            }
            else if( y<=a && z<=b )
            {
               cout << "->Turn->Rotate->Turn->Accept" << endl;
               M=M+x*y*z*r;
               V=V+x*y*z;
            }
            else if( x<= b && y <= a )
            {
               cout << "->Turn->Accept" << endl;
               M=M+x*y*z*r;
               V=V+x*y*z;
            }
            else if( x<=b && z<=a )
            {
               cout << "->Rotate->Accept" << endl; 
               M=M+x*y*z*r;
               V=V+x*y*z;
            }
            else 
               cout << "->Drop" << endl;
        }
    }
}


Добавлено @ 12:37
Цитата(Мизеракль @  3.11.2012,  12:55 Найти цитируемый пост)
Не могу понять где ошибка

Строковые литералы отграничены символами "...", а Вы пытаетесь выдумать что-то своё: "...'

Цитата(Мизеракль @  3.11.2012,  12:55 Найти цитируемый пост)
    cout<<"(Mmax,Vmax):('<<Mmax<<','<<Vmax<<')"<<endl;

Всё, что выделено красным цветом - один-единственный строковый литерал, который и будет благополучно напечатан.

Цитата(Мизеракль @  3.11.2012,  12:55 Найти цитируемый пост)
    while (M<=Mmax-m, V<=Vmax-v); {

Это шедевр - эти запятые и точки с запятой... Срочно в ветку http://forum.vingrad.ru/forum/forum-471.html smile

Добавлено через 12 минут и 1 секунду
Цитата(Мизеракль @  3.11.2012,  12:55 Найти цитируемый пост)
        if ((M+x*y*z*r<=Mmax)&&(V+x*y*z<=Vmax)) {

Здесь тоже не пойми что с чем сравнивается. А скобки то стоят, да не там...

Автор: Мизеракль 3.11.2012, 13:20
Спасибо feodorv за исправления)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)