- •1. Основы алгоритмизации и программирования
- •1.1. Этапы подготовки и решения задач на эвм
- •1.2. Алгоритмы и способы их описания Понятие алгоритма
- •Способы описания алгоритмов
- •Структурные схемы алгоритмов
- •1.3. Компиляция и интерпретация программ
- •1.4. Стили программирования
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентированное программирование
- •2.1. Пример готовой программы.
- •2.2. Структура основной программы
- •2.3. Алфавит языка
- •2.4. Константы и переменные Константы
- •Переменные
- •Примеры записи имен переменных
- •2.5. Арифметические выражения
- •Примеры вычисления арифметических выражений
- •Стандартные функции
- •Примеры программирования арифметических выражений
- •Контрольные задания
- •1. Составить описания для заданных переменных
- •2.6. Линейные вычислительные процессы
- •Оператор присваивания
- •Странные операторы присваивания
- •Операторы ввода-вывода
- •Операторы ввода исходных данных с клавиатуры
- •Потоковый ввод данных числового типа
- •Форматный ввод
- •Операторы вывода данных на экран Потоковый вывод
- •Форматный вывод
- •Контрольные задания
- •2.7. Разветвляющиеся вычислительные процессы
- •Логические выражения
- •Порядок выполнения операций в логических выражениях
- •Условные операторы
- •Короткий условный оператор
- •Полный условный оператор
- •If (логическое выражение) p1; else p2;
- •Вложенные структуры условных операторов
- •Оператор выбора
- •Контрольные задания
- •2.8. Циклические вычислительные процессы
- •Операторы цикла с условием
- •Оператор цикла do...While
- •Оператор цикла с параметром
- •2.9. Базовые алгоритмы
- •Задача 1. Алгоритм организации счетчика
- •Задача 2. Алгоритм накопления суммы
- •Задача 3. Алгоритм накопления произведения
- •Задача 4. Алгоритм поиска минимального члена последовательности
- •Задача 5. Табулирование функции (или кратные циклы)
- •Задача 6. Вычисление сумм последовательностей
- •2.10. Указатели и массивы Указатели
- •Понятие массива
- •Общий вид описания массива
- •Одномерные массивы
- •Описание одномерного массива
- •Индексированные переменные
- •Ввод-вывод одномерных массивов
- •Обработка одномерных массивов
- •Задача 1. Организация счетчика
- •Задача 2. Накопление суммы и произведения
- •Задача 3. Поиск минимального и максимального элементов массива
- •Двухмерные массивы
- •Описание двухмерного массива
- •Ввод-вывод двухмерного массива
- •Обработка матриц
- •2.11. Подпрограммы Структура сложной программы
- •Функции
- •Общий вид описания функции
- •Обращение к функции
- •Пример программы с функцией
- •Механизм замены параметров
- •Параметры-массивы в функциях
- •Рекурсия
- •Примеры программирования задач с использованием подпрограмм
- •Задача 1
- •2.12. Текстовые данные
- •Символьный тип данных
- •Ввод-вывод символьных данных
- •Обработка символьных данных
- •Ввод-вывод строковых данных
- •Обработка строковых данных
- •Стандартные функции обработки строк
- •Сравнение строк:
- •Сцепление строк
- •Определение длины строки
- •Копирование строк
- •Поиск символа в стоке
- •Пример программы для задачи с текстовыми данными
- •Контрольные задания
- •2.13. Динамическое выделение памяти
- •Структуры данных Понятие структуры
- •Обработка структур
- •Пример задачи с использованием структурированных данных
- •2.15. Файлы данных Понятие файла
- •Работа с файлами
- •Открытие файла
- •Обработка открытого файла
- •Закрытие файла
- •Функции ввода/вывода
- •Работа с текстовыми файлами
- •Обработка бинарных файлов
- •Контрольные задания
- •Заключение
- •Оглавление
Задача 5. Табулирование функции (или кратные циклы)
Тело цикла может содержать любой оператор, в том числе и другой оператор цикла. Структура цикла, содержащая вложенный цикл, называется кратным циклом. Число вложений может быть произвольным. Если цикл содержит один вложенный цикл, то он называется двойным, если содержит два вложенных цикла, то является тройным и т.д. Цикл, который содержит вложенный цикл, называется внешним. Вложенный цикл называется внутренним.
Переменная внутреннего цикла всегда меняется быстрее, чем внешнего. Это означает, что для каждого значения внешней переменной цикла меняются все значения внутренней переменной.
Внешний и внутренний циклы могут использовать любой вид операторов цикла (while, do-while, for).
Пример. Алгоритм табулирования функции с двумя переменными
Вычислить значение функции:
z(x, у) = sin x + cos y
при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Данный алгоритм реализуется с использованием двойного цикла, в котором х примем за внешнюю переменную цикла, у - за внутреннюю переменную цикла.
#include "stdafx.h"
#include<math.h>
int main()
{
float х, у, z; // описание переменных
printf("x y z(x,y)\n"); // вывод заголовка
x= -1; // начальное значение параметра внешнего цикла
while (х<=1) // запуск внешнего цикла, если х≤ 1
{
for( y=0; y<=1; y=y+0.1) //запуск внутреннего цикла
{
z=sin(x) + cos(y); // вычисление функции
printf("%6.1f %6.1f z=%6.1f",x, y, z); // вывод
}
x=x + 0.2; // изменение параметра х на шаг
}
return 0;
}
В результате выполнения программы вид таблицы на экране будет следующим:
x |
y |
z(x,y) |
-1.0 |
0.0 |
z=… |
-1.0 |
0.1 |
z=… |
… |
… |
… |
-1.0 |
1.0 |
z=… |
-0.8 |
0.0 |
z=… |
-0.8 |
1.0 |
z=… |
Задача 6. Вычисление сумм последовательностей
Последовательности с заданным числом элементов
Пример 1. Найти сумму первых 20 элементов последовательности
S=1/2 – 2/4 + 3/8 – 4/16+…
Чтобы решить эту задачу, надо определить закономерность в изменении элементов. В данном случае можно заметить:
Каждый элемент представляет собой дробь.
Числитель дроби при переходе к следующему элементу возрастает на единицу.
Знаменатель дроби с каждым шагов увеличивается в 2 раза.
Знаки перед дробями чередуются (плюс, минус и т.д.).
Любой элемент последовательности можно представить в виде
S=z*c/d
У переменной z меняется знак (эту операцию можно записать в виде z=-z), значение переменной c увеличивается на единицу (c++), а переменная d умножается на 2 (d=d*2).
Алгоритм решения задачи можно записать в виде следующих шагов:
Записать в переменную S значение 0. В этой ячейке будет накапливаться сумма;
Записать в переменные z, c и d начальные значения (для первого элемента): z=1, c=1,d=2;
Сделать 20 раз следующие две операции:
добавить к сумме значение очередного элемента;
изменить значения переменных z, c и d для вычисления следующего элемента.
#include "stdafx.h"
int main()
{
Начальные значения
float S, z, c, d;
int i;
S = 0; z = 1; c = 1; d = 2;
for ( i = 1; i <= 20; i ++ )
добавить элемент к сумме
{
S = S + z*c/d;
z = - z;
изменить переменные
c++;
d = d * 2;
}
printf("Сумма S = %f", S);
return 0;
}
Суммы с ограничивающим условием
Рассмотрим более сложную задачу, когда количество элементов заранее неизвестно.
Пример 2. Найти сумму всех элементов последовательности
S=1/2 – 2/4 + 3/8 – 4/16+…
которые по модулю меньше, чем 0.001.
Эта задача имеет решение только тогда, когда элементы последовательности убывают по модулю и стремятся к нулю. Поскольку мы не знаем, сколько элементов войдет в сумму, надо использовать цикл while (или do - while). Один из вариантов решения показан ниже.
#include<math.h>
#include "stdafx.h"
int main()
начальные значения
{
float S, z, c, d, a;
Запустить цикл, если а ≥0.001
S = 0; z = 1; c = 1; d = 2;
a = 1;
while ( a >= 0.001 )
{
добавить элемент к сумме
a =fabs( c / d);
S = S + z*a;
изменить переменные
z = - z;
c ++;
d = d * 2;
}
printf("Сумма S = %f", S);
return 0;
}
Цикл закончится тогда, когда переменная a (она обозначает модуль очередного элемента последовательности) станет меньше 0.001. Чтобы программа вошла в цикл на первом шаге, в эту переменную надо записать любое значение, большее, чем 0.001.
Очевидно, что если переменная a не будет уменьшаться, то условие в заголовке цикла всегда будет истинно и программа «зациклится».