Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Заполнение структуры 
V
    Опции темы
Queen
Дата 1.10.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 1.10.2007

Репутация: нет
Всего: 1



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

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

З.Ы. Товарищ май... тьфу, модер! я прекрасно знаю что надо типа такую х**** приставлять к названию темы. но да это же не знаю куда отнести алгоритм то универсальй что на си что на паскаль что на ещё чего. так что не пыли...
З.Ы.Ы. огромная просьба... не постить тут неработающие коды, которые вы сами-то не проверяли. бесит
а вот за хороший работающий пример будет моя вечная признательность
PM MAIL   Вверх
apook
Дата 2.10.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



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

#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" );

}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Queen
Дата 2.10.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 1.10.2007

Репутация: нет
Всего: 1



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

как я понимаю там через while всё должно работать, а вот как - я не понимаю.
PM MAIL   Вверх
nickless
Дата 2.10.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 4
Всего: 181



Код

#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;
}

Так пойдёт?


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Queen
Дата 2.10.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 1.10.2007

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) Queen - 2.10.2007, 17:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.