35657

Untitled

Apr 27th, 2023 (edited)
813
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.01 KB | None | 0 0
  1.  
  2. Здравствуйте!
  3.  
  4. По первому вопросу, в данном конкретном случае ничего страшного не произойдет если вы не инициализируете указатель нулём.
  5. А вообще, считается хорошей практикой инициализировать указатели при их объявлении. Может возникнуть ситуация когда программист не инициализировал указатель вручную (пропустил строчку p = &d;), либо условный оператор, который должен был инициализировать его, не сработал, или функция, которая его должна была инициализировать, удалена или модифицирована. В такой ситуации указатель будет указывать на какой-то мусор и при его разыменовании может возникнуть неопределенное поведение.
  6. Запись в указатель nullptr позволяет при обращении к указателю сначала проверить, есть ли там какое-то значение, например таким образом:
  7. if (p != nullptr) { // лиюо просто if(!p)
  8.     //записываем или читаем что-то из него
  9. }
  10. В дальнейшем вы с этим ещё столкнетесь, пока надо просто завести привычку либо сразу инициализировать указатель значением, либо хотя-бы нулем.
  11.  
  12.  
  13. По второму вопросу, возможны три варианта:
  14. 1) всё храним на стеке
  15. 2) массив указателей на стеке, фильмы в динамической памяти
  16. 3) массив указателей и фильмы в динамической памяти
  17.  
  18. если вы хотите всё хранить на стеке, то вам необходимо обязательно инициализировать свои структуры значениями по умолчанию, например:
  19.  
  20. struct film {
  21.     char name[100]{}; // фигурные скобки означают значение по умолчанию
  22.     char producer[100]{};
  23.     char genre[20]{};
  24.     int rating = 0;
  25. };
  26.  
  27. struct video_store {
  28.     film store[100]{};
  29.     int films_number = 0; // нужна чтобы знать какое количество фильмов выводить / искать ...
  30. };
  31.  
  32. // добавлять фильмы можно различным способом, можно так как у вас, но по заданию необходимо сделать функцию для этого, она может иметь например такой вид:
  33.  
  34. void AddMovie(video_store& some_store, const char name[], const char producer[], const char genre[], const int rating) { // не забывать ставить const, иначе не скомпилируется
  35.     if (some_store.films_number == 100) { // проверяем хватит ли места
  36.         cout << "The movie cannot be added" << endl;
  37.         return; // если нет, то выводим сообщение и выходим из функции
  38.     }  
  39.     strcpy(some_store.store[some_store.films_number].name, name); // для копирования переданных параметров поможет strcpy
  40.     // заполняем остальные поля
  41.     some_store.films_number++;
  42. }
  43.  
  44. // тогда заполнять можно например так:
  45. AddMovie(my_store, "Ivan Vasilyevich is changing his profession", "Leonid Gaidai", "comedy", 4);
  46.  
  47. // удаление по схожей логике
  48.  
  49. // чтобы вывести циклом, просто идём по массиву video_store.store пока не достигнем films_number и выводим например так
  50. cout << '\"' << some_store.store[i].name << "\", producer: " << some_store.store[i].producer << ", " << some_store.store[i].genre << ", rating " << some_store.store[i].rating << endl;
  51.  
  52. Для поиска по различным критериям также идем циклом:
  53.  
  54. void FindMovieName(video_store& some_store, const char name[]) {
  55.     cout << "Found according to your request: " << endl;
  56.     for (int i = 0; i < some_store.films_number; i++) {
  57.         if(!strcmp(some_store.store[i].name, name)) {  // поможет функция strcmp, когда строки равны, она возвращает 0, поэтому пишем !stdcmp...
  58.             cout << '\"' << some_store.store[i].name << "\", producer: " << some_store.store[i].producer << ", " << some_store.store[i].genre << ", rating " << some_store.store[i].rating << endl;
  59.         }
  60.     }
  61.     cout << endl;
  62. }
  63.  
  64. ну остальную логику попробуйте написать сами )
  65.  
  66.  
  67.  
  68.  
Advertisement
Add Comment
Please, Sign In to add comment