Разработка и оформление программ. Функции для тестирования. Поиск индекса максимального элемента главной диагонали, страница 2

Цикл

С

PHP

Pascal

while (a <= 10)

     a = a++;

while ($a <= 10)

    $a++;

while (a <= 10) do

     a = a++;

Ветвление

С

PHP

Pascal

if (a == 0)

     b = 1;

if ($a == 0)

     $b = 1;

if a=0 then

     b := 1;

Производные конструкции

Используя основные конструкции

Используя производный оператор

<?php

if ($i == 0) {

    echo "i equals 0";

} elseif ($i == 1) {

    echo "i equals 1";

} elseif ($i == 2) {

    echo "i equals 2";

}

?>

<?php

switch ($i) {

case 0:

    echo "i equals 0";

    break;

case 1:

    echo "i equals 1";

    break;

case 2:

    echo "i equals 2";

    break;

}

?>


Функции

С

PHP

Pascal

int INC (int a)

{

     return a+1;

}

function INC($a)
{

     return $a+1;
}

function INC (a:integer): integer;

     INC := a+1

End;

Типы данных и операторы

С

PHP

Pascal

char

int

float

double

boolean

integer

float   

string

boolean

char

integer

real

Указатели

Массивы

Операторы (арифметические)

С

PHP

Pascal

=

+

-

*

/

%

=

+

-

*

/

%

:=

+

-

*

div

mod


Более строгий способ построения программ

Задача нахождения НОД

Задача: найти наибольший общий делитель (НОД) чисел a и b.

{ a и b – целые числа, не равные 0 одновременно}

программа

{x = НОД(a,b)}

Прямой способ

{ a и b – целые числа, не равные 0 одновременно}

выбрать достаточно большое x

{всякое число, более x, не является общим делителем a, b}

уменьшать x пока не найдем требуемое

{x = НОД(a,b)}

Выбор достаточно большого x

{ a и b – целые числа, не равные 0 одновременно}

если а не равно 0 то x ← a

если b не равно 0 то x ← b

{всякое число, более x, не является общим делителем a, b}

Уменьшение х

{всякое число, более x, не является общим делителем a, b}

пока x не является общим делителем уменьшить x на единицу

{x = НОД(a,b)}


Изучение предметной области

НОД(a, b) = НОД(a, –b) = НОД(–a, b)

НОД(a, 0) = a

НОД(a – b, b) = НОД(a, b)

НОД(a, b–a) = НОД(a, b)

Более строгий алгоритм

{ a и b – целые числа, не равные 0 одновременно}

A  ← a, B ← b

{НОД(A, B) = НОД(a, b)}

Изменять A и B не изменяя НОД(A, B) пока A или B не станет 0.

{НОД(A, B) = НОД(a, b), A = 0 или B = 0}

если A равно 0 то x ← B

если B равно 0 то x ← A

{x = НОД(a,b)}

{НОД(A, B) = НОД(a, b)}

Сделать A и B не отрицательными

{НОД(A, B) = НОД(a, b) A > 0 и B > 0}

Уменьшать A и B не изменяя НОД(A, B) пока A или B не станет 0.

{НОД(A, B) = НОД(a, b), A = 0 или B = 0}

{НОД(A, B) = НОД(a, b)}

eсли А => 0,  B => 0  ничего не делать

eсли А => 0,  B <  0  B ← –B

eсли А <  0,  B => 0  A ← –A

eсли А <  0,  B <  0  A ← –A, B ← –B

{НОД(A, B) = НОД(a, b) A > 0 и B > 0}


Построение цикла

{НОД(A, B) = НОД(a, b) A > 0 и B > 0}

Уменьшать A и B не изменяя НОД(A, B) пока A или B не станет 0.

{НОД(A, B) = НОД(a, b), A = 0 или B = 0}

Первая попытка

{НОД(A, B) = НОД(a, b) A > 0 и B > 0}

Пока A или B не станут равным нулю повторять

     A ← A – B

{НОД(A, B) = НОД(a, b), A = 0 или B = 0}

Правильный вариант

{НОД(A, B) = НОД(a, b) A > 0 и B > 0}

Пока A или B не станут равным нулю повторять

если A > B  A ← A – B

если A < B  B ← B - A

{НОД(A, B) = НОД(a, b), A > 0 и B > 0, A = 0 или B = 0}

Проверка правильности

Предусловие

Постусловие

Условие окончания цикла

Инвариант

Исчисление (логика) Хоара


Рекуррентные функции

Примеры рекуррентных функций

Факториал

fact(1) = 1;

fact(n) = fact(n-1)*n;

int fact(int n);

{

    if n=1 return 1;

    return fact(n-1)*n;

}

Числа Фиббоначи

fib(1) = 1;

fib(2) = 1;

fib(n) = fib(n-1) + fib(n-1);

Преобразование рекуррентных функций в цикл

Инвариант

Условие окончание

Предусловие

Постусловие

Тело цикла

f = 1;

Для I от 1 до N

          F =F*I;


Оформление программ

Стандарт кодирования GNU

http://www.opennet.ru/docs/RUS/coding_standard/

Соглашения по оформлению кода команды RSDN

http://www.rsdn.ru/article/mag/200401/codestyle.XMl

Оформление кода

Количество операторов в строке

Пробелы

Пустые строки

Шрифт

Табуляция

Стиль Олмана

if (<cond>)

{

········<body>

}

Имена переменных и функций

ignore_space_change_flag

MouseEventHandler

Венгерская нотация

 

sClientName


Комментарии

/* многострочный

комментарий */

// однострочный комментарий

Что комментировать:

исходный файл

каждую функцию, тип данных, класс (структурную единицу)

глобальные переменные

нетривиальные алгоритмы

Макросы

#define LOWER 0
 

Диагностические сообщения

void assert (int выражение)

Тестирование