
- •ГЛАВА 7. ОСНОВЫ АЛГОРИТМИЗАЦИИ
- •1. ПОНЯТИЕ ОБ АЛГОРИТМЕ
- •2. ОСНОВНЫЕ СТРУКТУРЫ
- •2.1. Структура «следование»
- •2.2. Структура «развилка»
- •2.3. Структура «цикл»
- •3. ОСНОВНЫЕ ТИПЫ АЛГОРИТМОВ
- •3.1. Линейный алгоритм
- •3.2. Разветвленный алгоритм
- •3.3. Циклический алгоритм
- •Практические задания
- •1. Алгоритмы линейной структуры
- •2. Алгоритмы разветвляющейся структуры
- •3. Алгоритмы циклической структуры (цикл «ПОКА»)
- •4. Алгоритмы циклической структуры (цикл «ДО»)
- •ГЛАВА 8. ОСНОВЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL С++ 2005
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРОГРАММЫ
- •2. ПЕРЕМЕННЫЕ
- •3. ЛИНЕЙНАЯ ПРОГРАММА
- •3.1. Оформление линейной программы
- •3.2. Программирование в стандартизованной среде CLR
- •Практические задания
- •Русская система мер
- •4. ПРОГРАММА С ВЕТВЛЕНИЕМ
- •Практические задания
- •5. ЦИКЛ С ПАРАМЕТРОМ
- •6. ЦИКЛ «ПОКА»
- •Практические задания
- •7. ОДНОМЕРНЫЕ МАССИВЫ
- •7.1. Понятие об одномерном массиве
- •7.2. Сортировка в одномерном массиве
- •Практические задания
- •8. ДВУМЕРНЫЕ МАССИВЫ
- •8.1. Понятие о двумерном массиве
- •8.2. Датчик случайных чисел
- •Практические задания
- •9. ФУНКЦИИ
- •9.1. Понятие о пользовательских функциях
- •Рис. 8.20. Пятиугольник со сторонами a, b, c, d, f и диагоналями h,g.
- •9.2. Рекурсия
- •9.3. Вызов функции из функции
- •9.4. Функция типа void и глобальные переменные
- •9.5. Передача в функцию имени функции
- •Практические задания
- •10. СОБСТВЕННАЯ БИБЛИОТЕКА ПРОГРАММИСТА
- •10.1. Перегрузка функций
- •Рис. 8.25. Результат работы программы примера
- •11. ПЕРЕЧИСЛИМЫЙ ТИП
- •11.1. Понятие о перечислимом типе
- •11.2. Множественный выбор
- •12. УКАЗАТЕЛИ
- •12.1. Понятие об указателях
- •12.2. Указатели и функции
- •12.3. Указатели и динамические массивы
- •12.4. Указатели и перегрузка операций
- •13. ОБРАБОТКА СИМВОЛЬНЫХ СТРОК
- •13.1. Символьные переменные
- •13.2. Символьные строки (как массивы символов)
- •13.3. Обработка массивов строк
- •Практические задания
- •14. СТРУКТУРЫ
- •Практические задания
- •15. КЛАССЫ
- •15.1. Понятие класса
- •15.2. Открытые и закрытые члены класса
- •15.3. Конструкторы и деструкторы
- •Практические задания
- •Раздел А
- •Раздел Б
- •16. ФАЙЛЫ
- •16.1. Работа с текстовыми файлами
- •16.2. Работа со структурами в файлах
- •16.3. Работа с классами в файлах
- •Практические задания
- •Раздел А
- •Раздел Б
- •ПРИЛОЖЕНИЯ
- •Приложение 1. Список библиотечных функций
- •Математические функции
- •Строковые функции (для работы с символьными массивами)
- •Приложение 2. План лабораторных работ
- •ГЛАВА 9. ПРИЛОЖЕНИЯ WINDOWS FORMS
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРИЛОЖЕНИЯ
- •3. ДИНАМИЧЕСКИЕ ССЫЛКИ НА ОБЪЕКТЫ
- •3.1 Понятие о динамических ссылках.
- •3.2. Программа «Калькулятор»
- •4. ИСПОЛЬЗОВАНИЕ ТАЙМЕРА. КОМПОНЕНТ CHECKBOX
- •4.1 Таймер
- •4.2. Компонент CheckBox
- •5. СПИСКИ ВЫБОРА И ПОЛОСЫ ПРОКРУТКИ. ГРАФИЧЕСКИЕ КОМПОНЕНТЫ В C++Builder
- •5.1. Список выбора ListBox
- •5.2. Полосы прокрутки
- •5.3. Графика
- •6. РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ.
- •6.1. Чтение и запись текстового файла
- •ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
- •Раздел 1. Кнопки, метки и окна редактирования
- •Раздел 2. Радиокнопки
- •Раздел 3. Полосы прокрутки
- •Раздел 4. Обработка текстовых файлов
- •ЛИТЕРАТУРА
- •ТЕСТЫ
- •Тесты по основам алгоритмизации
- •Тесты по программированию на С++
- •Учебное издание

85
12.3. Указатели и динамические массивы
Если до начала разработки программы неизвестно, сколько в массиве элементов, в программе следует использоватьдинамические массивы. Память под них выделяется с помощью операции new в динамической области памяти во время выполнения - про граммы. Адрес начала массива хранится в переменной, называемой указателем.
Например,
int n=10;
int *a = new int[n]
Заметим, что обнуление памяти при ее выделении не происходит. Инициализировать динамический массив нельзя. Обратится к элементу динамического массива можно как обычноa[3], так и с использованием указателя *(a+3). Дело в том, что в переменной указателе хранится адрес начала массива. Для получения адреса третьего элемента к этому адресу прибавляется смещение3. Операция сложения с константой для указателей учитывает размер адресуемых элементов, т.е. на самом деле индекс умножается на длину элемента массива:
a + 3*sizeof(int)
Затем с помощью операции* (разадресации) выполняется выборка значения из указанной области памяти.
Если динамический массив в какой-то момент работы программы перестает быть нужным, и мы собираемся впоследствии использовать эту память повторно, необходимо освободить ее с помощью операции delete[], например
delete [] a;
размерность массива при этом не указывается.
Пример 12.3. Рассчитать сумму элементов правее последнего отрицательного.
//сумма элементов правее последнего отрицательного
//элемента (с использованием динамич. массива) #include <iostream>
#include <windows.h> using namespace std; int main()
{int n;
char str[256], str1[256];
AnsiToOem("введи размерность массива ",str);
86
cout<<str; cin>>n; float *a=new float[n]; int i, notr;
AnsiToOem("вводите элементы массива ",str); cout<<str;
AnsiToOem("\n сумма= ",str); AnsiToOem("\n отрицательных нет ",str1); for (i=0; i<n; i++) cin>>a[i];
notr=-1;
for (i=0; i<n; i++) if (a[i]<0) notr=i; if (notr!=-1)
{float sum=0;
for (i=notr+1;i<n;i++)sum=sum+a[i]; cout<<str<<sum;}
else cout<<str1; cout<<"\n";
return(0);
}
12.4. Указатели и перегрузка операций
Если мы вводим данные нового типа (таковым является, например, перечислимый тип), то желательно сделать так, чтобы стандартные операции для них имели тот же внешний вид. Такого рода переобозначение операций (для новых типов данных) называют перегрузкой операций. Для уяснения этого вспомните также, как мы ввели перегрузку функций (см. раздел 10.1). Общая форма для перегрузки операций имеет вид:
тип operator@ (параметр)
Здесь тип – нужный тип переменной, operator – служебное слово, @ – символическое обозначение нужной операции.
Указатели могут быть использованы и для перегрузки операций. Вспомним, пример 11.1, где мы не смогли использовать операцию инкремента. Достаточно ввести перегрузку для операции‘++’ для перечислимого типа и проблема исчезнет. Такая перегрузка имеет вид:
enum dni{Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} ;
dni operator++(dni &m) { return (m=dni(m+1));}
Тогда окончательно текст программы примера 11.1 примет вид:
// перечислимый тип - часы рабочей недели
#include <iostream>