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


Автор: Goth 18.5.2007, 11:29
Вот такая вот задача стоит предо мной:

описать структуру с именем MARSH, содержащую поля: 
•    BEGST – название начального пункта маршрута;
•    TERM – название конечного пункта маршрута;
•    NUMER –  номер маршрута.    
Написать программу, выполняющую следующие действия:
•    ввод из файла данных в массив TRAFFIC, состоящий из десяти структур типа MARSH; записи должны быть упорядочены по номерам маршрутов;
•    вывод на дисплей информации о маршрутах, которые начинаются или кончаются в пункте, введенном с клавиатуры;
•    если таких маршрутов нет, вывести соответствующее сообщение.

Кто осилит?:)

Автор: Xenon 18.5.2007, 20:44
Непонятка - бинарный файл со структруми уже есть? Если да, то :
Код

#include <iostream>
#include <string>
#include <fstream>

const int SIZE = 10;

struct MARSH
{
    std::string BEGST;
    std::string TERM;
    int NUMER;
    MARSH():BEGST("N/A"), TERM("N/A"), NUMER(0){}
};

void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
            arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}

int main(int argc, char* argv[])
{
    MARSH TRAFFIC[SIZE];
    std::string path;
    std::cout << "Enter path to file: ";
    std::getline(std::cin, path);
    std::ifstream file(path.c_str());
    if ( !file.is_open() )
    {
        std::cout << "Could not open file";
        std::cin.get();
        return -1;
    }
    for (int i = 0; !file.eof() && i < SIZE; ++i) file.read(reinterpret_cast<char*>(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    std::string BEGST;
    std::string TERM;
    std::cout << "Enter BEGST: ";
    std::getline(std::cin, BEGST);
    std::cout << "Enter TERM: ";
    std::getline(std::cin, TERM);
    bool are_found = false;
    for (int i = 0; i < SIZE; ++i)
    {
        if (TRAFFIC[i].BEGST == BEGST && TRAFFIC[i].TERM == TERM)
        {
            std::cout << i + 1 << " the number of route: " << TRAFFIC[i].NUMER << std::endl;
            are_found = true;
        }
    }
    if (!are_found) std::cout << "There are no such routes";
    std::cin.sync();
    std::cin.get();
    return 0;
}


Если нет - файл нужно сначала чем-то заполнить ... Как-нибудь вот так:
Код

std::ofstream file_out("d:\\autobusi.dat");
for (int i = 0; i < SIZE; ++i)
{
    MARSH buf;
    std::cout << "NUMBER: ";
    std::cin >> buf.NUMER;
    std::cout << "BEGST: ";
    std::cin >> buf.BEGST;
    std::cout << "TERM: ";
    std::cin >> buf.TERM;
    file_out.write(reinterpret_cast<char*>(&buf), sizeof(MARSH));
}
file_out.close();

Автор: Goth 19.5.2007, 10:08
Вместо "std::" нужно что-то подставить или что? Иначе компиллятор отказывается переваривать эту программу=)

Автор: zkv 19.5.2007, 13:59
Цитата(Goth @  19.5.2007,  10:08 Найти цитируемый пост)
Вместо "std::" нужно что-то подставить или что? Иначе компиллятор отказывается переваривать эту программу=) 

в следующий раз указывайте компилятор. std:: просто убрать (это пространство имен такое, если что smile ), а это:
Код

#include <iostream>
#include <string>
#include <fstream>

заменить на:
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>

Автор: Xenon 19.5.2007, 14:14
zkv, когда же наконец-то в институты/универы поставят нормальные компиляторы ... спасибо за поправку smile

Автор: zkv 19.5.2007, 14:44
Цитата(Xenon @  19.5.2007,  14:14 Найти цитируемый пост)
zkv, когда же наконец-то в институты/универы поставят нормальные компиляторы 

наверное, сначала в них (в институтах) должны появиться преподаватели, которые этих компиляторов (нормальных) сами не будут бояться  smile  

Автор: Goth 19.5.2007, 18:57
Самое смешное, что дело удалением "std::" не закончилось. Компиллятор выдал целый букет ошибок;))) Ну, к примеру, Borland не признает тип string и тд. Может есть возможность у тов. Xenon'a переделать прогу под Borland C++ 3.1? А то остальные ошибки вообще не понятны=)) Буду оч благодарен)

З.Ы. а про универы верно подмечено;))

Автор: Alexeis 19.5.2007, 19:13
Хм.. насколько я знаю в Borland C++ 3.1 нет поддержки STL. Так что работать не будет  smile 

Автор: Goth 19.5.2007, 19:20
Вот я и говорю, что много непонятных мне и компиллятору "ошибок". Поэтому взываю к добрым людям;))

Автор: Xenon 19.5.2007, 20:12
Не дай бог у меня в универе будет борланд smile
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>

const int SIZE = 10;
const int MAX = 20;

struct MARSH
{
    char BEGST[MAX];
    char TERM[MAX];
    int NUMER;
    MARSH():NUMER(0)
};

void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
            arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}

int main(int argc, char* argv[])
{
    MARSH TRAFFIC[SIZE];
    char path[256] = { '\0' };
    cout << "Enter path to file: ";
    cin.getline(path, 256);
    ifstream file(path);
    if ( !file.is_open() )
    {
        cout << "Could not open file";
        cin.get();
        return -1;
    }
    for (int i = 0; !file.eof() && i < SIZE; ++i) file.read(reinterpret_cast<char*>(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    char BEGST[MAX] = { '\0' };
    char TERM[MAX] = { '\0' };
    cout << "Enter BEGST: ";
    cin.getline(BEGST, MAX);
    cout << "Enter TERM: ";
    cin.getline(TERM, MAX);
    bool are_found = false;
    for (int i = 0; i < SIZE; ++i)
    {
        if ( !( strcmp(TRAFFIC[i].BEGST, BEGST) || strcmp(TRAFFIC[i].TERM, TERM) ) )
        {
            cout << i + 1 << " the number of route: " << TRAFFIC[i].NUMER << endl;
            are_found = true;
        }
    }
    if (!are_found) cout << "There are no such routes";
    cin.sync();
    cin.get();
    return 0;
}

Автор: Goth 19.5.2007, 20:57
И опять компиллятор выдает море ошибок. Сейчас посмотрим, что там....

Автор: zkv 19.5.2007, 21:06
вот прога Xenon'a, которая точно(нашел даже этот раритет smile) запускается в борланде, но не знаю насколько корректно работает, проверяй:
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>
//using namespace std;

const int SIZE = 10;
const int STRINGSIZE = 20;

struct MARSH
{
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    int NUMER;
    MARSH()
    {
        strcpy( BEGST, "N/A" );
        strcpy( TERM, "N/A" );
        NUMER = 0;    
    }
};
void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
            arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}
int main(int argc, char* argv[])
{
    MARSH TRAFFIC[SIZE];
    char path[STRINGSIZE];
    cout << "Enter path to file: ";
    cin.getline( path, STRINGSIZE );
    ifstream file( path );
    if ( !file )
    {
        cout << "Could not open file";
        cin.get();
    return -1;
    }
    for (int i = 0; !file.eof() && i < SIZE; ++i) file.read( (char*)(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
//    string TERM;
    cout << "Enter BEGST: ";
    cin.getline(BEGST, STRINGSIZE);
    cout << "Enter TERM: ";
    cin.getline(TERM, STRINGSIZE);
    int are_found = 0;
    for (i = 0; i < SIZE; ++i)
    {
    if (TRAFFIC[i].BEGST == BEGST && TRAFFIC[i].TERM == TERM)
    {
        cout << i + 1 << " the number of route: " << TRAFFIC[i].NUMER << endl;
        are_found = 1;
    }
    }
    if (!are_found) cout << "There are no such routes";
//    std::cin.sync();
    cin.get();
    return 0;
}

Автор: Goth 19.5.2007, 21:31
Эта программа ничуть не лучше=) Может я, конечно, чего-то недопонимаю, но компиллятор опять же выводит несуразные замечание (хотч их всего 2!), а именно "undefined symbols ..." ... Даже не знаю, что с этим можно сделать ;)

Автор: zkv 19.5.2007, 21:41
Goth, этот код я проверял на Borland C++ Version 3.1, он только два ворнинга выдает несущественных (обеспокоен тем что не пользуемся argc и argv). Так что показывай на какие выдает ошибки, и в каких строках.

Автор: Goth 20.5.2007, 08:53
Компилится нормально, но .EXE файл не линкуется... Привожу точный текст ошибки "Linker error: Undefined symbol _vector_new_(void far*, unsigned int, unsigned long, unsigned int,...) in module <имя файла с текстом программы>.CPP" 
И вот эта: "Linker error: Undefined istream::getline(char far*, int, unsigned char) in module <имя файла с текстом программы>.CPP"
Никогда с таким не сталкивался. Может я что-то не так делаю? :)

Автор: zkv 20.5.2007, 14:08
Goth, к либ файлам в директориях пути нормально прописаны? Посмотри в файловом менеджере (проводнике например) сначала, где папка с файлами у тебя с расширениями lib, по идее она LIB должна называться, потом пропиши путь к этим файлам в Directories, если не получится,  то тебе не повезло  smile

Автор: Goth 20.5.2007, 16:06
Папка с .lib файлами так и называется. В Directories путь прописан к этой папке. Все остальные проги нормально компиллятся. Ничего не понимаю...

Автор: dizzy1984 23.5.2007, 12:47
Options->Linker->Libraries->Standart Run-time Libraries вместо None поставить Static

Цитата(Alexeis @  19.5.2007,  21:13 Найти цитируемый пост)
Хм.. насколько я знаю в Borland C++ 3.1 нет поддержки STL. Так что работать не будет   

Такой, какой мы ее знаем на текущий день нет - но было некое подобие.
Были все потоковые классы - fstream, iostream.
Существовали контейнерные классы - Array(теперь vector), Queue, List, правда они не были шаблонными.

Различия по примеру Xenona.
std нет, т.к нет концепции о пространстве имен.
Типа string нет, зато есть тип String, правда с другими методами.
Нет типа bool и ключевых слов false и true
reinterpret_cast и иже с ним также отсутствуют

Все остальное портабельно

Автор: Goth 23.5.2007, 16:48
так, действительно запускается (видимо уж совсем устарел мой С++, скачал с бОльшим кол-вом библиотек). Но вот что должен из себя представлять файл для считывания? Какова должна быть структура записи информации в нем?  Перепробовал уже множество вариантов. И как можно вывести на экран уже отсортированный массив структур?

Автор: Xenon 24.5.2007, 00:01
Goth, я уже приводил функцию формированию файла на основе данных. Иначе никак, ведь формат данных бинарен, поэтому ручками не получится.
Вот та самая функция:
Код

std::ofstream file_out("d:\\autobusi.dat");
for (int i = 0; i < SIZE; ++i)
{
    MARSH buf;
    cout << "NUMBER: ";
    cin >> buf.NUMER;
    cout << "BEGST: ";
    cin >> buf.BEGST;
    cout << "TERM: ";
    cin >> buf.TERM;
    file_out.write(reinterpret_cast<char*>(&buf), sizeof(MARSH));
}
file_out.close();


Вывод? Везде, где угодно после функции sort():
Код

for (int i = 0; i < SIZE; ++i)
{
    cout << "BEGST: " << TRAFFIC[i].BEGST << endl;
    cout << "TERM: " << TRAFFIC[i].TERM << endl;
    cout << "NUMBER: " << TRAFFIC[i].NUMER << endl;
}

Автор: Goth 24.5.2007, 14:10
Понятно. Только проблема вот в чем: мой компиллятор не признает 11ую строку первого кода (что не удивительно). Чем можно заменить её в Borland?

Автор: zkv 24.5.2007, 14:16
Цитата(Goth @  24.5.2007,  14:10 Найти цитируемый пост)
Понятно. Только проблема вот в чем: мой компиллятор не признает 11ую строку первого кода (что не удивительно). Чем можно заменить её в Borland?

reinterpret_cast - это не понимает? меняй 
Код

reinterpret_cast<char*>(&buf)

на
Код

(char *)&buf

Автор: Goth 24.5.2007, 16:37
Всё равно не то... Но уже хотя бы запускается. Файл создается криво, далее не читается. А я уж думал сегодня отмечу задачу " как решенную" =))

Автор: Xenon 24.5.2007, 17:38
Не знаю как ты делал, но у меня все работает:
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>
using namespace std;

const int SIZE = 2;
const int STRINGSIZE = 20;

struct MARSH
{
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    int NUMER;
    MARSH()
    {
        strcpy( BEGST, "N/A" );
        strcpy( TERM, "N/A" );
        NUMER = 0;    
    }
};
void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
            arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}
int main(int argc, char* argv[])
{
    ofstream file_out("d:\\autobusi.dat");
    int i = 0;
    for (i = 0; i < SIZE; ++i)
    {
        MARSH buf;
        cout << "NUMBER: ";
        cin >> buf.NUMER;
        cout << "BEGST: ";
        cin >> buf.BEGST;
        cout << "TERM: ";
        cin >> buf.TERM;
        file_out.write((char*)&buf, sizeof(MARSH));
    }
    file_out.close();
    cin.ignore();
    MARSH TRAFFIC[SIZE];
    char path[STRINGSIZE];
    cout << "Enter path to file: ";
    cin.getline( path, STRINGSIZE );
    ifstream file( path );
    if ( !file )
    {
        cout << "Could not open file";
        cin.get();
    return -1;
    }
    for (i = 0; !file.eof() && i < SIZE; ++i) file.read( (char*)(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    cout << "Enter BEGST: ";
    cin.getline(BEGST, STRINGSIZE);
    cout << "Enter TERM: ";
    cin.getline(TERM, STRINGSIZE);
    int are_found = 0;
    for (i = 0; i < SIZE; ++i)
    {
        if (TRAFFIC[i].BEGST == BEGST && TRAFFIC[i].TERM == TERM)
        {
            cout << i + 1 << " the number of route: " << TRAFFIC[i].NUMER << endl;
            are_found = 1;
        }
    }
    if (!are_found) cout << "There are no such routes\n";
    cout << "All routes:\n";
    for (i = 0; i < SIZE; ++i)
    {
        cout << "BEGST: " << TRAFFIC[i].BEGST << endl;
        cout << "TERM: " << TRAFFIC[i].TERM << endl;
        cout << "NUMBER: " << TRAFFIC[i].NUMER << endl;
    }
    cin.get();
    return 0;
}

Автор: Goth 26.5.2007, 11:54
Ну чтож, могу отчитаться. Немного поразмыслив над всеми представленными кодами, я добавил кое-что в последний код тов. Xenon (а именно сделал поиск номера маршрута по начальному или конечному пути, т.к. предоставленный код отказывался всё это осуществлять), и в результате получилось нечто следующее:
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <stdio.h>

const int SIZE = 10;
const int STRINGSIZE = 20;

struct MARSH
{
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    int NUMER;
    MARSH()
    {
        strcpy( BEGST, "N/A" );
        strcpy( TERM, "N/A" );
        NUMER = 0;
    }
};
void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
        arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}
int main()
{
    ofstream file_out("d:\\autobusi.dat");
    int i, BEGIN(1), TERMIN(1);
    for (i = 0; i < SIZE; ++i)
    {
        MARSH buf;
        cout << "\n NUMBER: ";
        cin >> buf.NUMER;
        cout << "BEGST: ";
        cin >> buf.BEGST;
        cout << "TERM: ";
        cin >> buf.TERM;
        file_out.write((char*)&buf, sizeof(MARSH));
    }
    file_out.close();
    cin.ignore();
    MARSH TRAFFIC[SIZE];
    char path[STRINGSIZE];
    cout << "\n Enter path to file: ";
    cin.getline( path, STRINGSIZE );
    ifstream file( path );
    if ( !file )
    {
        cout << "\n Could not open file";
        cin.get();
    }
    for (i = 0; !file.eof() && i < SIZE; ++i)
    file.read( (char*)(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    cout << "\nEnter BEGST: ";
    cin.getline(BEGST, STRINGSIZE);
    cout << "Enter TERM: ";
    cin.getline(TERM, STRINGSIZE);
    for (i=0; i<SIZE; ++i)
    {
        BEGIN=strcmpi(BEGST, TRAFFIC[i].BEGST);
        TERMIN=strcmpi(TERM, TRAFFIC[i].TERM);
        if (BEGIN==0 )
        {
            cout << "\nThe number of route with beginning in " << BEGST << " is " << TRAFFIC[i].NUMER << endl;
        }
        if(TERMIN==0)
        {
            cout << "The number of route with termination in " << TERM << " is " << TRAFFIC[i].NUMER << endl;
        }
    }
    cout << "\nThere are no more such routes";
    for (i = 0; i < SIZE; ++i)
    {
        cout << "\n NUMBER: " << TRAFFIC[i].NUMER << endl;
        cout << "BEGST: " << TRAFFIC[i].BEGST << endl;
        cout << "TERM: " << TRAFFIC[i].TERM << endl;
    }
    cin.get();
    return 0;
}



В связи с этим выражаю благодарность следующим личностям: Xenon, zkv.  =)))

Автор: Xenon 26.5.2007, 13:33
Goth, 
Код

#include <iostream.h>
#include <string.h>
#include <fstream.h>
using namespace std;

const int SIZE = 2;
const int STRINGSIZE = 20;

struct MARSH
{
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    int NUMER;
    MARSH()
    {
        strcpy( BEGST, "N/A" );
        strcpy( TERM, "N/A" );
        NUMER = 0;    
    }
};
void sort(MARSH arr[SIZE])
{
    for (int j = 1, i = 0; j < SIZE; ++j)
    {
        MARSH buf = arr[j];
        for (i = j - 1; i >= 0 && arr[i].NUMER > buf.NUMER; --i)
            arr[i + 1] = arr[i];
        arr[i + 1] = buf;
    }
}
int main(int argc, char* argv[])
{
    ofstream file_out("d:\\autobusi.dat");
    int i = 0;
    for (i = 0; i < SIZE; ++i)
    {
        MARSH buf;
        cout << "NUMBER: ";
        cin >> buf.NUMER;
        cout << "BEGST: ";
        cin >> buf.BEGST;
        cout << "TERM: ";
        cin >> buf.TERM;
        file_out.write((char*)&buf, sizeof(MARSH));
    }
    file_out.close();
    cin.ignore();
    MARSH TRAFFIC[SIZE];
    char path[STRINGSIZE];
    cout << "Enter path to file: ";
    cin.getline( path, STRINGSIZE );
    ifstream file( path );
    if ( !file )
    {
        cout << "Could not open file";
        cin.get();
    return -1;
    }
    for (i = 0; !file.eof() && i < SIZE; ++i) file.read( (char*)(&TRAFFIC[i]), sizeof(TRAFFIC));
    sort(TRAFFIC);
    char BEGST[STRINGSIZE];
    char TERM[STRINGSIZE];
    cout << "Enter BEGST: ";
    cin.getline(BEGST, STRINGSIZE);
    cout << "Enter TERM: ";
    cin.getline(TERM, STRINGSIZE);
    int are_found = 0;
    for (int i = 0; i < SIZE; ++i)
    {
        if ( !( strcmp(TRAFFIC[i].BEGST, BEGST) || strcmp(TRAFFIC[i].TERM, TERM) ) )
        {
            cout << i + 1 << " the number of route: " << TRAFFIC[i].NUMER << endl;
            are_found = 1;
        }
    }
    if (!are_found) cout << "There are no such routes\n";
    cout << "All routes:\n";
    for (i = 0; i < SIZE; ++i)
    {
        cout << "BEGST: " << TRAFFIC[i].BEGST << endl;
        cout << "TERM: " << TRAFFIC[i].TERM << endl;
        cout << "NUMBER: " << TRAFFIC[i].NUMER << endl;
    }
    cin.get();
    return 0;
}


Так работает?

Автор: Goth 26.5.2007, 14:58
Это чисто из спортивного интереса?smile К слову, код, приведенный мной, еще меня не разочаровал=)

З.Ы. Xenon, опять хромает поиск номера маршрута по началу и концу пути...

Автор: Xenon 26.5.2007, 22:59
Goth, чего- то у меня даже в голове не укладывается ... вроде же правильно все: если результат первого или второго сравнения равно -1 или 1, то уже автоматом выражение в скобках принимает true, а операцией инверсии '!' получается false. А если и то и другое сравнение вернуло 0, значит и та и другая строка равны, в скобках получится false, а из-за '!' получится true ... Ну правильно кажись все.

Автор: lrad 27.5.2007, 11:02
У меня была похожая задача
1. Структура с именем MARSH содержит следующие поля:
-    название начального пункта маршрута;
-    название конечного пункта маршрута;
-    номер маршрута.
2. Условие поиска – вывод на экран информации о маршруте, номер которого введен с клавиатуры.

вот решение
а под твой вариант переделать элементарно

Код

#include <iostream.h>
#include <stdlib.h>  // exit()
#include <iomanip.h> // setw()
#include <string.h>  // strcmp()
#define NM 20
#define KM 20
#define Num 20

//------------------------------------------------------------------------

struct MARSH
{
char nachalo [NM];
char kon [KM];
char nomer [Num];
};

//-------------------------------------------------------------------------

// прототипы функций
void vvod ();
void prosmotr ();
void tabl();
void poisk () ;
//-------------------------------------------------------------------------

const Kol =10;
MARSH array[Kol]; //массив

//------------------------------------------------------------------------

void main ()
{
  vvod (); // Заполняем данные о маршрутах
  cout << "Информация о всех маршрутах:\n";
  tabl();  // выводим шапку
  prosmotr (); // Выводим все данные на экран
  poisk () ;
  
}


//------------------------------------------------------------------------
// Определение функции ввода данных
void vvod ()  
{  
  cout <<"Ввод информации о 10 маршрутах:\n";
   
    for( int i=0; i<Kol; i++ )
    {
      cout << "Заполните массив [ " << i << " ].\n" ;
      cout << "\nВведите название начального пункта маршрута: " ;
      cin >> array[ i ].nachalo ;
      cout << "\nВведите название конечного пункта маршрута: " ; 
      cin >> array[ i ].kon ;
      cout << "\nВведите номер маршрута: " ; 
      cin >> array[ i ].nomer ;
      cout << "\n\n"; 
   }
} 


//------------------------------------------------------------------------ 

// Определение функции вывода на экран
void prosmotr ()
{ 
  
  for( int i=0; i<Kol; i++ )
  { 
    cout.setf(ios::left); // Выравниваем по левому краю
    cout <<"|"<<setw(22)<<array[ i ].nachalo<<"|"<<setw(22)<<array[i].kon<<"|";
    cout.setf(ios::right);// Выравниваем по правому краю
    cout<<setw(22)<<array[i].nomer<<"|\n";
    cout << "|--------------------------------------------------------------------|\n";   
  }
   
}

  
 //------------------------------------------------------------------------
// определение функции вывода на экран шапки таблицы
void tabl()
{
  cout <<"|--------------------------------------------------------------------|\n";
  cout <<"|  Начало маршрута     |   Конец маршрута     |    Номер маршрута    |\n";
  cout <<"|----------------------|----------------------|----------------------|\n";
} 


//--------------------------------------------------------------------------
// Определение функции поиска
void poisk ()
{
  char nomer[Num];
  
  cout << "\nВведите номер маршрута: " ;
  cin >> nomer ;
  cout<<"\nВывод информации об искомом маршруте: \n";
  
     for( int i=0; i<Kol; i++ )
     {
       if (strcmp(array[i].nomer , nomer) == 0)
       {
         tabl();  // вывод на экран шапки таблицы 
     cout.setf(ios::left); // Выравниваем по левому краю
         cout <<"|"<<setw(22)<<array[ i ].nachalo<<"|"<<setw(22)<<array[i].kon<<"|";
         cout.setf(ios::right);// Выравниваем по правому краю
         cout<<setw(22)<<array[i].nomer<<"|\n";   
         cout << "|--------------------------------------------------------------------|\n";  
         cin.sync();
         cin.get();
         exit(0);
       } 
     }
  cout << "Нет такого маршрута!" << endl;
  cin.sync();
  cin.get();
}




 smile 

Автор: Goth 27.5.2007, 12:38
Xenon, насколько я понял, сравнить начало и конец пути можно только с помощью strcmpi, точную формулировку не помню, но вроде как в таком случае не учитывается "как" мы записывали поля структуры в файл (что-то там с двоичной системой связано). А вот насчет strcmp, которую используешь, не уверен. 

Irad, вся проблема заключалась как раз в записи в файл и считывании с файла полей структуры, а остальное не так уж проблемно=)))

Автор: Xenon 27.5.2007, 15:32
Goth, strcmp(const char* str1, const char* str2) стандартная функция сравнивающая две строки: если она вернет -1, значит st1 меньше st2, если 0, то они равны, если 1, то st1 больше st2.

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