Главная Контакты


  На сайте

  Java, JavaScript
  Документация Perl
  Документация PHP
  Документация ASP
  Новости сайта
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C
 


Функции и структура программ


Перевести эту схему в код достаточно легко. Если, мы будем считать пока, что наша программа находится в одном файле, она будет иметь примерно следующий вид:
# Include (включаемые файлы)
# Define (определение)

объявления функций для main

main () {... }

внешние переменные для проталкивания (push) и выталкивание (pop)

void push (double f) {... }
double pop (void) {... }

int getop (char s []) {... }
функции, вызванные getop

Позже мы рассмотрим, как это можно разбить на два или более выходных файла.

Функция main состоять из цикла, содержать большой переключатель (switch) типа оператора или операнда; это - типичнее использования switch чем то, что мы видели ранее.
# Include
# Include / * для atof () * /

# Define MAXOP 100 / * максимальный размер операнда или оператора * /
# Define NUMBER '0 '/ * сигнализировать, что номер найдено * /

int getop (char []);
void push (double);
double pop (void);

/ * Калькулятор с обратной польской нотацией * /
main ()
{
int type;
double op2;
char s [MAXOP];

while ((type = getop (s))! = EOF) {
switch (type) {
case NUMBER:
push (atof (s));
break;
case '+':
push (pop () + pop ());
break;
case '*':
push (pop () * pop ());
break;
case '-':
op2 = pop ();
push (pop () - op2);
break;
case '/':
op2 = pop ();
if (op2! = 0.0)
push (pop () / op2);
else
printf ("error: zero divisor \ n");
break;
case '\ n':
printf ("\ t% .8 g \ n", pop ());
break;
default:
printf ("error: unknown command% s \ n", s);
break;
}
}
return 0;
}

Поскольку + и * это переставные (коммутативные) операторы, последовательность в которой вытолкнуты операнды сочетаются не имеет значения, но в случае - и /, правый и левый операнд должны различаться. Например, в
push (pop () - pop ()); / * НЕПРАВИЛЬНО * /
последовательность, в которой два вызова pop вычислено, не определено. Чтобы обеспечить правильную последовательность, нужно вытолкнуть первое значение во временную переменную, как мы это сделали в main:
# Define MAXVAL 100 / * максимальная глубина стека * /

int sp = 0; / * следующая свободная позиция в стеке * /
double val [MAXVAL]; / * стек значений * /

/ * Push: проталкивания в стек значений * /
void push (double f)
{
if (sp val [sp + +] = f;
else
printf ("error: stack full, can't push% g \ n", f);
}

/ * Pop: вытолкнуть и вернуть верхне значение из стека * /
double pop (void)
{
if (sp> 0)
return val [- sp];
else {
printf ("error: stack empty \ n");
return 0.0;
}
}


Переменная считается внешней, если ее обозначили вне любой функции. Таким образом, стек и индекс стека, совместно использоваться push и pop, определены снаружи этих функций. Но сама main не обращается в стеке или положение в стеке, поэтому представление может быть скрытым.

Другие статьи по теме:

- Внешние переменные и область действия
- Типы, операторы и выражения
- Символьные массивы
- Функции и структура программ
- Введение в c++


Голосование:
Чего Вы хотели бы видеть больше на сайте?

Статей, документации
Скриптов
Программ для вебмастера
Я не знаю



Другие голосования

Обмен кнопочками:



Приглашаем Вас обменяться кнопочками! Обращайтесь к администратору.


Новые статьи:


Наши партнеры:





2006-2024 © SMTI.RU
Главная страница | Связаться с нами