Similar presentations:
Алгоритмизация и программирование (Лекция 4)
1.
2. Алгоритмизация и программирование I Лекция 4
3.
4. Повторение
■Сколько раз выполняется цикл и почему?
■
а)
a = 4; b = 6;
while ( a < b ) a = a + 1;
■
б)
a= 4; b= 6;
while ( a > b ) a ++;
■
в)
a= 4; b= 6;
while ( a < b ) a --;
4
5.
6. ОТВЕТ
А) 2 разаБ) 0 раз
В) зацикливание
7. Постановка задачи
Числовым рядом называется бесконечная сумма S некоторойпоследовательности.
8.
Найти сумму первых N слагаемыхНайти сумму первых слагаемых, больших заданной величины
(найти сумму с заданной точностью)
Замечание. Вычисления организовать оптимально за
минимальное число операций умножения и деления.
9.
10.
Все суммы можноразделить на три
группы:
1)каждое слагаемое
вычисляется
самостоятельно;
2) очередное
слагаемое
вычисляется через
предыдущее;
3)часть очередного
слагаемого
вычисляется через
часть предыдущего
слагаемого
11. Порядок решения задачи
1.Выписать формулу общего слагаемого2.Определить к какой группе относится сумма
3.Написать программу
12.
1 группа (1): каждое слагаемое вычисляется самостоятельно через1
порядковый номер k: a k .
k
2 группа (3, 4): каждое последующее слагаемое вычисляется через
предыдущее (степень какого-либо числа или выражения и факториалы):
xk
x0
x1
x k 1
.
ak ; a0 1; a1 x; ak 1
k!
0!
1!
(k 1)!
Для определения сумм второй группы для получения следующего
слагаемого выписываются рекуррентные соотношения:
13.
14.
3 группа (2, 5, 6): слагаемое представляется в виде произведения двухсомножителей. Один из сомножителей вычисляется самостоятельно, а второй –
через аналогичный сомножитель предыдущего слагаемого:
1
ak=bk ck; с k – самостоятельное выражение; bk – вычисляется через
k
рекуррентное соотношение.
1
(2): a k ( 1) ( k 1)
k
k
x
1
(5): a k x k
k
k
k
x
1
(6): a k ( 1) k 1 ( 1) k 1 x k
k
k
Решение:
k
x2 x3
x
(4): S 1 x .. . ( 1) k 2 ...
2! 3!
k!
ak=–ak-1 x/k; k=1, 2,...
a0=1
1 1 1
1
(2): S 1 ...( 1) k 1 ...
2 3 4
k
15.
16.
17.
#include <iostream>#include <iomanip>
using namespace std;
void main()
{
int i,n;
double x,a,s,b;
cin >>x>>n;
s=1;
a=1;
for (i=1;i<n;i++)
{
a=-a*x*x/((2*i-1)*2*i);
s=s+a;
}
cout <<setprecision(5)<<fixed<<s<<endl;
}
18.
#include <iostream>#include <iomanip>
using namespace std;
void main()
{
int i,n;
double x,a,s,b;
cin >>x>>n;
s=1; a=1;
for (i=1;i<n;i++)
{
b=2*I;
a=-a*x*x/((b-1)*b);
s=s+a;
}
cout <<setprecision(5)<<fixed<<s<<endl;
}
19.
#include <iostream>#include <iomanip>
using namespace std;
void main()
{
int i,n;
double x,a,s,b;
cin >>x>>n;
s=1; a=1; b=0;
for (i=1;i<n;i++)
{
b+=2;
a=-a*x*x/((b-1)*b);
s=s+a;
}
cout <<setprecision(5)<<fixed<<s<<endl;
}
20.
#include <iostream>#include <iomanip>
#include <math.h>
using namespace std;
void main()
{
int i,n;
double x,a,s,b, eps;
cin >>x>>eps;
s=0; a=1; i=1;
while (fabs(a)>eps)
{
s+=a;
i++
b=2*I;
a=-a*x*x/((b-1)*b);
}
cout <<setprecision(5)<<fixed<<s<<endl;
}
21.
#include <iostream>#include <iomanip>
#include <math.h>
using namespace std;
void main()
{
int i,n;
double x,a,s,b, eps;
cin >>x>>eps;
s=0; a=1; i=1;
for (i=2;fabs(a)>eps;i++)
{
s+=a;
b=2*I;
a=-a*x*x/((b-1)*b);
}
cout <<setprecision(5)<<fixed<<s<<endl;
}
22.
23. Цикл с параметром
■■
for (инициализация; выражение; модификации) оператор;
Инициализация – это действие, когда переменной присваиваем
начальное значение, т.е. значение с которого наш цикл начинает
работать. Можно инициализировать сразу несколько переменных. В этом
случае используется операция «запятая»
.
■
Выражение определяет условие продолжения цикла: если его
результат, приведенный к типу bool, равен true, цикл выполняется.
■
Модификация – это действие, которое осуществляется в процессе
работы цикла. В части модификаций тоже можно написать несколько
операторов через запятую.
Любая из частей может быть пропущена, но точки с запятой должны
стоять на своих местах.
Оператор является телом цикла, т.е. одно действие, но с помощью
цикла оно выполняется столько, сколько указано в цикле.
Соответственно, если мы хотим задать группу операторов, то они
помещаются в фигурные скобки.
■
■
23
24. Пример 1. Посчитать сумму чисел от 1 до n.
#include <stdio.h>#include <iostream>
using namespace std;
void main()
{
int i,s=0,n;
cout <<"n=";
cin >>n;
for (i=1;i<=n;i++) s=s+i;
cout <<"s="<< s<<endl;
}
24
25. Пример 2. Другой вариант решения
#include <stdio.h>#include <iostream>
using namespace std;
void main()
{
int n,i,s;
cout <<"n=";
cin >>n;
for (i=1,s=0; i<=n; i++) s += i;
cout<<"s="<<s;
}
или
i=s=0;
for (; i<n; s +=++i) ;
25
26. Взаимозаменяемость трех видов циклов
27. Взаимозаменяемость трех видов циклов
28. Текстовые файлы
■■
■
■
■
Текстовыми называются файлы, состоящие из
любых символов.
Они организуются по строкам, каждая из которых
заканчивается символом «конец строки»
(символы с кодами 13 и 10).
Конец самого файла обозначается символом
«конец файла» (код 26).
При записи информации в текстовый файл все
данные преобразуются к символьному типу и
хранятся в символьном виде.
Текстовый файл можно создать и просмотреть с
помощью любого текстового редактора
28
29. Работа с текстовыми файлами в с С++ (потоковый)
■■
Поток — это абстрактное понятие,
относящееся к любому переносу данных
от источника к приемнику.
В программах при работе с текстовыми
файлами необходимо подключать
библиотеки iostream и fstream.
❑
❑
❑
#include <iostream>
#include <fstream>
using namespace std;
29
30. Текстовые файлы. Запись
Для того чтобы записывать данные в текстовый файл,необходимо:
1) описать переменную типа ofstream:
ofstream Fout;
2) открыть файл с помощью функции open.
Fout.open(«file», mode);
Fout — переменная, описанная как ofstream,
file — полное имя файла на диске (ставитcя двойной
слеш вместо одинарного: D:\\sites\\accounts.txt ),
mode — режим работы с открываемым файлом.
3) вывести информацию в файл.
Fout<<a;
Fout<<b<<c<<d;
4) обязательно закрыть файл.
Fout.close();
■
30
31. Режимы работы с файлом
■■
■
■
■
ios::in — открыть файл в режиме чтения данных;
режим является режимом по умолчанию для
потоков ifstream;
ios::out — открыть файл в режиме записи данных
(при этом информация о существующем файле
уничтожается); режим является режимом по
умолчанию для потоков ofstream;
ios::app — открыть файл в режиме записи данных
в конец файла;
ios::ate—Перейти к концу файла после
открытия .
ios::trunc — очистить файл, это же происходит в
режиме ios::out;
31
32. Пример записи в текстовый файл
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int a,b;
ofstream f;
f.open("a.txt",ios::out);
cin >>a>>b;
f<<a<<b;
f.close();
}
32
33. Текстовые файлы. Чтение
Для того чтобы прочитать данные из текстового файла,необходимо:
1) описать переменную типа ifstream :
ifstream Finp;
2) открыть файл с помощью функции open.
Finp.open(«file», mode);
Finp — переменная, описанная как ifstream,
file — полное имя файла на диске,
mode — режим работы с открываемым файлом.
3) считать информацию из файла, при считывании каждой
порции данных необходимо проверять, достигнут ли конец
файла
Finp>>a;
4) закрыть файл.
Finp.close();
■
33
34. Пример чтения из файла
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int a,b;
ifstream f;
f.open("a.txt",ios::in);
f >>a>>b;
cout<<a<<b;
f.close();
}
34
35. Пример чтения из файла (конец файла)
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int a;
ifstream f;
f.open("a.txt",ios::in);
while(!f.eof())
{
f >>a;
cout<<a<<‘\t’;
}
f.close();
}
35
36. Задание
■В текстовом файле input.txt находятся
целые числа. Подсчитать количество
отрицательных.
36
37. Решение
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int a, k=0;
ifstream f;
f.open("a.txt",ios::in);
while (!f.eof())
{
f >>a;
If (a<0) k++;
}
cout<<k;
f.close();
}
37
38. Задание
■Найти все числа Фибоначчи, попадающие
в промежуток от a до b. Ответ записать в
файл c именем a.tst, располагая по
одному числу в строке. Если таких чисел
нет, то результирующий файл должен
быть создан, но пуст.
38
39. Решение
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int a,b,f1,f2,f3;
ofstream f;
cin>>a>>b;
f.open("a.tst",ios::out);
f1=1;f2=1;
while (f2<=b)
{
if (f2>=a && f2<=b) f<<f2<<"\n";
f3=f2+f1;
f1=f2;
f2=f3;
}
f.close();
}
39
40. Задание
■Дан текстовый файл с именем a.txt, в
котором записано несколько натуральных
чисел. Посчитать среднее
арифметическое чисел, хранимых в
файле. Массивы использовать
запрещается, а файл для чтения
открывать только один раз.
40
41. Решение
#include <iostream>#include <fstream>
using namespace std;
void main()
{
int n=0,s=0,a;
ifstream f;
f.open("a.txt",ios::in);
if (f)
{
while (!f.eof())
{
f>>a;
s+=a;
n++;
}
cout<<(double(s)/n);
}
else cout<< "Not file!";
f.close();
}
41
42. Пример 6. Вычислить сумму ряда S=1*2+2*4+3*8+4*16+…+n*2n
#include <iostream>using namespace std;
void main()
{
int i,j,n,s;
cin >>n;
for (i=1,j=2,s=0;i<=n;i++,j=j*2)
s=s+i*j;
cout <<s;
}
42