Конец холивара. Pascal vs C 2 стр.

3. Процедуры и функции (подпрограммы)

Подпрограммы позволяют разбить одну сложную программу на несколько более простых и решать эти отдельные задачи самостоятельно, возможно даже, что делать это будут разные программисты и в разное время. Готовую подпрограмму, в дальнейшем, можно использовать в других программах.

Функции и процедуры описываются после описания переменных.

Главное отличие процедуры от функции заключается в том, что процедура может возвращать в программу более одного значения или не возвращать совсем, а функция – всегда должна возвращать одно значение.

Вызов функции отличается от вызова процедуры, тем, что, при вызове имя функции указывается в качестве одного из операндов выражения, например, в правой части оператора присваивания.

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

Процедуры или функции могут не иметь параметров или иметь параметры-переменные или параметры-значения. При помощи параметров производится передача данных в процедуру или функцию. Параметры, в которые записываются результаты работы процедуры и которые будут использоваться в программе должны описываться как параметры-переменные (перед ними должно стоять слово VAR), а параметры, которые будут передавать в процедуру или функцию исходные данные должны описываться как параметры-значения. Параметры при объявлении процедуры (формальные параметры) и при вызове процедуры (фактические параметры) должны соответствовать друг другу по типу данных.

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

Процедуры и функции могут иметь свои собственные константы, типы данных, переменные и даже собственные процедуры и функции. Но все эти элементы, которые называются локальными, могут использоваться только в тех процедурах и функциях, в которых они определены. Константы, типы и переменные объявленные в программе имеющей процедуру или функцию называются глобальными. Они могут быть доступны, то есть предоставлять или изменять свои значения внутри тел процедур или функций, объявленных в этой программе. Локальные элементы позволяют работать над подпрограммами разным программистам, не боясь, что, например, они могут дать имена переменным аналогичные именам переменных в других подпрограммах или в основной программе – это не повлияет на работу других подпрограмм, или основной программы.

На этом, в том числе, базируется структурное программирование. По данной методологии любая программа строится без использования оператора безусловного перехода (goto) из трёх базовых управляющих структур: последовательность, ветвление и цикл. Кроме того, используются подпрограммы. Притом, разработка программы ведётся пошагово, методом "сверху вниз". Методология структурного программирования появилась, как следствие возрастания сложности решаемых на компьютерах задач и усложнения программ.

3.1. Функции

Пример 1.7: Функция вычисляющая факториал.

VAR A, Y : INTEGER;

FUNCTION FAKTORIAL (N : INTEGER) : INTEGER;

VAR F, K : INTEGER;

BEGIN

F := 1;

FOR K := 1 TO N DO

F := F * K;

FAKTORIAL := F

END;

BEGIN

WRITELN (‘ВВЕДИТЕ ЦЕЛОЕ ПОЛОЖИТЕЛЬНОЕ ЧИСЛО’);

READLN (A);

Y := FAKTORIAL (A);

WRITELN (‘N!=’, Y);

READLN;

READLN

END.

Обратите внимание на то, что в описании функции обязательно содержится оператор присваивания в котором слева от знака присваивания помещено имя функции.

3.2. Процедуры

Пример 1.8: Процедура вычисляет корни квадратного уравнения

AX+BX+C=0

PROGRAM KU (INPUT, OUTPUT);

VAR A, B, C, D, X1, X2 : REAL;

PROCEDURE KVUR (A, B, C: REAL; VAR D, X1, X2: REAL);

BEGIN

D:=SQR (B) -4*A*C;

IF D = 0 THEN X1:= (-B) / (2*A)

ELSE

IF D> 0 THEN

BEGIN

X1:= ((-B) – SQRT (D)) / (2*A);

X2:= ((-B) + SQRT (D)) / (2*A)

END

END;

BEGIN

WRITE (‘Введите A=’);

READLN (A);

WRITE (‘Введите B=’);

READLN (B);

WRITE (‘Введите C=’);

READLN (C);

KVUR (A, B, C, D, X1, X2);

IF D <0 THEN WRITELN (‘Действительных корней нет’)

ELSE

IF D = 0 THEN WRITELN (‘X=’, X1)

ELSE

BEGIN

WRITELN (‘X1=’, X1);

WRITELN (‘X2=’, X2)

END;

READLN;

READLN

END.

Где SQR – квадрат числа, а SQRT – корень квадратный.

4. Массивы и индексированные переменные

Массив – это упорядоченный набор переменных одинакового типа. Доступ к элементу массива производится по его номеру (индексу). Массивы удобно использовать для хранения однородной по составу информации, например, элементов таблиц, коэффициентов уравнений, матриц. Частным случаем массива символов является строка (переменная типа STRING).

Типичные действия с массивами: ввод и вывод массивов, поиск в массиве заданного элемента, поиск максимального или минимального элемента, сортировка.

Массивы бывают одномерные (например: VAR A : ARRAY [1..100] OF INTEGER;) и двумерные (например: VAR B : ARRAY [1..10, 1..10] OF INTEGER;). Двумерный массив – это таблица.

ARRAY (массив), OF (из) – ключевые слова.

Доступ к элементам массива удобно производить с помощью циклов с параметрами. Для двумерных массивов нужны вложенные циклы.

Пример 1.9: Программа генерирует таблицу умножения и оформляет вывод результатов в матрицу 10 на 10 используя двумерный массив.

VAR A : ARRAY [1..9, 1..9] OF INTEGER;

I, K : INTEGER;

BEGIN

FOR I := 1 TO 9 DO

FOR K := 1 TO 9 DO

A [I, K] := I * K;

FOR I := 1 TO 9 DO

BEGIN

FOR K := 1 TO 9 DO

WRITE (I, '*’, K, '=’, A [I, K],’’);

WRITELN

END;

READLN;

READLN

END.

5. Заглянем в вычислительную математику

Метод половинного деления

Один из методов численного решения уравнений с одним неизвестным. Пусть имеется уравнение Y (x) =0 с непрерывной на отрезке [а, b] функцией Y (х), принимающей на концах отрезка значения разных знаков и имеющей внутри [а, b] единственный корень X. Для приближенного нахождения X отрезок [а, b] делят пополам и вычисляют значение Y (x1) в средней точке x1= (a+b) /2. Если Y (x1) не равна нулю, то из двух отрезков [а, х1] и [х1,b] для последующего деления пополам выбирается тот, на концах которого значения функции различны по знаку. Возникающая в процессе такого дробления последовательность середин отрезков х1, х2, x3, … сходится к корню X. Вычисление прекращается, когда длинна отрезка становится меньше заданной погрешности вычисления.

Пример 1.10: Найти корень уравнения X – 3 = 0.

VAR A, B, E, X, Y, Y1 : REAL;

PROCEDURE FNY;

BEGIN

Y := SQR (X) – 3

END;

BEGIN

WRITELN (‘ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА И ПОГРЕШНОСТЬ’);

READLN (A, B, E);

X := A;

FNY;

Y1 := Y;

WHILE B – A> = E DO

BEGIN

X := (A + B) /2;

FNY;

IF Y*Y1> = 0

THEN

BEGIN

A := X;

Y1 := Y

END

ELSE B := X

END;

WRITELN (‘X =’, X);

READLN;

READLN

END.

В этой программе используется процедура без параметров. Заменяя в ней функцию можно находить корни других уравнений.

6. Чего ещё не хватает?

Много чего не хватает, а, особенно, денег. Но, в контексте программирования на Паскале, вас не удивляло – почему Николаус Вирт не ввёл в ряд его стандартных функций, довольно распространённый в вычислениях, кубический корень?

Сейчас мы исправим этот недочёт!

Набирайте в разделе описаний, сразу после описаний переменных, следующую функцию и будет вам счастье!

FUNCTION KUBKOR (X: REAL): REAL;

BEGIN

KUBKOR := EXP (1/3 * LN (X))

END;

Для Си это не актуально, поскольку там есть функция вычисляющая любую степень, в том числе, и дробную. А кубический корень числа – это, по другому, число в степени 1/3.

Часть вторая
Язык программирования C

1. Структура программы на языке C

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

Ключевые слова программы записываются только строчными буквами, так как C (в отличии от Pascal) различает регистр букв.

Имя переменной или константы – это последовательность букв и цифр, начинающаяся с буквы. Переменные, как и в Pascal, могут быть глобальными и локальными.

В языке C числа изображаются без знака, но есть операция "-".

Литеры и строки изображаются в кавычках ("…"), а не в апострофах (’…’), как в Pascal.

Комментарии начинаются с /* и заканчиваются */ – текст между этих скобок игнорируется при исполнении программы.

В начале программы идут строки такого вида:

#include "имя файла"

#include <имя файла>

Такая строчка заменяется файлом с указанным именем. В первом случае, сначала поиск файла ведётся в текущем каталоге, а затем продолжается в стандартном. Во втором случае – сразу в стандартном.

Например:

#include <stdio. h> – для использования функций, связанных с вводом и выводом данных.

#include <stdlib. h> – для использования стандартной библиотеки языка Си, которая содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие.

#include <math. h> – для использования стандартных математических функций.

Эти строки называются директивами препроцессора. Всё что ниже называется блоком описания функции.

Далее следует заголовок функции, например:

int main () – где main – имя функции. В скобках (…) могут быть её аргументы, или слово void (ничто) – если аргументов нет. Описание int указывает, что эта функция возвращает целое число.

После чего следует тело функции в фигурных скобках {…}, которое состоит из описаний констант и переменных и последовательности операторов, разделённых точками с запятыми (;). Тело функции определяет последовательность действий, выполняемых данной функцией – логику функции.

Фигурные скобки обрамляют также и составной оператор, аналогично операторным скобкам BEGIN… END в Pascal.

В конце тела функции обычно ставятся следующие команды:

Команда return 0; которая завершает выполнение функции с возвратом значения 0, определяемого стандартом (для функции main), как код успешного завершения.

При запуске непосредственно из графического окружения, отведенное программе окно может закрыться сразу же после завершения программы. Функция getchar ожидает ввод пользователя, тем самым "откладывая" завершение программы (return). Какие именно действия могут прервать это ожидание – зависит от системы, однако скорее всего, нажатие клавиши Enter завершит эту функцию в любом случае.

Точка в конце программы, в отличии от Pascal, не ставится.

Стандартные типы данных и описание переменных

int – целое

long – длинное целое

short – короткое целое

unsigned – беззнаковое целое

float – вещественное

double – длинное вещественное

char – литерное

В отличии от Pfscal, в С логических переменных нет.

Примеры описания переменных:

int k;

char a, b, c;

double x;

Константы

Примеры описания констант:

int: 17;

float: 1.25;

char: "a";

Процедуры ввода и вывода

Стандартная библиотека ввода-вывода языка C подключается с помощью директивы препроцессора #include <stdio. h>

Форматный ввод данных пользователя с клавиатуры производится функцией scanf ().

scanf (CONTROL, ARG1, ARG2, …);

Данная функция осуществляет чтение символов, вводимых с клавиатуры, и преобразование их во внутреннее представление в соответствии с типом величин. В функции scanf () CONTROL и список аргументов (ARG1, ARG2, …) присутствуют обязательно.

Символьную последовательность, вводимую с клавиатуры и воспринимаемую функцией scanf (), принято называть входным потоком. Функция scanf () разделяет этот поток на отдельные вводимые величины, интерпретирует их в соответствии с указанным типом и форматом и присваивает переменным, содержащимся в списке аргументов. Список аргументов – это перечень вводимых переменных, причем перед именем каждой переменной ставится значок &. Это знак операции "взятие адреса переменной".

CONTROL заключается в кавычки (то есть является текстовой константой) и состоит из списка спецификаций. Каждая спецификация начинается со знака %, после которого следует спецификатор.

Для ввода числовых данных используются следующие спецификаторы:

d – для целых десятичных чисел (тип int);

u – для целых десятичных чисел без знака (тип unsigned int);

f – для вещественных чисел (тип float) в форме с фиксированной точкой;

е – для вещественных чисел (тип float) в форме с плавающей точкой (с мантиссой и порядком).

Разделителем в потоке ввода между различными значениями может быть любое количество пробелов, а также другие пробельные символы: знак табуляции, конец строки. Только после нажатия на клавишу Enter вводимые значения присвоятся соответствующим переменным. До этого входной поток помещается в буфер клавиатуры и может редактироваться.

Форматный вывод на экран производится функцией printf ().

printf (CONTROL, ARG1, ARG2, …);

CONTROL заключается в кавычки (то есть является текстовой константой) и может включать в себя произвольный текст, управляющие символы и спецификаторы формата.

Список аргументов (ARG1, ARG2, …) может отсутствовать или же состоять из выражений, значения которых выводятся на экран (в частном случае из констант и переменных). Управляющие символы влияют на расположение на экране выводимых знаков. Признаком управляющего символа является значок \.

Вот их список:

\n – перевод строки;

\t – горизонтальная табуляция;

\r – возврат курсора к началу новой строки;

\a – сигнал-звонок;

\b – возврат на один символ (одну позицию);

\f – перевод (прогон) страницы;

\v – вертикальная табуляция.

Спецификатор формата определяет форму внешнего представления выводимой величины.

Вот некоторые спецификаторы формата:

%c – символ;

%s – строка;

%d – целое десятичное число (тип int);

%u – целое десятичное число без знака (тип unsigned);

%f – вещественные числа в форме с фиксированной точкой;

%е – вещественные числа в форме с плавающей точкой.

Соответствие между спецификаторами формата и элементами списка аргументов устанавливается в порядке их записи слева направо.

Использование функций ввода и вывода смотрите в примерах программ далее по тексту.

Арифметические операции

Унарные операции – применяются к одной переменной.

++ – увеличение на единицу (x++ выдаёт старое значение, ++x – новое значение).

– – – уменьшение на единицу, аналогично операции ++.

Бинарные операции – стоят между двумя переменными или числами.

* – умножение.

/ – деление.

% – остаток от деления (только для int или long).

+ – сложение.

- – вычитание.

Назад Дальше