Консультация № 69039
29.12.2006, 13:48
0.00 руб.
0 3 3
Здравствуйте!
Хочу задать вам вот такую задачку. Надо написать программу, в которой массивы используются для хранения имен, адресов и номеров телефонов 6 человек. В программе должна быть возможность ввода имени и последующего просмотра массива в поисках номера телефона соответствующего человека. Мне предложили такой код.
Однако, автор так и не смог мне объяснить, зачем он использовал указатели. Вы сможете?

Приложение:
#include <iostream.h>#include <math.h>#include <conio.h>#include <string.h>char Name[7][256];char Adress[7][256];char Tel[7][256];int max = 0;bool Enter(char *m_Name, char *m_Adress, char *m_Tel){ cout << "Enter name: "; cin >> Name[max]; cout << "Enter adress: "; cin >> Adress[max]; cout << "Enter tel: "; cin >> Tel[max]; return true;}bool Print(int i){ cout << "Name: " << Name[i] << endl; cout << "Adress: " << Adress[i] << endl; cout << "Tel: " << Tel[i] << endl; return true;}int Search(char *m_Tel){ int i = 0; while (i < max) { if (strcmp(&Tel[i][0], &m_Tel[0]) == 0) { return i; break; } i++; } return -1;}int main(){ int i = 0; int choice; while (true) { cout << "1 - new" << endl; cout << "2 - print" << endl; cout << "3 - search" << endl; cout << "0 - exit" << endl; cin >> choice; cout << endl; if (choice == 0) break; switch (choice) { case 1: { Enter(&Name[max][0], &Adress[max][0], &Tel[max][0]); max++; i = max; break; } case 2: { cout << "Enter # elemente (0-" << max-1 << "): "; cin >> i; Print(i); break; } case 3: { char m_Tel[256]; cout << " Search" << endl; cout << "Enter tel: "; cin >> m_Tel; cout << "***********" << endl; int i = Search(&m_Tel[0]); if (i == -1) cout << "Ne naideno" << endl; else Print(i); cout << "***********" << endl; break; } default : continue; } } return 0;}

Обсуждение

Неизвестный
29.12.2006, 15:58
общий
это ответ
Здравствуйте, Waitekk!

Потому что таким образом обычно передаются массивы внутрь фунции. Думаю автор прекрассно это знает Ж;-)

Если вас там смущают указатели, то это
bool Enter(char *m_Name, char *m_Adress, char *m_Tel)
можно заменить на это
bool Enter(char m_Name[], char m_Adress[], char m_Tel[])

что в вашем случаем будет одно и тоже
Неизвестный
30.12.2006, 11:18
общий
это ответ
Здравствуйте, Waitekk!
если речь идет об указателях в функции Enter, то их он использовал вобщем-то зря. они там просто не используются. я сейчас немогу проверить эту прогу - под рукой нет компилятора. но по моему их можно просто удалить
Неизвестный
30.12.2006, 14:17
общий
это ответ
Здравствуйте, Waitekk!

В функцию Enter(char *,char *,char *) передаются указатели на начало области памяти, где хранятся данные (кстати вместо громоздкого &Name[max][0] можно написать просто Name[max] (по сути это одно и то же)), однако функия Enter их не использует, обращаясь напрямую к массивам данных. Чтобы эти указатели использовались функция Enter должна выглядеть так:
bool Enter(char *m_Name, char *m_Adress, char *m_Tel)
{
cout << "Enter name: "; cin >> m_Name;
cout << "Enter adress: "; cin >> m_Adress;
cout << "Enter tel: "; cin >> m_Tel;

return true;
}
В функции Search указатель уже используется при сравнении строк:
int Search(char *m_Tel)
{
int i = 0;

while (i < max)
{
if (strcmp(Tel[i], m_Tel) == 0)
{
return i;
break;
}
i++;
}

return -1;
}
Могу посоветовать книгу Кернигана и Ритчи "Язык программирования Си". В ней очень доступно описана работа с указателями.
Форма ответа