Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Phonebook #5

Open
wants to merge 21 commits into
base: master
Choose a base branch
from
Open

Phonebook #5

wants to merge 21 commits into from

Conversation

viktoriia-fomina
Copy link
Owner

Program phonebook does these things:
0 - exit
1 - add note (name and phone number)
2 - print all notes
3 - find number by name
4 - find name by number
5 - save current data

Copy link

@yurii-litvinov yurii-litvinov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Всё так, но надо немного навести порядок

struct Subscriber
{
// ����������� - �������� ����������� - ����������
explicit Subscriber(char const * name, char const * number);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А у этого конструктора два аргумента, ему explicit не нужен :)
Хотя вреда от него нет, так что, наверное, правильно было бы писать explicit всегда (как const), но обычно его в таких случаях почему-то не пишут.

Subscriber::Subscriber(Subscriber const & s)
{
this->name = nullptr;
this->number = nullptr;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чтобы три раза это не писать, можно инициализировать поля прямо в месте их объявления, в самой структуре. Или воспользоваться constructor chaining-ом,

Subscriber::Subscriber(Subscriber const & s)
	: Subscriber()
{
	setName(s.name);
	setNumber(s.number);
}

{
(*destination)[i] = str[i];
}
(*destination)[size] = '\0';

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть strcpy, которая делает как раз это :)


Phonebook::Phonebook(Phonebook const & p) {} // ����������� �����������

void Phonebook::operator=(Phonebook const & p) {} // �������� ������������

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нее, это делается в .h-нике:

	Phonebook(Phonebook const & p) = delete; // конструктор копирования
	void operator=(Phonebook const & p) = delete; // оператор присваивания

Phonebook::Phonebook()
{
int const size = 100;
base = new Subscriber[size];

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут, мне кажется, можно было просто new Subscriber[100];, всё равно size нигде больше не используется

}
}
return true;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тоже, есть strcmp, которая и так всё делает.

if (!file)
{
printf("FILE WAS NOT FOUND\n!");
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И тут тоже бы return, а то там ещё ниже fclose, ну и вообще, лишний else


menu();

system("pause");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нельзя :)

p.addNote(s2);
p.addNote(s3);
p.findNumberByName("Tralala");
printf("Test passed if written: Tralala 567\n");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну лучше бы возвращать массив результатов и проверять автоматически. Тесты по идее должны выполняться при каждой сборке, и никто не будет специально сидеть и проверять, что всё ок.

printf("Tralala 567\n");
printf("Lalala 900\n\"\n");
p.saveToFile();
printf("Check file \"phonebook\" to finish testing\n");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И тут --- имеет смысл открыть файл, прочитать и убедиться, что всё ок

const int readBytes = fscanf(file, "%s", buffer);
if (readBytes < 0)
{
break;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так же утечка памяти будет? Ну да, буфер не заполнился, но память-то под него выделена, а тут мы теряем на него указатель.

Subscriber* s = new Subscriber;
s->setName(data[i]);
s->setNumber(data[i + 1]);
(*this)[i / 2] = *s;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В this кладутся только значения Subscriber, а не указатель на неё? Тогда память, выделенная под структуру, потеряется. Можно было её не на куче, а на стеке вызовов прямо выделять.

{
delete[] data[i];
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне кажется, что можно вообще все данные в data не считывать, а прямо прочитали две строки, разобрали их в Subscriber, запихали в базу и т.д. Но это просто наблюдение, можно это не править.

// printf("Lalala 900\n\"\n");
// p.saveToFile();
// printf("Check file \"phonebook\" to finish testing\n\n\n");
//}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ммм?

Copy link

@yurii-litvinov yurii-litvinov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не тестировать программу перед релизом не очень правильно, так что правильнее было бы попросить Вас исправить, но там исправить можно за пару секунд, так что зачтена :)

{
for (int i = 0; i < size(); ++i)
{
if (strcmp((*this)[i].getNumber(), number))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strcmp возвращает 0, если строки равны, что соответствует false, если привести его к bool-у. Поэтому неявные преобразования типов --- зло. Этот код находит все записи, кроме той, что нужна :)

Subscriber s1("Ololo", "1234");
Phonebook p;
p.addNote(s1);
p.saveToFile();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

После этого тест не удаляет добавленные данные, поэтому сколько раз мы запустили программу --- столько строк "Ololo 1234" будет в телефонной книге :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants