Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Разработать класс "Записная книжка" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Запись всех повторяющихся слов в новый массив слов http://www.cyberforum.ru/cpp-beginners/thread804634.html
компилируется без ошибок, запускаю консоль после 13 строчки, а именно ввода количества слов, программа где-то вылетает, думал на 15 что-то не то, попробовал убрать, результат тот же, и 19 строчка,...
C++ Задача про бутылки лимонада Уважаемые форумчане! Помогите, пожалуйста, с решением задачи: Бутылка лимонада стоит К рублей, а пустая бутылка М рублей. Семья в понедельник на все деньги купила лимонад. Выпив все, они на... http://www.cyberforum.ru/cpp-beginners/thread804632.html
C++ Определение третьего по величине числа
Уважаемы форумчане! Прошу помощи в решении задачи: напишите программу, которая вводит с клавиатуры непустой массив чисел, в котором могут быть повторяющиеся элементы и печатающую значение...
Подсчитать количество обоев для оклейки комнаты C++
необходимо написать программку, которая будет рассчитывать какое количество рулонов потребуется и сколько метров обоев выкинется при известных данных - длинна комнаты 6м, ширина 4м, высота 3.5м,...
C++ Напишите программу, запрашивающую с клавиатуры число и массив чиел http://www.cyberforum.ru/cpp-beginners/thread804627.html
Уважаемы форумчане! Помогите, пожалуйста, с решением задачи: напишите программу, запрашивающую с клавиатуры число Х и массив чисел, а затем определяющую, содержаться ли в этом массиве идущие...
C++ Х людей расположены по кругу Уважаемые форумчане! Прошу у вас помощи в решении это задачи: Х людей расположены по кругу. начав отсчет от первого, удаляют каждого К-го, смыкая круг после каждого удаления. Напишите программу,... подробнее

Показать сообщение отдельно
GoldenId
126 / 124 / 32
Регистрация: 11.11.2010
Сообщений: 694
Записей в блоге: 13
Завершенные тесты: 1
10.03.2013, 18:03
Вот, набросал класс, как было запрошено. Отлаживать не отлаживал, интерфейс не прикручивал (ибо столько же работы).

Кликните здесь для просмотра всего текста
Чтобы выглядело более правдоподобно, удалите все комментарии. Там и так ясно, что писал не студент, а с комментариями прям совсем. Комментарии я писал для Вас, чтобы Вы разобрались.


Кликните здесь для просмотра всего текста
Функция Remove получилась довольно сложной. Если преподаватель не очень дотошный, можно не разбираться.


Notebook.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once
 
// класс записной книжки
class Notebook
{
public:
    // конструктор 
    // noteCount - максимальное количество записей, под которое будет выделена память
    // unique - поддерживать ли уникальность содержимого, 
    // т.е., чтобы не допускать несколько записей с одинаковыми фамилиями
    Notebook( int noteCount, bool unique );
 
    // деструктор
    ~Notebook(void);
 
    // метод добавления записи в книжку
    // surname -  фамилия
    // phone - номер телефона
    // возвращаемое значение:
    //  true - если запись была успешно вставлена
    //  false - в противном случае
    // этот метод не берет владение строками surname и phone, а копирует их
    bool Add( char *surname, char *phone );
 
    // удаление записи/записей
    // surname - фамилия, запись/записи с котоорой следует удалить
    // возвращаемое значение:
    //  true - если запись была удалена/записи были удалены успешно
    //  false - в противном случае
    bool Remove( char *surname );
 
    // поиск записи с заданной фамилией
    // surname - фамилия для поиска записи
    // возвращаемое значение:
    //  строка, содержащая телефон, если такая запись была найдена либо
    //  0 - в противном случае
    char *Search( char *surname );
 
    // внутреннее представление
private:
 
    // структура одной записи в книжке - тип данных
    struct Note
    {
        char* surname;  // фамилия
        char* phone;    // номер телефона
    };
 
    // указатель на структуру типа Note
    // используется для организации массива записей и 
    // хранит указатель на первый элемент этого массива
    Note* notes;
 
    // количество записей, под которое выделена память, оно же
    // длина массива, оно же
    // максимально допустимое количество записей
    int reserved;
 
    // количество заполненных записей в массиве.
    // записи в массиве располагаются, начиная с индекса 0 и заканчивая индексом count - 1
    int count;
 
    // флаг, будем ли мы поддерживать уникальность записей,
    // т.е. что не будем допускать вставки нескольких записей с одной и той же фамилией
    bool unique;
};
Notebook.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <string.h>
#include "Notebook.h"
 
 
// конструктор 
// noteCount - максимальное количество записей, под которое будет выделена память
// unique - поддерживать ли уникальность содержимого, 
// т.е., чтобы не допускать несколько записей с одинаковыми фамилиями
Notebook::Notebook( int noteCount, bool unique )
{
    // создаем массив записей
    // проверку на корректность значения noteCount, например (noteCount > 0) не делаем,
    // потому что результат неуспешной проверки из конструктора возвращать сложно 
    notes = new Note[noteCount];
 
    // запоминаем, что у нас выделено noteCount количество записей
    reserved = noteCount;
 
    // запоминаем, что на данный момент записей нет
    count = 0;
 
    // запомним флаг уникальности
    this->unique = unique;
}
 
// деструктор
Notebook::~Notebook(void)
{
    // здесь нужно вручную осободить всю занятую динамическую память
    // а именно, это каждая запись, которая присутствует в книжке
    for( int i = 0; i < count; i++ )
    {
        delete[] notes[i].surname;
        delete[] notes[i].phone;
    }
 
    // после этого можно освобождать сам массив
    delete[] notes;
}
 
// метод добавления записи в книжку
// surname -  фамилия
// phone - номер телефона
// возвращаемое значение:
//  true - если запись была успешно вставлена
//  false - в противном случае
// этот метод не берет владение строками surname и phone, а копирует их
bool Notebook::Add( char *surname, char *phone )
{
    // прежде всего проверим, есть ли в массиве записей свободное место
    if( count >= reserved )
        return false;
 
    // если мы поддерживаем уникальность записей, проверим, 
    // нет ли записи с такой фамилией уже в списке
    if( Search( surname ) != 0 )
        return false;
 
    // если мы дошли досюда, то можем добавить запись в конец
 
    // выделим память для строк фамили и телефона в массиве
    // так как строки помимо символов должны содержать завершающий нулевой символ,
    // выделяем дополнительный + 1 байт
    notes[count].surname = new char[ strlen( surname ) + 1];
    notes[count].phone = new char[ strlen( phone ) + 1];
 
    // копируем содержимое переданных нам строк в наше созданное хранилище
    strcpy( notes[count].surname, surname );
    strcpy( notes[count].phone, phone );
 
    // увеличиваем счетчик заполненных записей
    count++;
 
    // отчитываемся, что запись вставлена успешно
    return true;
}
 
// удаление записи/записей
// surname - фамилия, запись/записи с котоорой следует удалить
// возвращаемое значение:
//  true - если запись была удалена/записи были удалены успешно
//  false - в противном случае
bool Notebook::Remove( char *surname )
{
    // проходим по массиву и удаляем все записи с данной фамилией,
    // сдвигая остальные так, чтобы они находились подряд
 
    // флаг того, что была удалена хотя бы одна запись
    bool hit = false;
 
    // индекс текущей записи в массиве при состоянии до удаления
    int old;
    // индекс текущей записи в массиве при состоянии после удаления
    int new_;
    // проходим по массиву двумя индексами
    // индекс old идет по исходному массиву, каждый раз сдвигается на следующую запись
    // индекс new_ указывает текущую позицию в массиве, 
    // полученном после удаления записей и сдвига оставшихся
    
    // когда мы встречаем запись с заданной фамилией, мы удаляем её данные,
    // шагаем индексом old на следующую, а индекс new_ не шагает,
    // таким образом мы пропускаем место, где была удаленная запись в массиве
    // так что при дальнейшем копировании записи из положения с индексом old 
    // положение с индексом new_, записи с заданной фамилией исключаются из итогового массива
    for( old = 0, new_ = 0; old < count; old++ )
    {
        // если строки равны, т.е. мы нашли искомую фамилию
        if( strcmp( notes[old].surname, surname ) == 0 )
        {
            // отмечаем, что запись была удалена
            hit = true;
            // удаляем запись с ней
            delete[] notes[old].surname;
            delete[] notes[old].phone;
        }
        else
        {
            if( new_ < old )
            {
                notes[new_].surname = notes[old].surname;
                notes[new_].phone = notes[old].phone;
            }
            new_++;
        }   
    }
    // запомним новоей количество записей в массиве
    count = new_;
    // вернем флаг того, была ли удалена хотя бы одна запись
    return hit;
}
 
// поиск записи с заданной фамилией
// surname - фамилия для поиска записи
// возвращаемое значение:
//  строка, содержащая телефон, если такая запись была найдена либо
//  0 - в противном случае
char *Notebook::Search( char *surname )
{
    // пройдемся по массиву записей и вернем телефон первой записи с фамилией, 
    // совпавшей с заданной
    for( int i = 0; i < count; i++ )
        if( strcmp( notes[i].surname, surname ) == 0 )
            return notes[i].phone;
    // если не было встречено ни одной такой записи, вернем признак неудачи
    return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru