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

Задача из Лафоре - C++

Восстановить пароль Регистрация
 
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
10.07.2013, 19:43     Задача из Лафоре #1
Для разъяснения действия наших доморощенных указателей мы смоделируем память компьютера с помощью массивов. Так как доступ к массивам всем понятен, то вы сможете увидеть, что реально происходит, когда мы используем для доступа к памяти указатели.
Мы будем использовать один массив типа char для хранения всех типов переменных. Именно так устроена память компьютера: массив байтов, каждый из которых имеет адрес.
Однако С++ не позволит нам хранить данные типа float или int в массиве типа char обычным путем (мы можем использовать объединения, но это другая история). Поэтому мы создадим симулятор памяти, используя отдельный массив для каждого типа данных, которые мы хотим сохранить. В этом упражнении мы ограничимся одним типом float, и нам понадобится массив для него. Назовем этот массив fmemory. Однако значения указателей (адреса) тоже хранятся в памяти, и нам понадобится еще один массив для их хранения. Так как в качестве модели адресов мы используем индексы массива, то нам потребуется массив типа int, назовем его pmemory, для хранения этих индексов.
Индекс массива fmemory (назовем его fmem_top) показывает на следующее по очереди доступное место, где можно сохранить значение типа float. У нас есть еще похожий индекс массива pmemory(назовем его pmem_top). Не волнуйтесь о том, что наша “память” может закончиться. Мы предполагаем , что эти массивы достаточно большие, чтобы хранить все, что мы захотим, и нам не надо заботиться об управлении памятью.
Создадим класс Float, который мы будем использовать для моделирования чисел типа float, которые будет храниться в fmemory вместо настоящей памяти. Класс Float содержит поле, значением которого является индекс массива fmemory, хранящего значения типа float. Назовем это поле addr. В классе также должны быть два метода. Первый- это конструктор, имеющий один аргумент типа float для инициализации значения. Конструктор помещает значение аргумента в элемент массива fmemory, на который указывает указатель fmem_top, а затем записывает значение fmem_top в массив addr. Второй метод является перегружаемой операцией &. Он просто возвращает значение указателя (индекса типа int ) в addr.
Создадим второй класс ptrFloat. Объект этого класса содержит адрес(индекс) в pmemory. Метод класса инициализирует этот “указатель” значеним типа int. Второй метод перегружает операцию * (операция разыменования). Его действие более сложны. Он получает адрес из массива pmemory, в котором хранится адреса. Затем полученный адрес используется как индекс массива fmemory для получения значения типа float, которое располагалось по нужному нам адресу.
C++
1
2
3
4
Float& ptrFloat::operator*()
{
    return fmemory[ pmemory[addr] ];
}
Таким образом мы моделируем действия операции разыменования (*). Заметим, что вам нужно возвращаться из этой функции по ссылке, чтобы можно было использовать * слева от знака равно.
Классы Float и ptrFloat похожи, но класс Float хранит данные типа float в массиве, представляющем собою память, а класс ptrFloat хранит поля типа int (являющееся у нас указателями, но на самом деле индексами массива) в другом массиве, который тоже представляет собой память.
Это типичное использование этих классов в функции main():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Float var1=1.234;
Float var2=5.326;
 
ptrFloat ptr1=&var1;
ptrFloat ptr2=&var2;
 
cout<<*ptr1=<<*ptr1<<endl;
cout<<*ptr2=<<*ptr2<<endl ;
 
*ptr1=7.123 ;
*ptr2=8.456 ;
 
cout<<*ptr1=<<*ptr1<<endl;
cout<<*ptr2=<<*ptr2<<endl ;
Заметим, что за исключением других имен типов переменных, это выглядит так же, как действия с настоящими переменными. Далее результат работы программы:
C++
1
2
3
4
5
*ptr1=1.234 ;
*ptr2=5.678 ;
 
*ptr1=7.123 ;
*ptr2=8.456 ;
Добавлено через 3 часа 2 минуты
актуально
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2013, 19:43     Задача из Лафоре
Посмотрите здесь:

C++ Лафоре задача по классам
Лафоре,задача про денежный тип C++
C++ Сокращение программы, приводит к другому результату. Лафоре 3 глава, 3 задача
Задача из Лафоре C++
Лафоре. Глава 11. Задача 2 C++
C++ Не компилируется задача из Лафоре
C++ Очередь (задача из Лафоре)
Задача 7 главы 7 из книги Р. Лафоре. Строки C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferz_
Сообщений: n/a
25.07.2013, 01:05     Задача из Лафоре #2
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
#include <iostream>
 
using namespace std;
 
const int MAX=10;
 
float fmemory[MAX];
int pmemory[MAX];
int fmem_top=0;
int pmem_top=0;
 
class Float
{
    int addr;
public:
    Float(float n)
    {
        fmemory[fmem_top]=n;
        addr=fmem_top;
        fmem_top++;
    }
    int operator&();
};
 
class ptrFloat
{
    int addr;
public:
    ptrFloat(int n)
    {
        pmemory[pmem_top]=n;
        addr=pmem_top;
        pmem_top++;
    }
    float& operator*();
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Float var1 = 1.234;  // определяем и инициализируем
    Float var2 = 5.678;  // две вещественные переменные
    ptrFloat ptr1 =&var1;  // определяем и инициализируем
    ptrFloat ptr2 = &var2;  // два указателя
    cout << " *ptr1 =" <<*ptr1; // получаем значения переменных
    cout << " *ptr2 = " <<*ptr2; // и выводим на экран
    *ptr1 = 7.123;  // присваиваем новые значения
    *ptr2 = 8.456;  // переменным, адресованным через указатели
    cout << " *ptr1 =" << *ptr1; // снова получаем значения
    cout << " *ptr2 = " <<*ptr2; // и выводим на экран
    return 0;
}
 
int Float::operator&()
{
    return addr;
}
 
float& ptrFloat::operator*()
{
    return fmemory[pmemory[addr]];
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2013, 01:46     Задача из Лафоре #3
Цитата Сообщение от Valentina Посмотреть сообщение
актуально
много текста. вопрос то какой?
Yandex
Объявления
25.07.2013, 01:46     Задача из Лафоре
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru