Quick actions

cmd+k|ctrl+k

Navigation

Languages

Лаба 1

Snippet info

Language

Cpp

Visibility

public

Author

muzon4ik

Created

2017-12-02T19:08:56Z

Updated

2017-12-23T09:52:35Z

/*
Задание на дом. Лабораторная №1.

Связный список, классы
- Создать класс Карточка (библиотечная, кадрова и т.п. - тему выбрать самостоятельно).
- Создать список (однонаправленный или двунаправленный) из карточек.
- Реализовать следующие функции:
    X создание пустого списка
    X создание элемента списка (данные из консоли)
    X добавление карточки в конец списка
    X включение карточки после текущей
    X поиск карточки (по ключу, по имени..)
    X удаление карточки из списка
    X изменение карточки
    X печать карточки (в консоль)
    X печать всего списка
    загрузка списка из файла
    сохранение списка в файл
При этом карточка обязательно должна содержать данные с типом char.
char *title; //Заголовок книги
Использовать в функциях передачу параметров с помощью указателей и по ссылке, при этом везде, где не требуется изменять значение, использовать const.*/

/*
2
Helen
Rouger
01.11.2007
Pushkin lyceum
Mark
Gordon
01.11.2007
School №7
Annie
Leonhart
01.11.2007
104th Training Corps

*/


#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Student {
private:
    int id;
    
    int get_new_id() {
        static int id = 0;
        return id++;
    }
    
    void input_field(char *field, int size, const char *description) {
        // Выводит приглашение для ввода такого типа:
        // > Description (value):
        // (value) выводится только если field[0] != '\0'
        cout << "> " << description;
        if (field[0]) {
            cout << " (" << field << ")";
        }
        cout << ": ";
        
       
        string input;
         getline(cin, input);
        
        // Если юзер ничего не ввел, то в input[0] будет хранится '\0', и if не сработает.
        
    if (input[0]) {
      int length = input.copy(field, size);
      field[length] = '\0';
    }
        
        cout << "\n";
    }

public:
    char fname[30];
    char lname[30];
    char birthday[11];
    char school[50];
    
    Student *next;
    
    Student() {
        id = get_new_id();
        fname[0] = '\0';
        lname[0] = '\0';
        birthday[0] = '\0';
        school[0] = '\0';
        
        next = nullptr;
        
        input();
    }
    
    void print() { //вывод карточки
        cout << id << "\n" << fname << "\n" << lname << "\n" << birthday << "\n" << school << "\n";
    }
    
    void input() { // ввод карточки
        this->input_field(fname, sizeof fname, "Firstname");
        this->input_field(lname, sizeof lname, "Lastname");
        this->input_field(birthday, sizeof birthday, "Birthday");
        this->input_field(school, sizeof school, "School");
    }
    
    int get_id() { // для уникального ID
        return id;   
    }
};

class Students {
    Student *head;
    int length;
    
    
public:
    Students() {
        head = nullptr;
    }
    
    void print() { // печатаем список
        Student *current = head;
        while (current) {
            current->print();
            current = current->next;
        }
    }
    
    void push(Student *student) {
        student->next = head;
        head = student;
    }
    
    bool remove(int id) {
    Student *student = head;
    Student *prev = nullptr;

    while (student) {
      if (student->get_id() == id) {
        if (prev) {
          prev->next = student->next;
        } else {
          head = student->next;
        }

        delete student;
        return true;
      }

      prev = student;
      student = student->next;
    }

    return false;
  }
    
    bool append(int id, Student *student) { //вставка
        Student *predecessor = get(id);
        
        if (predecessor) {
            Student *tmp = predecessor->next;
            predecessor->next = student;
            student->next = tmp;
            
            return true;
        }
        
        return false;
    }
    
    Student * get(int id) { // поиск по ID
        Student *student = head;
        
        while (student) {
            if (student->get_id() == id) {
                return student;   
            }
            
            student = student->next;
        }
        
        return nullptr;
    }
        
    Student * find(string query, bool continue_from_last = false) {
    static Student *student = nullptr;

    student = continue_from_last ? (student->next) : head;

    while (student != nullptr) {
      string fullname = string(student->fname) + ' ' + string(student->lname);

      if (fullname.find(query) != -1) {
        return student;
      }

      student = student->next;
    }

    return nullptr;
  }
};

int main()
{
    Students students = Students();

    int slaves_num;
    cout << "How much slaves do you want? ";
    cin >> slaves_num;

    
    cin.ignore();
    
    while(slaves_num--) { // добавляем студентво
        Student *st = new Student();
        students.push(st);
    }
    
     
    
    cout << "\nBefore append\n";
    students.print(); // выводим их
    
    students.append(0, new Student()); // функция вставки
    
    cout << "\nAfter append\n";
    students.print(); // воводим со вставкой
    
    cout << "\nFind\n";
    students.find("An")->print(); // ищем и выводим студента по имени
    //students.find("An", true)->print(); // продолжение поиска
    
    cout << "\n";
    students.get(1)->print(); // ищем и выводим студента по ID
    
   cout << "\nDelete\n";
    students.remove(1); // удаляем первого студента
    students.print(); // выводим их
    
    cout << "\nGet\n"; //редактирование
    Student * student = students.get(0);
      if (student) {
        student->input();
      }
      
      students.print(); // выводим их*/
}
INFO