Динамические структуры
От: z1z  
Дата: 19.04.07 15:50
Оценка:
Всем доброго времени суток)
Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

код задачи прилагаю:

#include <string.h>
#include <dos.h>
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <conio.h>



struct bus
{
    char FIO_voditel[ 50 ];
    int bus_number, route_number, viezd, zaezd;
    struct bus *even;
    };

struct bus *next;
struct bus *start=NULL;
struct bus *end=NULL;

int size=0;


void index( int index )
{
next=start;
for( int i=0; next; ++i )
{
    if( i==index ) break;
    next=next->even;
    }
return;
}

void addtail( bus &X ) //функция добавления в список одной структуры
{
++size;
next=( bus * ) malloc ( sizeof(bus) );
memcpy( next, &X, sizeof(bus) );
if( start==NULL && end==NULL )  start=next;
else end->even=next;
end=next;
end->even=NULL;
return;
}

void filled()
{
randomize();
char opt[ 10 ];
struct bus X;

clrscr();
cout << setw( 10 ) << "Naberite EXIT dlai prekrasheniai vvoda dannih" << endl;
cout << "Vvedite dannie --" << setw( 10 ) << size+1 << endl
     << "Familia i iniciali voditelaiя: ";
cin.get( X.FIO_voditel , 100 );

if( strlen(X.FIO_voditel)==0 || stricmp(X.FIO_voditel, "exit")==0 ) return;

cout << "Nomer avtobusa i nomer reisa cherez probel: ";
cin >> X.bus_number >> X.route_number;
cin.ignore();

for( ;((X.viezd=random( 24 ))>=(X.zaezd=random( 24 ))); );

addtail( X );

memset( &X, 0, sizeof(bus) );

filled(); // рекурсия

}





void main( void )
{
int i, j, c;
struct time t;
gettime( &t );

filled(); //заполняем список

for( ; c!=3; )
{
    clrscr();
    cout << "[ 1 ] V parke" << endl
     << "[ 2 ] Na linii" << endl
     << "[ 3 ] Bihod" << endl
     << "Vvedite 1,2,3 : ";
    cin >> c;


    switch( c )
    {
    case 1:
        cout << "V parke v dannii moment: " << endl;
        for( j=0,i=0; i<size; ++i )
        {
        index( i );
        if( next->viezd>t.ti_hour || next->zaezd<t.ti_hour )
        {
            cout << "Nomer avtobusa: " << next->bus_number << endl
             << "Nomer reisa: " << next->route_number << endl
             << "Voditel': " << next->FIO_voditel << endl
             << "------------------------------------" << endl;
            ++j;
            }
        }
        cout << "Itogo: " << j << " iz " << size << endl
         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
        getch();
    break;
    case 2:
        cout << "Na linii v dannii moment: " << endl;
        for( j=0,i=0; i<size; ++i )
        {
        index( i );
        if( next->viezd<t.ti_hour && next->zaezd>t.ti_hour )
        {
            cout << "Nomer avtobusa: " << next->bus_number << endl
             << "Nomer reisa: " << next->route_number << endl
             << "Voditel': " << next->FIO_voditel << endl
             << "------------------------------------" << endl;
            ++j;
            }
        }
        cout << "Itogo: " << j << " iz " << size << endl
         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
        getch();
    break;
    default:
        if( c>3 ) cout << "Nevernii vvod!" << endl;
    break;
    }
    }

return;
}

заранее благодарна)
Re: Динамические структуры
От: Кодт Россия  
Дата: 19.04.07 17:31
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Всем доброго времени суток)

z1z>Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

Объясняю: код — в топку.
Во-первых, там односвязный список.
Во-вторых, такой инфернальный* стиль программирования (впрочем, характерный для лаб, писанных новичками под нечутким руководством препода и на дремучем турбоси++).
*) сиречь, адский
В-третьих, программа с ошибками.

А именно:
— buffer overrun
struct bus
{
    char FIO_voditel[50];
    .....
};

.....
cin.get( X.FIO_voditel , 100 );
.....

— хвостовая рекурсия вместо итерации (сколько там под стек отводится? в модели tiny?)
void filled()
{
    randomize(); // каждый раз!!! зачем?
    
    // отжираем 80 байтов на стеке, плюс ещё 4 были на служебные нужды
    char opt[10];
    struct bus X;
    
    ..... // диалог с пользователем, добавляем копию в список
    
    memset(&X,0,sizeof(bus)); // а меж тем, эта переменная нам больше не нужна. Зачем чистить
    filled(); // ну что, не жалко очередных 88 байтов?
}

— память от списка не освобождается
ну и ещё по мелочи...



Тебе нужен именно двусвязный список, или односвязный сгодится?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Динамические структуры
От: z1z  
Дата: 19.04.07 18:03
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Всем доброго времени суток)

z1z>Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

z1z>код задачи прилагаю:


z1z>
z1z>#include <string.h>
z1z>#include <dos.h>
z1z>#include <iostream.h>
z1z>#include <iomanip.h>
z1z>#include <stdlib.h>
z1z>#include <conio.h>



z1z>struct bus
z1z>{
z1z>    char FIO_voditel[ 50 ];
z1z>    int bus_number, route_number, viezd, zaezd;
z1z>    struct bus *even;
z1z>    };

z1z>struct bus *next;
z1z>struct bus *start=NULL;
z1z>struct bus *end=NULL;

z1z>int size=0;


z1z>void index( int index )
z1z>{
z1z>next=start;
z1z>for( int i=0; next; ++i )
z1z>{
z1z>    if( i==index ) break;
z1z>    next=next->even;
z1z>    }
z1z>return;
z1z>}

z1z>void addtail( bus &X ) //функция добавления в список одной структуры
z1z>{
z1z>++size;
z1z>next=( bus * ) malloc ( sizeof(bus) );
z1z>memcpy( next, &X, sizeof(bus) );
z1z>if( start==NULL && end==NULL )  start=next;
z1z>else end->even=next;
z1z>end=next;
end->>even=NULL;
z1z>return;
z1z>}

z1z>void filled()
z1z>{
z1z>randomize();
z1z>char opt[ 10 ];
z1z>struct bus X;

z1z>clrscr();
z1z>cout << setw( 10 ) << "Naberite EXIT dlai prekrasheniai vvoda dannih" << endl;
z1z>cout << "Vvedite dannie --" << setw( 10 ) << size+1 << endl
z1z>     << "Familia i iniciali voditelaiя: ";
z1z>cin.get( X.FIO_voditel , 100 );

z1z>if( strlen(X.FIO_voditel)==0 || stricmp(X.FIO_voditel, "exit")==0 ) return;

z1z>cout << "Nomer avtobusa i nomer reisa cherez probel: ";
z1z>cin >> X.bus_number >> X.route_number;
z1z>cin.ignore();

z1z>for( ;((X.viezd=random( 24 ))>=(X.zaezd=random( 24 ))); );

z1z>addtail( X );

z1z>memset( &X, 0, sizeof(bus) );

z1z>filled(); // рекурсия

z1z>}





z1z>void main( void )
z1z>{
z1z>int i, j, c;
z1z>struct time t;
z1z>gettime( &t );

z1z>filled(); //заполняем список

z1z>for( ; c!=3; )
z1z>{
z1z>    clrscr();
z1z>    cout << "[ 1 ] V parke" << endl
z1z>     << "[ 2 ] Na linii" << endl
z1z>     << "[ 3 ] Bihod" << endl
z1z>     << "Vvedite 1,2,3 : ";
z1z>    cin >> c;


z1z>    switch( c )
z1z>    {
z1z>    case 1:
z1z>        cout << "V parke v dannii moment: " << endl;
z1z>        for( j=0,i=0; i<size; ++i )
z1z>        {
z1z>        index( i );
z1z>        if( next->viezd>t.ti_hour || next->zaezd<t.ti_hour )
z1z>        {
z1z>            cout << "Nomer avtobusa: " << next->bus_number << endl
z1z>             << "Nomer reisa: " << next->route_number << endl
z1z>             << "Voditel': " << next->FIO_voditel << endl
z1z>             << "------------------------------------" << endl;
z1z>            ++j;
z1z>            }
z1z>        }
z1z>        cout << "Itogo: " << j << " iz " << size << endl
z1z>         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
z1z>        getch();
z1z>    break;
z1z>    case 2:
z1z>        cout << "Na linii v dannii moment: " << endl;
z1z>        for( j=0,i=0; i<size; ++i )
z1z>        {
z1z>        index( i );
z1z>        if( next->viezd<t.ti_hour && next->zaezd>t.ti_hour )
z1z>        {
z1z>            cout << "Nomer avtobusa: " << next->bus_number << endl
z1z>             << "Nomer reisa: " << next->route_number << endl
z1z>             << "Voditel': " << next->FIO_voditel << endl
z1z>             << "------------------------------------" << endl;
z1z>            ++j;
z1z>            }
z1z>        }
z1z>        cout << "Itogo: " << j << " iz " << size << endl
z1z>         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
z1z>        getch();
z1z>    break;
z1z>    default:
z1z>        if( c>3 ) cout << "Nevernii vvod!" << endl;
z1z>    break;
z1z>    }
z1z>    }

z1z>return;
z1z>}

z1z>

z1z>заранее благодарна)

Кодт...спасибо за то, что обратили внимание)....мне в принципе и односвязный список пойдет...)

я понимаю что код ужасный — но мне бы хоть в нем разобраться)))....вы мне поможете?.....помогите пожалуйста)
Re: Динамические структуры
От: Sm0ke Россия ksi
Дата: 20.04.07 07:52
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Всем доброго времени суток)

z1z>Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

z1z>код задачи прилагаю:


Вы лучше саму задачу изложите.
А то поставить задачу по чужому коду трудно.

Раз задача аналогична, а не идентична, то скорее всего решение будет отличаться.
Re: Динамические структуры
От: Tiamer  
Дата: 20.04.07 08:14
Оценка:
http://pegasus.rutgers.edu/~elflord/cpp/list_howto/
Только там на английском... Там есть реализация односвязного списка с рисунком.
Вместо T подставьте свою книжку и будем вам счастие..
(Код который вы привели, это на каком языке то ?)
Re: Динамические структуры
От: z1z  
Дата: 20.04.07 11:38
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Всем доброго времени суток)

z1z>Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

z1z>код задачи прилагаю:


z1z>
z1z>#include <string.h>
z1z>#include <dos.h>
z1z>#include <iostream.h>
z1z>#include <iomanip.h>
z1z>#include <stdlib.h>
z1z>#include <conio.h>



z1z>struct bus
z1z>{
z1z>    char FIO_voditel[ 50 ];
z1z>    int bus_number, route_number, viezd, zaezd;
z1z>    struct bus *even;
z1z>    };

z1z>struct bus *next;
z1z>struct bus *start=NULL;
z1z>struct bus *end=NULL;

z1z>int size=0;


z1z>void index( int index )
z1z>{
z1z>next=start;
z1z>for( int i=0; next; ++i )
z1z>{
z1z>    if( i==index ) break;
z1z>    next=next->even;
z1z>    }
z1z>return;
z1z>}

z1z>void addtail( bus &X ) //функция добавления в список одной структуры
z1z>{
z1z>++size;
z1z>next=( bus * ) malloc ( sizeof(bus) );
z1z>memcpy( next, &X, sizeof(bus) );
z1z>if( start==NULL && end==NULL )  start=next;
z1z>else end->even=next;
z1z>end=next;
end->>even=NULL;
z1z>return;
z1z>}

z1z>void filled()
z1z>{
z1z>randomize();
z1z>char opt[ 10 ];
z1z>struct bus X;

z1z>clrscr();
z1z>cout << setw( 10 ) << "Naberite EXIT dlai prekrasheniai vvoda dannih" << endl;
z1z>cout << "Vvedite dannie --" << setw( 10 ) << size+1 << endl
z1z>     << "Familia i iniciali voditelaiя: ";
z1z>cin.get( X.FIO_voditel , 100 );

z1z>if( strlen(X.FIO_voditel)==0 || stricmp(X.FIO_voditel, "exit")==0 ) return;

z1z>cout << "Nomer avtobusa i nomer reisa cherez probel: ";
z1z>cin >> X.bus_number >> X.route_number;
z1z>cin.ignore();

z1z>for( ;((X.viezd=random( 24 ))>=(X.zaezd=random( 24 ))); );

z1z>addtail( X );

z1z>memset( &X, 0, sizeof(bus) );

z1z>filled(); // рекурсия

z1z>}





z1z>void main( void )
z1z>{
z1z>int i, j, c;
z1z>struct time t;
z1z>gettime( &t );

z1z>filled(); //заполняем список

z1z>for( ; c!=3; )
z1z>{
z1z>    clrscr();
z1z>    cout << "[ 1 ] V parke" << endl
z1z>     << "[ 2 ] Na linii" << endl
z1z>     << "[ 3 ] Bihod" << endl
z1z>     << "Vvedite 1,2,3 : ";
z1z>    cin >> c;


z1z>    switch( c )
z1z>    {
z1z>    case 1:
z1z>        cout << "V parke v dannii moment: " << endl;
z1z>        for( j=0,i=0; i<size; ++i )
z1z>        {
z1z>        index( i );
z1z>        if( next->viezd>t.ti_hour || next->zaezd<t.ti_hour )
z1z>        {
z1z>            cout << "Nomer avtobusa: " << next->bus_number << endl
z1z>             << "Nomer reisa: " << next->route_number << endl
z1z>             << "Voditel': " << next->FIO_voditel << endl
z1z>             << "------------------------------------" << endl;
z1z>            ++j;
z1z>            }
z1z>        }
z1z>        cout << "Itogo: " << j << " iz " << size << endl
z1z>         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
z1z>        getch();
z1z>    break;
z1z>    case 2:
z1z>        cout << "Na linii v dannii moment: " << endl;
z1z>        for( j=0,i=0; i<size; ++i )
z1z>        {
z1z>        index( i );
z1z>        if( next->viezd<t.ti_hour && next->zaezd>t.ti_hour )
z1z>        {
z1z>            cout << "Nomer avtobusa: " << next->bus_number << endl
z1z>             << "Nomer reisa: " << next->route_number << endl
z1z>             << "Voditel': " << next->FIO_voditel << endl
z1z>             << "------------------------------------" << endl;
z1z>            ++j;
z1z>            }
z1z>        }
z1z>        cout << "Itogo: " << j << " iz " << size << endl
z1z>         << "Nagmite lybyu klavishy dlai prodolgeniaя " << endl;
z1z>        getch();
z1z>    break;
z1z>    default:
z1z>        if( c>3 ) cout << "Nevernii vvod!" << endl;
z1z>    break;
z1z>    }
z1z>    }

z1z>return;
z1z>}

z1z>

z1z>заранее благодарна)



задача которая решается в этом коде звучит так :
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке.
Сведения о каждом автобусе содержат:
• номер автобуса;
• фамилию и инициалы водителя;
• номер маршрута;
• признак того, где находится автобус — на маршруте или в парке.
Программа должна обеспечивать:
• начальное формирование данных о всех автобусах в виде списка;
• при выезде каждого автобуса из парка вводится номер автобуса, и программа устанавливает зна-чение признака «автобус на маршруте»;
• при въезде каждого автобуса в парк вводится номер автобуса, и программа устанавливает значе-ние признака «автобус в парке»;
• по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящих-ся на маршруте.
моя задача аналогична этой только про книги.....я прошу всех объяснить мне этот код и если это возможно исправить в нем ошибки, но свою задачу я хочу решить сама, предварительно полностью поняв решение этой...помогите пожалуйста с объяснением...)
Re: Динамические структуры
От: alzt  
Дата: 02.05.07 13:02
Оценка:
Здравствуйте, z1z, Вы писали:

z1z>Всем доброго времени суток)

z1z>Я к вам вот по какому поводу…у меня висит лаба по динамике и есть код задачи которая полностью аналогична моей из Лабы (только там про автобусы а у меня про книжки)…и вот проблема – я очень плохо понимаю тот код особенно в части указателей и работы с двусвязным списком, который как раз и является основой этой Лабы(…отсюда просьба – не могли бы вы мне объяснить этот код…

Это форум разработчиков, а не желающих решать чужие лабы. Хотите разобраться — задавайте вопросы по источникам, которые помогут Вам изучить С++ и различные структуры данных.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.