1. Составить и проверить функцию, которая в текстовом режиме с помощью символов псевдографики рисует границу прямоугольника, не заполняя его внутреннюю область.
void ramka (int x0, int y0, int, int);
int main ()
{ ramka (2,5, 10, 30); getch(); return 0;
}
void ramka (int x0, int y0, int n1, int n2)
{ int x,y,i; x=x0; y=y0;
gotoxy(x,y++); printf("%c",218); // символ левого верхнего угла
for (i=0;i<n1-2;i++)
{ gotoxy(x,y++); printf("%c", 179); // для вертикальной линии
}
gotoxy(x++,y); printf("%c",192); // левый нижний угол
for (i=0;i<n2-2;i++)
{ gotoxy(x++,y); printf("%c",196); // для горизонтальной линии
}
gotoxy(x,y--); printf("%c",217); // правый нижний угол
for(i=0;i<n1-2;i++)
{ gotoxy(x,y--); printf("%c",179);
}
gotoxy(x--,y); printf("%c",191); // правый верхний угол
for(i=0;i<n2-2;i++)
{ gotoxy(x--,y); printf("%c",196);
}
}
Коды всех символов, в том числе и символов псевдографики, можно вывести с помощью следующей программы:
main()
{ clrscr(); textcolor(2);
for (int i=1; i<256; i++)
{ cprintf("%4d",i); printf("%c%c" , i, i%12?' ':'\n');
}
getch(); return 0;
}
Здесь по формату "%4d” выводим код символа указанным в textcolor вторым цветом, а по формату "%c” выводим символ с этим кодом цветом по умолчанию. При этом если i кратно 12, то выполняется переход на следующую строку экрана.
2. Составить функцию для нахождения действительных корней квадратного уравнения a∙x2 + b∙x + c =0. Используя ее, составить и проверить функцию решения биквадратного уравнения a∙z4 + b∙z2 + c =0.
3. Составить и проверить функцию решения линейного уравнения вида a∙x=b.
4. Вывести n параллельных горизонтальных линий разными цветами. Составить и использовать функцию для рисования одной горизонтальной линии.
5. Вывести n параллельных вертикальных линий разными цветами. Составить и использовать функцию для рисования одной вертикальной линии.
6. В текстовом режиме заполнить все окно вывода следующими фигурами, не заполняя их внутри:
a) ромбами;
б) равнобедренными треугольниками;
в) прямоугольными треугольниками с прямым углом внизу слева;
г) прямоугольными треугольниками с прямым углом внизу справа.
Составить и использовать функцию для рисования границы одной фигуры в зависимости от варианта.
7. В текстовом режиме нарисовать последовательность заполненных внутри прямоугольников, разместив их одним из следующих способов:
а) по диагонали окна, начиная с левого верхнего угла;
б) по диагонали окна, начиная с левого нижнего угла;
в) в шахматном порядке.
§ 3. Функции с одним результатом. Оператор return
Пример. Ввести последовательность целых чисел, пока не введём 0 (нуль). Для каждого из них найти и вывести сумму составляющих это число десятичных цифр.
При решении подобных задач с использованием функций необходимо ответить на следующие вопросы:
1) Какие функции, для каких целей будем составлять? Может быть несколько вариантов ответа на такой вопрос. Для определённости составим функцию для вычисления суммы десятичных цифр одного числа с именем SUMDIG. Эта функция будет вызываться в цикле несколько раз для каждого введённого числа.
2) Определяем входные и выходные параметры функции, то есть что для неё дано и что функция получает. У нас дано одно (!) целое число, а не массив, и получаем сумму его цифр, то есть тоже одно (!) целое число.
3) Составляем алгоритм функции SUMDIG и записываем его на языке C++. Для вычисления суммы цифр выделяем их в обратном порядке справа налево, используя получение остатка от деления на 10 (операция %) и целочисленное деление на 10 (операция /). Так как размерность числа может быть любой, то получается цикл с неизвестным количеством повторений. Получение цифр продолжаем, пока не получим при целочисленном делении нуль.
4) В головной функции в цикле вводим целое число, вызываем SUMDIG и выводим результат.
int SUMDIG(int );
int main()
{ int X=1; cout<< "For exit -- 0\n\n";
while (X)
{ cin>>X;
gotoxy(30, wherey()-1);
cout<<SUMDIG(X)<<endl;
}
return 0; }
int SUMDIG (int num)
{ int s=0, dig;
while (num)
{ dig=num%10;
s+=dig;
num/=10;
} return s;
}
В прототипе функции, возвращающей единственный результат, записываем его тип вместо void, имя функции и в скобках только входные параметры с их типами по тем же правилам, что и раньше. В скобках единственный выходной параметр не записывается. Аналогично записываем заголовок функции при её описании.
В тексте такой функции должен быть оператор вида
return выражение;
где выражение должно быть того же или совместимого типа, что и в заголовке функции.Оператор осуществляет выход из функции, передаёт управление в вызвавшую её функцию (в нашем примере в головную, но не обязательно) и возвращает в неё значение указанного выражения.
Особенности return:
· как частный случай выражения, можно возвращать константу или значение одной переменной;
· оператор может быть единственным в функции:
float MyFun1 (float x, float y)
{return x+y;
}
· наоборот, таких операторов может быть несколько и он не обязательно должен быть в конце функции. Но выполняется всегда один из них. Например, следующий вариант
float MyFun2A (float x, float y)
{ if (x>y) return x+y;
else return x*y;
}
короче, чем
float MyFun2B (float x, float y)
{ float r;
if (x>y) r= x+y;
else r= x*y;
return r;
}
Это же можно реализовать ещё компактнее с помощью тернарной операции:
float MyFun2 (float x, float y)
{ return x>y ? x+y : x*y;
}
· Оператор return обязателен, если возвращается одно значение, то есть в заголовке тип результата отличен от void.
Вызов такой функции с единственным возвращаемым значением записывается непосредственно в выражении, где используется её результат. Вызывать функцию, в том числе и типа void, можно не только из головной функции, но и из любой другой. Кроме “команды вывода”, обращение функции с одним результатом можно записать
· в операции присваивания, например sd=SUMDIG(1234);
· непосредственно в операторе if, не присваивая предварительно значение функции переменной (if (SUMDIG(a)>10)…), где a — переменная целого типа;
· в операторе while, например, while (SUMDIG(a*a)!=num)
или while (SUMDIG(a*a)-num)… и других операторах;
· при вызове другой функции в качестве фактического параметра, например, LINE2 (SUMDIG(a), 5, ‘.’); (см. 1.1, пример 2).
Оператор return имеет также и другое назначение. Он прекращает работу любой функции, в том числе и типа void. То есть он не обязательно должен иметь возвращаемое значение. Тогда return просто осуществляет выход из функции, не возвращая никакого значения. В таком виде, то есть в функции типа void, оператор return не обязателен. Если он не записан, то работа функции заканчивается после выполнения последнего оператора при достижении закрывающей скобки. В функции типа void оператор return имеет смысл использовать, если надо выйти из функции в разных её ветвях в зависимости от некоторого условия.