Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] помогите решить задачу! (http://forum.oszone.net/showthread.php?t=227668)

virus8 12-02-2012 17:31 1857082

помогите решить задачу!
 
народ помогите разобраться - программка типа телефонный справочник.
Каким образом мне обеспечить ввод адреса ( типа такого - ул. чайковского 10) - чтоб программка не перескакивала через один ввод.
А то что то ввод в массив структуры не даётся)))))

вот код: (в коде строку пометил которая не дает ввести)
Код:

#include <iostream>
#include <cstring>
using namespace std;

void main()
{
        setlocale(LC_ALL, "Russian");
        struct {
                char firstname[15],
                        lastname[20];
                char address[40];
                int phone;
        } kniga[50];

        cout << "\t\tТелефонный справочник\n";

        int k_abon;
        cout << "Введите количество абонентов: ";
        cin >> k_abon;
        cout << endl;

        for(int i = 0; i < k_abon; i++)
        {
                cout << "Введите имя:\t";
                cin >> kniga[i].firstname;
                cout << "Введите фамилию:";
                cin >> kniga[i].lastname;
                cout << "Введите адрес:";
                cin.getline(kniga[i].address, 40);  // ПОМОЧЬ НАДО С ЭТИМ ОТРЕЗКОМ КОДА пробовал через cin тоже самое
                cout << "Введите телефон:";
                cin >> kniga[i].phone;
                cout << endl;
        }
}


virus8 14-02-2012 14:00 1858514

Подправил пустую тему

ferget 14-02-2012 20:20 1858825

можно так

Код:

for(int i = 0; i < k_abon; i++)
{
    cout << "Введите имя:\t";
    cin >> kniga[i].firstname;
    cout << "Введите фамилию: ";
    cin >> kniga[i].lastname;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Введите адрес: ";
    cin.getline(kniga[i].address, 40);
    cout << "Введите телефон:";
    cin >> kniga[i].phone;
    cout << endl;
}


virus8 14-02-2012 21:03 1858877

О, спасибо!
А можно поподробнее где про это можно почитать, а то я в описание про cin не нашел!
Цитата:

cin.ignore(numeric_limits<streamsize>::max(), '\n');
о

ferget 14-02-2012 21:19 1858892

Цитата:

Цитата virus8
где про это можно почитать »

тоже хочу найти какую-нибудь литературу, где подробно описано

а пока вот например http://www.cplusplus.com/reference/i...stream/ignore/

virus8 14-02-2012 21:57 1858927

Спасибо большое!
Вот только не посчитай меня занудливым можешь еще подсказать одну вещь - как функции передать массив структур???

void search(struct kniga[50], int) - потом не считает её структурой.
Пробовал void search(struct kniga *N_kniga[]) - тоже не катит.
Если че сильно не смейтесь)))

ferget 15-02-2012 04:55 1859077

примерно так

Код:

#include <iostream>
#include <cstring>
using namespace std;

typedef struct {
char firstname[15], lastname[20];
char address[40];
int phone;
} kniga[50];

void search(kniga *ptr, int i)
{
        *ptr[i]->firstname;
        *ptr[i]->lastname;
        *ptr[i]->address;
        ptr[i]->phone;
}

void main()
{
setlocale(LC_ALL, "Russian");

cout << "\t\tТелефонный справочник\n";
kniga kn;

int k_abon;
cout << "Введите количество абонентов: ";
cin >> k_abon;
cout << endl;

for(int i = 0; i < k_abon; i++)
{
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Введите имя:\t";
cin >> kn[i].firstname;
cout << "Введите фамилию: ";
cin >> kn[i].lastname;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Введите адрес: ";
cin.getline(kn[i].address, 40);
cout << "Введите телефон:";
cin >> kn[i].phone;
cout << endl;
}
search(&kn, 0);
}


virus8 15-02-2012 11:43 1859238

Вот навоял такое)))
Только, что то не пойму - абонентов не выводит, поиск происходит только по первому абоненту.

Только прошу не решайте, а если есть возможность просто на ошибки укажите(просто хочу сам разобраться, а чет туплю не по детски).
Сразу грешил на кодировку, а потом понял, что не в ней дело. Походу как то не корректно сохраняет инфу в массив
читать дальше »
Код:

#include <iostream>
#include <cstring>

using namespace std;

typedef struct {
                char firstname[15],
                        lastname[20];
                char address[40];
                int phone;
        }kniga[50];

void menu();
void search(kniga *ptr);
void vivod(kniga *ptr, int i);

int main()
{
       
        kniga kn;

        cout << "\t\tTelefonniy spravochnik\n";
        int k_abon;
        cout << "Vvedite kol-vo abonentov: ";
        cin >> k_abon;
        cout << endl;

        for(int i = 0; i < k_abon; i++)
{
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Vvedite imya:\t";
    cin >> kn[i].firstname;
    cout << "Vvedite familiyu: ";
    cin >> kn[i].lastname;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Vvedite address: ";
    cin.getline(kn[i].address, 40);
    cout << "Vvedite telefon:";
    cin >> kn[i].phone;
    cout << endl;
}

        for(int i = 0; i < k_abon; i++) // вывод введенного
        {
                cout << kn[i].firstname << " " << kn[i].lastname << " " << kn[i].address << " " << kn[i].phone << "\n";
        }

        int Menu;
        do
        {
                menu();
            cin >> Menu;
                switch(Menu)
                {
       
                case 1: // поиск по фамилии
                        search(&kn);
                        break;

                case 2: // вывод всех абонентов по первой букве алфавита
                        char Flastname;
                        cout << "Vvedite pervuyu bukvu";
                        cin >> Flastname;
                        for(int i = 0; i < k_abon; i++)
                        {
                                if(kn[i].lastname[0] == Flastname)
                                        cout << kn[i].firstname << " "
                                        << kn[i].lastname << " "
                                        << kn[i].phone << " "
                                        << kn[i].address << "\n";
                        }
                        break;

                case 3:  // вывод всех абонентов
                        vivod(&kn, k_abon);
                        break;
                }
        } while(Menu > 1 || Menu < 3);
        return 0;
}

void menu()
{
        cout << "\t\tMenu\n"
            << "\n1) Poisk telefona po familii"
                << "\n2) Vivod abonentov po pervoy bukve familii"
                << "\n3) Vivod vsex abonentov\n";
}

void vivod(kniga *ptr, int k_abon)
{
        for(int i = 0; i < k_abon; i++)
                        {
                                cout << ptr[i]->firstname << " "
                                        << ptr[i]->lastname << " "
                                        << ptr[i]->address << " "
                                        << ptr[i]->phone << "\n";
                        }
}

void search(kniga *ptr)
{
                char Slastname[20];
                        cout << "Vvedite familiyu";
                cin >> Slastname;
                for(int i = 0; i < 50; i++)
                  {
                                  if(!strcmp(ptr[i]->lastname, Slastname))
                                  {
                                                  cout << "Telefon: " << ptr[i]->phone << endl;
                                          break;
                                  }
                  }
}



вот такой вот вывод получается сразу все хорошо все выводится, а потом какие то маты консоль выдает(русский убрал полностью)


Посидел чу-чуть поразмыслил: переделал все тоже самое только без функций, работает - теперь если у кого то время будет можете глянуть верхний код и сравнить его с переделанным и указать на ошибки.
Вот код:
читать дальше »
Код:

#include <iostream>
#include <cstring>

using namespace std;

typedef struct {
                char firstname[15],
                        lastname[20];
                char address[40];
                int phone;
        }kniga[50];

void menu();

int main()
{
        kniga kn;

        cout << "\t\tTelefonniy spravochnik\n";
        int k_abon;
        cout << "Vvedite kol-vo abonentov: ";
        cin >> k_abon;
        cout << endl;

        for(int i = 0; i < k_abon; i++)
{
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Vvedite imya:\t";
    cin >> kn[i].firstname;
    cout << "Vvedite familiyu: ";
    cin >> kn[i].lastname;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Vvedite address: ";
    cin.getline(kn[i].address, 40);
    cout << "Vvedite telefon:";
    cin >> kn[i].phone;
    cout << endl;
}

        int Menu;
        do
        {
                menu();
            cin >> Menu;
                switch(Menu)
                {
       
                case 1: // поиск по фамилии
                        char Slastname[20];
                        cout << "Vvedite familiyu\t";
                cin >> Slastname;
                for(int i = 0; i < k_abon; i++)
                  {
                                  if(!strcmp(kn[i].lastname, Slastname))
                                  {
                                                  cout << "Telefon: " << kn[i].phone << endl;
                                          break;
                                  }
                  }
                        break;

                case 2: // вывод всех абонентов по первой букве алфавита
                        char Flastname;
                        cout << "Vvedite pervuyu bukvu\t";
                        cin >> Flastname;
                        for(int i = 0; i < k_abon; i++)
                        {
                                if(kn[i].lastname[0] == Flastname)
                                        cout << kn[i].firstname << " "
                                        << kn[i].lastname << " "
                                        << kn[i].phone << " "
                                        << kn[i].address << "\n";
                        }
                        break;

                case 3:  // вывод всех абонентов
                        for(int i = 0; i < k_abon; i++) // вывод введенного
        {
                cout << kn[i].firstname << " " << kn[i].lastname << " " << kn[i].address << " " << kn[i].phone << "\n";
        }
                        break;
                }
        } while(Menu > 1 || Menu < 3);
        return 0;
}

void menu()
{
        cout << "\t\tMenu\n"
            << "\n1) Poisk telefona po familii"
                << "\n2) Vivod abonentov po pervoy bukve familii"
                << "\n3) Vivod vsex abonentov\n";
}





И вообще спасибо за оказанную помощь

ferget 15-02-2012 14:45 1859378

проблема вот в этой конструкции
Код:

#include <iostream>
#include <cstring>

using namespace std;

typedef struct {
char firstname[15],
lastname[20];
char address[40];
int phone;
}kniga[50];

void menu();
void search(kniga *ptr);
void vivod(kniga *ptr, int i);

она сильно усложняет код
если заменить на

Код:

typedef struct {
        char firstname[15],
                lastname[20];
        char address[40];
        int phone;
}KNIGA;

KNIGA kniga[50];

void menu();
void search(KNIGA *ptr);
void vivod(KNIGA *ptr, int i);

то будет намного проще

Код:

int main()
{
        cout << "\t\tTelefonniy spravochnik\n";
        int k_abon;
        cout << "Vvedite kol-vo abonentov: ";
        cin >> k_abon;
        cout << endl;

        for(int i = 0; i < k_abon; i++)
        {
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "Vvedite imya:\t";
                cin >> kniga[i].firstname;
                cout << "Vvedite familiyu: ";
                cin >> kniga[i].lastname;
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
...................................................................................................


virus8 15-02-2012 16:15 1859442

Все разобрался - как раз тему читал про структуры. Сделал для себя великое открытие, что kniga и так является указателем на структуру KNIGA))))))).
ferget спасибо большое за помощь!!!
Если кому нужно вот код:
читать дальше »
Код:

#include <iostream>
#include <cstring>

using namespace std;

typedef struct {
        char firstname[15],
                lastname[20];
        char address[40];
        int phone;
}KNIGA;

KNIGA kniga[50];

inline void menu();
inline void search(KNIGA *ptr, int k_abon);
inline void vivod(KNIGA *ptr, int i);
inline void searchB(KNIGA *ptr, int k_abon);

int main()
{



cout << "\t\tTelefonniy spravochnik\n";
int k_abon;
cout << "Vvedite kol-vo abonentov: ";
cin >> k_abon;
cout << endl;

for(int i = 0; i < k_abon; i++)
{
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Vvedite imya:\t";
cin >> kniga[i].firstname;
cout << "Vvedite familiyu: ";
cin >> kniga[i].lastname;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Vvedite address: ";
cin.getline(kniga[i].address, 40);
cout << "Vvedite telefon:";
cin >> kniga[i].phone;
cout << endl;
}

for(int i = 0; i < k_abon; i++) // вывод введенного
{
cout << kniga[i].firstname << " " << kniga[i].lastname << " " << kniga[i].address << " " << kniga[i].phone << "\n";
}

int Menu;
do
{
menu();
cin >> Menu;

switch(Menu)
{

case 1: // поиск по фамилии
search(kniga, k_abon);
break;

case 2: // вывод всех абонентов по первой букве алфавита
        searchB(kniga, k_abon);
break;

case 3: // вывод всех абонентов
vivod(kniga, k_abon);
break;
}


} while(Menu > 1 || Menu < 3);
return 0;
}

inline void menu()
{
cout << "\t\tMenu\n"
<< "\n1) Poisk telefona po familii"
<< "\n2) Vivod abonentov po pervoy bukve familii"
<< "\n3) Vivod vsex abonentov\n";
}

inline void vivod(KNIGA *ptr, int k_abon)
{
for(int i = 0; i < k_abon; i++)
{
        cout << ptr[i].firstname << " "
<< ptr[i].lastname << " "
<< ptr[i].address << " "
<< ptr[i].phone << "\n";
}
}

inline void search(KNIGA *ptr, int k_abon)
{
char Slastname[20];
cout << "Vvedite familiyu\t";
cin >> Slastname;
for(int i = 0; i < 50; i++)
{
if(!strcmp(ptr[i].lastname, Slastname))
{
cout << "Telefon: " << ptr[i].phone << endl;
break;
}
}
}
inline void searchB(KNIGA *ptr, int k_abon) // поиск всех абонентов по букве
{
        char Flastname;
cout << "Vvedite pervuyu bukvu\t";
cin >> Flastname;
for(int i = 0; i < k_abon; i++)
{
if(kniga[i].lastname[0] == Flastname)
cout << kniga[i].firstname << " "
<< kniga[i].lastname << " "
<< kniga[i].phone << " "
<< kniga[i].address << "\n";
}

}


Drongo 15-02-2012 19:11 1859594

virus8, Я из раза в раз подправляю ваши сообщения по добавлению тегов оформления кода. Давайте договоримся на будущее, вы всегда будете оформлять код тегами [code]значение[/code] почитать об этом коде можно здесь - > [сode].

virus8 15-02-2012 20:39 1859678

Извиняюсь. Обещаю я исправлюсь ))


Время: 18:35.

Время: 18:35.
© OSzone.net 2001-