- •Void main(void)
- •Void main(void)
- •Void main()
- •Void main()
- •Viod main()
- •Условные выражения
- •Void main()
- •If(Выраженне1) Выражение2;
- •If(Выражение1) Выраженпе2; else ВыражениеЗ;
- •Void main()
- •Циклические выражения
- •Void nain()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Массивы
- •Void main()
- •Void main()
- •Void main()
- •Viod main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Адреса и указатели
- •Void main()
- •Viod main()
- •Функции
- •Void main(void)
- •Void main(void)
- •Int I; double X,step();
- •Void decart(double r, double f)
- •Void main()
- •Void decart(double r,double f,double *X,double*y)
- •Void main()
- •Void rnain()
- •Void main()
- •Void main()
- •Void main()
- •Int length;
- •Объектно-ориентированное программирование и приложения с графическим интерфейсом
- •Void main(void)
- •Int MyFunc(int, int);
- •Void NewFunc(void);
- •Void main()
- •Void FuncOut();
- •Void prob::FuncOut()
- •Void main()
- •Void main()
- •Void __fastcall tForm1::Button1Click(tObject *Sender)
- •Int pascal
- •Int nCmdShow)
- •Void __fastcall tForm1::Timer1Timer(tObject *Sender)
- •Void __fastcall tForm1::okClick(tObject *Sender)
- •Int I,step;
- •Введение в численные методы
Void decart(double r, double f)
{
double pil80=Pi/180;
X=r*cos(f); Y=r*sin(f);
}
Void main()
{
double rr.ff;
scanf(“%lf %If'”,&rr.&ff);
decart(rr,ff);
printf(“%lf %lf",X,Y);
}
Прежде всего, поясним новый элемент программы, появившийся в третьей строке. Мы уже говорили, что конструкции, начинающиеся символом #, являются инструкциями препроцессору. Такие инструкции предписывают системе еще до начала компиляции произвести над программой некоторые предварительные действия. Так, инструкция #include предписывает подключить к программе соответствующий заголовочный файл. По инструкции #define АAА ВВВ препроцессор просматривает весь текст программы и везде, где встречается фрагмент ААА, производится его замена на фрагмент ВВВ. Подчеркнем, что замена делается именно в тексте еще до компиляции программы. Необходимость в использовании этой препроцессорной инструкции возникает только в особых случаях, с которыми, однако, читателю, возможно, придется столкнуться, что и побудило нас включить эту конструкцию в программу.
Функция decart в данной программе не возвращает никакого значения и поэтому имеет тип void. В теле функции описана локальная переменная pil80, которая получает значение, используемое для преобразования углов из градусной меры в радианную. Использование здесь локальной переменной явно нецелесообразно. Автор сознательно допустил это для того, чтобы читатель сам попробовал сделать необходимые корректировки. Передача в главную функцию вычисленных в decart значений осуществляется с помощью глобальных переменных Х и Y.
Передача результатов вычислений из одной функции в другую через глобальные переменные является не единственным и иногда и не лучшим способом. Альтернативой может быть передача значений по адресам, с использованием указателей. Начнем с того, что напомним - функция, приняв значения своих аргументов, работает не непосредственно с этими аргументами, а с их копиями. Так, если вы попытаетесь в теле функции изменить значение аргумента, то, выйдя из функции, обнаружите, что эти изменения в вызывающей функцию программе никак не отразились. Однако эту особенность можно обойти, если аргументы, которые вы хотите изменить, задать через их адреса. Теперь, если с ними обращаться по правилам работы с указателями, то можно передавать значения из функции в функцию по адресам, без использования глобальных переменных.
Продемонстрируем эти возможности на той же задаче, которую реализовала предыдущая программа. Сейчас она будет выглядеть следующим образом:
const double pil80=3.1415927/180;
Void decart(double r,double f,double *X,double*y)
{
*x=r*sin(f*pil80);
*y=r*cos(f*pil80);
}
Void main()
{ double r,f,x,y;
scanf("%lf %lf”,&r,&f);
DECART(r,f,&x,&y);
printf("%lf %1f",x,y);
}
Для начала мы оптимизировали определение значения pi180. Теперь оно стало вещественной константой, которая не может и не должна меняться нигде в программе. Кроме того, сразу задано ее числовое значение через деление пифагорова числа на 180. Эта операция делается в программе один раз, что и является наиболее оптимальным.
Функция DECART имеет четыре аргумента. Два первых - обычные переменные типа double, а третий и четвертый - указатели на double. Тело функции состоит из двух выражений присваивания. Первое из них следует понимать так: "По адресу, указанному третьим аргументом функции, записать значение, равное произведению первого аргумента на синус второго аргумента, умноженного на значение константы pi180". Аналогичную сентенцию можно сочинить и для второго выражения присваивания.
В главной функции описаны четыре вещественные переменные: r, f, х, у. Значения первых двух вводятся с консоли и далее используются как "входные" параметры в функции DECART. Значения х и у формируются в результате работы этой функции. Поскольку на месте двух последних аргументов должны стоять указатели, мы и написали в вызове функции DECART &x и &у.
Изложенные только что представления позволят нам окончательно разобраться с функцией scanf. Вспомним, что инициализируемую с консоли переменную мы снабжали символом & перед ее именем. Сейчас стало понятным, почему это необходимо. Функция scanf должна изменить значение вводимой переменной — единственная возможность сделать это без привлечения глобальных объектов заключается в использовании указателей. Именно по этой причине аргументом функции scanf является не сама переменная, а ее адрес.
Рассмотрим еще один пример на использование "самодельной" функции без параметров. В этом примере мы познакомимся с еще одним генератором случайных чисел, описанным в заголовочном файле stdlib.h. Эта функция называется random, имеет аргумент типа int и возвращает целое случайное число из диапазона от 0 до N-1(включительно), где N — значение аргумента функции. С помощью этой функции изготовим генератор вещественных случайных чисел в диапазоне от 0 до 1, В главной функции генератор будет использован для заполнения вещественного массива случайными числами:
#include<stdlib.h>
const double g=l./31999.;
double RN()
{
return random(32000)*g;
}