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

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

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

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

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

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

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

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

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

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

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

Разработать класс для понятия "Генератор шума" - C++
Разработать класс для понятия "Генератор шума" для генерации дискретных значений белого шума вида y(t)=yc+A*E(t)),ult E(ti) - случайная...

Разработать класс, обьект которого реализует "пользовательский" тип данных - C++
Помогите сдать экзамен, не было времени подготовится) могу даже оплатить работу если угодно. Задача Разработать класс, обьект...

Разработать класс "Строка" и реализировать операции для работы подстроками - C++
Разработать класс "Строка" и реализировать операции вставки подстрочки в строчку и ее удаление, способы вывода.

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

Разработать класс "Cmp", обеспечивающий нахождение НОД и НОК двух чисел - C++
Кто может помогите пожалуйста. Не могу разобраться в классах Перепишите задачу в сообщение

Разработать класс "Счет физического лица" и обеспечить возможность работы с ним - C++
-продумать атрибуты класса и инкапсулировать их в закрытой части интерфейса класса; -определить в классе по крайней мере три...

Разработать класс "Полином" , в котором информация о коэфициентах хранится в виде списка - C++
Разработать класс "Полином" , в котором информация о коэфициентах хранится в виде списка. Реализовать для класса методы ввода вывода,...

Разработать класс "студенческая группа". Предусмотреть возможность работы с переменным числом студентов - C++
Помогите доделать, пожалуйста. #include <iostream.h> #include <conio.h> #include <process.h> #include <fstream.h> #include...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoldenId
125 / 123 / 32
Регистрация: 11.11.2010
Сообщений: 639
Записей в блоге: 12
Завершенные тесты: 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;
}
Yandex
Объявления
10.03.2013, 18:03     Разработать класс "Записная книжка"
Ответ Создать тему
Опции темы

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