C/C++ - [решено] помогите решить задачу!

Аватара пользователя
virus8

C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

народ помогите разобраться - программка типа телефонный справочник.

Каким образом мне обеспечить ввод адреса ( типа такого - ул. чайковского 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

Re: C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

можно так



Код: Выделить всё

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

Re: C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

О, спасибо!

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


Цитата:



cin.ignore(numeric_limits::max(), '\n');



о
Аватара пользователя
ferget

Re: C/C++ - [решено] помогите решить задачу!

Сообщение ferget »

Цитата virus8:



где про это можно почитать
C/C++ - [решено] помогите решить задачу!




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



а пока вот например
http://www.cplusplus.com/reference/i...stream/ignore/
Аватара пользователя
virus8

Re: C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

Спасибо большое!

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



void search(struct kniga[50], int) - потом не считает её структурой.

Пробовал void search(struct kniga *N_kniga[]) - тоже не катит.

Если че сильно не смейтесь)))
Аватара пользователя
ferget

Re: C/C++ - [решено] помогите решить задачу!

Сообщение ferget »

примерно так



Код: Выделить всё

#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

Re: C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

Вот навоял такое)))

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



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

Сразу грешил на кодировку, а потом понял, что не в ней дело. Походу как то не корректно сохраняет инфу в массив


читать дальше »

Код: Выделить всё

#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

Re: C/C++ - [решено] помогите решить задачу!

Сообщение ferget »

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



Код:

Код: Выделить всё

#include 
#include 
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  k_abon;
	cout  kniga[i].firstname;
		cout > kniga[i].lastname;
		cin.ignore(numeric_limits::max(), '\n');
...................................................................................................
Аватара пользователя
virus8

Re: C/C++ - [решено] помогите решить задачу!

Сообщение virus8 »

Все разобрался - как раз тему читал про структуры. Сделал для себя великое открытие, что 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";
}
}
Ответить

Вернуться в «Программирование и базы данных»