- •Н. А. Аленский основы программирования
- •§ 1. Структура простой программы. Ввод, вывод
- •1.1. Пример первой программы
- •1.2. Директива препроцессора #include
- •1.3. Структура программы
- •1.4. Комментарии
- •1.5. Ключевые слова и идентификаторы
- •1.6. Простой ввод, вывод
- •§ 2. Оператор if
- •2.1. Полная форма
- •2.2. Сокращённая форма
- •2.3. Особенности оператора
- •Задачи и упражнения
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Особенности операции присваивания
- •3.5. Тернарная операция (?)
- •Задачи и упражнения
- •§ 4. Оператор выбора switch
- •Задачи и упражнения
- •§ 5. Операторы цикла
- •5.1. Оператор while c предусловием
- •Правила использования и особенности оператора while
- •5.2. Оператор цикла do … while c постусловием
- •5.3. Оператор for
- •5.4. Операторы continue и break
- •Задачи и упражнения
- •§ 6. Введение в одномерные массивы
- •6.1. Что такое массив. Объявление одномерного массива
- •6.2. Способы определения массивов
- •6.3. Вывод одномерного массива. Функции printf и сprintf
- •6.4. Некоторые типы простых задач при работе с массивами
- •Задачи и упражнения
- •§ 1. Функции без результатов. Передача параметров по значению
- •1.1. Примеры. Правила оформления и вызова функций
- •Void line2(int Len, y, char ch) // ошибка,
- •1.2. Формальные и фактические параметры
- •1.3. Передача параметров по значению
- •§ 2. Функции типа void с несколькими результатами
- •2.1. Пример
- •2.2. Что такое ссылочный тип
- •2.3. Возврат значений из функции с помощью ссылочного типа
- •Задачи и упражнения
- •§ 3. Функции с одним результатом. Оператор return
- •Задачи и упражнения
- •§ 4. Одномерные массивы в функциях. Сортировка массива
- •Задачи и упражнения.
- •§ 5. Область действия имён. Локальные и глобальные имена
- •§ 6. Дополнительные возможности функций
- •Встраиваемые функции (inlineфункции)
- •6.2. Параметры по умолчанию
- •6.3. Перегрузка функций
- •§ 1. Примеры
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Задачи и упражнения.
- •Глава 4 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •1.2. Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •Задачи и упражнения.
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •Глава 5 матрицы (двухмерные массивы) § 1. Объявление, способы определения
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов на обработку матриц
- •3.1. Построчная обработка
- •3.2. Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •3.5. Преобразование матрицы
- •Упражнения.
- •3.6. Построение матриц
- •§ 4. Передача матрицы в качестве параметра функции
- •Задачи и упражнения.
- •Б. Обработка матрицы по столбцам.
- •Даны две матрицы a и b одинаковой размерности. Построить матрицу с, каждый элемент которой определяется по правилу:
- •Список рекомендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Задачи и упражнения …….……………………………………...12
- •3.1. Константы ………………………………………………...…14
§ 2. Функции типа void с несколькими результатами
С помощью оператора return можно возвратить только одно значение. А как быть, если функция возвращает более одного результата? В таком случае можно использовать указатели (см. 2-й семестр) и ссылочный тип. Здесь рассматривается второй способ, который легче первого.
2.1. Пример
Для x=-0.8, -0.6, -0.4, … , 0.8 найти и вывести на экран значения функций:
в виде следующих пяти столбцов: x, y, cos(x), z, sin(x), в которых показать значения указанных тригонометрических функций, вычисленные как сумма бесконечного ряда с заданной точностью, так и с помощью встроенных функций.
С точки зрения разбиения на функции возможны несколько вариантов. Составим функцию SINCOS, которая вычисляет обе бесконечные суммы с произвольной одинаковой точностью. Поэтому она имеет два входных параметра: аргумент функций (x) и одинаковую точность вычисления бесконечных сумм (eps) и два выходных (y и z), которые в заголовке функции объявляются с помощью ссылочного типа.
void SINCOS(float x, float eps, float &y, float &z);
int main()
{ float x, sn, cs;
cout<<" x MySin Sin(Standart) MyCos”<< “ Cos(Standart)";
cout<<endl<<endl;
for (x=-0.8; x<0.805; x+=0.1)
{ SINCOS(x,1E-10, cs, sn);
printf("%5.1f %10.6f %12.6f %10.6f %12.6f\n",
x, sn, sin(x), cs, cos(x)) ;
}
getch(); return 0;
}
void SINCOS(float x, float eps, float &y, float &z)
{ float k=1, v1=1; y=1;
do {
v1=v1*(-1)*x*x/(k*(k+1));
y+=v1;
k+=2;
}
while (fabs(v1)>eps);
k=2; v1=x; z=x;
do {
v1=v1*(-1)*x*x/(k*(k+1));
z+=v1;
k+=2;
}
while (fabs(v1)>eps);
}
2.2. Что такое ссылочный тип
Сначала рассмотрим самостоятельное использование переменной этого типа, так называемую независимую ссылку. Пусть объявлены две переменные:
float x=5; float &s=x;
Переменная ссылочного типа s обязательно должна быть проинициализирована. После такого объявления идентификатор s определяет другое, альтернативное, имя ячейки, названной x, то есть s и x — синонимы, идентификаторы для обозначения одной и той же области оперативной памяти. Иногда говорят, что ссылочная переменная — это псевдоним переменной, к которой она обращается. Поэтому оператор сout<<endl <<x<<” “<<s; выведет два одинаковых числа 5. Изменим значение переменной x: x*=2; а выведем s: cout<<endl <<x<<” “<<s; Несмотря на то, что значение s явно в программе не изменялось, то есть не было записано s*=2, оно также изменится и будут выведены два одинаковых числа 10. Это произошло потому, что между этими переменными нет разницы, то есть s и x — имена одной и той же ячейки.
Наоборот, если изменим значение s — s+=100; а выведем x— cout<<endl <<x<<” “<<s; то убедимся, что x также изменилось, и выводится 110 110.
Если объявить и проинициализировать ещё одну “обычную” переменную float y=3; и записать s=y; то копируются не адреса, а, как и при обычном объявлении, значение одной ячейки (y) помещается в другую, которую можно использовать как с именем s, так и x. Аналогично, s++ не меняет адрес, а увеличивает на единицу значение переменной s или x.
Если объявляется несколько переменных ссылочного типа, то перед каждым идентификатором должен стоять символ “&”.
Замечания.
-
Следует различать использование символа & для взятия адреса элемента. Это связано с указателями и рассматривается во втором семестре.
-
Самостоятельное использование переменных ссылочного типа не имеет практического применения. Наоборот, независимые ссылки создают недоразумения и затрудняют отладку программы.