
- •Часть 1
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •§ 1. Основные понятия программы
- •1.2. Директива препроцессора #include
- •Структура программы
- •Комментарии
- •Ключевые слова, идентификаторы, переменные
- •§ 2. Ввод, вывод
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Операция присваивания
- •§ 4. Программирование ветвлений
- •4.1. Оператор if
- •4.2. Тернарная операция
- •4.3. Оператор выбора switch
- •Г л а в а 2 циклы
- •§ 1. Оператор while
- •§ 2. Оператор break
- •§ 3. Оператор do … while
- •§ 4. Оператор for
- •Г л а в а 3 Введение в массивы
- •§ 1. Основные понятия
- •§ 2. Способы определения массивов
- •§ 3. Вывод массива. Функции printf и cprintf
- •§ 4. Типы задач при работе с массивами
- •Упражнения и тесты
- •Г л а в а 4 модульное программирование. Функции
- •§1. Функции без результатов. Параметры-значения
- •1.1. Примеры. Правила оформления и вызова функций
- •Формальные и фактические параметры
- •Передача параметров по значению
- •§ 2. Функции типа void с результатами
- •2.1. Вычислeниe бeсконeчных сумм
- •2.2. Что такое ссылочный тип
- •2.3. Параметры ссылочного типа
- •§ 3. Функции, отличные от void. Оператор return
- •§ 4. Область действия имён. Локальные и глобальные имена
- •§ 5. Встраиваемые (inline) функции
- •§ 6. Параметры по умолчанию
- •§ 7. Перегрузка функций
- •7. Сравнение функций типа void и отличных от типа void.
- •Г л а в а 5 введение в объектно-оРиентированное программирование
- •§ 1. Первое знакомство с ооп
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Упражнения и тесты
- •Оглавление
- •3.1. Константы …………………………………………….………..….........…8
- •Упражнения и тесты …….………………..………………………….…………....19
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 1
7. Сравнение функций типа void и отличных от типа void.
Пусть описаны функции
void FVoid (int x, int y, int &r) { r=x+y; }
int FInt (int x, int y, int &r) { r=x-y; return x/y; }
Укажите номера строк, в которых правильные вызовы функций. Что будет выведено для правильных вызовов?
int main() { int R;
if (FVoid (12, 12, R)) //1
cout<<" Yes "<<R; else cout<<" No "<<R;
if (FInt (14, 12, R)) //2
cout<<" Yes "<<R; else cout<<" No "<<R;
FVoid (12, 12, R); //3
R ? cout<<" Yes ": cout<<" No "; cout<<R;
FInt (4, 14, R); cout<<" "<<R<<" "; //4
int RES=0, x=12; RES= FVoid (x, 12, 3); //5
RES ? cout<<"Yes": cout<<"No"; cout<<RES;
RES=0; x=12; RES= FInt (x, 12, 3); //6
RES ? cout<<"Yes": cout<<"No"; cout<<RES;
getch(); return 0; }
В других более простых вариантах функции Fint записано return r; т. е. одно и то же выражение получается и с помощью переменной, и возвращается с помощью return.
В тексте функции может быть более сложное логическое выражение или использоваться другие операции (см. упражнения и тесты гл.1).
Локальные и глобальные переменные.
Дан код: void fun1(…);
void main() { int a; … }
void fun1 (…) { … }
Где можно использовать переменную a?
Варианты ответов: 1) только в main; 2) только в fun1; 3) в main и в fun1;
9. Дан код: void fun1( int a;…) { … };
void main() { … }
Где можно использовать переменную a?
Варианты ответов: 1) только в main; 2) только в fun1; 3) в main и в fun1;
10. Дан код: void fun1(…) { … };
void main() { int a; … }
Где можно использовать переменную a?
Варианты ответов: 1) только в main; 2) только в fun1; 3) в main и в fun1;
11. Дан код: void fun1(int x, …) { … };
void main() { int x; … }
Будет ли ошибка? Варианты ответов:
1) да, ошибка компиляции;
2) да, компиляция пройдёт успешно, но выполняться программа не будет;
3) компиляция и выполнение пройдут успешно.
Параметры по умолчанию.
12. Пусть описана функция
void fun (int i, char c='*', float f=1.2)
{ cout<< endl<< i<<'\t'<<c<<'\t'<<f<< endl;}
Какие из следующих вызовов допустимы? Что будет выведено для правильных вызовов?
1) fun(10, ‘A’); 2) fun (20, 65);
3) fun (33, 65, 3.3); 4) fun (44, , 4.4);
5) if (fun(50, ‘A’, 5.5)) cout<<”+++”; else cout<<”---“;
6) float r; r=fun(6, ‘*’, 0.6); 7) float r; r=fun(6, , 0.6);
13. Для каких функций в записи прототипа есть ошибки? Почему?
void Fun1(int, float, float); void Fun2(int x=5, float y, float z);
void Fun3(int x=5, float y=.6, float z=.7); void Fun4(int x, float y=.6, float z);
void Fun5(int x, float y, float z=.7);
Перегрузка функций.
14. Будет ли компилироваться и выполняться следующая программа? Ответ объяснить.
int Sum (int , int ); //1
float Sum (float , float); //2
int main()
{ int i1=12, i2=34;
cout<<Sum(i1,i2)<<" "; //3
float f1=1.1, f2=2.2;
cout<<Sum(f1,f2)<<" "; //4
getch(); return 0;
}
int Sum (int x, int y) //5
{ return x%10 + y%10; }
float Sum (float x, float y) //6
{ return x>y?x:y; }
Варианты ответов:
1) Да. Будет выведено (записать самим) …
2) Нет, так как две функции с одинаковым именем.
3) Нет, так как в //6 вычисляется не сумма.
4) Нет, так как в //1 и //2 в прототипе не указаны имена переменных.
5) Нет, так как одна и та же переменная x в //5 и //6 объявлена с разными типами.
6) Нет, так как… (указать другую причину).
15. Перегрузите три функции для нахождения наибольшего из двух целых, вещественных и символьных величин. В последнем варианте найти символ с наибольшим кодом. В головной функции проверьте каждый из вариантов.
Задачи
1. Для каждой пары введенных целых чисел найти их сумму и произведение двумя способами: с помощью одной функции типа void, которая возвращает и сумму, и произведение двух чисел; с помощью двух функций с одним результатом типа int, одна из которых возвращает сумму, а вторая — произведение двух целых чисел.
void SumMult (int, int, int &, int &);
int MySum (int, int );
int MyMult (int, int );
int main()
{ int a, b, r1, r2; cout<<" 0 0 -- exit"<<endl; cin>>a>>b;
while(a!=0 || b!=0 )
{ SumMult(a,b,r1,r2) ; cout<<a<<" + "<<b<<" = "<<r1<<endl;
cout<<a<<" * "<<b<<" = "<<r2<< endl;
cout<<a<<" + "<<b<<" = "<< MySum (a,b)<< endl;
cout << a << " * " << b << " = " << MyMult(a,b) << endl;
cin >> a >> b; }
return 0; }
void SumMult ( int x, int y, int &s, int &p) { s=x+y; p=x*y; }
int MySum (int x, int y) { return x+y; }
int MyMult (int x, int y) { return x*y; }
Составить и проверить несколько вариантов функции для нахождения наибольшего из двух чисел: 1) функцию типа int с помощью оператора if и 2) с помощью тернарной операции; 3) функцию типа void с помощью тернарной операции.
int maxfun1 (int, int);
int maxfun2 (int, int);
void maxfun3 (int , int , int &r);
int main()
{ int a, b; cout<<" 0, 0 – exit "<<endl; cin>>a>>b;
while(a!=0 || b!=0 ){ if (a==b)
cout<<endl<<a<<" is equal "<<b<<endl;
else { cout<<maxfun1(a,b)<<" " <<maxfun2(a,b);
int mymax; maxfun3(a,b,mymax);
cout<<" "<<mymax<<endl; }
cin>>a>>b;
} return 0; }
int maxfun1(int x,int y) { if (x>y) return x; else return y; }
int maxfun2(int x,int y) { return x>y?x:y; }
void maxfun3(int x,int y,int &r) { r=x>y?x:y; }
Составить логическую функцию, которая определяет, принадлежит ли точка плоскости с координатами (x, y) части круга радиуса R, находящейся в первой или третьей четверти. В головной программе последовательно ввести координаты точек плоскости и для каждой из них вывести “Да” или “Нет”.
bool Test(float, float, float);
main()
{ float X,Y, R;
do // ввод радиуса с контролем ввода
{ cout<<"R= "; cin>>R;
if (R<=0) cout<<"R<=0, repeat\n ";
} while (R<=0);
int gy=wherey()+1;
cout<<"X=1000 && Y=1000 -- exit";
while (1)
{ gotoxy(2,gy); cin>>X;
gotoxy(10,gy); cin>>Y;
if (X==1000 && Y==1000) break;
if (Test(X, Y, R))
{ gotoxy(20, gy++);
cout<<"Yes\n"; }
else { gotoxy(30, gy++);
cout<<"No\n"; }
}
return 0; }
bool Test (float x, float y, float r)
{ return x*x+y*y<=r*r && x*y>=0; }
Для текста послeднeй функции можно прeдложить eщё два варианта:
if (x*x+y*y<=r*r && x*y>=0) return true;
else return false;
// или
return x*x+y*y<=r*r &&
(x>=0 && y>=0 || x<=0 && y<=0);
Составить функцию, которая для одного значения переменной х вычисляет значение бесконечной суммы ряда
y
= 1–
c заданной точностью . В головной программе вычислить значения этой функции для x=–1.6,–1.4,–1.2, …, 1.4, 1.6 и вывести их на экран.
float MyCos(float x);
main()
{ printf("\n x MyCos(x) cos(x)");
for(float X=-1.6; X<=1.600001; X+=0.2)
printf("\n%6.1f%11.7f%11.7f", X, MyCos(X), cos(X));
getch(); return 0; }
/* Для контроля вывели также значение этой же суммы, вычисленное с помощью стандартной функции cos(X)*/
float MyCos(float x)
{ float y=0, u=1, k=-1, eps=1e-6;
while (fabs(u)>eps)
{ y+=u; k+=2;
u*=(-1)*x*x/(k*(k+1)); }
return y;
}
Уровень B
Составить и проверить функцию решения линейного уравнения вида a∙x=b.
Составить функцию для решения квадратного уравнения a∙x2 + b∙x + c =0. Используя ее, составить и проверить функцию решения биквадратного уравнения a∙z4 + b∙z2 + c =0.
Вывести n параллельных горизонтальных линий разными цветами. Составить и использовать функцию для рисования одной горизонтальной линии.
Вывести n параллельных вертикальных линий разными цветами. Составить и использовать функцию для рисования одной вертикальной линии.
Составить и проверить функцию нахождения наименьшего общего кратного двух натуральных чисел.
Составить и проверить функцию нахождения наибольшего общего делителя двух натуральных чисел.
Составить и проверить функцию, которая переставляет цифры заданного целого числа N1 в обратном порядке и получает новое число N2. Например, если N1=425, то N2=524.
В массиве целых чисел найти количество чисел с наименьшим количеством цифр. Например, в массиве {123, 34, 56, 1000, 20, 55000, 777, 11} таких чисел 4, это 34, 56, 20, 11. Составить и использовать функцию, которая определяет количество цифр одного целого числа.
В целочисленном одномерном массиве все симметричные числа, т. е. числа, которые одинаково читаются слева направо и справа налево (палиндромы, перевертыши), заменить нулем. Составить и использовать логическую функцию для определения, является ли одно целое число симметричным.
В последовательности целых чисел (не в массиве) найти количество чисел, у которых в шестнадцатеричном представлении нет букв. Составить и использовать функцию для нахождения количества букв в шестнадцатеричном представлении одного целого числа.
В последовательности целых чисел (не в массиве) найти количество простых чисел. Составить и использовать логическую функцию для определения, является ли одно целое число простым.
13. Среди заданных координатами вершин треугольников на плоскости найти треугольник с наименьшим периметром (площадью). Составить и использовать следующие функции: вычисление длины отрезка по координатам двух вершин; вычисление периметра (площади) одного треугольника; головную функцию, в которой находим координаты требуемого треугольника.
Уровень C
В текстовом режиме заполнить все окно вывода следующими фигурами, границы которых состоят из произвольных символов:
a) ромбами;
b) равнобедренными треугольниками;
c) прямоугольными треугольниками с прямым углом внизу слева;
d) прямоугольными треугольниками с прямым углом внизу справа.
Составить и использовать функцию для рисования границы одной фигуры в зависимости от варианта. Фигуры внутри не заполняются. Параметры функции: текстовые координаты одной из точек фигуры, один или два размера фигуры и символ.
2. В текстовом режиме заполнить окно вывода теми же фигурами (см. 1), закрасив их внутри тем же символом, что и на границе.
В текстовом режиме нарисовать последовательность заполненных внутри прямоугольников, разместив их одним из следующих способов:
a) по диагонали окна, начиная с левого верхнего угла;
b) по диагонали окна, начиная с левого нижнего угла;
c) в шахматном порядке.