Задача: Классы. Определение класса Tnote(запись). Перегрузка операторо

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Помогите пожалуста, я не знаю как реализовать((
не могу разобратся, может есть какой-то пример. Буду очень признательна

1. Определить класс с именем NOTE, содержащий следующие поля:
• фамилия, имя;
• номер телефона;
• год рождения .
2. Написать программу, выполняющую следующие действия:
• ввод с клавиатуры данных в массив, состоящий из трех объектов типа NOTE; записи должны быть упорядочены по трем первым цифрам номера телефона;
• вывод на экран информации о человеке, чья фамилия введена с клавиатуры;
• если такого нет, выдать на дисплей соответствующее сообщение.
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
2 ксешенька : Если ли свои наработки какие-нибудь по коду???
не могу разобратся, может есть какой-то пример. Буду очень признательна
Примеров тут много... Из последних которые тут на форуме постил, похожие : это Фирмы:Классы, Студенты:Классы
Определение вашего класса будет представлять
C++:
class TNome
{
char FamName[128]; //• фамилия, имя;
char TelNumber[16] //• номер телефона;
unsigned int birdyear; //• год рождения .
}
 
G

Guest

#3
C++:
class NOTE
{

char name[20];
char surname[30];
int year_of_birth;
double tel_number;
public:
NOTE() {};
void vvod()
{
cout<<"Vvedit' im'ia"<<'\n';
cin>>name;
cout<<"Vvedit' prizvishe"<<'\n';
cin>>surname;
cout<<"Vvedit' rik narodjennia"<<'\n';
cin>>year_of_birth;
cout<<"Vvedit' nomer telefony"<<'\n';
cin>>tel_number;
};
void vivod()
{
cout<<"Im'ia: "<<name;
cout<<"	Prizvishe: "<<surname;
cout<<"	Rik narodjennia: "<<year_of_birth;
cout<<"	Nomer Tel: "<<tel_number<<'\n';
}
};

int _tmain(int argc, _TCHAR* argv[])
{
NOTE mas[3];
for(int i=0; i<3; i++)
{
mas[i].vvod();
}
for(int i=0; i<3; i++)
{
mas[i].vivod();
}
system("pause");
return 0;

}

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

lazybiz

Well-known member
03.11.2010
1 339
0
#4
ксешенька. пиши с тэгами! нифига же не понято.
Приведешь в нормальный вид - помогу.
 
E

ensane

#5
Народ, сорри что вмешиваюсь, но почему если даже задача на C++/классы => ООП, все равно используется процедурный подход? Почему char* если есть string?
P.S. Это касается не только этой темы, но и вообще всего раздела.
 
G

Guest

#7
C++:
class NOTE
{

char name[20];//имя человека
char surname[30];//фамилия
int year_of_birth;//год рождения
double tel_number;//номер телефона
public:
NOTE() {};//конструктор по умолчанию
void vvod()//функция ввода данных с клавиатуры
{
cout<<"Vvedit' im'ia"<<'\n';
cin>>name;
cout<<"Vvedit' prizvishe"<<'\n';
cin>>surname;
cout<<"Vvedit' rik narodjennia"<<'\n';
cin>>year_of_birth;
cout<<"Vvedit' nomer telefony"<<'\n';
cin>>tel_number;
};
void vivod()//функция вывода
{
cout<<"Im'ia: "<<name;
cout<<"	Prizvishe: "<<surname;
cout<<"	Rik narodjennia: "<<year_of_birth;
cout<<"	Nomer Tel: "<<tel_number<<'\n';
}
};

int _tmain(int argc, _TCHAR* argv[])
{
NOTE mas[3];//массив типа NOTE, количество данных которые мы вводим
for(int i=0; i<3; i++)
{
mas[i].vvod();//вводим 3 значения
}
for(int i=0; i<3; i++)
{
mas[i].vivod();//и выводим тож 3
}
system("pause");
return 0;

}

если я правильно тебя поняла)
 

DarkKnight

Well-known member
01.08.2010
653
0
#8
Вот, перезагруженных функций тут более чем достаточно...
Единственное поиск по фамилии не описал.. Очень спать хочу, а если поиск начну писать, то и менюшку воять придется...
C++:
/*
1. Определить класс с именем NOTE, содержащий следующие поля:
• фамилия, имя;
• номер телефона;
• год рождения .
2. Написать программу, выполняющую следующие действия:
• ввод с клавиатуры данных в массив, состоящий из трех объектов типа NOTE; записи должны быть упорядочены по трем первым цифрам номера телефона;
• вывод на экран информации о человеке, чья фамилия введена с клавиатуры;
• если такого нет, выдать на дисплей соответствующее сообщение.
з.ы. еще нужны перегрузка операторов(сравнение или присвоение)
*/

/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>

using namespace std;

//Объявление класса TNote
class TNote
{
private:
char	Soname[32]; //Фамилия
char	Name[16]; //Имя 
char	TelNubm[14]; //Отчество
int		Year; //Год рождения

public:

TNote(){}; //Конструктор по умолчанию

//Перезагруженный оператор сравнения (сравнивает по всем полям)
bool operator == (TNote& A) 
{
bool Res = false; //Выставим флаг результат ТРУ
if (strcmp(Soname,A.Soname) == 0) //Если Фамилии равны
if (strcmp(Name,A.Name) == 0) //Если Имена равны
if (strcmp(TelNubm,A.TelNubm) == 0) //Если тел. номера равны
if (Year == A.Year) //И год рождения тоже
Res = true; //То сменим флаг на true
return Res;
}
//Дружественная функция сортировки массива TNote по ном. телефона
friend void SortNote(TNote *Arr, int Size)
{
for (int i = 0; i <Size; i++)
for (int j =i+1; j < Size; j++)
if (strcmp(Arr[i].TelNubm,Arr[j].TelNubm) > 0)
{
TNote Temp;
Temp = Arr[i];
Arr[i] = Arr[j];
Arr[j] = Temp;
}
}

//Дружественная перезагрузка оператора потокового ввода
friend istream& operator>> (istream& in,TNote& Note) 
{
cout<< "Ввод записи TNote" << endl;
cout << "Введите Фамилию : ";
in.getline(Note.Soname,31);
cout << "Введите Имя : ";
in.getline(Note.Name,15);
cout << "Введите номер телефона : ";
in.getline(Note.TelNubm,13);
cout << "Введите год рождения : ";
in>>Note.Year;
in.ignore(1);
return in;
}

//Дружественная перезагрузка оператора потокового вывода
friend ostream& operator<< (ostream& out, TNote& Note)
{
out << "---------------------------------------" << endl;
out << "Фамилия : " << Note.Soname << endl;
out << "Имя : " << Note.Name << endl;
out << "Номер телефона : " << Note.TelNubm << endl;
out << "Год рождения : " << Note.Year << endl;
out << "---------------------------------------" << endl << endl;
return out;
}
};


//Основная функция (точка входа)
void main(void)
{
setlocale(LC_ALL,".1251"); //Установим локаль
TNote Arr[3]; //Наш массив объектов

//Ввод массива
for (int i = 0; i< 3; i++)
cin>>Arr[i];

//Проверка перазагруженной функции
if (Arr[1] == Arr[2])
cout << "Объект 2 == Объекту 3" << endl;
else cout << "Объект 2 != Объекту 3" << endl;

SortNote(Arr,3); //Отсортируем массив по ном. телефонов

//Выведим отсортированный массив на экран
for (int i = 0; i<3; i++)
cout << Arr[i];
}
 
E

ensane

#9
Потому, что это разные типы данных.
Это разные инструменты для решения определенного типа задач. В некоторых случаях string лучше, в других - char*. В данном случае лучше string.
Или ты хочешь сказать что в С++ тип char * вообще использовать не нужно?
Я бы сказал, что там, где это возможно, лучше использовать string. Это улучшает читабельность кода, избавляет от глупых ошибок и потихоньку приучает к ООП-стилю.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#10
Твой вариант с поиском по фамилии.
C++:
#include <iostream.h>

class NOTE {
char	name[20];
char	surname[30];
int		year_of_birth;
double	tel_number;		// лучше использовать char [20] или другого размера

public:
NOTE() {};

char *get_surname()
{
return surname;
}

void vvod()
{
cout << "Enter name: "; cin >> name;
cout << "Enter surname: "; cin >> surname;
cout << "Enter year of birth: "; cin >> year_of_birth;
cout << "Enter telephone number: "; cin >> tel_number;
}

void vivod()
{
cout << "Name: " << name << endl;
cout << "Surname: " << surname << endl;
cout << "Year of birth: " << year_of_birth << endl;
cout << "Telephone number: " << tel_number << endl;
}
};

int main( /* Зачем нам арументы, если мы их не используем? */ )
{
NOTE	mas[3];

for ( int i = 0; i < 3; i++ ) {
mas[i].vvod();
}

for( int i = 0; i < 3; i++ ) {
mas[i].vivod();
}

for( int i = 0; i < 3; i++ ) {
if ( strcmp( mas[i].get_surname(), "Ivanov" ) == 0 ) {
mas[i].vivod();
}
}

system( "pause" );
return 0;
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#11
2 ensane : Кординально не согласен с вашим сообщением.... Лично меня использование базового класса string - всегда настораживает, если я вижу его в коде... Я не говорю про библиотечную специализацию (такую как AnsiString в VCL Борданде (Delphi/С++ Builder), CString (MFC Microsoftа)... Но если я вижу в консольной программе или в оконной построенной сугубо на API string - это в первую очередь крайне подозрительно)
Строка по своему определению - это мусорка в памяти, поэтому лучше все же ее контролировать самому, да, это не особо читаемо, в некоторых случаях сложно в реализации , но это в первую очередь СОВМЕСТИМОСТЬ , а во вторую полный контроль...
 
E

ensane

#13
2DarkKnight125:
Мсье, тогда уж давайте перейдем на "pure C". Никаких class. Вместо cout и cin - printf/scanf. Да, и фтопку эти новоделы new/delete! malloc() - вот элегантное оружие цивилизованной эпохи.
Да, у ООП есть свои недостатки, но классы изобрели не на пустом месте. И они удобны. И это удобство одним махом перечеркивает все недостатки. Да, на коротенькой программе студенческой лабораторной этого удобства заметить нельзя. Но приучать нужно с детства. А то потом приходится сталкиваться с ситуацией когда выпускники даже очень хороших ВУЗов оказываются непригодны к практической работе в отрасли программирования.
но это в первую очередь СОВМЕСТИМОСТЬ
Это с каких же пор std оказался "несовместимым"?
2lazybiz
Да это я не с целью наезда, а так... наболело...
 
G

Guest

#14
ой ой ой
стоп-машина) вы тут такие проблемы глобальные обсуждаете, я прям теряюсь.
насчет типа string, нам пока такого не обьясняли. сказали char, мы и юзаем char))
________________________________________________________________________________
lazybiz, можно вопрос?


как мне сделать, чтоб искало не только по фамилии Иванов, а чтобы искало фамилию, которую я ввожу с клавиатуры??
 

DarkKnight

Well-known member
01.08.2010
653
0
#15
От излишних комментариев откажусь...
Видно вы не совсем поняли о чем я пытался сказать...
А насчет классов и приучать с детства, напишите тогда разработчикам ОС (начиная от Гейтса, кончая группе Unix), что мол живете в прошлом веке, давно уже нужно в API и в ос включать std::string, а не писать основные строковые данные с байтовой форме завершая их нулевыми символами.....
 

lazybiz

Well-known member
03.11.2010
1 339
0
#16
ксешенька
Конечно.

C++:
	// ...
char	poisk[20];
cout << "Enter surname to search: "; cin >> poisk;
for( int i = 0; i < 3; i++ ) {
if ( strcmp( mas[i].get_surname(), poisk ) == 0 ) {
mas[i].vivod();
}
}
// ...
 
G

Guest

#17
спасибо)
блин, вы все такие умные)
мне еще пахать и пахать, чтоб шарить что-то нормально)
 
E

ensane

#18
2DarkKnight125:
...что мол живете в прошлом веке, давно уже нужно в API и в ос включать std::string, а не писать основные строковые данные с байтовой форме завершая их нулевыми символами...
А причем здесь это? Системное программирование на уровне ядра - это как бы C без плюсов по дефолту. И с этим почти никто не спорит. Речь идет о прикладном программировании.
А вот что произойдет, если добрый препод при приемке вышеприведенной программы решит ввести имя "Рома куча пробелов в строке и еще какая-нибудь лабуда и переполнение буфера однако"?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#19
А вот что произойдет, если добрый препод при приемке вышеприведенной программы решит ввести имя "Рома переполнение буфера однако"?
Ответы основаны на вопросах. А если препод скажет: "Ну ни хрена себе! Мы ж такого не проходили! Значит делал не сам!" ???
 
G

Guest

#20
еще один глупый вопрос от меня

надо сделать оператор перегрузки, как это сделать??
и зачем оно вообще надо?
нужен оператор типа присваивания или сравнения?
толком не обьяснили, сказали делайте.

в конспекте дали пример что-то вроде

C++:
bool operator==(int kolichestvo)
{
if (kolichestvo==_kolichestvo) return true;
return false;

}
(сравнивали количество стульев в аудиториях) бред какой-то.
 
Статус
Закрыто для дальнейших ответов.