Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Здравствуйте!
- По первому вопросу, в данном конкретном случае ничего страшного не произойдет если вы не инициализируете указатель нулём.
- А вообще, считается хорошей практикой инициализировать указатели при их объявлении. Может возникнуть ситуация когда программист не инициализировал указатель вручную (пропустил строчку p = &d;), либо условный оператор, который должен был инициализировать его, не сработал, или функция, которая его должна была инициализировать, удалена или модифицирована. В такой ситуации указатель будет указывать на какой-то мусор и при его разыменовании может возникнуть неопределенное поведение.
- Запись в указатель nullptr позволяет при обращении к указателю сначала проверить, есть ли там какое-то значение, например таким образом:
- if (p != nullptr) { // лиюо просто if(!p)
- //записываем или читаем что-то из него
- }
- В дальнейшем вы с этим ещё столкнетесь, пока надо просто завести привычку либо сразу инициализировать указатель значением, либо хотя-бы нулем.
- По второму вопросу, возможны три варианта:
- 1) всё храним на стеке
- 2) массив указателей на стеке, фильмы в динамической памяти
- 3) массив указателей и фильмы в динамической памяти
- если вы хотите всё хранить на стеке, то вам необходимо обязательно инициализировать свои структуры значениями по умолчанию, например:
- struct film {
- char name[100]{}; // фигурные скобки означают значение по умолчанию
- char producer[100]{};
- char genre[20]{};
- int rating = 0;
- };
- struct video_store {
- film store[100]{};
- int films_number = 0; // нужна чтобы знать какое количество фильмов выводить / искать ...
- };
- // добавлять фильмы можно различным способом, можно так как у вас, но по заданию необходимо сделать функцию для этого, она может иметь например такой вид:
- void AddMovie(video_store& some_store, const char name[], const char producer[], const char genre[], const int rating) { // не забывать ставить const, иначе не скомпилируется
- if (some_store.films_number == 100) { // проверяем хватит ли места
- cout << "The movie cannot be added" << endl;
- return; // если нет, то выводим сообщение и выходим из функции
- }
- strcpy(some_store.store[some_store.films_number].name, name); // для копирования переданных параметров поможет strcpy
- // заполняем остальные поля
- some_store.films_number++;
- }
- // тогда заполнять можно например так:
- AddMovie(my_store, "Ivan Vasilyevich is changing his profession", "Leonid Gaidai", "comedy", 4);
- // удаление по схожей логике
- // чтобы вывести циклом, просто идём по массиву video_store.store пока не достигнем films_number и выводим например так
- cout << '\"' << some_store.store[i].name << "\", producer: " << some_store.store[i].producer << ", " << some_store.store[i].genre << ", rating " << some_store.store[i].rating << endl;
- Для поиска по различным критериям также идем циклом:
- void FindMovieName(video_store& some_store, const char name[]) {
- cout << "Found according to your request: " << endl;
- for (int i = 0; i < some_store.films_number; i++) {
- if(!strcmp(some_store.store[i].name, name)) { // поможет функция strcmp, когда строки равны, она возвращает 0, поэтому пишем !stdcmp...
- cout << '\"' << some_store.store[i].name << "\", producer: " << some_store.store[i].producer << ", " << some_store.store[i].genre << ", rating " << some_store.store[i].rating << endl;
- }
- }
- cout << endl;
- }
- ну остальную логику попробуйте написать сами )
Advertisement
Add Comment
Please, Sign In to add comment