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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lili_I
0 / 0 / 0
Регистрация: 28.06.2012
Сообщений: 9
#1

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

10.03.2013, 14:52. Просмотров 1320. Ответов 1
Метки нет (Все метки)

Разработать класс "Записная книжка". Используйте массив для хранения записей.Реализуйте методы добавления, удаления, поиска телефона по фамилии. Программа на С++

Добавлено через 13 минут
я плохо поняла тему классы, а как использовать массив вообще не поняла
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 14:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разработать класс "Записная книжка" (C++):

Реализовать класс "записная книжка" с конструктором и деструктором - C++
1. Написать класс, объектами которого являются записи в записной книжке. Каждая запись состоит из следующих полей: имя, фамилия, номер...

Разработать класс "зачетная книжка", содержащий информацию об успеваемости студентов - C++
Разработать класс "зачетная книжка" содержащий информацию о успеваемости студентов. Выполнить перегрузку оператора "<<" для этого...

Создать линейный список по уже имеющийся структуре "Записная книжка" - C++
У меня довольно таки сложная последняя лабораторная.(для меня, по крайней мере) Нужно создать линейный список по уже имеющийся...

Структура "Записная книжка" - C++
Добрый день, Задание описано ниже, но я застрял на добавлении новой записи. после ввода всех полей выдает то, что на картинке ниже....

Есть записная книжка "filestream" где есть данные людей. Надо добавить данные через map container - C++
Как добавить map в filestream и желательно примеры с файлстримами ali19158, пожалуйста, прочитайте правила форума и постарайтесь...

Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива. - C++
Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива. ...

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

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


Кликните здесь для просмотра всего текста
Функция 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 18:03
Привет! Вот еще темы с ответами:

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru