Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_1_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
813.57 Кб
Скачать

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).

Локальные и глобальные переменные.

  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. Составить и проверить несколько вариантов функции для нахождения наибольшего из двух чисел: 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; }

  1. Составить логическую функцию, которая определяет, принадлежит ли точка плоскости с координатами (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);

  1. Составить функцию, которая для одного значения переменной х вычисляет значение бесконечной суммы ряда

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

  1. Составить и проверить функцию решения линейного уравнения вида ax=b.

  2. Составить функцию для решения квадратного уравнения ax2 + bx + c =0. Используя ее, составить и проверить функцию решения биквадратного уравнения az4 + bz2 + c =0.

  3. Вывести n параллельных горизонтальных линий разными цветами. Составить и использовать функцию для рисования одной горизонтальной линии.

  4. Вывести n параллельных вертикальных линий разными цветами. Составить и использовать функцию для рисования одной вертикальной линии.

  5. Составить и проверить функцию нахождения наименьшего общего кратного двух натуральных чисел.

  6. Составить и проверить функцию нахождения наибольшего общего делителя двух натуральных чисел.

  7. Составить и проверить функцию, которая переставляет цифры заданного целого числа N1 в обратном порядке и получает новое число N2. Например, если N1=425, то N2=524.

  8. В массиве целых чисел найти количество чисел с наименьшим количеством цифр. Например, в массиве {123, 34, 56, 1000, 20, 55000, 777, 11} таких чисел 4, это 34, 56, 20, 11. Составить и использовать функцию, которая определяет количество цифр одного целого числа.

  9. В целочисленном одномерном массиве все симметричные числа, т. е. числа, которые одинаково читаются слева направо и справа налево (палиндромы, перевертыши), заменить нулем. Составить и использовать логическую функцию для определения, является ли одно целое число симметричным.

  10. В последовательности целых чисел (не в массиве) найти количество чисел, у которых в шестнадцатеричном представлении нет букв. Составить и использовать функцию для нахождения количества букв в шестнадцатеричном представлении одного целого числа.

  11. В последовательности целых чисел (не в массиве) найти количество простых чисел. Составить и использовать логическую функцию для определения, является ли одно целое число простым.

  12. 13. Среди заданных координатами вершин треугольников на плоскости найти треугольник с наименьшим периметром (площадью). Составить и использовать следующие функции: вычисление длины отрезка по координатам двух вершин; вычисление периметра (площади) одного треугольника; головную функцию, в которой находим координаты требуемого треугольника.

Уровень C

  1. В текстовом режиме заполнить все окно вывода следующими фигурами, границы которых состоят из произвольных символов:

a) ромбами;

b) равнобедренными треугольниками;

c) прямоугольными треугольниками с прямым углом внизу слева;

d) прямоугольными треугольниками с прямым углом внизу справа.

Составить и использовать функцию для рисования границы одной фигуры в зависимости от варианта. Фигуры внутри не заполняются. Параметры функции: текстовые координаты одной из точек фигуры, один или два размера фигуры и символ.

2. В текстовом режиме заполнить окно вывода теми же фигурами (см. 1), закрасив их внутри тем же символом, что и на границе.

  1. В текстовом режиме нарисовать последовательность заполненных внутри прямоугольников, разместив их одним из следующих способов:

a) по диагонали окна, начиная с левого верхнего угла;

b) по диагонали окна, начиная с левого нижнего угла;

c) в шахматном порядке.