От Паскаля к Си.

Введение.

Статья носит ознакомительный характер.
На полноту изложения я не претендую.
Переход с одного алгоритмического языка на другой не столь труден, как может казаться вначале. Ведь главное в программировании, это алгоритмический тип мышления. То есть умение многократно разбивать крупную задачу на ряд мелких подзадач, до тех пор, пока мелкие задачи не превратятся в элементарные шаги. Элементарные шаги необходимо записать в виде операторов языка, а затем все это обратно синтезировать в исходную задачу. То есть необходимо помнить, что язык программирования это средство, с помощью которого программист записывает свой алгоритм. Сначала этот алгоритм надо составить, а только после этого писать программу. Любой алгоритмический язык состоит из операторов. Разные языки имеют разные составы операторов. Но идеи не так сильно различаются. Итак, начнем рассмотрение с того, что общего между языками Си и Паскаль.

Сходство языков Си и Паскаль.

И Си и Паскаль родились от одной мамы Algol-60. Поэтому у них много общего. И в первую очередь блочная структура языка. Это очень важно. Например, Бейсик не является языком, последовательно проводящим идею блочной структуры, поэтому перейти с Бейсика на Си сложнее.

Паскаль

Си

Begin
< Оператор1>;
[ …
< ОператорN>;]
End;

{
< Оператор1>;
[ …
< ОператорN>;]
};

Записываются блоки по-разному, служебные слова begin end в Паскале и фигурные скобки { } в Си, но идея блочной структуры одна и та же. Блоки допускают вложение в обоих языках, то есть внутри блока могут быть вложены другие блоки.

Все переменные должны быть описаны. Так что тут особенно переучиваться нечему.

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

Различие языков Си и Паскаль.

Различия я буду приводить в основном в виде таблиц.

Начинаем программу. В Паскале программа имеет имя, здесь оно myPasc, в Си оно всегда main (это относится к главной программе).

Паскаль

Си

program myPasc;

begin

end.

viod main (void)
{

}

При описании переменных в Си не требуется служебного слова var, и сначала идет тип переменной, а затем имя переменной.

Паскаль

Си

var i : integer;

int i;

Похоже? Конечно похоже, с поправкой на местный колорит. Но привыкнуть к этому нужно, и не слишком сложно.

Операции.

Если мы производим какие - то операции с одной и той же переменной, то можно сократить запись, указав эту переменную один раз и использовав следующие операции. В Паскале такой операции нет, а те же действия производит обычный оператор присвоения.

Паскаль.
В Пакале такая операция отсутствует. Соответствует оператору.

Си

Операция

Пример

x := x+y;

+=

x += y;

x := x-2;

-=

x -= 2;

x := x*y;

*=

x *= y;

x := x/y;

/=

x /= y;

x := x MOD y;

%=

x %= y;

x := x shr 2;

>>=

x >>= 2;

x := x shl y;

<<=

x <<= y;

x := x and y;

&=

x &= y;

x := x xor y;

^=

x ^= y;

x := x or y;

|=

x |= y;

В Си есть две операции, + + и - -, выполнение которых зависит от того, где они стоят. А именно, до или после операнда. Их смысл и соответствие операторам Паскаля приводятся в таблице. Эта таблица относится только к простым переменным. Для указателей их смысл несколько иной.

Паскаль

Си

j := j+1;

j++;

++j;

j := j-1;

j - - ;

- - j;

j:=j+1;
y:=j;

y=++j;

y:=j;
j:=j+1;

y=j++;

j:=j-1;
y:=j;

y=--j;

y:=j;
j:=j-1;

y=j--;

Обратите внимание на четыре последних строки. В Паскалевской части последовательность операторов меняется, в зависимости от того, где стоит "++" ("--"), слева или справа от переменной. Это очень важный момент при переходе на Си. Если двойной знак стоит слева от переменной, то значение переменной сначала инкрементируется (декрементируется), а уже затем осуществляется присвоение. Это так называемая префиксная операция, то есть "операция до". Если же операция "++" ("--") стоит справа от переменной, тогда инкрементирование (декрементирование) происходит после выполнения соответствующей операции. Это так называемая постфиксная операция, то есть "после". Следует также отметить, что в таких операторах изменяются две переменные, а в более сложных выражениях и больше, причем в одном выражении можно употреблять и те и другие вместе. Благодаря этим возможностям Си очень компактен, но одновременно и более сложен, так как если в одном выражении "накручено" сразу несколько префиксных и постфиксных операций, то разобрать смысл такого выражения понять не очень просто.

Паскаль

Си

   

Оператор выбора.

Паскаль

Си

case < ключ выбора > of
<
список выбора >
[else <
операторы>]
end

switch (выражение) {
case
case

default:
}


Здесь аналогия полная, различны лишь ключевые слова, да в Си выражение заключено в скобках. Но вот при выполнении есть одно существенное различие. Если в Паскалевском операторе найден оператор соответствующий условию, то он выполняется, а затем происходит выход из оператора, в Си происходит переход на следующий оператор. Для того чтобы в Си выполнить только один оператор после него должен стоять оператор break.

Паскаль

Си

Var c:integer;
begin

Readln(c);
case c of
1 : writeln ('понедельник');
2 : writeln ('вторник');
3 : writeln ('среда');
4 : writeln ('четверг');
5 : writeln ('пятница');
6 : writeln ('суббота');
7 : writeln ('воскресенье');
else writeln ('такого дня нет');
end
end.

main()
{
switch (выражение) {
case 1: printf("\n понедельник ");break;
case 2: printf("\n вторник ");break;
case 3: printf("\n среда ");break;
case 4: printf("\n четверг ");break;
case 5: printf("\n пятница ");break;
case 6: printf("\n суббота ");break;
case 7: printf("\n воскресенье ");break;
default: printf("\n такого дня нет' ");
}
}

 

Паскаль

Си

while <выражение> do <оператор> ;

while (выражение) оператор ;

Пример использования оператора

while X<5 do S:=S+X*X ;

while (X<5) S+=X*X;

Паскаль

Си

repeat <тело цикла>until <условие>;

do <оператор>while (выражение) ;

Пример использования оператора

repeat <тело цикла>until <условие>;

do <оператор>while (выражение) ;

А вот оператор цикла for требует гораздо большего внимания. В Си этот оператор имеет заметно большие возможности.

Паскаль

Си

for <переменная цикла>:= <начальное значение> to <конечное значение> do <оператор> ;

for (начальные действия;
условия завершения;
действия после очередного прохода) <оператор >;

Пример схожего использования операторов

for i := 1 to 10 do S:=S+i*i ;

for ( i=1 ; i<10 ;i++) S+=i*i ;

Не всякий оператор for на Си может быть записан аналогично в Паскале, но применяя различные ухищрения и используя операторы break и continue, можно добиться того же эффекта. Существенным в Си является то, что можно использовать комбинированные условия. В этом случае они пишутся через запятую.

Паскаль

Си

Примеры различного использования операторов

j:=3;
for i := 0 to 10 do begin
if s>=50 then break;

j := i*i;
s := s+i*j;
end;

for (i = 0, j = 3; i<10,s<50; i++, j+=i*i) s+=i*j;

В этом примере мы имеем комбинированные условия.

Начальные: i = 0, j = 3. В Паскале необходимо дополнительные условия выносить за цикл.

Условия завершения: В Си проверяются оба условия, то есть запятая в логическом смысле заменяет символ И. В Паскале необходимо вставлять дополнительный оператор if.

Действия после очередного прохода : А вот здесь надо смотреть за порядком операторов иначе результат будет совсем иной.

Паскаль

Си

   

Паскаль

Си

   

Паскаль

Си

   

 

ПРЕДЫДУЩАЯ ГЛАВА |  ГЛАВНАЯ СТРАНИЦА |  ТЕКУЩАЯ СТРАНИЦА | 

 

Hosted by uCoz