Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Эквивалентные преобразования логических выражений




Несколько замечаний относительно эквивалентных преобразований логических выражений, часто используемых в программах:

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

// Цикл обнаружения пары последовательных значений «меньше 0 - больше 0»

for (i=1; i<20 &&! ( A[i-1]<0 && A[i]>0 ); i++);

· оператор прерывания цикла break по условию, размещенный в начале тела цикла, может быть вынесен в заголовок цикла в виде инвертированного условия продолжения цикла, объединенного с имеющимся ранее по И;

for (int i=0; i<20; i++){      // До конца массива

   if (A [ i ]<0) break;     // Отрицательный – выход

...}

for (int i =0; i <20 && A [ i ] >= 0){ // Пока не кончился массив

...}                           // И элемент неотрицательный

· инверсия условий, объединенных по И, раскрывается как объединение по ИЛИ обратных условий и наоборот:

                      // Цикл прекращается, когда одновременно оба равны 0

for (i =1;! (A [ i -1]==0 && A [ i ]==0); i ++)...

                                                          // Цикл продолжается, пока хотя бы один не равен 0

for (i=1; A[i-1]!=0 || A[i]!=0; i++)...

-----------------------------------------------------------------------------------------

Циклические алгоритмы

В программировании выделяют следующие типы циклических алгоритмов:

· цикл с параметром (число итераций известно или легко определяется); например, вычисление суммы или произведения конечного числа слагаемых, вычисление значения функции в точках некоторого отрезка, выполнение операций над массивами размера N и т.д.

· итерационный цикл (число итераций неизвестно, работа цикла организуется на основе некоторого условия повторения); например, вычисление суммы бесконечного числа слагаемых.

 

Большинство языков программирования предоставляют дополнительные средства для управления циклом, например, операторы досрочного завершения цикла, то есть выхода из цикла независимо от истинности условия выхода (в Си++ – break) и операторы пропуска итерации (в Си++ – continue).

В лабораторной работе мы рассмотрим циклы каждого из этих видов и их реализацию средствами С и С++ (циклы while, do while, for).

     
 


-----------------------------------------------------------------------------------------

Цикл с параметром

Организация цикла с параметром включает этапы:

подготовку к выполнению цикла:

• выбор параметра (управляющей переменной) цикла;

                     -определение начального и конечного его значений;

                          -инициализацию параметра цикла  начальным
                            значением;

                          -определение правила изменения значения параметра цикла;

                     -определение условия повторения цикла;                

определение тела цикла (действий, выполняемых в цикле)

подготовку к очередному шагу выполнения цикла (модификация  параметра цикла).

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

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

Изменение параметра цикла можно записать так: x = xn (h) xk –  параметр цикла х изменяется от начального значения xn с шагом h до конечного значения xk, т.е. параметр х принимает значения xn, xn+h, xn+2*h, …, xn+k*h; или можно рассматривать иначе:

x=xn;

x=х+h; (выполняется в цикле, пока х ≤ xk;)

                                      xn           xn+h         xn+2*h     xk=xn+k*h

                                    x=xn            x+h             x+h          x+h 

 

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

 

Программа для вычисления и вывода на печать с помощью цикла while таблицы значений функции у = а*х2 при а =17.7, х изменяется от xn = 25.5 до xk = 35.5 с шагом h = 1.0.

#define _USE_MATH_DEFINES

#include <math.h>    //включение заголовков математических функций

#include <stdio.h> //включение заголовков функций ввода/вывода               

#include <conio.h> //включение заголовка функции _getch()    

 

int main ()

{

double a = 17.7, xn = 25.5, xk = 35.5, x, y, h = 1.0;

                          // xn – начальная точка отрезка, xk – конечная точка отрезка

const double X _ end = xk + h/2; //чтобы не делать проверку в цикле
                                           // на точное равенство с xk

x = xn;

 

while (x < X_end)     

   {

          y = a*x*x; //вычисление значения функции в точке

     printf ("x=%7.2lf y=%10.2lf\n", x, y);

     x += h;     //переход к следующей точке

         _getch(); //для просмотра результатов вывода на экране, каждое

                      // следующее значение выводится после нажатия произвольной клавиши

}

return 0; 

}

Результат работы:

x= 25.50 y= 11509.42

x= 26.50 y= 12429.82

x= 27.50 y= 13385.63

x= 28.50 y= 14376.82

x= 29.50 y= 15403.42

x= 30.50 y= 16465.42

x= 31.50 y= 17562.82

x= 32.50 y= 18695.63

x= 33.50 y= 19863.82

x= 34.50 y= 21067.42

x= 35.50 y= 22306.42

 

-----------------------------------------------------------------------------------------

Вычисление аn

Рассмотрим последовательность операторов для вычисления р = аn при а=2, n=3:

int n = 3, a = 2;

int p = 1, k = n;

while (k > 0)

{ p *= a; 

  k --;

}

Выполним цикл по шагам. В виде комментариев указано состояние памяти в конце очередной итерации при выполнении цикла:

n=3; a =2;
p=l;      k=3;                                   
                     //вход в цикл                                          à проверка условия  k>0:  true;
                                   //выполнение тела цикла
р=1*2; k=3-l;                                      // p=2;  k=2
     
                   /*повторная проверка выполнения условия
                                                                                         à проверка условия k>0: true;  */
                             //выполнение тела цикла
p=2*2; k=2-l;                              // p=4;  k=l
                            /*повторная проверка выполнения условия
                                                                                         à проверка условия k>0: true; */
                                //выполнение тела цикла
р=4*2; k=l-l;                              // p=8; k=0
                         
/*повторная проверка выполнения условия }
                                                                                         à проверка условия k>0: false, */
                                //завершение цикла

 

 

При а=2, n=0 процесс выглядит так:

р=1; k=0;
                      //вход в цикл à проверка условия k>0: false;
                      //завершение цикла без выполнения его тела

 

-----------------------------------------------------------------------------------------

Проверьте себя. Проанализируйте работу цикла while  в следующих примерах:

int x, y, z;

x = y = 0;

while (y < 10) ++y; x += y; printf ("%d %d\n", x, y); //x=10, y=10

 

x = y = 0;

while (y < 10) x += ++y; printf ("%d %d\n", x, y);  //x=55, y=10

 

y = 1;

while (y < 10) {x = y++; z = ++y;} printf ("%d %d %d\n", x, y, z);
                                                       //x=9, y=11, z=11

-----------------------------------------------------------------------------------------

Программа для вычисления и вывода на печать с помощью цикла do while таблицы значений функции у = а*х2 при а =17.7, х изменяется от xn = 25.5 до xk = 35.5 с шагом h = 1.0.

 

#define _USE_MATH_DEFINES

#include <math.h> //включение заголовков математических функций

#include <stdio.h> //включение заголовков функций ввода/вывода               

#include <conio.h> //включение заголовка функции _getch()    

 

int main ()

{

double a = 17.7, xn = 25.0, xk = 35.0, x, y, h = 0.5;

const double X _ end = xk + h/2; //чтобы не делать проверку в цикле
                                 // на точное равенство с xk 

  x = xn;

do            

{

     y = a*x*x;

printf ("x=%7.2lf y=%10.2lf\n", x, y);

_getch(); //для задержки результатов вывода на экране, каждое

             // следующее значение выводится после нажатия произвольной клавиши

x += h;//очередная точка отрезка отсчитывается от предыдущей!!!  

 

} while (x < X_end);

return 0;

}

-----------------------------------------------------------------------------------------

Программа для вычисления и вывода на печать с помощью цикла for таблицы значений функции у = а*х2 при а =17.7, х изменяется от xn = 25.5 до xk = 35.5 с шагом h = 1.0.

 

#define _USE_MATH_DEFINES

#include <math.h> //включение заголовков математических функций

#include <stdio.h> //включение заголовков функций ввода/вывода               

#include <conio.h> //включение заголовка функции _getch()    

 

int main ()

{ double  a = 17.7, xn = 25.5, xk = 35.0, x, y, h = 0.5;

const double X _ end = xk+h/2; //чтобы не делать проверку в цикле
                                        // на точное равенство с xk

for (x = xn; x < X_end; x+=h)

  { y = a * x * x;

printf ("x=%7.2lf y=%10.2lf\n", x, y);

_getch();

}

return 0;

}

или

 

#define _USE_MATH_DEFINES

#include <math.h> //включение заголовков математических функций

#include <stdio.h> //включение заголовков функций ввода/вывода               

#include <conio.h> //включение заголовка функции _getch()    

 

int main ()

{

double a = 17.7, xn = 25.5, xk = 35.0, x, y, h = 0.5;

const double X _ beg = xn - h/2; //чтобы не делать проверку в цикле
                                          // на точное равенство с xn

for (x = xk; x > X_beg; x -= h)   

   {

           y = a * x * x;

     printf ("x=%7.2lf y=%10.2lf\n", x, y);

     _getch();

}

return 0;

}

 

Или

 

#define _USE_MATH_DEFINES

#include <math.h> //включение заголовков математических функций

#include <stdio.h> //включение заголовков функций ввода/вывода               

#include <conio.h> //включение заголовка функции _getch()    

int main ()

{

  double a = 17.7, x, y, h = 0.5, xn = 25.5, xk = 35.0;

  const int k = int((xk-xn)/h)+1; //или floor ((xk-xn)/h)+1;     

  x = xn;

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

{

      y = a * x * x;

   printf ("x=%7.2lf y=%10.2lf\n", x, y);

     x += h;

_getch();

}

return 0;

}

-----------------------------------------------------------------------------------------

Итерационные циклы

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

Итерационный цикл - цикл, в котором число его повторений и поведение программы на каждом шаге цикла зависят от результатов, полученных на предыдущих шагах.

 





Поделиться с друзьями:


Дата добавления: 2018-10-15; Мы поможем в написании ваших работ!; просмотров: 612 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Стремитесь не к успеху, а к ценностям, которые он дает © Альберт Эйнштейн
==> читать все изречения...

2906 - | 2839 -


© 2015-2026 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.