Циклические вычислительные процессы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Циклические вычислительные процессы



Вычислительный процесс называется циклическим, если он содержит неоднократное выполнение одной и той же последовательности действий.

 

Число повторений цикла в некоторых случаях - фиксировано, в других – определяется в процессе выполнения цикла на основе проверки некоторого условия.

 

Бывают циклы с проверкой условия перед началом выполнения цикла(циклы с предусловием), или по окончанию выполнения цикла(циклы с постусловием), или внутри цикла(с помощью оператора передачи управления).

 

Итерация - выполнения цикла один раз.

Операторы цикла состоят их заголовка и тела цикла.

Заголовок – некая конструкция, включающая в себя служебное слово.

Тело цикла – один оператор или блок, повторяющийся заданное количество раз.

 

 

Для построения цикла необходимо: инициализация, итерация, коррекция:

а) выделить переменную цикла, от которой зависит, продолжается цикл или нет.

б) до начала цикла присвоить ей правильное начальное значение.

в) построить условие продолжения цикла.

г) при каждой итерации так изменять переменную цикла так, чтобы он на определенном шаге завершился бы.

 

Реализация циклов происходит с помощью операторов: while, do while, for, continue, break, (goto).

+

Оператор цикла WHILE и его применение при программировании.

Цикл while – цикл с предусловием.

Применяется, когда количество повторов неизвестно, а известно лишь условие, при котором цикл повторяется или завершается.

Синтаксис: while (выражение)

один оператор или блок(1)

Если выражение истинно(т.е. =0), выполняется действие 1 – тело цикла; если выражение ложно, управление передается следующему за циклом оператору.

 

Пример:

1. Вычислить сумму натуральных чисел от одного до ста.

int i=1, sum=0;

while (i<=100)

{

sum +=i;

i++; // или s+=n++

}

2. Вывести на экран изображение введенного символа и его код, пока не нажата q.

char sim;

sim='a';

while(sim!='q')

{

cin>>sim;

cout<<"Vash simvol: "<<sim;

cout<<", ego kod"<<(int)sim<<endl;

 

3. Дано натуральное число, посчитать сумму цифр в числе.

int n, s=0, k;

cin>>n;

while(n!=0)

{

k=n%10;

s+=k;

n/=10;

}

cout<<s; +

Оператор цикла DO WHILE и его применение при программировании.

Цикл do while – цикл с постусловием

Применяется, когда количество повторов неизвестно, а известно лишь условие.

Синтаксис: do

один оператор или блок(1)

while (выражение);

Выполняется: сначала выполняется действие 1(тело цикла), если выражение истинно, то тело цикла выполняется повторно, если ложно, то управление передается следующему оператору.

Пример: контроль вводимых данных для 3х заданных сторон треугольника

 

double a, b, c;

do

{

cout<<"vvedite storoni ";

cin>>a>>b>>c;

}

while(!(a+b>c&&a+c>b&&c+b>a)); // 3 строки – плохие

 

 

+

Оператор цикла FOR и его применение при программировании.

Цикл for – цикл с предусловием

Используется, если известно количество повторений цикла.

Синтаксис: for (инициализация; условие; коррекция)

один оператор или блок(1)

Цикл выполняется:

а) один раз до начала цикла выполняется инициализация – один или несколько операторов,

разделенных запятой.

б) если условие цикла истинно, то выполняется действие 1, если ложно - цикл завершается.

г) выполняется коррекция – один оператор или несколько, разделенных запятой.

д) выполнение пункта б.

Любая из трех частей заголовка может отсутствовать но; писать обязательно.

Пример: выполнение цикла k раз

for (n=0; n<k; n++)

{... }

 

Задача: вычислить N!=1*2*3…*N

P – произведение, i – переменная цикла.

int main(void)

{

int N, i;

double P=1;

cin>>N;

for (i=1; i<=N; i++)

P*=i;

cout<<"N!="<<P<<endl;

return 0;

}

 

Сумма цифр от 0 до n

int main(void)

{

int i, n;

int sum = 0;

cin>>n;

for (i = 1; i <= n; i++)

sum += i;

cout << "summa ot 1 do "<<n<<" = " << sum << endl;

return 0;

} +

Операторы BREAK, GOTO, CONTINUE их применение при программировании.

Операторы передачи управления

Break continue goto

Выполнение каждого из этих операторов вызывает скачок в выполнении вычислительного процесса. Частое использование if ухудшает читаемость программы, увеличивает вероятность ошибки и затрудняет ее модификацию.

Операторы применяются в составе условных конструкций.

 

Оператор break

Применяется: для построения цикла с выходом из него изнутри тела цикла

while(1)

{

операторы

if (условие выхода из цикла)

break;

операторы

{

 

Пример:

Определить является ли простым натуральное число N.

int main(void)

{

int n, i;

cout<< "vvedite chislo: ";

cin>>n;

for (i=2; i<n; i++)

if (n%i==0)

break;

if (i==n)

cout<<"\nprostoe"<<endl;

else

cout<<"\nneprostoe"<<endl;

return 0;

}

Оператор continue

Применяется внутри тела цикла и приводит к выполнению следующей итерации, оставшаяся часть текущей итерации пропускается.

while(выражение)

{

операторы

if(условие)

continue;

операторы

}

 

Оператор continue в цикле применяется всегда в составе условного оператора, также как и break.

 

Оператор goto

Используется для передачи управления внутри одной функции от одного оператора к другому, помеченному меткой. Метка формируется как имя переменной, т.е. метка начинается с буквы и может содержать в себе буквы цифры и некоторые знаки.

Синтаксис: Не входить внутрь блока, условных операторов цикла.

goto m1;

.............

m1:

.............

 

Пример:

for (…)

for (…)

{

if (условие ошибки)

goto m1;

.............

}

............

m1:

............

 

+

Вложенные циклы.

Цикл называется вложенным, если находится в теле другого цикла.

 

Задача: из двух цифр сформировать всевозможные двузначные числа и расположить в порядке возрастания (матрица)

int j, i;

i=1;

for (i=0; i<10; i++)

{

for (j=0; j<10; j++)

cout<<i*10+j<<’ ‘;

cout<<endl;

}

return 0;

Нужно расписать вложенный цикл и показать, как он работает.

Сначала фиксируется переменная во внешнем цикле. Проверяется условие. Если условие истинно, то идём в тело этого цикла. А в теле этого цикла есть внутренний цикл. Инициализация переменной внутреннего цикла, идём внутрь этого цикла, происходит алгоритм обработки. Прокручивается внутренний цикл до конца. Потом выскакиваем во внешний цикл. Идёт коррекция, снова проверка условия, снова закручивается внутренний цикл от начала до конца.

 

Формирование пустого квадрата.

int main()

{

int n=5, m=5;

char simv = 'a';

cout<<endl;

 

for (int i=1; i<=n; i++)

{

if (i==1 || i==n) // 1-я и последняя строка

{

for (int j=1; j<=m; j++)

cout << simv; // сплошная из символов

}

else // все строки между первой и заключительной

{

cout << simv; // показать один символ

for (int j=1; j<=m-2; j++)

cout << ' ';

cout << simv; // показать ещё один символ

}

cout << endl; // новая строка

}

cout << endl;

return 0;

}

+

Указатели и адреса: описание, инициализация и операции с указателями. Применение указателей при программировании.

Указатель – это переменная, которая содержит адрес другой переменной соответствующего типа, или точнее говоря адрес первого байта памяти, выделенного под эту переменную.

Зачем нужны указатели:

· Применение указателей в некоторых случаях позволяет упростить алгоритм, повышает его эффективность.

· Обращение к памяти через адрес осуществляется быстрее.

· С помощью указателей эффективней управляем оперативной памятью. Существуют операции, которые позволяют резервировать или освобождать блоки памяти в процессе выполнения программы. – этот процесс называется управлением динамической памятью.

· Обмен данными между различными функциями осуществляется эффективней, передача массивов и дополнительных результатов из функций возможна только через указатель.

 

Для работы с данными через адрес необходимо:

1) объявить указатель

2) положить в указатель правильный адрес

3) осуществить доступ к данному через адрес

 

Объявление указателя.

Синтаксис: имя_типа*имя_ указателя;

Пример:

1. int *p1; // переменная p1 объявлена как указатель на целый тип данных, т.е. она может содержать адрес любой переменной целого типа.

2. void *p3; // переменная p3 является указателем на тип void т.е. может содержать адрес любого типа.

Инициализация указателей. Помещение в указатель правильного адреса.

Имеются несколько способов инициализации:

· в указатель помещаем адрес существующей переменной

double *p1, a; // * относится только к p1

p1=& a; // & - амперсант, операция определения адреса по имени переменной

· Инициализация указателя с помощью другого указателя, уже правильно инициализированного.

char a, *p1, *p2;

p1=&a;

p2=p1; // нельзя присваивать указатели разного типа

Указатель на тип void совместим с любым адресом

void *p3;

p3=(void*)p1;

p3=(double*)p2;

· В указатель помещаем адрес памяти, выделенной под данное динамически

Способы выделения памяти под данные:

· статическая память выделяется в момент компиляции и её объём должен быть заранее известен

· динамическая память выделяется в процессе выполнения операции new, её объём может быть вычислен или введён; освобождается память при выполнении delete

int *p1 = new int; - выделяется память под одну переменную целого типа

int *p2 = new int(5); - выделяется память под одну переменную целого типа и туда помещается значение 5

int *p3 = new int[7]; - выделяется память под семь переменных целого типа, лежащих в памяти подряд

 

В нужном месте программы выделенную память обязательно нужно освободить

delete p1;

delete p2;

delete[]p3;

Операции над указателем.

1. Операция доступа к содержимому по адресу (операция разадресации) * - унарная.

Пример:

int *p=new int;;

*p = 7; // операция разадресации - значение по адресу p равно 7.

2. К указателю на соответствующий тип можно прибавить целое число m, при этом мы сместимся в памяти вперед на m элементов. Но мы должны быть уверены, что в памяти расположены m элементов подряд.

3. От указателя на соответствующий тип можно отнять целое число n, при этом мы сместимся в памяти назад на n элементов.

4. Два адреса можно сравнить с помощью операции отношения = =,! =, <, < =, >, > =.

5. Можно найти разность между двумя указателями, и определить на каком расстоянии находится два объекта между собой. p[2]-p[4]

p-(p-4)=4

 

 

Задача.

Выделить память под 3 данных типа int, находящихся в памяти подряд, присвоить значение 1,2,3.

int *p;

p = new int[3];

*p = 1;

*(p+1) = 2;

*(p+2) = 3;

Указатель на константу:

int a=98, b=20; const int *pa;

pa=&a;// правильно

*pa=10;// ошибка

pa=&b;// правильно

 

Константный указатель:

int a=9, int b=4; int* const pa=&a;

*pa=11;

pa=&b;// ошибка

+

23.Строки в языке С++: объявление (статически), инициализация, доступ к символам строки, стандартный цикл обработки.

Строка – набор символов, завершающийся 0 символом.

Адрес строки – адрес первого символа в строке.

Со строкой работаем как с единым целым, при этом используется имя или адрес строки.

Если хотим выполнить действие над строкой, как над единым целым – ищем функцию обработки строки.

 

Статические строки

#define SIZE 80 размер строки только константное данное

или

const int SIZE=80;

char str[SIZE];

char str[SIZE]=”Hello!”; // с инициализацией

Особенность строки: объем выделенной памяти отличается от реального размера введенной строки.

Реальный размер вычисляется.

 

Как определить адрес символа строки?

Имя строки является константным адресом строки.

str+i – адрес символа с индексом i (i=0, с шагом 1)

 

Как определить значение символа строки?

*(str+i) или str[i]

 

Динамические строки

Размерность может быть константой или переменной.

#define SIZE 80

или

const int SIZE=80

или

int SIZE=80;

или

cin>>SIZE;

char *p;

p=new char[SIZE];

delete []p;

Особенность – без инициализации

 

Как определить адрес символа строки?

p+i – адрес элемента с индексом i

*(p+i) – значение элемента с индексом i

p[i] – значение элемента с индексом i

 



Поделиться:


Последнее изменение этой страницы: 2016-06-06; просмотров: 850; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.151.231 (0.094 с.)