
Цикл for
Если мы знаем точное количество действий (итераций) цикла, то можем использовать цикл for. Синтаксис его выглядит примерно так:
for (действие до начала цикла;
условие продолжения цикла;
действия в конце каждой итерации цикла) {
инструкция цикла;
инструкция цикла 2;
инструкция цикла N;
}
Итерацией цикла называется один проход этого цикла
Существует частный случай этой записи, который мы сегодня и разберем:
for (счетчик = значение; счетчик < значение; шаг цикла) {
тело цикла;
}
№9.2
#include "stdafx.h" void ArrPrint(double *, int); void Sort(double *, int); void main() { double mas[10] = {4, 54, 5, -4, 87, 31, 6, 12, 1, 7}; // инициализируем массив printf("Vvedenniy massiv \n"); ArrPrint(mas, 10); printf("\nOtsortirovanniy massiv \n"); Sort(mas, 10); ArrPrint(mas, 10); printf("\n"); } void ArrPrint(double *mas, int size) { for (int i = 0; i < size; i++) printf("%.2lf ", mas[i]); } void Sort(double *mas, int size) // Функция сортировки массива { double temp; for (int i = 0; i < size - 1; i++) for (int k = 0; k < size - 1; k++) if (mas[k] > mas[k + 1]) { temp = mas[k]; mas[k] = mas[k + 1]; mas[k + 1] = temp; } }
№10.1
Цикл while
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do...while. Синтаксис цикла while в C++ выглядит следующим образом.
while (Условие) {
Тело цикла;
}
Данный цикл будет выполняться, пока условие, указанное в круглых скобках является истиной. Решим ту же задачу с помощью цикла while. Хотя здесь мы точно знаем, сколько итераций должен выполнить цикл, очень часто бывают ситуации, когда это значение неизвестно.
Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 1000.
#include <iostream>
using namespace std;
int main()
{
setlocale(0, "");
int i = 0; // инициализируем счетчик цикла.
int sum = 0; // инициализируем счетчик суммы.
while (i < 1000)
{
i++;
sum += i;
}
cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
return 0;
}
Цикл do while
Цикл do while очень похож на цикл while. Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 1000, с применением цикла do while.
#include <iostream>
using namespace std;
int main ()
{
setlocale(0, "");
int i = 0; // инициализируем счетчик цикла.
int sum = 0; // инициализируем счетчик суммы.
do {// выполняем цикл.
i++;
sum += i;
} while (i < 1000); // пока выполняется условие.
cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
return 0;
}
Принципиального отличия нет, но если присвоить переменной i значение, большее, чем 1000, то цикл все равно выполнит хотя бы один проход.
№10.2
К>struct DISTANCE
К>{
К> int least, greatest;
К> double distance;
К>};
К>DISTANCE Distance(const double* data, int length)
К>{
К> DISTANCE d;
К> ...
К> return d;
К>}
№11.1
switch-case — это замена длинной if-else конструкции. Синтаксис:
1 2 3 4 5 6 7 8 9 10 11 12 |
switch ( <переменная> ) { case значение1: Выполнить если <переменная> == значение1 break; case значение2: Выполнить если <переменная> == значение2 break; ... default: выполнить, если ни один вариант не подошел break; } |
№11.2
floatGetFuguresS(void** ppFigures, intcount)
{ // рсчитываемая площадь
floatS = 0;
// цикл обхода заданного числа элементов массива
for(inti = 0; i < count; i++)
{
void* p = ppFigures[i]; // указатель на объект фигуры
// получаем тип фигуры из указателя на объект
Figures kind = *((Figures*)p);
switch(kind)
{
caseFCyrcle:
S += pow((float)((Cyrcle*)p)->Rad,2)*3.14;
break;
caseFRectangle:
S += ((Rect*)p)->width*((Rect*)p)->len;
break;
caseFTriangle:
{
Triangle* t = (Triangle*)p;
// полупериметр
floatpper = (t->side_a+t->side_b+t->side_c)/2;
// площадь треугольника
S+= sqrtf(pper*(pper - t->side_a)
*(pper - t->side_b)
*(pper - t->side_c));
break;
}
default:
// случай ошибки в данных
printf("Error in Сalculation of Square!!! \n");
return0;
}
}
returnS;
}
№12.1
Переменные, объявляемые внутри функций, называются локальными переменными. В некоторой литературе по С данные переменные могут называться автоматическими из-за использования ключевого слова auto. Поскольку термин локальные переменные широко используется, то далее мы будем пользоваться им. С локальными переменными могут работать только операторы, находящиеся в блоке, где данные переменные объявлены. Вне этого блока локальные переменные неизвестны. Следует помнить, что блок кода начинается открытием фигурной скобки и заканчивается закрытием фигурной скобки.
Наиболее важно понять то, что локальные переменные существуют только в блоке кода, в котором они объявлены. Таким образом, локальные переменные создаются при входе в блок и уничтожаются при выходе из него.
Наиболее типичным блоком кода, в котором объявляются локальные переменные, является функция. Например, рассмотрим две функции: void func1 (void) { int x; x= 10; ) void func2(void) { int x; x = -199; Целочисленная переменная x объявляется дважды: один раз в func1() и другой раз в func2(). х в func1() не имеет отношения к х в func2(), поскольку каждая х известна только в блоке, где произошло объявление переменной.
№12.2
Макросы - это препроцессорные "функции" , т.е. лексемы, созданные с помощью директивы #define, которые принимают параметры подобно функциям. После директивы #define указывается имя макроса, за которым в скобках (без пробелов) параметры, отделенные запятыми и определение макроса, отделенное пробелом.
Например:
#define ADD(x,y) x = x + y
если после этого написать:
int a=2;
int b=3;
ADD(a,b);
cout
то получим:
a=5 b=3
Параметры макросов лучше писать в скобках, хотя это не обязательно, но иногда отсутствие скобок приводит к неожиданным результатам. Вот пример, надеюсь все ясно, объяснять ничего не буду.
#define MACRO1(x) x * x
#define MACRO2(x) ( x ) * ( x )
int a =2;
int b=3;
cout
Директива #include дает указание компилятору читать еще один исходный файл — в дополнение к тому файлу, в котором находится сама эта директива. Имя исходного файла должно быть заключено в двойные кавычки или в угловые скобки. Например, обе директивы
#include "stdio.h"
#include <stdio.h>
№13.1
Массивы и указатели
Массивы и указатели довольно тесно связаны между собой. Имя массива можно разыменовывать, как указатель. В свою очередь, указатель можно индексировать, как массив, если это имеет смысл. Поэтому мы рассматриваем массивы и указатели в одном разделе.
Массивы
Массив по существу является совокупностью однотипных переменных (элементов массива), объединенных под одним именем и различающихся своими индексами. Массив объявляется подобно простой переменной, но после имени массива указывается число его элементов в квадратных скобках:
int myArray[8];
Массив, как и переменную, можно инициализировать при объявлении. Значения для последовательных элементов массива отделяются друг от друга запятыми и заключаются в фигурные скобки:
int iArray[8] = {7, 4, 3, 5, 0, 1, 2, 6);
Обращение к отдельным элементам массива производится путем указания индекса элемента в квадратных скобках, например:
myArray[3] = 11;
myArray[i] = iArray[7-i];
Индекс должен быть целым выражением, значение которого не выходит за пределы допустимого диапазона. Поскольку индексация массивов начинается в С всегда с нуля (т. е. первый элемент имеет индекс 0), то, если массив состоит из N элементов, индекс может принимать значения от О до N-1.
В языке С не предусмотрена автоматическая проверка допустимости значений индекса времени выполнения, поэтому при индексации массивов нужно быть внимательным. Выход индекса за границы массива может приводить к совершенно непредсказуемым результатам.
Массивы естественным образом сочетаются с циклами for. Мы приведем пример программы, работающей с массивом целых чисел. Она выполняет так называемую “пузырьковую сортировку” введенных пользователем чисел в порядке возрастания
№13.2