- •О.Л. Викентьева, А.Н. Гусин, O.A. Полякова
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
- •1. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •10.1. Базовые конструкции структурного программирования
- •10.3. Составные операторы
- •10.4. Операторы выбора
- •10.5. Операторы циклов
- •10.6. Операторы перехода
- •11. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ ОСНОВНЫХ ОПЕРАТОРОВ C++
- •11.2. Программирование арифметических циклов
- •11.3. Программирование итерационных циклов
- •11.4. Программирование вложенных циклов
- •12. МАССИВЫ
- •12.1. Определение массива в C/C++
- •12.2. Примеры решения задач с использованием массивов
- •13. УКАЗАТЕЛИ
- •13.1. Понятие указателя
- •13.2. Динамическая память
- •13.3. Операции с указателями
- •14. ССЫЛКИ
- •15.3. Динамические массивы
- •СИМВОЛЬНАЯ ИНФОРМАЦИЯ И СТРОКИ
- •16.1. Представление символьной информации
- •16.2. Библиотечные функции для работы со строками
- •16.3. Примеры решения задач с использованием строк
- •17. ФУНКЦИИ В C++
- •17.1. Объявление и определение функций
- •17.2. Прототип функции
- •17.3. Параметры функции
- •17.4. Локальные и глобальные переменные
- •17.5. Функции и массивы
- •17.5.1. Передача одномерных массивов как параметров функции
- •17.5.2. Передача строк в качестве параметров функций
- •17.5.3. Передача многомерных массивов в функцию
- •17.6. Функции с начальными значениями параметров (по умолчанию)
- •17.7. Подставляемые (inline) функции
- •17.8. Функции с переменным числом параметров
- •17.9. Рекурсия
- •17.11. Шаблоны функций
- •17.12. Указатель на функцию
- •17.13. Ссылки на функцию
- •18. ТИПЫ ДАННЫХ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ
- •18.1. Переименование типов
- •18.2. Перечисления
- •18.3. Структуры
- •18.3.1. Работа со структурами
- •18.3.2. Битовые поля
- •18.3.3. Объединения
- •19. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
- •19.1. Создание элемента списка
- •19.2. Создание списка из п элементов
- •19.3. Перебор элементов списка
- •19.4. Удаление элемента с заданным номером
- •19.5. Добавление элемента с заданным номером
- •19.6. Двунаправленные списки
- •19.7. Очереди и стеки
- •19.8. Бинарные деревья
- •19.9. Обход дерева
- •19.10. Формирование дерева
- •19.11. Удаление элемента из дерева
- •19.12. Обработка деревьев с помощью рекурсивного обхода
- •20. ПРЕПРОЦЕССОРНЫЕ СРЕДСТВА
- •20.1. Стадии и команды препроцессорной обработки
- •20.2. Директива #define
- •20.3. Включение текстов из файлов
- •20.4. Условная компиляция
- •20.5. Макроподстановки средствами препроцессора
- •21.1. Проектирование программы
- •21.2. Кодирование и документирование программы
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
11.4. Программирование вложенных циклов
Тело цикла может содержать любые операторы, в том числе и другие циклы. Оператор цикла, который содержится в теле другого цикла, называется вложенным.
Задача № 6. Напечатать N простых чисел. Разделим эту задачу на две подзадачи:
1)определить является ли число простым;
2)напечатать п чисел, удовлетворяющих заданному условию. Простым называется число, которое делится только само на себя
ина единицу (сама единица простым числом не является). Тогда, чтобы определить, является число простым или нет, нужно прове рить, есть ли у него другие делители. Для этого будем делить число К на все числа от 2 и до К, используя цикл с постусловием. Если К раз делится на d без остатка, только когда d станет равно К, значит, чис ло простое:
d=l;//начальное значение делителя
do
{
d++;//увеличиваем делитель
}
/*цикл выполняется, пока остаток от деления К
на d не равен 0 (не делится)*/ while(K%d!=0);
if(K==d)//делитель равен К, т.е. число простое cout<<a<<"
Для решения второй подзадачи, нам нужно перебирать все чис ла, начиная с 2, и печатать только те, которые являются простыми. При этом нужно подсчитывать напечатанные числа. Выполнение цикла закончится, когда будет напечатано п чисел.
К=1;//присваиваем начальное значение числу //выполняем цикл, пока не будет напечатано п чисел
for(int i=0;i<n;)
{
K++;//берем следующее число if (К простое число)
i++;//увеличиваем счетчик простых чисел
}
Объединив эти два фрагмента вместе, получим решение постав ленной задачи:
#include<iostream.h> void main()
{
int K=l,n,d; cout<<"\nEnter N"; cin>>n;
//неправильно задано число n if(n<l) {
cout«"\nerror in data"; return;//завершение программы
}
for(int i=0;i<n;)//внешний цикл
{
K++;d=l;
do //внутренний цикл
{
d++;
}
while(K%d!=0);//конец внутреннего цикла if(K==d){
cout<<K<<" i++; }
}//конец внешнего цикла
}
Тесты:
n = 0 |
Error in data |
|
П = |
1 |
2 |
n = |
5 |
10 |
12.МАССИВЫ
Вязыке C/C++, кроме базовых типов, разрешено вводить и ис пользовать производные типы, полученные на основе базовых. Стан дарт языка определяет три способа получения производных типов:
1)массив элементов заданного типа;
2)указатель на объект заданного типа;
3)функцию, возвращающую значение заданного типа.
Массив - это упорядоченная последовательность переменных одного типа. Каждому элементу массива отводится одна ячейка па мяти. Элементы одного массива занимают последовательно располо женные ячейки памяти. Все элементы имеют одно имя - имя массива и отличаются индексами - порядковыми номерами в массиве. Коли чество элементов в массиве называется его размером. Чтобы отвести в памяти нужное количество ячеек для размещения массива, надо заранее знать его размер. Резервирование памяти для массива выпол няется на этапе компиляции программы.
12.1. Определение массива в C/C++
Массивы определяются следующим образом: |
|
||||
i n t |
а [1 0 0 ];//м асси в из 100 |
элем ентов |
целого типа |
||
Операция s i z e o f (а) |
даст результат 400, т.е. |
100 элементов по |
|||
4 байта. |
|
|
|
|
|
Элементы массива всегда нумеруются с 0. |
|
||||
| 45 | |
352 |
63 |
124 |
значения элементов массива |
|
0 |
1 |
Т |
99 |
индексы элементов массива |
|
|
|
|
|
Рис. 8. Размещение массива в памяти
Чтобы обратиться к элементу массива, надо указать имя массива
иномер элемента в массиве (индекс) (рис. 8):
а[ 0] - индекс задается как константа;
а [ 55] - индекс задается как константа;
а[i] —индекс задается как переменная;
а[2*i ] - индекс задается как выражение.
Элементы массива можно задавать при его определении: int а[10]={1,2,3,4,5,6,7,8,9,10};
Операция sizeof (а) даст результат 40, т.е. 10 элементов по4 байта, int а[10]={1,2,3,4,5};
Если количество начальных значений меньше, чем объявленная длина массива, то начальные элементы массива получат только пер вые элементы.
int а[]={1,2,3,4,5};
Операция sizeof (а) даст результат 20, т.е. 5 элементов по 4 байта. Длина массива вычисляется компилятором по количеству значений, перечисленных при инициализации.
12.2. Примеры решения задач с использованием массивов
Задача № 1. Формирование массива с помощью датчика случай ных чисел.
Для того чтобы сформировать массив, необходимо организовать цикл для перебора элементов массива. Для формирования каждого элемента вызывается функция rand (), которая возвращает псевдо случайное число из диапазона от 0 до 32767. Чтобы получить значе ния из диапазона от 0 до 100, используется операция получения ос татка от деления %. Если нужно получить не только положительные, но и отрицательные числа, вычитается число к, равное половине от требуемого диапазона.
а [ I ] = ra n d ()% 1 0 0 -5 0 ;//ч и с л а и з диапазона - 5 0 ..4 9 . Чтобы использовать функцию ra n d (), надо подключить биб
лиотечный файл < s t d l i b . h>
#include <iostream.h>
#include <stdlib.1э>//файл с описанием функции //rand()
void main()
{
int a [100]; int n;
cout<<"\nEnter the size of arraycin>>n; for(int I=0;I<n;I++)
{
a[I]=rand()%100;//числа из диапазона 0..100 cout<<a[I]<<" ";//вывод элемента массива
}
}
Задача № 2. Найти максимальный элемент массива.
Для решения этой задачи нужно сформировать массив, присво
ить начальное значение в переменную max, в качестве начального значения выступает первый элемент массива, а затем сравнить каж дый элемент массива с переменной шах. Если значение элемента бу дет больше max, то оно записывается в шах и последующие элемен
ты сравниваются уже с этим значением. |
|
|||
#in c lu d e c io s tr e a m .h > |
|
|||
#in c lu d e |
< s t d l ib . h > |
|
||
v o id |
m a in () |
|
|
|
{ |
|
|
|
|
i n t |
a [100] ; |
|
|
|
i n t |
n; |
|
|
|
c o u t « " \ n E n t e r th e s i z e o f a r r a y : " ; |
||||
c i n » n ; |
|
|
|
|
f o r ( i n t |
1 = 0 ;I< n ;I+ + ) //з а п о л н е н и е |
м а сси в а |
||
{ |
|
|
|
|
a [I]=rand()%100—5 0 ; |
|
|||
cout<<a[I]<<" |
|
|
||
} |
|
|
|
|
i n t |
m ax = a[0 ]; |
//з а д а е м н ач ал ьн о е |
зн ач ен и е max |
|
f o r ( I = l ; I < n ; I + + ) |
|
|||
//с р а в н и в а е м |
элементы м асси в а c max |
|||
i f (а [ I ] >max)m ax=a[ I ] ; |
|
|||
cout<<"\nM ax="<<m ax; |
|
|||
} |
|
|
|
|
Задача № 3. Найти сумму элементов массива с четными индексами. Для решения этой задачи можно предложить несколько способов.
1.Массив перебирается с шагом 2, и все элементы суммируются.
2.Массив перебирается с шагом 1, и суммируются только эле менты, имеющие четные индексы. Для проверки на четность исполь зуется операция получения остатка от деления на 2.
//П ервы й способ
# in c lu d e c io s tr e a m .h > #in c lu d e c s t d l i b . h>
v o id |
m a in () |
{ |
|
i n t |
a [1 0 0 ]; |
i n t |
n; |
c o u t « " \ n E n t e r t h e s i z e o f a r r a y : " ;
c i n » n ;
for (int 1=0; Kn; I++)
{
//заполнение массива случайными числами а [I]=rand()%100-50;
cout<<a [I]« " ";
}
int Sum=0;
f o r ( 1 = 0 ; I < n ; I+ = 2 )
//суммируются элементы с индексами 0, 2, 4, и т.д. Sum+=a[I];
cout«"\nSum="«Sum";
}
/ / В т о р о й с п о с о б
# i n c l u d e < i o s t r e a m . h >
#include <stdlib.h> void main()
{
int a [100]; int n;
c o u t « " \ n E n t e r t h e s i z e o f a r r a y : " ; c i n » n ;
for(int 1=0;I<n;I++)
{
//заполнение массива случайными числами а [I]=rand()%100—50;
cout«a [I] <<" ";
}
int Sum=0;
for (1=0; Kn; I++)
i f ( I%2==0)
//суммируются элементы с индексами 0, 2, 4, и т.д.
Sum+=a[I];
cout«"\nSum="«Sum" ;
}