- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Цикл for
Одним из самых используемых является цикл со счётчиком for. Его синтаксис
for (<инициализация>; <условие продолжения>; <изменение счётчика>){
<тело цикла>
}
Например, выведем квадраты первых ста чисел.
int i;
for (i = 1; i < 101; i++) {
printf("%d ", i*i);
}
Одним из замечательных моментов цикла for является то, что он может работать не только с целыми числами.
float num;
for (num = 5.3f; num > 0f; num -= 0.2) {
printf("%.2f ", num);
}
Этот цикл выведет числа от 5.3 до 0.1. Цикл for может не иметь некоторых "блоков" кода, например, может отсутствовать инициализация, проверка (тогда цикл становится бесконечным) или изменение счётчика. Вот пример с интегралом, реализованный с применением счётчика for.
#include<conio.h>
#include<stdio.h>
int main() {
double sum = 0.0;
double a = 0.0;
double b = 1.0;
double h = 0.01;
double x;
for (x = a; x < b; x += h) {
sum += x*x * h;
}
printf("%.3f", sum);
getch();
}
Давайте рассмотрим кусок кода
double x ;
for (x = a; x < b; x += h) {
sum += x*x * h;
}
Его можно изменить так
double x = a;
for (; x < b; x+=h) {
sum += x*x*h;
}
Более того, используя оператор break, можно убрать условие и написать
double x;
for (x = a;; x += h){
if (x>b){
break;
}
sum += x*x*h;
}
или так
double x = a;
for (;;){
if (x > b){
break;
}
sum += x*x*h;
x += h;
}
кроме того, используя оператор ",", можно часть действий перенести
double x ;
for (x = a; x < b; x += h, sum += x*x*h) ;
Но, Это ухудшает читаемость кода и приводит к трудноуловимым ошибкам.
Давайте решим какую-нибудь практическую задачу посложнее. Пусть у нас имеется функция f(x). Найдём максимум её производной на отрезке. Как найти производную функции численно? Очевидно, по определению. Производная функции в точке - это тангенс угла наклона касательной.
Возьмём точку на кривой с координатами (x; f(x)), сдвинемся на шаг h вперёд, получим точку (x+h, f(x+h)), тогда производная будет
dy / dx = [ f( x + h ) – f(x) ]/ ( x + h - x ) = tg( α )
То есть, отношение малого приращения функции к малому приращению аргумента. Почему мы двигаемся вперёд по функции, а не назад. Ну, пойдёмте назад сути это не изменит.
dy / dx = [f(x) – f(x - h)]/(x - x + h) = tg(β)
Возьмём среднее от этих двух значений, получим
[ f(x + h) – f(x - h) ]/(2∙h) = tg(β)
В общем-то теперь задача становится тривиальной: идём от точки a до точки b и находим максимальное значение производной, а также точку, в которой производная принимает это значение. Для решения нам понадобятся, как и в задаче с интегралом, переменные для границ области поиска a и b, текущее значение x и шаг h. Кроме того, необходимо максимальное значение maxVal и координата maxX этого максимального значения. Для работы возьмём функцию
x∙sin(x)
#include<conio.h>
#include<math.h>
#include<stdio.h>
int main() {
double a = 0;
double b = 3.0;
double h = 0.001;
double h2 = h * 2.0;
double maxVal = a*sin(a);
double maxX = a;
double curVal;
double x;
// Проходим по всей области от a до b
// и ищем максимум первой производной
// Используем функцию x*sin(x)
for (x = a; x < b; x += h) {
curVal = ( (x+h)*sin(x+h)-(x-h)*sin(x-h) )/h2;
if (curVal > maxVal) {
maxVal = curVal;
maxX = x;
}
}
printf("max value = %.3f at %.3f", maxVal, maxX);
getch();
}
На выходе программа выдаёт max value = 1.391 at 1.077
Численное решение даёт такие же (с точностью до погрешности) результаты, что и наша программа.
