1

Тема: Як налагодити пошук за ключовим словом

Засів за написання курсової, допоможіть будь ласка.
Одне із завдань полягає в тому що б шукати прізвище людини в текстовому файлі.

#include <iostream>
#include <cmath>
#include <fstream> 
#include <stdio.h> 
#include <conio.h> 
 
using namespace std;
int main()
 
{
    setlocale(LC_ALL,"Russian");
    cout << "    *******************************************"<<"\n";
    cout << "    ***** БАЗА ДАННЫХ <<БАНКОВСКОЕ ДЕЛО>> *****"<<"\n";
    cout << "    *******************************************                                                                                                                                                                        "<<"\n";
    cout <<"Выберите один из вариантов:                                                                              "<<"\n";
    cout <<"      1 - Создание/дополнение базы данных"<<"\n";
    cout <<"      2 - Просмотр содержимого базы данных"<<"\n";
    cout <<"      3 - Поиск банков с максимальным годовым процентом"<<"\n";
    cout <<"      4 - Выход с программы"<<"\n";
    {
        int familia;
        int adres;
        int suma;
        ifstream f2("klienti.txt");
            while (! f2.eof())
            {

Зміст текстового файлу:

***** ПРОСМОТР СОДЕРЖИМОГО БАЗЫ ДАННЫХ *****
******************************************************

------------------------------------------------
:Фамилия : Адрес :Сума вложений :
------------------------------------------------
:Иванов С.А. :Львов :15000
:Петров М.П. :Киев :16020
:Гресь К.О. :Сумы :1000
:Сирык Л.М. :Одесса :12333
:Бондаренко Г.О. :Луганск :12520
:Кузьменко И.В. :Полтава :9855
:Васильев Ю.В. :Харьков :12000

2

Re: Як налагодити пошук за ключовим словом

А проблема в чому?

I belong to the Dead Generation.

3

Re: Як налагодити пошук за ключовим словом

Проблема в тому, що я не знаю, як налагодити пошук, тобто вводиш Іванов і тобі видає рядок
-----------------------------------
:Прізвище : Адреса :Сума вкладу :
-----------------------------------
:Іванов     : Львів   : 15000

4

Re: Як налагодити пошук за ключовим словом

Класи чи хоча б структури ви вже проходили?

5

Re: Як налагодити пошук за ключовим словом

У наведеному коді я теж не бачу, як це виглядало б...

Загалом:

1. Цикл меню
2. Має бути пункт "пошук за прізвищем"
3. Вибір цього пункту - сигнал до пошуку у файлі.

I belong to the Dead Generation.

6

Re: Як налагодити пошук за ключовим словом

ні не проходив

7 Востаннє редагувалося koala (14.12.2013 19:12:39)

Re: Як налагодити пошук за ключовим словом

Тоді не буду вам забивати голову за вашого викладача. Ось вам функції:
ifstream::getline(char* s,  long int n, char delim) - читає з файлу рядок, доки не зустріне знак delim, але не більше ніж n символів, наприклад:

char buffer[ 100 ];
f2.getline( buffer, 100, ':' );//прочитати в буфер все до знаку ':'
f2.getline( buffer, 100, '\n' );//прочитати в буфер все до знаку нового рядка

char * strstr ( char * str1, char * str2 ) - знаходить в рядку str1 перше входження str2, якщо не знаходить, повертає 0, наприклад:

if( strstr( buffer, "Іванов" ) ) ) 
  cout << "Знайшли!" << endl;

Користуйтеся на здоров'я.

Подякували: dkii1

8

Re: Як налагодити пошук за ключовим словом

Трохи погуглив, почитав про структури і ось, що вийшло, підкажіть будь ласка, що переробити або виправити.

#include <iostream>
#include <cmath>
#include <fstream> 
#include <stdio.h> 
#include <conio.h> 
#include <string.h>
using namespace std;
struct klienti {
        char lastname[256]; 
        char adres[256];
        int  suma;
    };
int nain()
{
    setlocale(LC_ALL,"Russian");
    cout << "    *******************************************"<<"\n";
    cout << "    ***** БАЗА ДАННЫХ <<БАНКОВСКОЕ ДЕЛО>> *****"<<"\n";
    cout << "    *******************************************                                                                                                                                                                        "<<"\n";
    cout <<"Выберите один из вариантов:                                                                              "<<"\n";
    cout <<"      1 - Создание/дополнение базы данных"<<"\n";
    cout <<"      2 - Просмотр содержимого базы данных"<<"\n";
    cout <<"      3 - Поиск банков с максимальным годовым процентом"<<"\n";
    cout <<"      4 - Выход с программы"<<"\n";
    cout <<"      5 - Поиск по фамилии"<<"\n";
    
    struct klieni lib;
    char a[20];
    int n,count=0;
    cout<<"Сколько нужно занести людей в базу данных?\n";
        cin >>n;
    for(int i = 0; i < n;i++){
    cout<<"Введите фамилию человека\n";
    cin>>lib.lastname;
        cout<<"Введите адрес человека\n";
    cin>>lib.adres;
        cout<<"Введите суму вклада\n";
    cin>>lib.suma;
    }
    cout <<"Введите фамилию человека для поиска\n";
    cin >>a;
    if (strcmp(a, lib.lastname)==0)
    {
        count++;
        cout<<"Фамилия "<<lib.lastname<<"\n";
        cout<<"Адрес "<<lib.adres<<"\n";
        cout<<"Сума "<<lib.suma<<"\n";
    
    }
    else
        cout<<"Пользователя не найденно\n";
    ofstream myfile;
    myfile.open ("struct.txt");
    for( int k = 0; k < count; k++ )
    {
 
        myfile << "Фамилия "<<lib.lastname<<"\n"  << endl;
        myfile << "Адрес "<<lib.adres<<"\n"  << endl;
        myfile << "сума "<<lib.suma<<"\n"  << endl;
 
    }
    myfile.close();
    system("pause");
    return 0;
}

9

Re: Як налагодити пошук за ключовим словом

struct klienti {
//....
struct klieni lib;
//Різницю бачите десь?
int nain()
//По руках пательнею
  for(int i = 0; i < n;i++){
    cout<<"Введите фамилию человека\n";
    cin>>lib.lastname;
        cout<<"Введите адрес человека\n";
    cin>>lib.adres;
        cout<<"Введите суму вклада\n";
    cin>>lib.suma;
    }

Логіка невірна. Кожен екземпляр структури містить окремого клієнта. А тут ви просто перезаписуєте її кілька разів, і наприкінці матимете лише одного.

З.І: перед викладанням коду сюди компілюйте у себе, бо цей код жоден компілятор не пропустить, крім мертвого.

I belong to the Dead Generation.

10

Re: Як налагодити пошук за ключовим словом

Пане, давайте так: це ваш код, а ми вам не няньки. Якщо вас цей код влаштовує - то й добре; якщо чомусь не влаштовує - ставте КОНКРЕТНІ питання. Ідеального коду не існує в принципі, завжди можна знайти що покращити, оптимізувати, скоротити та доповнити.
P.S. Я б цей код не прийняв, бо він не компілюється. Виправте хоча б це.

11

Re: Як налагодити пошук за ключовим словом

Вибравив перший та другий пункти, одна із функцій программи, це те, що вона дописує нового клієнта, якщо це, звичайно потрібно. І я старався якось це реалізувати. Якщо моя логіка не вірна, то розкажіть, як це має виглядати,  бажано з прикладом.

12 Востаннє редагувалося Bartash (15.12.2013 16:52:33)

Re: Як налагодити пошук за ключовим словом

Складається враження, що ви пишете код, не уявляючи навіть, про що саме.
Перше робиться структура програми (хочете - можна й на папері олівцем).
Потім робите загальний інтерфейс (реалізація менюшки, але без реальних дій у тих пунктах меню).
Зрештою, кожен окремий пункт меню реалізовуєте окремо: у класі, функціях, абощо.

А так - код нагадує поле атомної війни та безвихідь.

З.І: і логіку наведеного коду не вкурив поки: яке його місце у загальній програмі? Де функція main()? Хто тут взагалі???

I belong to the Dead Generation.

13

Re: Як налагодити пошук за ключовим словом

Bartash написав:

Складається враження, що ви пишете код, не уявляючи навіть, про що саме.

Можливо й так, я маю досить слабке поняття про структури, дві помилкия виправив

#include <iostream>
#include <cmath>
#include <fstream> 
#include <stdio.h> 
#include <conio.h> 
#include <string.h>
using namespace std;
struct klienti {
        char lastname[256]; 
        char adres[256];
        int  suma;
    };
int main()
{
    setlocale(LC_ALL,"Russian");
    cout << "    *******************************************"<<"\n";
    cout << "    ***** БАЗА ДАННЫХ <<БАНКОВСКОЕ ДЕЛО>> *****"<<"\n";
    cout << "    *******************************************                                                                                                                                                                        "<<"\n";
    cout <<"Выберите один из вариантов:                                                                              "<<"\n";
    cout <<"      1 - Создание/дополнение базы данных"<<"\n";
    cout <<"      2 - Просмотр содержимого базы данных"<<"\n";
    cout <<"      3 - Поиск банков с максимальным годовым процентом"<<"\n";
    cout <<"      4 - Выход с программы"<<"\n";
    cout <<"      5 - Поиск по фамилии"<<"\n";
    
    struct klieni;
    char a[20];
    int n,count=0;
    cout<<"Сколько нужно занести людей в базу данных?\n";
        cin >>n;
    for(int i = 0; i < n;i++){
    cout<<"Введите фамилию человека\n";
    cin>>lib.lastname;
        cout<<"Введите адрес человека\n";
    cin>>lib.adres;
        cout<<"Введите суму вклада\n";
    cin>>lib.suma;
    }
    cout <<"Введите фамилию человека для поиска\n";
    cin >>a;
    if (strcmp(a, lib.lastname)==0)
    {
        count++;
        cout<<"Фамилия "<<lib.lastname<<"\n";
        cout<<"Адрес "<<lib.adres<<"\n";
        cout<<"Сума "<<lib.suma<<"\n";
    
    }
    else
        cout<<"Пользователя не найденно\n";
    ofstream myfile;
    myfile.open ("struct.txt");
    for( int k = 0; k < count; k++ )
    {
 
        myfile << "Фамилия "<<lib.lastname<<"\n"  << endl;
        myfile << "Адрес "<<lib.adres<<"\n"  << endl;
        myfile << "сума "<<lib.suma<<"\n"  << endl;
 
    }
    myfile.close();
    system("pause");
    return 0;
}

14

Re: Як налагодити пошук за ключовим словом

Пане, ваш код банально не компілюється, а ви про це не пишете. Ще раз: ставте КОНКРЕТНІ запитання; якщо код не компілюється і ви не знаєте, чому - наводьте текст помилки і в якому рядку вона сталася. Якщо компілюється, але працює не так, як вам треба - пишіть конкретно, які данні ви вводили, який результат очікували і який отримали. Це потрібно в першу чергу вам самому - 90%, що розібравшись в цих деталях, ви самі зрозумієте, як це виправити, а коли розбираєтеся самі - отримуєте значно більше досвіду, ніж коли отримуєте відповіді.

15

Re: Як налагодити пошук за ключовим словом

Код помилок:
d:\ббб\vc\kurs\kurs\kurs.cpp(33): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(33): error C2228: выражение слева от ".lastname" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(35): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(35): error C2228: выражение слева от ".adres" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(37): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(37): error C2228: выражение слева от ".suma" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(41): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(41): error C2228: выражение слева от ".lastname" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(44): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(44): error C2228: выражение слева от ".lastname" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(45): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(45): error C2228: выражение слева от ".adres" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(46): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(46): error C2228: выражение слева от ".suma" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(56): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(56): error C2228: выражение слева от ".lastname" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(57): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(57): error C2228: выражение слева от ".adres" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>d:\ббб\vc\kurs\kurs\kurs.cpp(58): error C2065: lib: необъявленный идентификатор
1>d:\ббб\vc\kurs\kurs\kurs.cpp(58): error C2228: выражение слева от ".suma" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
Не знаю, що саме не так.

16

Re: Як налагодити пошук за ключовим словом

Переробив, компілятор помилки вже не видає, але коли шукаєш людину, то видає каракулі, замість тексту хоча мова підключена.

#include <iostream>
#include <cmath>
#include <fstream> 
#include <stdio.h> 
#include <conio.h> 
#include <string.h>
using namespace std;
int main()
{
    setlocale(LC_ALL,"Russian");
    cout << "    *******************************************"<<"\n";
    cout << "    ***** БАЗА ДАННЫХ <<БАНКОВСКОЕ ДЕЛО>> *****"<<"\n";
    cout << "    *******************************************                                                                                                                                                                        "<<"\n";
    cout <<"Выберите один из вариантов:                                                                              "<<"\n";
    cout <<"      1 - Создание/дополнение базы данных"<<"\n";
    cout <<"      2 - Просмотр содержимого базы данных"<<"\n";
    cout <<"      3 - Поиск банков с максимальным годовым процентом"<<"\n";
    cout <<"      4 - Выход с программы"<<"\n";
    cout <<"      5 - Поиск по фамилии"<<"\n";
    
    struct klieni;
    char lastname[256];
    char adres[256];
    int  suma;
    char a[20];
    int n,count=0;
    cout<<"Сколько нужно занести людей в базу данных?\n";
        cin >>n;
    for(int i = 0; i < n;i++){
    cout<<"Введите фамилию человека\n";
    cin>>lastname;
        cout<<"Введите адрес человека\n";
    cin>>adres;
        cout<<"Введите суму вклада\n";
    cin>>suma;
    }
    cout <<"Введите фамилию человека для поиска\n";
    cin >>a;
    if (strcmp(a, lastname)==0)
    {
        count++;
        cout<<"Фамилия "<<lastname<<"\n";
        cout<<"Адрес "<<adres<<"\n";
        cout<<"Сума "<<suma<<"\n";
    
    }
    else
        cout<<"Пользователя не найденно\n";
    ofstream myfile;
    myfile.open ("struct.txt");
    for( int k = 0; k < count; k++ )
    {
 
        myfile << "Фамилия "<<lastname<<"\n"  << endl;
        myfile << "Адрес "<<adres<<"\n"  << endl;
        myfile << "сума "<<suma<<"\n"  << endl;
 
    }
    myfile.close();
    system("pause");
    return 0;
}

17

Re: Як налагодити пошук за ключовим словом

Я б вам порадив забити на це і вводити англійською. Здоров'я зекономите :)

18

Re: Як налагодити пошук за ключовим словом

Накидав, користуйтеся і уточнюйте:
http://replace.org.ua/post/19070/

Подякували: dkii1

19

Re: Як налагодити пошук за ключовим словом

Простий пошук по файлу не підійде. Тому що прізвище може буте "Франків". І вам виведе неправильний результат. Для цієї роботи бажано реалізувати масив структур з полями  ФІО, Адрес, і сума. Також реалізувати функцію запису цього масива в файл і завантаження. Якщо стане рук то
можна дописати в структуру поле bool Ditry. яке змінюється та true якщо цей запис помінявся користувачем і відповідно відрізняється від того що в файлі. І при процедурі запису в файл переписувати тільки  рядки які помічені як Dirty а інші не чіпати. Це буде правильний підхід щоб не переписувати весь файл.
Також в структуру можна добавити поле - номер рядка. І тоді можна записувати дані в то місце де потрібно не перечитуючи весь файл- така собі індексація.

Подякували: dkii1