Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] Заполнение структуры


Автор: Queen 1.10.2007, 23:26
Имеются объекты, данные о которых хранятся в виде массива структур. Добавление нового объекта происходит в отдельной функции. После ввода каждого нового поля программа проверяет введённые значения на соответствие некоторым условиям. Каким - неважно, важно то что условия делятся на два типа условий - фатальные и нефатальные. Если не выполнено фатальное условие, то юзверу выводится, что он - ДЯТЕЛ и всякий ввод прекращается, а из функции даётся сигнал что всё накрылось. Если же не выполнено нефатальное условие, то программа должна долбать юзверя до тех пор, пока он не введёт что-то пристойное. Если условие выполнено, то переходим к просерке следующего условия.

Задача: написать более-менее простой алгоритм, который позволит делать такой ввод. Конкретный пример неважен, важен для меня общий принцип построения таких вот программ.
Доп. условия:
1.В любой момент юзверь должен иметь возможность вообще отказаться от ввода, и при этом всё что он ввёл должно быть стёрто
2.Не должно быть способа прервать программу, кроме как выполнить все условия либо же отказаться от ввода вообще. При этом в массив структур очередной объект добавляется только если всё заполнено правильно.
3.Массив - динамический, и при добавлении нового объекта он тоже должен "толстеть"

З.Ы. Товарищ май... тьфу, модер! я прекрасно знаю что надо типа такую х**** приставлять к названию темы. но да это же не знаю куда отнести алгоритм то универсальй что на си что на паскаль что на ещё чего. так что не пыли...
З.Ы.Ы. огромная просьба... не постить тут неработающие коды, которые вы сами-то не проверяли. бесит
а вот за хороший работающий пример будет моя вечная признательность

Автор: apook 2.10.2007, 12:12
Эта программа заполняет список данными о рабочих, и производит вывод информации по запросу имени, Т.е данные о всех служащих с именем которое указано будут выведены на экран, Если устраивает (т.е нет проблем с компилятором)то код можно модернизировать...
Код

#include <list>
#include <string>
#include <iostream>












//__________________________________________________________________________________________
class employee
 {
    std::string Name, SurName;

public:
    employee( const char *n, const char *sn, int hr );
    virtual ~employee();

    std::string name() { return( Name ); }
    std::string surname() { return( SurName ); }
    int hour, years;
protected:
    //int hour, years;

 };


// this mambers
employee::employee( const char *n, const char *sn, int hr ) : hour( hr ), Name( n ), SurName( sn )
{
}

employee::~employee()
{
    // Placeholder.
}

//__________________________________________________________________________________________






class manager : public employee
 {
public:
    manager( const char *n, const char *sn, int hr ) : employee( n, sn, hr ) {}
 };


//__________________________________________________________________________________________






class company
 {
    std::list< employee * > EmployeeList;
public:
   ~company();
    void addObject( const char *name, const char *surname, int hour );
    void showObject( const char *name );
 };


// this mambers

void company::addObject( const char *name, const char *surname, int hour )
{
    manager *m = new manager( name, surname, hour );
    EmployeeList.push_back( m );
}

void company::showObject( const char *name )
{
    std::list< employee * >::iterator p;
    for( p = EmployeeList.begin(); p != EmployeeList.end(); ++p )
     {
         if( (*p)->name() == name )
         {
            std::cout << "Name [" << (*p)->name().c_str() << "]  Surname ["
                      << (*p)->surname().c_str() << "]  Delivery date [" << (*p)->hour << "]" << std::endl;

         }
     }
}

company::~company()
{
    std::list< employee * >::iterator p;
    for( p = EmployeeList.begin(); p != EmployeeList.end(); ++p )
    {
        delete *p;
    }
}
//__________________________________________________________________________________________



void main()
{
company ACME;

    ACME.addObject( "Bill", "Billo",  1978 );
    ACME.addObject( "Bob", "Boggins",  2004 );
    ACME.addObject( "Julie","Elette", 1999 );
    ACME.addObject( "Bob", "Ouan",  2006 );
    ACME.addObject( "Boris", "Gunz",1999 );
    ACME.addObject( "Bob", "Jo",  2001 );
    ACME.addObject( "Julie", "Marvin", 2002 );


    ACME.showObject( "Bob" );

}

Автор: Queen 2.10.2007, 15:06
это не то что нужно
мне нужно БЕЗ всяких классов и лишних заморочек, обычная структура. в которую всё вводится.
в этой задаче считаю лишним выходить за рамки структурного программирования

как я понимаю там через while всё должно работать, а вот как - я не понимаю.

Автор: nickless 2.10.2007, 16:15
Код

#include <iostream>
#include <cstring>
using namespace std;


struct Object
{
    unsigned int    a;
    float           f;
    char            name[8];
};


/** Добавляет один объект в конец массива
 */
int grow_objects( Object *& objects, int & size )
{
    Object * tmp = new Object[size+1];
    for (int i=0; i<size; i++)
        tmp[i] = objects[i];
    delete [] objects;
    objects = tmp;
    return ++size;
}


/** Нефатальный тест
 */
bool test_f( float f )
{
    if ( f >= 0.0 )
    {
        cout << "Нефатальное условие f < 0.0 не выполнено!" << endl;
        cout << "Повторите ввод." << endl;
        return false;
    }
    return true;
}


/** Фатальный тест
 */
bool fatal_test_a( int a )
{
    if ( a < 0 )
    {
        cout << "Фатальное условие a >= 0 не выполнено!" << endl;
        cout << "Юзверь, ты - ДЯТЕЛ!!!" << endl;
        return false;
    }
    return true;
}


/** Фатальный тест
 */
bool fatal_test_name( const char * name )
{
    if ( strlen(name) > 7 )
    {
        cout << "Фатальное условие strlen(name) < 7 не выполнено!" << endl;
        cout << "Юзверь, ты - ДЯТЕЛ!!!" << endl;
        return false;
    }
    return true;
}


/** Добавляет 1 объект в конец массива если юзверь прошел все тесты
 */
bool add_object( Object *& objects, int & size )
{
    cout << endl << "Добавление " << size+1 << "-ого объекта" << endl;

    // тесты
    int tmp_a = 0;
    cout << "a    : ";
    cin >> tmp_a;
    if ( cin.eof() || cin.fail() )
    {
        cin.clear();
        cin.ignore();
        return false;
    }
    if ( !fatal_test_a( tmp_a ) )
        return false;

    float tmp_f = 0.0;
    do {
        cout << "f    : ";
        cin >> tmp_f;
        if ( cin.eof() || cin .fail() )
        {
            cin.clear();
            cin.ignore();
            return false;
        }
    } while ( !test_f( tmp_f ) );

    cout << "name : ";
    char tmp_name[256];
    cin >> tmp_name;
    if ( cin.eof() || cin.fail() )
    {
        cin.clear();
        cin.ignore();
        return false;
    }
    if ( !fatal_test_name( tmp_name ) )
        return false;

    // собственно добавление
    grow_objects( objects, size );
    objects[size-1].a   = tmp_a;
    objects[size-1].f   = tmp_f;
    strncpy( objects[size-1].name, tmp_name, 7);
    objects[size-1].name[7] = 0;
    return true;
}


int main()
{
    int size = 0;
    Object * objects = NULL;

    // добавляем 8 объектов
    while ( size < 8 )
    {
        if ( !add_object( objects, size ) )
            cout << endl << "Не получилось, пробуем еще раз..." << endl << endl;
    }

    cout << endl << endl << "Чего-то делаем с объектами..." << endl;
    for (int i=0; i<size; i++)
    {
        cout << "object[" << i << "] :" << endl;
        cout << "a    : " << objects[size-1].a << endl;
        cout << "f    : " << objects[size-1].f << endl;
        cout << "name : " << objects[size-1].name << endl;
        cout << endl;
    }

    return 0;
}

Так пойдёт?

Автор: Queen 2.10.2007, 17:09
Зашибись! Братва, поставьте ему плюс кто-нить!
я такого точного ответа здесь ещё не встречала...

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