Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Организация циклов с параметром





Лабораторная работа 2

Циклы

(для выполнения лабораторной работы №2 необходимо проработать материал лекций №№ 5-6 и разобрать примеры, приведенные в данной методичке)

Организация циклов с параметром.. 2

Цикл while в циклах с параметром.. 2

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

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

Подсчет количества цифр в числе N.. 2

Вычисление значений функции на отрезке. 3

Вычисление на отрезке значений функции с условием и оформление результатов. 3

Вычисление на отрезке значений функции с условием и оформление результатов в виде таблицы (в стиле С++) 4

Цикл do-while в циклах с параметром.. 5

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

Калькулятор. 5

Проверка входных данных. 6

Вычисление значений функции на отрезке. 7

Вычисление на отрезке значений функции с условием и оформление результатов. 7

Цикл for в циклах с параметром.. 7

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

Вывод на экран кодов символов. 8

Приостановка выполнения программы на n секунд. 8

Получение натуральных делителей числа N.. 9

Проверка, является ли натуральное число N простым.. 9

Вычисление значений функции на отрезке. 9

Вычисление на отрезке значений функции с условием и оформление результатов. 10

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

Цикл while в итерационных циклах. 11

Вычисление числа π. 11

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

Вычисление значения многочлена на отрезке (схема Горнера) 13

Разложение функции на отрезке в ряд Тейлора. 14

Организация работы с последовательностью чисел, вводимых с клавиатуры.. 16

Корректная организация циклов. 17

Оптимизация программы.. 17

Примеры граф-схем алгоритмов. 20

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

Алгоритмы циклов с параметром.. 20

Алгоритм типа «развилка, вложенная в цикл с параметром». 22

Алгоритмы итерационных циклов. 23

Алгоритмы с вложенными циклами. 26

Алгоритм вложенного цикла с развилкой. 27

 

 

Организация циклов с параметром

Цикл while в циклах с параметром

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

 

//вариант_1

const int N=10;

int main ()

{ int i=1, summa=0; //определение и инициализация переменных

// i является одновременно и счетчиком цикла

while (i<=N)

{ summa += i; //вычисление суммы

i++; //получение нового числа

}

cout << summa<< endl;

_getch();

return 0;

}

 

//вариант_2

const int N=10;

int main ()

{ int i=1, summa=0; //определение и инициализация переменных

//i является одновременно и счетчиком цикла

while (i<=N)

summa += i++; //вычисление суммы и получение нового числа

cout << summa<< endl;

_getch();

return 0;

}

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

#include <LIMITS.H> //LONG_MAX

int main ()

{int p=0; //искомая степень

float x=1.; //тип float позволяет иметь значение x до 3.4*10^38

while (x < LONG_MAX) // x< 2 147 483 648



{x*=100.;

p++;

}

cout << setiosflags(ios::fixed)<< x/100. << setw(8) <<p-1 <<endl;

getch();

return 0;

}

Подсчет количества цифр в числе N

//найти количество и сумму цифр числа

int main()

{

int N=123456;

int sum=0, k=0;

while (N>0)

{sum += N%10;

N /=10;

k++;

}

cout << k << " " << sum << endl; //6 21

_getch();

return 0;

}

Вычисление значений функции на отрезке

Составим программу для вычисления и вывода на печать таблицы значений функции у = а*х2 при а =17.7, х изменяется от x0 = 5.5 до xn = 35.0 с шагом h = 0.5 с помощью цикла while.

int main ()

{double a=17.7, x0=5.5, xn=35.0, x, y, h=0.5;

const double X_end = xn+h/2 ; //35.0+h/2, чтобы попала точка 35.0

x= x0;

while (x < X_end)

{ y = a*x*x;

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

x+=h;

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

 

}

 

return 0;

}

Вычисление на отрезке значений функции с условием и оформление результатов

Составим программу для вычисления и вывода на печать таблицы значений функции с условием у(х), если х изменяется от x0 = 2.0 до xn = 5.0 с шагом h=0.5 с помощью цикла while.

int main()

{

double x0=2.0, xn=5.0, x, y, h=0.5;

const double X_end = xn+h/2 ; //5.0 +h/2, чтобы попала точка 5.0

 

//////////////////////////////////////////////////////////////////////

printf("\nwhile:\n");

printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",

218,196,196,196,196,194,196,196,196,196,196,196,196,196,196,191);

printf ("%c x %c y %c\n",179, 179, 179);

x=x0;

while (x< X_end)

{ if (x<=3.5) y=cos(x);

else y=sin(x);

printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",

195,196,196,196,196,197,196,196,196,196,196,196,196,196,196,180);

printf("%c%4.2lf%c%9.5lf%c\n", 179, x, 179, y, 179);

x+=h;

}

printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",

192,196,196,196,196,193,196,196,196,196,196,196,196,196,196, 217);

_getch();

return 0;

}

 

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

 

while:

┌────┬─────────┐

│ x │ y │

├────┼─────────┤

│2.00│ -0.41615│

├────┼─────────┤

│2.50│ -0.80114│

├────┼─────────┤

│3.00│ -0.98999│

├────┼─────────┤

│3.50│ -0.93646│

├────┼─────────┤

│4.00│ -0.75680│

├────┼─────────┤

│4.50│ -0.97753│

├────┼─────────┤

│5.00│ -0.95892│

└────┴─────────┘

 

Вычисление на отрезке значений функции с условием и оформление результатов в виде таблицы (в стиле С++)

Составим программу для вычисления и вывода на печать таблицы значений функции с условием у(х), если х изменяется от x0=2.0 до xn=5.0 с шагом h=0.5 с помощью цикла while.

 

#include <iomanip>

#include <math.h>

int main()

{

double x0=2.0, xn=5.0, x, y, h=0.5;

const double X_end = xn+h/2 ; //5.0+h/2, чтобы попала точка 5.0

char c,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10;

c=char(196); c1=char(218); c2=char(194); c3=char(191);

c4=char(179); c5=char(195); c6=char(197); c7=char(180);

c8=char(192); c9=char(217); c10=char(193);

cout<<c1<<c<<c<<c<<c<<c<<c2<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c3<<'\n';

cout<<c4<<" x " << c4 << " y " << c4 << '\n';

int i=0;

x=x0+i*0.5;

while (x < X_end)

{

if (x<=3.5)

{double r=cos(x);

y=r*r;

}//end_if

else

{

y=sin(x)*log(x);

}//end_else

cout <<setiosflags(ios::fixed)<<setprecision(2); cout<<c5<<c<<c<<c<<c<<c<<c6<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c7<<'\n';

cout<<c4<<setw(5) << x;

cout <<setiosflags(ios::fixed)<<setprecision(6) ;

cout<<c4<<setw(11) << y<<c4<<"\n";

i++; //эти два оператора можно заменить на x+=0.5;

x=x0+i*0.5;

} //end_while

cout<<c8<<c<<c<<c<<c<<c<<c10<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c9<<'\n';

_getch();

return 0;

}

 

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

┌─────┬───────────┐

│ x │ y │

├─────┼───────────┤

│ 2.00│ -0.416147│

├─────┼───────────┤

│ 2.50│ -0.801144│

├─────┼───────────┤

│ 3.00│ -0.989992│

├─────┼───────────┤

│ 3.50│ -0.936457│

├─────┼───────────┤

│ 4.00│ -0.756802│

├─────┼───────────┤

│ 4.50│ -0.977530│

├─────┼───────────┤

│ 5.00│ -0.958924│

└─────┴───────────┘

Цикл do-while в циклах с параметром

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

 

#define N 10

int main ()

{int i=1, summa=0;

do

summa += i++;

while (i<=N);

cout << summa << endl;

_getch();

return 0;

}

 

Калькулятор

 

int main()

{ double n1, n2, ans;

char oper, ch;

do {cout << "\nEnter first number, operator, second number: " <<endl;

cin >> n1 >> oper >> n2;

switch (oper)

{ case '+': ans = n1 + n2; break;

case '-': ans = n1 - n2; break;

case '*': ans = n1 * n2; break;

case '/': ans = n1 / n2; break;

default: ans = 0;

}

cout << "Answer = " << ans;

cout << "\nDo another (enter 'y' or 'n')? ";

cin >> ch;

} while( ch != 'n' );

_getch();

return 0; }

 

Проверка входных данных

В данном примере оператор цикла требует повторного ввода данных до тех пор, пока не будут введены значения из диапазона от 1 до 20:

int r;

do

{cout << "input 1 <= r <=20" << endl;

cin >> r;

} while (r <1 || r>20);

 

В следующем примере цикл проверяет, чтобы вводимые данные были положительными и отличны от 13:

int r;

do

{cout << "input r >0, r !=13: " <<endl;

cin >> r;}

while (r <0 || r==13);

 

В этом примере с помощью цикла while реализована проверка до 10 попыток ввода значения 25:

int i=1, rez=0;

while (i++ <=10 && rez !=25)

{cout << "input rez=25"<<endl;

cin >> rez;}

 

Напомним (см. метод. указания лаб.раб.1), что контроль правильности ввода значения некоторого типа можно реализовать, например, таким образом:

//проверка ввода значения из диапазона значений типа unsigned char

unsigned int uchar; //более широкий тип unsigned int

do {

cout << "input unsigned char:" << endl;

cin >> uchar;

} while(uchar < 0 || uchar > UCHAR_MAX);
//диапазон значений типа unsigned char

 

//проверка ввода значения из диапазона значений типа int

float f; //более широкий тип float

int i;

do {

cout << "input int:" << endl;

cin >> f;

} while(f < INT_MIN || f > INT_MAX);

//диапазон значений типа int

i=f;

cout <<"ok " << i << endl;

Цикл for в циклах с параметром

Приостановка выполнения программы на n секунд

const int DELAY =500000000;

int main (){

long i;

int n;

cout << "sec=?\n";

cin >> n;

For (; n; n--)

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

cout << n << endl;

_getch();

return 0;

}

 

Или

 

int main ()

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

const double X_beg = x0-h/2 ; //25.5-h/2, чтобы попала точка 25.5

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

{ y = a*x*x;

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

_getch();

}

return 0;

}

 

Или

 

#include <math.h>

int main ()

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

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

x=x0;

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;

}

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

Оптимизация программы

Оптимизация – преобразование исходного текста программы, при котором:

• результат выполнения остается неизменным,

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

 

Оптимальность программы в значительной степени определяется ее алгоритмом. При оптимизации программы необходимо выявить ее фрагменты, являющиеся «основными потребителями» ресурса, а затем перепрограммировать их: например, схема Горнера преобразовывает алгоритм с целью сокращения количества выполняемых операций.

Большинство компиляторов сегодня выполняют сами некоторые виды оптимизации программы. И тем не мене, отметим некоторые приемы:

  1. Выделять общие подвыражения и вычислять их отдельно.
  2. При вычислении сумм с использованием циклов, общий множитель (при его наличии) необходимо выносить из цикла: это уменьшает количество умножений и увеличивает точность вычислений:

 

summa=0; for (j=1; j<=1000; j++) summa += a*x[i]; summa=0; for (j=1; j<=1000; j++) summa += x[i]; summa *= a; Это лучше!!!!! Объяснить почему

 

  1. При программировании вложенных циклов следует иметь в виду, что затраты процессорного времени на выполнение таких конструкций могут зависеть от порядка следования вложенных циклов. По возможности, следует делать цикл с наибольшим числом повторений самым внутренним, а цикл с наименьшим числом повторений – самым внешним:
for (j=1; j<=100000; j++) for (k=1; k<=1000; k++) a=1; for (j=1; j<=1000; j++) for (k=1; k<=100000; k++) a=1; Это лучше!!!!! Объяснить почему

 

  1. Ветвящийся алгоритм описать как совокупность непересекающихся ветвей: описывать каждую из ветвей максимально структурировано и компактно, в частности, оформляя последовательности операторов, выполняющих некоторые алгоритмы, в виде составных операторов или в виде функций; завершать каждую из ветвей подходящим оператором завершения (break, continue, return, exit()).

Рассмотрим нахождение корней квадратного уравнения, как пример оптимизации алгоритма с ветвлением:

2 + bx + c = 0 (a, b, c – вещественные)

if (!a && !b && !c) выведем на экран: “Корней бесконечно много”;

if (!a && !b && c) выведем на экран: “Корней нет”;

if (!a && b) выведем на экран: “Один вещественный корень”;

d = b*b – 4*a*c; вычислим дискриминант

if (d >= 0) выведем на экран: “Вещественные корни:”;

и найдем корни:

d1= sqrt (d);

х1= (-b + d1) /(2 *a);

х2= (-b - d1) /(2 *a);

if (d < 0) выведем на экран: “Комплексные корни:”;

и вычислим их:

dk = -b / (2 * a); //действ.часть
mk = sqrt (-d) / (2 * a); //мним. часть

Рассмотрим структуру программы:

//каждая ветвь завершается оператором return

double a, b, c, d, d1, x1, x2, dk, mk;
……….

/*_1_*/

if (!a && !b && !c) {

{

cout << “Корней бесконечно много”;
_getch();
return 1;
}

/*_2_*/

if (!a && !b && c)

{ ….

return 2;

}

 

/*_3_*/

if (!a && b)

{ ….

return 3;

}

 

d = b*b – 4*a*c; //вычисление дискриминанта

/*_4_*/

 

if (d >= 0) // действительные корни

{ ….

return 4 ;

}

 

/*_5_*/

//комплексные корни:*/
d = -b / (2 * a); //действ.часть
m = sqrt (-d) / (2 * a); //мним. часть


Без оператора return последовательность прохождения операторов в каждой ветви будет:
_1_ à _2_ à _3_ à _4_ à _5_

 

 

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

Лабораторная работа 2

Циклы

(для выполнения лабораторной работы №2 необходимо проработать материал лекций №№ 5-6 и разобрать примеры, приведенные в данной методичке)

Организация циклов с параметром.. 2

Цикл while в циклах с параметром.. 2

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

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

Подсчет количества цифр в числе N.. 2

Вычисление значений функции на отрезке. 3

Вычисление на отрезке значений функции с условием и оформление результатов. 3

Вычисление на отрезке значений функции с условием и оформление результатов в виде таблицы (в стиле С++) 4

Цикл do-while в циклах с параметром.. 5

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

Калькулятор. 5

Проверка входных данных. 6

Вычисление значений функции на отрезке. 7

Вычисление на отрезке значений функции с условием и оформление результатов. 7

Цикл for в циклах с параметром.. 7

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

Вывод на экран кодов символов. 8

Приостановка выполнения программы на n секунд. 8

Получение натуральных делителей числа N.. 9

Проверка, является ли натуральное число N простым.. 9

Вычисление значений функции на отрезке. 9

Вычисление на отрезке значений функции с условием и оформление результатов. 10

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

Цикл while в итерационных циклах. 11

Вычисление числа π. 11

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

Вычисление значения многочлена на отрезке (схема Горнера) 13

Разложение функции на отрезке в ряд Тейлора. 14

Организация работы с последовательностью чисел, вводимых с клавиатуры.. 16

Корректная организация циклов. 17

Оптимизация программы.. 17

Примеры граф-схем алгоритмов. 20

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

Алгоритмы циклов с параметром.. 20

Алгоритм типа «развилка, вложенная в цикл с параметром». 22

Алгоритмы итерационных циклов. 23

Алгоритмы с вложенными циклами. 26

Алгоритм вложенного цикла с развилкой. 27

 

 

Организация циклов с параметром









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.