- •Н. А. Аленский основы программирования
- •§ 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
§ 1. Примеры
П р и м е р 1. Разработаем простейший класс для работы с двумя целыми числами. В класс включим конструктор и следующие функции: вывод двух целых чисел; вычисление их суммы; проверка, делится ли одно число на другое без остатка; изменение двух целых чисел по правилу: наименьшее число или оба, если они одинаковы, умножаем на величину par, которая передаётся как параметр функции при её вызове.
class FirstCl // Описание класса с именем FirstCl
{ int a,b; // поля класса, т. е. переменные
public: // атрибут доступа (см. § 2)
/* Заголовок конструктора. Это функция, которая имеет то же имя, что и класс; тип возвращаемого значения не записывается.*/
FirstCl(int x, int y);
/* Заголовки четырёх функций (методов) класса, оформленных как внешние. Они похожи на прототипы обычных самостоятельных функций, только поля класса, т. е. два целых числа, в качестве параметров не записываем */
void MyPrint();
int MySum();
bool MyTest();
/* Метод, который изменяет поля класса. Метод может использовать дополнительные параметры, которые не являются полями класса. У нас это число, на которое умножаем, наименьшее из двух чисел, или оба, если они одинаковы. */
void Change (int );
}; // конец описания класса
/* Текст внешнего конструктора. Перед именем внешнего конструктора и каждой внешней функции записываем имя класса и операцию “::” (разрешение области видимости). */
FirstCl::FirstCl (int x, int y)
{ a=x; b=y;
};
// Тексты четырёх внешних методов.
void FirstCl::MyPrint()
{ cout<<"\nThe first number "<<a<< " The second number "<<b <<endl;
} ;
int FirstCl::MySum()
{ return a+b;
};
/* Логическая функция, возвращающая true или false в зависимости от того, делится ли a на b без остатка (для 10 и 3 — false, 3 и 10 — false, 10 и 2 — true, 2 и 10 — false). */
bool FirstCl::MyTest()
{return !(a%b)? true : false;
};
void FirstCl::Change (int par)
{ if (a>b) b*=par;
else if (a<b) a*=par;
else { b*=par; a*=par;
}
};
/* В головной функции создаём объект, т. е. переменную типа класс, и вызываем включённые в класс методы. */
int main(int argc, char* argv[])
{ FirstCl obj(10,2);
/* Объявили объект obj и одновременно с этим вызвали конструктор, с помощью которого создаётся объект, и в класс передаются числа 10 и 2. Методы (функции) этого объекта будут выполняться для этих чисел. Повторно при вызове методов класса эти числа не передаём. Как и для самостоятельных функций, при объявлении объекта можно в качестве “фактических параметров” для конструктора передать не только константы, а и значения предварительно объявленных и определённых, например, введённых, переменных:
int A,B; cin>>A>>B;
FirstCl obj(A,B ); */
/* При вызове функций записываем имя объекта (obj), но не класса, и после точки имя функции (MyPrint). */
obj.MyPrint();
cout<<"\nSum "<<obj.MySum();
if (obj.MyTest()) cout<<"\n-----";
else cout<<"\n+++++";
obj.Change(10); cout<<"\nChanging ";
obj.MyPrint();
getch(); return 0;
}
При вызове функций класса есть аналогия с обычными самостоятельными функциями, не членами класса. Функции типа void вызываются отдельно (obj.MyPrint(); obj.Change(10);). Вызов функции с возвращаемым с помощью return единственным результатом записывается непосредственно в выражении, а значит, в операторе, в котором используется значение функции
(if (obj.MyTest() ) …).
Ещё раз обратим внимание на следующие особенности вызова методов класса:
-
перед именем метода записывается имя объекта (а не класса!) и после точки имя метода. При необходимости в скобках записываем фактические параметры (см. функцию Change);
-
поля класса передаются в объект с помощью конструктора. При вызове каждого метода повторно передавать эти числа, как для обычных функций, не надо. Передаём только те параметры, которые не включены в класс (параметр Par для метода Change).
П р и м е р 2. Разработать класс для работы с одномерным массивом наибольшей размерности 20. В отличие от первого примера, все функции оформим как встроенные. Их назначение приведено в комментариях:
#define MaxSize 20
/*Определили макрос, используемый в качестве наибольшей размерности массива */
class ClArray
{ int n;
float A[MaxSize];
public:
/* Конструктор инициализирует только одно поле — размерность массива. При этом осуществляется проверка передаваемого значения. Массив, который является вторым полем класса, определяется с помощью функции MyInp */
ClArray (int m)
{ n=m; if (n>MaxSize || n<1) n=10;
} ;
// Функция (метод) для ввода массива.
void MyInp()
{ int x=1, y; y=wherey();
for(int i=0; i<n; i++, x+=7)
{ gotoxy(x,y); cin>>A[i];
}
} ;
/* Функция (метод) для “цветного” вывода массива. При этом числа num выводятся цветом С1, а остальные — цветом С2 */
void MyOut(int C1, int C2, float num)
{ cout<<endl;
for ( int i=0; i<n; i++)
{ if (A[i]==num) textcolor ( C1 );
else textcolor ( C2 );
cprintf ( "%10.4f", A[i] );
}
}
/* Логическая (булевская) функция (метод), возвращающая true или false в зависимости от того, найдено число t в массиве или нет */
bool Test (float t)
{ for (int i=0; i<n; i++)
if (A[i]==t) return true;
return false;
}
/* Функция (метод), которая в массиве каждое наибольшее число меняет на наименьшее и наоборот. Кроме того, функция возвращает наибольшее и наименьшее значения. */
void MyChange ( float &mx, float &mn)
{ mx=mn=A[0];
for(int i=0; i<n; i++)
{ mx= A[i]>mx? A[i] : mx;
mn= A[i]<mn? A[i] : mn; }
for(int i=0; i<n; i++)
if (A[i]==mx) A[i]=mn;
else if (A[i]==mn) A[i]=mx;
} // end of the last function
} ; // end of class
/* В головной функции в цикле создаём объекты, то есть работаем с несколькими одномерными массивами, пока не введём в качестве размерности число 0. */
int main()
{ int N=5; float num;
do { ClArray ObArr(N);
ObArr.MyInp(); // ввод массива
while(1) // цикл для поиска нескольких чисел в массиве
{ cout<<"\n Number for find (1000 -- exit)"; cin>>num;
if (num==1000) break;
ObArr.MyOut ( 2, 5, num); // вывод массива разным цветом
if ( ObArr.Test ( num ) )
cout <<" \n Find the number " ;
else cout<<"\n Do not find the number ";
cout<<num;
}
float MyMx, MyMn;
/* Изменяем массив и возвращаем в функцию main наибольшее (MyMx) и наименьшее (MyMn) значения. */
ObArr.MyChange(MyMx, MyMn);
/* Вывод массива с выделением другим цветом наибольшего значения (MyMx). */
ObArr.MyOut(2,5,MyMx);
/* Вывод массива с выделением другим цветом наименьшего значения (MyMn). */
ObArr.MyOut(2,5,MyMn);
cout<< "\n Size of array (0 -- exit)"; cin>>N;
} while ( N);
return 0;
}