Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Просмотр и сортировка данных из файла

20K
07 февраля 2007 года
Eklmn
19 / / 07.02.2007
Всем привет!
Пишу "навороченный" :) телефонный справочник на с++:
Код:
#include<iostream.h>
#include<fstream.h>
int menu();
baza();
prosmotr();
sortirovka();
udalenie();
int main()
{
    bool exit=false;
    for(;;)
    {
        int choice=menu();
        switch(choice)
        {
            case (1):
                baza();
                break;
            case (2):
                prosmotr();
                break;
            case (3):
                sortirovka();
                break;
            case (4):
                udalenie();
                break;
            case (5):
                exit=true;
                break;
            default:
                cout<<"Please select again!"<<endl;
                break;
        }
        if(exit==true)
            break;
    }
    return 0;
}
int menu()
{
    int choice;
   
    cout<<"Telephone book\n";
    cout<<"    Menu    \n";
    cout<<"(1)New BD\n";
    cout<<"(2)Veiw\n";
    cout<<"(3)Sort\n";
    cout<<"(4)Delete\n";
    cout<<"(5)Exit\n";
    cout<<": ";
    cin>>choice;
    return choice;
}
baza()
{
    char fileName[80];
    char name[255];
    char adres[255];
    int nomer;
    char otvet;
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"Please enter the file name: ";
    cin>>fileName;
    ofstream fout(fileName, ios::app);
    if(!fout)
    {
        cout<<"Unable to open "<<fileName<<" for writing.\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        return(1);
    }
    do
    {
        cout<<"Enter a name: ";
        cin>>name;
        cout<<"Address: ";
        cin>>adres;
        cout<<"Numder of phone: ";
        cin>>nomer;
        cout<<"Continue (y/n)?";
        cin>>otvet;
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        fout<<endl;
        fout<<name<<"        "<<adres<<"      "<<nomer<<endl;
    }
    while(otvet=='Y'||otvet=='y'||otvet=='Д'||otvet=='д');
       fout.close();
       return 0;
}
       
prosmotr()
{
    char fileName[80];
    char name[255];
    char adres[255];
    int nomer[5];
   
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"Please enter the file name: ";
    cin>>fileName;
    ifstream fin(fileName);
    char ch;
    if(!fin)
    {
        cout<<"Unable to open "<<fileName<<" for reading.\n";
        return(1);
    }
    cout<<"Telephone book\n";
    cout<<".__________________________________.\n";
    cout<<"|Name        | Address   |Number   |\n";
    cout<<"|____________|___________|_________|\n";
    while(fin.get(ch))
        cout<<ch;    
    cout<<"|",name,"    |",adres,"  |",nomer,"|\n" ;
    cout<<"|__________________________________|\n";
    cout<<"Press any key for continuation\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    fin.close();
    return 0;
}
sortirovka()
{
    return 0;

}
udalenie()
{
     int result;
     result = remove ("data");
     if (result == -1)
     {
         cout<<"Unable to delete file data.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     else
     {
         cout<<"File data was removed.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     return 0;
}


Не могу понять, как осуществить простую сортировку данных (name, adres, nomer), которые хранятся в файле - базе или поиск. Чего-нибудь одного хватит.

И не получается сделать нормальный (красивый) вывод данных на экран, т.е. чтобы получилось:
 
Код:
.__________________________________.
|Name        | Address   |Number   |
|____________|___________|_________|
|",name,"    |",adres,"  |",nomer,"|
|__________________________________|


Подскажите, пожалуйста, как осуществить задуманное? Или ткните носом в примеры (желательно подробные :)), из которых можно было бы понять суть.
263
07 февраля 2007 года
koltaviy
816 / / 16.12.2004
Ну, во-первых, для таких целей лучше использовать бинарные файлы.
Создаешь структуру:
 
Код:
struct Zapis
{
    char name[255];
    char adres[255];
    int nomer;
};

И работаешь уже с ней.
К примеру считывание из файла и вывод:
 
Код:
ifstream ifile("NoteBook.txt", ios::binary);
Zapis zapis;
cout << ".__________________________________.\n";
while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
    cout << zapis.name << "\t" << zapis.adres << "\t" << zapis.nomer << "\n";
}

Или запись в файл:
 
Код:
...
ofstream ofile("NoteBook.txt", ios::binary);
...
ofile.write((char*)&zapis, sizeof(Zapis));
...

Если надо сортировать, осуществлять поиск - считываешь нужное количество записей в массив структур, и поехали..Методов сортировки куча..
В поисках более подробной информации в поиск:)
Например сюда:
http://www.yandex.ru/yandsearch?rpt=rad&text=ios%3A%3Abinary
9
08 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Я бы использовал ODBC, например Microsoft Text Driver (*.txt, *.cvs). Прелести, понимаешь, SQL. :)
20K
08 февраля 2007 года
Eklmn
19 / / 07.02.2007
koltaviy
Переписал код с использованием структуры:
Код:
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>

struct Zapis
{
    char name[255];
    char adres[255];
    int nomer;
};



baza();
prosmotr();
sortirovka();
udalenie();
int menu();


int main()
{
    bool exit=false;
    for(;;)
    {
        int choice=menu();
        switch(choice)
        {
            case (1):
                baza();
                break;
            case (2):
                prosmotr();
                break;
            case (3):
                sortirovka();
                break;
            case (4):
                udalenie();
                break;
            case (5):
                exit=true;
                break;
            default:
                cout<<"Please select again!"<<endl;
                break;
        }
        if(exit==true)
            break;
    }
    return 0;
}

int menu()
{
    int choice;
   
    cout<<"Telephone book\n";
    cout<<"    Menu    \n";
    cout<<"(1)New BD\n";
    cout<<"(2)Veiw\n";
    cout<<"(3)Sort\n";
    cout<<"(4)Delete\n";
    cout<<"(5)Exit\n";
    cout<<": ";
    cin>>choice;
    return choice;
}


baza()
{
    struct Zapis zapis;
    char otvet;

    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    ofstream ofile("data.txt", ios::binary);
    if(!ofile)
    {
        cout<<"Unable to open data.txt for writing.\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        return(1);
    }
    do
    {
        ofile.write((char*)&zapis, sizeof(Zapis));
        cout<<"Enter a name: ";
        cin>>zapis.name;
        cout<<"Address: ";
        cin>>zapis.adres;
        cout<<"Numder of phone: ";
        cin>>zapis.nomer;
        cout<<"Continue (y/n)?";
        cin>>otvet;
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";        
    }
    while(otvet=='Y'||otvet=='y'||otvet=='&#196;'||otvet=='&#228;');
       ofile.close();
       return 0;
}
       


prosmotr()
{
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    struct Zapis zapis;
    ifstream ifile("data.txt", ios::binary);
    {
        cout<<"Unable to open data.txt for reading.\n";
        return(1);
    }
    cout << ".__________________________________.\n";
    cout<<"Telephone book\n";
    cout<<".__________________________________.\n";
    cout<<"|Name        | Address   |Number   |\n";
    cout<<"|____________|___________|_________|\n";
    while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
    {
    cout<<"|%-12s|%-11|%-9|\n", zapis.name, zapis.adres, zapis.nomer;
    }
    cout<<"|__________________________________|\n";
    cout<<"Press any key for continuation\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    ifile.close();
    return 0;
}


sortirovka()
{
    return 0;
}


udalenie()
{
    int result;


    ofstream ofile("data.txt", ios::binary);
    if(!ofile)
    {
        cout<<"Unable to open data.txt for writing.\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        return(1);
    }
     result = remove ("data.txt");
     if (result == -1)
     {
         cout<<"Unable to delete file data.txt.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     else
     {
         cout<<"File data.txt was removed.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     return 0;
}

Теперь файл-база - data.txt ни записывается, ни открывается, ни читается. Что-то я напутал.. :-(

Жирным выделил изменённые части кода.

Lerkin
В том-то всё и дело, что надо без использования БД.
Тем более это курсовой проект, первый курс... Какие БД? :-)
263
08 февраля 2007 года
koltaviy
816 / / 16.12.2004
Ну вот по крайней мере:
Код:
do
    {
        ofile.write((char*)&zapis, sizeof(Zapis));
        cout<<"Enter a name: ";
        cin>>zapis.name;
        cout<<"Address: ";
        cin>>zapis.adres;
        cout<<"Numder of phone: ";
        cin>>zapis.nomer;
        cout<<"Continue (y/n)?";
        cin>>otvet;
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";        
    }
    while(otvet=='Y'||otvet=='y'||otvet=='&#196;'||otvet=='&#228;');

Нужно же сначала заполнить поля структуры, а только потом записывать!!

Что такое:
 
Код:
struct Zapis zapis;

Может я чо-то путаю, конечно, но нужно просто:
 
Код:
Zapis zapis;

Какое-то у тя странное удаление происходит!! Зачем весь файл-то сносить - удалять-то ты должен только записи, а твоя импровизированная БД должна оставаться целой и невредимой!!

В твоем случае, имхо, лучше использовать произвольный доступ к файлу.
Объявляешь глобальную переменную типа:
 
Код:
fstream file_book;

В main'e до for открываешь файл:
 
Код:
file_book.open("Note.txt", ios::binary | ios::in | ios::out);

А после for закрываешь:
 
Код:
file_book.close();

И что значит 'файл не открывается'? В чем это проявляется по твоему?
Используй отладчик и посмотри, что он у тя делает!!
9.5K
08 февраля 2007 года
ROLpogo
80 / / 22.08.2006
Сортировка нужна:
1. Только для просмотра базы в текущем сеансе работы программы?
2. Нужно перезаписать отсортированную базу обратно в файл?
3
08 февраля 2007 года
Green
4.8K / / 20.01.2000
Если уж ты пишешь на C++, применяй C++.
В C++ в объявлении функции ВСЕГДА указывается возвращаемый тип.
Программировать станет значительно проще, если ты начнешь использовать ООП. Логично будет определить класс для базы данных и для запсиси в этой базе данных (начало у тебя уже положено - структура Zapis).
Имена методам лучше давать начинающиеся с глагола.

Чем проще формат базы данных тем лучше, поэтому нет смысла создавать бинарный файл, как советовали выше. Пусть это будет обычный текстовый файл: каждая запись в базе - это новая строка, а поля разделены знаком табуляции. Такой файл ты сможешь открыть хоть в блокноте, хоть в Exel и отредактированть/проверить правильность.
Использование в С++ массивов фиксированной длины в большинстве случаев неактуально. Поэтому вместо char name[255] и т.п. используй string.

Эта строка вообще не понятна:
cout<<"|%-12s|%-11|%-9|\n", zapis.name, zapis.adres, zapis.nomer;
Для форматирования вывода в поток существуют манипуляторы (setw, setfill, hex и т.п.)

Разноси функциональность связанную с операциями с данными (сортировка, удаление, добавление) и операции связанные с выводом на экран.
Например функция baza, которую пиравильнее назвать fillDataBase (начинается с глагола) могла бы выглядеть так:
Код:
struct Record
{
    string name;
    string adres;
    string nomer;
};

Record requestRecord()
{
   Record record;

    cout << "Enter a name: ";
    cin >> record.name;
    cout << "Address: ";
    cin >> record.adres;
    cout << "Numder of phone: ";
    cin >> record.nomer;

    return record;
}

bool fillDataBase()
{
    DataBase db;

    db.create("data.txt");
    if( !db ) {
        cerr << "Unable to open data.txt for writing.\n";
        return false;
    }

    do
    {
        db.add( requestRecord() );
        cout << "Continue (y/n)?";
    cin >> otvet;
    }
    while(otvet=='Y'||otvet=='y'||otvet=='&#196;'||otvet=='&#228;');

    db.close();
    return true;
}

Здесь DataBase - это класс, который тебе надо реализовать.

Данные БД можно хранить в контейнере (std::vector, std::list и т.п.). Для сортировки по конкретному из полей тебе надо будет написать предикат и использовать функцию std::sort для контейнера.
20K
08 февраля 2007 года
Eklmn
19 / / 07.02.2007
Цитата:
Нужно же сначала заполнить поля структуры, а только потом записывать!!


=) Незнакомый оператор.
Исправил, struct тоже убрал. Исправил, теперь файл читается, открывается. И каким-то непонятным образом удаляет содержание файла data.txt, а не сам файл.

Цитата:
В твоем случае, имхо, лучше использовать произвольный доступ к файлу.


Что это даёт? Может, без него как-нибудь?

Цитата:
Какое-то у тя странное удаление происходит!! Зачем весь файл-то сносить - удалять-то ты должен только записи, а твоя импровизированная БД должна оставаться целой и невредимой!!


:) Удаление осуществлено в силу своих знаний.

Цитата:
Используй отладчик и посмотри, что он у тя делает!!


Не могу, т.к. не умею, а нормальной литературы по отладчику не нашел. :-(

Цитата:
Сортировка нужна:
1. Только для просмотра базы в текущем сеансе работы программы?
2. Нужно перезаписать отсортированную базу обратно в файл?


1. Да.
2. Нет. Всего лишь вывести на экран.


Цитата:
В C++ в объявлении функции ВСЕГДА указывается возвращаемый тип.


О. Спасибо, нам говорили, что функция просто должна возвращать значение.

Цитата:
Программировать станет значительно проще, если ты начнешь использовать ООП.


Начну конечно, только за "21 день" трудно многое усвоить.

Цитата:
вместо char name[255] и т.п. используй string.


Эх. Если б знал, как.


Цитата:
Для форматирования вывода в поток существуют манипуляторы (setw, setfill, hex и т.п.)


Вроде бы то, что нужно.


Цитата:
Здесь DataBase - это класс, который тебе надо реализовать.

Данные БД можно хранить в контейнере (std::vector, std::list и т.п.). Для сортировки по конкретному из полей тебе надо будет написать предикат и использовать функцию std::sort для контейнера.


На данном этапе это для меня трудноосуществимо из-за нехватки времени. Да и не нужно в этой программе всё усложнять. Простой она должна быть.

В общем, задача состоит в том, чтобы с минимальными знаниями написать нечто простое программоподобное.

20K
08 февраля 2007 года
Eklmn
19 / / 07.02.2007
Какая библиотека нужна для string?
9
08 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Eklmn
Какая библиотека нужна для string?


 
Код:
#include <string>
using namespace std; // а можно и using std::string;

или просто
 
Код:
#include <string.h>

хотя первое более корректно
20K
09 февраля 2007 года
Eklmn
19 / / 07.02.2007
Цитата:
#include <string.h>


Пробовал так, всё равно компилятор ругается.

При использовании using namespace std; // а можно и using std::string; компилятор начинает ругаться на ofstream. :-)

Есть продвижение! Получилось красиво (хотя и через ж) выводить данные базы на экран:

Код:
prosmotr()
{
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    Zapis zapis;
    ifstream ifile("data.txt", ios::binary);
    if(!ifile)
    {
        cout<<"Unable to open data.txt for reading.\n";
        return(1);
    }  
    cout.width(48);
    cout.fill('_');
    cout<<"\n";
    cout<<"|";
    cout.width(15);
    cout.fill(' ');
    cout<<"Name";
    cout<<" |";
    cout.width(15);
    cout<<"Address";
    cout<<" |";
    cout.width(10);
    cout<<"Number";
    cout<<" |";
    cout<<"\n";
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";
    while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
    {
        cout<<"|";
        cout.width(15);
        cout.fill(' ');
        cout<<zapis.name;
        cout<<" |";
        cout.width(15);
        cout<<zapis.adres;
        cout<<" |";
        cout.width(10);
        cout<<zapis.nomer;
        cout<<" |";
        cout<<"\n";
       
    }
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";
    cout<<"\n";
    cout<<"Press any key for continuation\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    ifile.close();
    return 0;
}


Конечно, создаётся проблема, если переменные больше пределов указанной ширины width, но будем надеяться.
9.5K
09 февраля 2007 года
ROLpogo
80 / / 22.08.2006
К какому сроку нужна прога?
Готов сделать 2 варианта:

1. "Я его слепила из того, что было" :D
2. "Я тут книжку умную почитал и как то сразу разобрался с классами и списками" :rolleyes:
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: ROLpogo
К какому сроку нужна прога?
Готов сделать 2 варианта:

1. "Я его слепила из того, что было" :D
2. "Я тут книжку умную почитал и как то сразу разобрался с классами и списками" :rolleyes:


Ну зачем медвежьи услуги оказывать? Может быть человек сам разобраться хочет...

320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Lerkin написал же как делать.Перечитай еще раз его пост.

Код:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    string file_name;
    cin>>file_name;
    ofstream of(file_name.c_str());
    return 0;

}

Ни на что не ругается:)
20K
09 февраля 2007 года
Eklmn
19 / / 07.02.2007
ROLpogo
Спасибо за предложение, но тут писать уже нечего, осталась только сортировка или поиск. Что первое в понятном виде найдётся.

Цитата: Lerkin
Ну зачем медвежьи услуги оказывать? Может быть человек сам разобраться хочет...


Хочу. Но тороплюсь. :-)

m_Valery
Теперь ругается только на TCHAR*. Вроде бы пишет, что она не объявлена.

355
09 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
если тебе не нужен юникод, можешь спокойно заменять _TCHAR на char, а _tmain на main
20K
09 февраля 2007 года
Eklmn
19 / / 07.02.2007
<SCORP>
Да нет. Он здесь вообще не используется, просто в общеобразовательных целях. В общем понятно, tmain - название функции, а TCHAR - тип переменной.


Интересует, можно ли реализовать поиск таким образом.
Открываем файл базы для чтения, читаем из него переменные, оператором if сравниваем искомое слово с переменной, например, zapis.name и затем выводим результат на экран?
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Да,как сказал SCORP -напиши просто int main() без TCHAR.А файл то у тебя записывается?
Попробуй как - нибудь так для записи .
 
Код:
....    ofstream ofile("data.txt");
    if(!ofile)
    {
        cerr<<"Unable to open data.txt for writing.\n";
        cout<<"\n\n\n";
    }
    string word;
    while(cin >> word&&word != "0"){
       ofile << word << ' ';
    }...

Так записывает строки пока не введешь 0.
А потом для чтения так(когда выбираеш 2 пункт меню)
Код:
...ifstream ifile("data.txt);
    if(!ifile){
        cerr<<"Unable to open data.txt for reading.\n";
    }
    cout << ".__________________________________.\n";
    cout<<"Telephone book\n";
    cout<<".__________________________________.\n";
    cout<<"|Name        | Address   |Number   |\n";
    cout<<"|____________|___________|_________|\n";
    string text;
    while(getline(ifile,text,' ')){
     cout<<text<<' ';
    }
    cout<<endl;...

Я вот попробовал - нормально работает.Подправь только чтоб не просто строки вводить/выводить а поля структуры и отформатируй правильно,
пробелы , табуляция и т.д.Все остальное вроде работает.Типы возвращаемго значения для ф-ий указывай,а бинарные файлы не нужны , обычные текстовые(как тебе уже говорил выше Green)
9.5K
09 февраля 2007 года
ROLpogo
80 / / 22.08.2006
Цитата: Lerkin
Ну зачем медвежьи услуги оказывать? Может быть человек сам разобраться хочет...



Судя по тому коду, что в первом посте, намёками и обрывками кода студенту сложно помочь за такое короткое время. Здесь эффективнее будет показать полный код с использованием тех функций, которые обычно успевают осилить на первом курсе и сдобрить всё это хозяйство комментариями.
А если человек захочет дальше вникать, то можно дать ещё и более продвинутый вариант :)

9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Тогда надо постить в раздел "Студентам". Именно там решаются такие вопросы.
20K
09 февраля 2007 года
Eklmn
19 / / 07.02.2007
m_Valery
C этим уже справился, правда по другому:
Код:
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#include<string.h>

struct Zapis
{
    char name[255];
    char adres[255];
    int nomer;
};



baza();
prosmotr();
sortirovka();
udalenie();
int menu();


int main()
{
    bool exit=false;
    for(;;)
    {
        int choice=menu();
        switch(choice)
        {
            case (1):
                baza();
                break;
            case (2):
                prosmotr();
                break;
            case (3):
                sortirovka();
                break;
            case (4):
                udalenie();
                break;
            case (5):
                exit=true;
                break;
            default:
                cout<<"Please select again!"<<endl;
                break;
        }
        if(exit==true)
            break;
    }
    return 0;
}

int menu()
{
    int choice;
   
    cout<<"<< Telephone book >>\n";
    cout<<"\n";
    cout<<"    Menu    \n";
    cout<<"(1)New BD\n";
    cout<<"(2)Veiw\n";
    cout<<"(3)Sort\n";
    cout<<"(4)Delete\n";
    cout<<"(5)Exit\n";
    cout<<": ";
    cin>>choice;
    return choice;
}


baza()
{
    Zapis zapis;
    char otvet;

    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    ofstream ofile("data.txt", ios::binary, ios::app);
    if(!ofile)
    {
        cout<<"Unable to open data.txt for writing.\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        return(1);
    }
    do
    {
        cout<<"<< Telephone book >>\n";
        cout<<"\n";
        cout<<"Entering data\n";
        cout<<"\n";
        cout<<"Enter a name: ";
        cin>>zapis.name;
        cout<<"Address: ";
        cin>>zapis.adres;
        cout<<"Numder of phone: ";
        cin>>zapis.nomer;
        ofile.write((char*)&zapis, sizeof(Zapis));
        cout<<"\n";
        cout<<"Continue (y/n)?";
        cin>>otvet;
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";        
    }
    while(otvet=='Y'||otvet=='y'||otvet=='&#196;'||otvet=='&#228;');
       ofile.close();
       return 0;
}
       


prosmotr()
{
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    Zapis zapis;
    ifstream ifile("data.txt", ios::binary);
    if(!ifile)
    {
        cout<<"Unable to open data.txt for reading.\n";
        return(1);
    }
    cout<<"<< Telephone book >>\n";
    cout<<"\n";
    cout.width(48);
    cout.fill('_');
    cout<<"\n";
    cout<<"|";
    cout.width(15);
    cout.fill(' ');
    cout<<"Name";
    cout<<" |";
    cout.width(15);
    cout<<"Address";
    cout<<" |";
    cout.width(10);
    cout<<"Number";
    cout<<" |";
    cout<<"\n";
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";
    while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
    {
        cout<<"|";
        cout.width(15);
        cout.fill(' ');
        cout<<zapis.name;
        cout<<" |";
        cout.width(15);
        cout<<zapis.adres;
        cout<<" |";
        cout.width(10);
        cout<<zapis.nomer;
        cout<<" |";
        cout<<"\n";
       
    }
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";
    cout<<"\n";
    cout<<"Press any key for continuation\n";
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    ifile.close();
    return 0;
}


sortirovka()
{
    return 0;
}


udalenie()
{
    int result;

    result = remove ("data.txt");
     if (result == -1)
     {
         cout<<"Unable to delete data.txt.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     else
     {
         cout<<"File data.txt was removed.\n";
         cout<<"\n";
         cout<<"\n";
         cout<<"\n";
     }
     return 0;
}


Сейчас пытаюсь сделать сортировку или поиск... Можно ли реализовать поиск с помощью функции stricmp?

Цитата: ROLpogo
Судя по тому коду, что в первом посте, намёками и обрывками кода студенту сложно помочь за такое короткое время. Здесь эффективнее будет показать полный код с использованием тех функций, которые обычно успевают осилить на первом курсе и сдобрить всё это хозяйство комментариями.
А если человек захочет дальше вникать, то можно дать ещё и более продвинутый вариант :)


Всё. Сдавать уже затвтра. Приехали. :-)
Можно ли к приведённому выше коду прикрутить поиск? Кстати, что проще поиск или сортировка?

242
09 февраля 2007 года
Оlga
2.2K / / 04.02.2006
по каому полю поиск надо?
вообще все просто, если умеешь.
622
09 февраля 2007 года
nilbog
507 / / 19.12.2006
Цитата: OlgaKr

вообще все просто, если умеешь.


в большинстве случаев(не говорю во всех тк не доказываю) поиск проще
в самом лучшем случае у нас будет количество сравнений при сортировке ~nlogn и при этом я молчу про сложность на перестановки

242
09 февраля 2007 года
Оlga
2.2K / / 04.02.2006
помоему речь идет о том, какую функцию легче написать
20K
09 февраля 2007 года
Eklmn
19 / / 07.02.2007
Цитата: OlgaKr
по каому полю поиск надо?


По любому, главное, чтобы была такая функция реализована.

Цитата: OlgaKr
вообще все просто, если умеешь.


В этом вся проблема. :-)

622
10 февраля 2007 года
nilbog
507 / / 19.12.2006
ну сам по себе алгоритм поиска прост
если данные в структуре никак не упорядочены то неминуемо в худшем случае придется сравнивать искомую величину со всеми
если вас не волнует скорость то никаких проблем нет
и как правило чем быстрее поиск тем дольше(сложнее) вставка новых элементов
20K
10 февраля 2007 года
Eklmn
19 / / 07.02.2007
Цитата: nilbog
ну сам по себе алгоритм поиска прост
если данные в структуре никак не упорядочены то неминуемо в худшем случае придется сравнивать искомую величину со всеми


Есть пример? Какие функции для этого используются?

Цитата: nilbog
если вас не волнует скорость то никаких проблем нет


Скорость не важна.


Интересно, это счиатется сортировкой:

Код:
sortirovka()
{
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    Zapis zapis;
    int ch[20];
    int k,i,razm,pr,min,m;
    ifstream ifile("data.txt", ios::binary);
    if(!ifile)
    {
        cout<<"Unable to open data.txt for reading.\n";
        return(1);
    }
    for(k=0, i=0;k<20;k++)
        if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
        {
            ch[k]=zapis.nomer;
            razm=k+1;
        }
        else
            break;

        for(i=0;i<razm;i++)
        {
            min=ch;
            pr=i;

            for(m=i+1;m<razm;m++)
                if(ch[m]<min)
                {
                    min=ch[m];
                    pr=m;
                }
                ch[pr]=ch;
                ch=min;
        }
        cout<<"<< Telephone book >>\n";
    cout<<"\n";
    cout.width(48);
    cout.fill('_');
    cout<<"\n";
    cout<<"|";
    cout.width(15);
    cout.fill(' ');
    cout<<"Name";
    cout<<" |";
    cout.width(15);
    cout<<"Address";
    cout<<" |";
    cout.width(10);
    cout<<"Number";
    cout<<" |";
    cout<<"\n";
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";

    for(i=0;i<razm;i++)
    {
        if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
            break;
        if(ch==zapis.nomer)
        {
        cout<<"|";
        cout.width(15);
        cout.fill(' ');
        cout<<zapis.name;
        cout<<" |";
        cout.width(15);
        cout<<zapis.adres;
        cout<<" |";
        cout.width(10);
        cout<<zapis.nomer;
        cout<<" |";
        cout<<"\n";
        }

        cout<<"|";
        cout.width(46);
        cout.fill('_');
        cout<<"|";
        cout<<"\n";
        cout<<"\n";
        cout<<"Press any key for continuation\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        ifile.close();
    }
    return 0;
}
?
Хотя что-то с циклом не так: низ импровизированной таблицы (выделено жирным) печатается два раза.
20K
10 февраля 2007 года
Eklmn
19 / / 07.02.2007
Поменял несколько строк местами, теперь нормально выводится, только почему-то выводит только одну запись (по-моему последнюю запись в файле):
Код:
sortirovka()
{
    cout<<"\n";
    cout<<"\n";
    cout<<"\n";
    Zapis zapis;
    int ch[20];
    int k,i,razm,pr,min,m;
    ifstream ifile("data.txt", ios::binary);
    if(!ifile)
    {
        cout<<"Unable to open data.txt for reading.\n";
        return(1);
    }
    for(k=0, i=0;k<20;k++)
        if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
        {
            ch[k]=zapis.nomer;
            razm=k+1;
        }
        else
            break;

        for(i=0;i<razm;i++)
        {
            min=ch;
            pr=i;

            for(m=i+1;m<razm;m++)
                if(ch[m]<min)
                {
                    min=ch[m];
                    pr=m;
                }
                ch[pr]=ch;
                ch=min;
        }
        cout<<"<< Telephone book >>\n";
    cout<<"\n";
    cout.width(48);
    cout.fill('_');
    cout<<"\n";
    cout<<"|";
    cout.width(15);
    cout.fill(' ');
    cout<<"Name";
    cout<<" |";
    cout.width(15);
    cout<<"Address";
    cout<<" |";
    cout.width(10);
    cout<<"Number";
    cout<<" |";
    cout<<"\n";
    cout<<"|";
    cout.width(46);
    cout.fill('_');
    cout<<"|";
    cout<<"\n";

    for(i=0;i<razm;i++)
    {
        if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
            break;
        if(ch==zapis.nomer)
        {
        cout<<"|";
        cout.width(15);
        cout.fill(' ');
        cout<<zapis.name;
        cout<<" |";
        cout.width(15);
        cout<<zapis.adres;
        cout<<" |";
        cout.width(10);
        cout<<zapis.nomer;
        cout<<" |";
        cout<<"\n";
        cout<<"|";
        cout.width(46);
        cout.fill('_');
        cout<<"|";
        cout<<"\n";
        cout<<"\n";
        cout<<"Press any key for continuation\n";
        cout<<"\n";
        cout<<"\n";
        cout<<"\n";
        }

        ifile.close();
    }
    return 0;
}

Отчего это может происходить?
9.5K
10 февраля 2007 года
ROLpogo
80 / / 22.08.2006
Успел только продвинутый вариант набросать.
А для того примера, что есть, на данный момент, у автора темы, для сортировки понадобится создать динамический массив или список структур, отсортировать его и потом, либо заново переписать в файл, либо менять функцию вывода, чтобы она получала в качестве аргумента массив или список структур, а не запрашивала бы имя файла базы данных.
3
10 февраля 2007 года
Green
4.8K / / 20.01.2000
М-да... жуть...
Ты специально пишешь такой запутанный код и не используешь С++?
А сортировка то... пузырек рулит? :)

Почему бы не использовать стандартные контейнеры, методы сортировки, строковые классы? Почему бы не отвязать бизнес-логику от вывода на экран? Почему бы не разбить длинные методы на более короткие логически законченные функции?
20K
10 февраля 2007 года
Eklmn
19 / / 07.02.2007
Подскажите, где скачать библиотеку dir.h?
622
10 февраля 2007 года
nilbog
507 / / 19.12.2006
Цитата: Green
пузырек рулит? :)


ну тут он написал то что аффтар просил )
не важна скорость
или нужно было например естественным слиянием делать ) яро заявив что нас не волнует память но скорость прежде всего

63
10 февраля 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Eklmn
Подскажите, где скачать библиотеку dir.h?


Так библиотеку или хидер? Или и то, и то?

20K
10 февраля 2007 года
Eklmn
19 / / 07.02.2007
Цитата: Zorkus
Так библиотеку или хидер? Или и то, и то?


Что за "хидер"? 0_о
Библиотеки определённо нужна, так как её нет.

И ёщё нужна stdafx.h.

9.5K
11 февраля 2007 года
ROLpogo
80 / / 22.08.2006
Цитата: Eklmn
Подскажите, где скачать библиотеку dir.h?



#include <dir.h> можно убрать, просто вместо MAXPATH нужно прописать, к примеру, 1024

9
11 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Eklmn
Что за "хидер"? 0_о
Библиотеки определённо нужна, так как её нет.

И ёщё нужна stdafx.h.


Ёлы-палы! :mad:
dir.h - заголовочный (header) файл, а не библиотека. Слово header - читается как "хидер".
stdafx.h - хидер, используемый при прекопиляции в среде MS Visual C++. Для МАЛЕНЬКИХ проектов - нафиг не нужен (изменяется в настройках)!

3
11 февраля 2007 года
Green
4.8K / / 20.01.2000
Цитата: nilbog
ну тут он написал то что аффтар просил )
не важна скорость
или нужно было например естественным слиянием делать ) яро заявив что нас не волнует память но скорость прежде всего


Ну так а почему бы не использовать стандартную?
Не пришлось бы велосипедов городить.

9.5K
12 февраля 2007 года
ROLpogo
80 / / 22.08.2006
Цитата: Green
М-да... жуть...
Ты специально пишешь такой запутанный код и не используешь С++?
А сортировка то... пузырек рулит? :)

Почему бы не использовать стандартные контейнеры, методы сортировки, строковые классы? Почему бы не отвязать бизнес-логику от вывода на экран? Почему бы не разбить длинные методы на более короткие логически законченные функции?



Пузырёк прикрутил на скорую руку, да и с ним автору темы проще было бы разобраться :)
ИМХО в теме для студентов контейнеры не уместны.
Отвязать бизнес-логику от вывода на экран не успел. Думал, посижу на выходных спокойно, "а тут бац, и вторая смена" (с) :D
Особо длинных методов вроде бы и не было :rolleyes:

242
12 февраля 2007 года
Оlga
2.2K / / 04.02.2006
темка переходит во флуд. закрываю.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог