Язык Паскаль и среда PascalABC



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

Для программирования на паскаль мы можем использовать среду разработки PascalABC, она абсолютно бесплатна и общедоступна, скачать её можно на официальном сайте: pascalabc.net

Устанавливаешь, запускаешь- проект создаётся при запуске автоматически. Вместо int main() у нас используется начало и конец:

begin

// тут будет вся программа (комментарии делаются так же двумя слэшами)

end.

Здесь мы рассмотрим только основы, потому что можно написать целую аналогичную книгу, рассмотрев чуть ли не все типы, команды и прочее. Впрочем, ты сам это можешь посмотреть в справке (F1). Также тут есть примеры программ для самообучения: помощь -> изучаем pascalabc.net. И ещё есть задачник для самотренировки: модули -> посмотреть задания.

Никаких include, using namespace- этой всей фигни тут нет. Регистр букв тоже не важен, т.е. ты можешь писать Begin c большой буквы и разницы для компилятора никакой не будет. То же самое касается всех остальных команд.

Переменные объявляются после поля var. Например ниже примеры объявления целых чисел, вещественных и строк. Для строк ничего подключать не надо.

var

x,y : integer;

r : real;

s,s1,s2 : string;

Можно писать и так:

var x,y : integer;

var r : real; и т.п.

Переменные можно объявлять как до главного бегина, так и внутри.

Для ввода из консоли используются функции read или readln. В pascalABC разницы никакой не замечено. Для вывода- write и writeln. Если мы пишем writeln, то после вывода происходит переход на новую строку.

Ниже пример всей программы: создаём 2 переменные целого цисла, складываем и выводим:

begin

var a,b : integer;

write('a= '); read(a);

write('b= '); read(b);

writeln('a+b= ', a+b);

end.

Для запуска жмём зелёную кнопочку наверху или F5. Вывод будет внизу в самой среде, без консольных окон. Если нам нужно консольное окно, то программу нужно скомпилировать: верхнее меню -> программа -> компилировать (CTRL + F9). Далее в корневой папке диска С находим папку PABCWork.NET, в ней будет уже готовый exe файл с программой.

Для того чтобы не вылетало, тут нет system("pause"), поэтому запросим ввести какую-нибудь переменную, например тут в конце программы напишем просто read(a). И как только мы введём любое число и нажмём enter, консольное окно закроется. Можно предварительно также выводить что-то вроде "Программа завершена. Для выхода введите любое число и нажмите enter"

Можно вводить несколько переменных сразу: read(a,b,c,d);

Чтобы сделать просто лишний переход на новую строку, пишем: writeln(); это аналог cout << endl;

Присваивание идёт через двоеточие и равно. Например:

var pi : real; pi:= 3.141592653;

Также есть отличия в плане целых и дробных: если мы поделим 2 целых, которые нацело не делятся, то получится дробное и так выведется. Пусть мы делим 2 целых числа: a/b. Если нам нужна целая часть, пишем a div b. Остаток находится так: a mod b. Округлить до целого можно так: trunc(x);

Также работают операции изменения: a+=2 всё равно что a:= a+2;

Математические функции во многом аналогичны: sqrt(), abs(), sin() и т.д. Для них подключать ничего не надо. Точный список функций можно найти в справке.

Условие реализуется так:

if (условие) then делать;

Или так: if(условие) then делать одно else делать другое ;

Если действие больше чем одно, то вместо фигурных скобок у нас begin и end; Главный end с точкой, все остальные- с точкой с запятой.

Ниже пример упрощённой программы, которая считает корни квадратного уравнения:

begin

var a,b,c,d : real;

read(a,b,c);

if(a<>0) then begin

           d:= b*b - 4*a*c;

           if (d<0) then writeln('Корней нет');

           if (d=0) then writeln('x= ', -b/(2*a));

           if (d>0) then begin

                           writeln('x1= ', (-b + sqrt(d) ) / (2*a));

                           writeln('x2= ', (-b - sqrt(d) ) / (2*a));

           end;

end;

end.

Ах да, знаки тут немного отличаются: присваивание (:=), равенство (=). В отличие от с++, где у нас присваивание(=), равенство(==). Ну а "не равно" на паскале пишется как меньше или больше, т.е. <>

Для объединения условий: or (или), and (и), not (не). При этом тут не нужно заключать в скобки всё условие, если мы например что-то перечисляем:

if (x mod 2 = 0) and (x>=100) and (x<=999) then writeln(x);

Теперь циклы. Тут в основном 2 типа:

var i: integer;

for i:=1 to 100 do что-то делаем 100 раз

или

while (условие соблюдается) do делаем

Также есть третий редкий тип, аналог do while в c++, но с одним отличием: в с++ мы делаем пока условие какое-то соблюдается, а в паскале делаем пока какое-то условие не станет таким как надо:

repeat

делаем что-то

until (нужное нам условие чтобы выйти из цикла) ;

Например:

var a: real;

Repeat

read(a);

if(a<10) then writeln('Ошибка');

until (a>=10);

Прям так копируется как в паскаль абс- это даже круто ))) масштаб мы можем менять колёсиком, как и в visual studio.

Для цикла for в паскале у нас по умолчанию i++, в этом плане функционал меньше. Если мы хотим наоборот уменьшать итератор, то можно писать например так:

for var i:=8 downto 2 do write(i,' ');

Теперь посмотрим как делать массивы и функции. Массив из 10 целых чисел объявится к примеру так:

var mass : array[1..10] of integer;

и у нас есть элементы mass[1], mass[2] и т.д. до mass[10]. Нумерация здесь может идти не только с 0, но и с любого числа, например var a:array[4..14] of real; в этом плане функционал больше.

Можно сделать двумерный массив: var m:array[1..7, 1..5] of integer; И обращаться к элементу так: m[3,2];

Функции создаются так. Ниже на примере факториала:

function fact (n:integer) : integer;

begin

var res, i: integer;

res:=1;

for i:=1 to n do res:= res*i;

fact:= res;

end;

Заметим разницу: return тут нет, вместо этого присвоение значения имени функции, в нашем случае fact. Также всегда пишется кодовое слово function, а тип возвращаемого значения указывается после аргументов. И ещё точка запятой после этого.

Аргументов может быть несколько и разного типа, например так:

function mrrow (a,b : real; c:string) : integer;

Используется функция как обычно, например write(fact(6)); или a:= fact(5);

Функции, которые ничего не возвращают, называются процедурами, а типа void тут нет, пишется так: procedure имя (аргументы) ;

Например, процедура перехода на новую строку n раз:

procedure nl (n:integer);

begin

for var i:=1 to n do writeln();

end;

Также можно использовать перегрузку функций.

Случайное число от 1 до n можно вызвать так: random(n)- это будет целое значение, которое можно использовать как мы хотим.

Вместо класса тут может использоваться структура (запись), т.е. без ООП (объектно-ориентированного программирования). Например, точка:

type point = record

x,y : integer;

end;

Обращение как к обычному элементу класса, например var a:point; a.x:= 100; a.y:= random(100); и т.п.

...

Теперь посмотрим как тут можно делать графику. Это гораздо проще чем в си плюс плюс. В начале программы пишем uses GraphABC; и можно сделать далее begin и end основные. Запустим- вылезет окошечко.

Система координат начинается с левого верхнего угла. Окно по умолчанию: 640 по ширине вправо и 480 по высоте вниз. Вместо 640 и 480 можно писать WindowWidth и WindowHeight. Также можно задать размеры окна самому, например 500 на 400:

SetWindowSize(500,400);

Теперь напишем, начиная с точки с координатой 100 вправо и 200 вниз, слово "привет". Для этого пишем такую программу, покажу всю:

uses GraphABC;

Begin

textout(100,200,'Привет');

end.

Можно выводить и числа- надо вместо 'Привет' написать какое-нибудь число.

Далее мы можем рисовать круги, прямоугольники и линии. Для этого используются свои функции:

circle(x,y,r); нарисовать круг с центром в (x,y) и радиусом r.

rectangle(x1,y1,x2,y2); нарисует прямоугольник между 2 диагональными точками: (х1,у1) и (х2,у2).

line(x1,y1,x2,y2); рисует линию по 2 точкам.

Можно в цикле рисовать несколько таких фигур. А ещё можно задавать цвет. Для этого перед рисованием фигуры пишем: SetBrushColor(цвет); Чтобы закрасить обводку, пишем SetPenColor(цвет). По умолчанию обводка чёрная, а цвет фигуры белый. Цвет начинается с cl и далее название на английском. Ниже пример рисования 5 красных линий:

uses GraphABC;

Begin

for var i:=1 to 5 do begin

SetPenColor(clRed);

line(0,0+i*50, 640, i*50);

end;

end.

Можно использовать случайный цвет: clRandom. Ниже мы нарисуем картину из 100 красных кругов со случайным радиусом и в случайных местах:

uses GraphABC;

Begin

for var i:=1 to 100 do begin

SetPenColor(clRed);

SetBrushColor(clRed);

circle(random(300), random(300), random(100));

end;

end.

Можно даже сделать простую анимацию, для этого делается задержка: sleep(миллисекунды); Например, будем рисовать круги вправо с задержкой:

uses GraphABC;

Begin

for var i:=1 to 10 do begin

sleep(300);

SetBrushColor(clRandom);

circle(i*50,100,50-i*4);

end;

end.

Посмотрим как загружать картинки. Нужно создать переменную типа picture:

var p : picture;

Естественно, у нас подключено graphabc. Далее я сделал в пэинте тестовую картинку, сохранил как jpg и переместил в папку PABCWork.NET на диске C.

Загрузка картинки: p:= picture.Create('example.jpg');

Помещение этой картинки в нужную координату: p.Draw(300,200);

Ниже я приведу код игры сапёр, на примере которого ты можешь со всеми этими технологиями ознакомиться:

uses graphABC;

 

Var

mass: array [0..11,0..11] of integer;

pic: array [0..15] of Picture;

x,y,i,j,n:integer;

size:integer;

 

procedure GameOver();

var i,j:integer;

Begin

for i:=1 to 10 do

for j:=1 to 10 do

pic[mass[i][j]].Draw(i*size, j*size);

end;

 

 

procedure MouseDown(x,y,mb:integer);

Begin

 i:=x div size;

 j:=y div size;

 if mb=1 then pic[mass[i,j]].Draw(i*size,j*size);

 if mb=2 then pic[11].Draw(i*size,j*size);

 if (mb=1) and (mass[i,j]=9) then GameOver();

end;

 

Begin

size:=32;

SetWindowSize(400,400);

OnMouseDown:=MouseDown;

 

for i:=0 to 11 do pic[i]:=Picture.Create('images/'+i.ToString()+'.jpg');

 

for i:=1 to 10 do for j:=1 to 10 do begin

mass[i,j]:=10;

if (random(5)=0) then mass[i,j]:=9;

end;

 

for i:=1 to 10 do for j:=1 to 10 do begin

n:=0;

if mass[i,j]=9 then continue;

if mass[i+1,j]=9 then n:=n+1;

if mass[i,j+1]=9 then n:=n+1;

if mass[i-1,j]=9 then n:=n+1;

if mass[i,j-1]=9 then n:=n+1;

if mass[i+1,j+1]=9 then n:=n+1;

if mass[i-1,j-1]=9 then n:=n+1;

if mass[i-1,j+1]=9 then n:=n+1;

if mass[i+1,j-1]=9 then n:=n+1;

mass[i,j]:=n;   

end;

 

for i:=1 to 10 do for j:=1 to 10 do pic[10].Draw(i*size, j*size);

 

end.

Картинки от этого сапёра ты можешь скачать и использовать здесь:

https://yadi.sk/d/72lR8VFy3KZT9Z

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

 

57. Язык Си и отличия от С++

Как известно, язык с++ произошёл от си. В си нет объектно-ориентированного программирования. Сначала появился язык "си с классами", а позже уже и сам си плюс плюс. Название исходит из инкрементации си- как бы на единицу больше, т.е. чуточку получше. Полезно посмотреть, как писать хотя бы простые вещи на языке си, тут во многом всё похоже на си плюс плюс. Кроме того, сам язык си входит в с++ (если упрощённо рассматривать, хотя всё чуточку сложнее), т.е. ты можешь в программе на с++ спокойно писать участки кода с конструкциями языка си и компилятор будет это переваривать. Язык си также называют "чистый си", в отличие от c++, c# и прочих.

Но мы можем создать и проект чисто на языке си. Для этого не нужна какая-то отдельная среда. В devcpp ты так же создаёшь проект, только выбираешь при этом не с++, а просто с. Создастся файл main.c. В visual studio ты тоже просто можешь создать файл main.c

В си заметно больше заморочек, чем в с++, и он кажется сложнее- поэтому поняв с++, изучение языка си уже не кажется таким страшным. Просто нужно больше кода писать и больше нюансов помнить и учитывать. Потому что си- это более низкоуровневый язык чем с++, т.е. он ближе к машинному языку, а поэтому быстрее- но при этом сложнее для программиста (для человека). На си часто программируют микроконтроллеры, например калькуляторы какие-то и прочие устройства.

Итак, приступим. В языке си тоже нужно подключать библиотеки, только они называются немного по-другому. Например, вместо iostream у нас stdio.h. Для подключения библиотек используется та же команда #include.

Для вывода информации используется функция printf(); Как в паскале примерно. Например, чтобы вывести привет, мы пишем: printf("Privet"); Для поддержки русского языка можно использовать такие же приёмы. Для перехода на новую строку можно использовать только последовательность "\n"; Типы переменных такие же: int, char, double и прочие.

Программа, которая выводит Privet:

#include <stdio.h>

int main() {

           printf("Privet\n");

           system("pause");

}

Теперь попробуем создать 2 переменные целого числа и сложить. В си есть заморочка с вводом и выводом переменных и ты сейчас офигеешь насколько в с++ в этом плане сделали всё проще.

Чтобы создать переменную a, мы пишем как привыкли: int a;

Можно через запятую создать две: int a,b;

А вот вводить переменную, например a, нужно так: scanf("%d",&a);

Т.е. мы не просто вводим переменную, а указываем через "%d" что мы вводим именно целое число. Для каждого типа переменной нужно указывать свои буквы после процента. А далее мы вводим не просто переменную, а ещё и с амперсентом, чем обозначается адрес.

На этом заморочки не заканчиваются. Выводить тоже надо с процентными последовательностями до переменных, но адрес ставить уже не надо. Вот вся программа, которая складывает 2 целых числа:

#include <stdio.h> // библиотека ввода-вывода

int main() {

           int a,b; // освобождение 2 ячеек памяти под целые числа с именами a,b

           scanf("%d",&a); // ввод переменной a

           scanf("%d",&b); // ввод b

           printf("%d",a+b); // вывод суммы

           printf("\n"); // переход на новую строку

           system("pause"); // пауза чтобы консольное окно не вылетало

}

А как же с типами float, double и прочими? Ниже список с процентными символами, которые нужно указывать:

%d — целое число типа int со знаком в десятичной системе счисления;

%u — целое число типа unsigned int;

%x — целое число типа int со знаком в шестнадцатеричной системе счисления;

%o — целое число типа int со знаком в восьмеричной системе счисления;

%hd — целое число типа short со знаком в десятичной системе счисления;

%hu — целое число типа unsigned short;

%hx — целое число типа short со знаком в шестнадцатеричной системе счисления;

%ld — целое число типа long int со знаком в десятичной системе счисления;

%lu — целое число типа unsigned long int;

%lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;

%f — вещественный формат (числа с плавающей точкой типа float);

%lf — вещественный формат двойной точности (числа с плавающей точкой типа double);

%e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);

%c — символьный формат;

%s — строковый формат.

Поехали дальше. Арифметика в языке си такая же как в с++, т.е. знаки плюс, минус и прочее всё то же самое. Условия и циклы имеют такой же синтаксис.

Тогда теперь сосчитаем сумму чисел от 1 до 100 с помощью цикла на языке си. Это выглядит так:

#include <stdio.h>

int main() {

           int sum= 0, i;

           for (i=1; i<=100; i++) sum+= i;

           printf("%d",sum);

           system("pause");

}

Важно: в printf мы указываем только 2 аргумента: процентный символ и выводимое число. Все дальнейшие аргументы через запятую игнорируются. Приходится prinf писать несколько раз.

Если мы хотим вывести "Сумма: 5050" то тогда это выглядит так:

printf("Сумма: %d",sum);

Для русского языка как обычно прописываем setlocale(0,"");

...

Для корня, модуля и т.п. всё то же самое, но библиотека уже <math.h>

Ниже программа, которая считает арифметический корень из семи:

#include <stdio.h>

#include <math.h>

int main() {

           setlocale(0,"");

           printf("%lf",sqrt(7));

           printf("\n");

           system("pause");

}

Помним про процентные символы для ввода-вывода.

...

Статические массивы создаются и используются так же. Пример:

int a[5]= {2,4,7,5,1}; printf("%d", a[2]);

А вот динамические создаются по-другому. Нужно подключить библиотеку:

#include <malloc.h>

Массив целых чисел под именем mass и с числом элементов n создаётся так:

int *mass; mass = (int*)malloc(n * sizeof(int));

Ниже будет программа, где мы создаём массив, вводим элементы и затем выводим:

#include <stdio.h> // для ввода-вывода

#include <malloc.h> // для динамических массивов

int main() {

           setlocale(0,""); // для вывода русских символов

           int i,n;

           printf("Размер массива: "); scanf("%d", &n); // сколько элементов

           int *a; a = (int*)malloc(n * sizeof(int)); // создали массив

           // вводим элементы

           for (i = 0; i<n; i++) {

                    printf("a[%d] = ", i); // выводится будет a[0]=, a[1]= и т.д. в цикле

                  scanf("%d", &a[i]);

      }

      for (i = 0; i<n; i++) printf("%d ", a[i]); // выводим

           printf("\n"); system("pause");

}

Случайные числа создаются такими же функциями, только библиотеки <stdlib.h>, <time.h>

Ну и помнить про процентные символы, они тут как воздух в языке си.

Функции делаются так же как в си плюс плюс. Ниже пример генерация случайного двузначного числа через функцию:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int getrand() { return rand()%90 + 10; }

int main() {

           setlocale(0,"");

           srand(time(NULL));

           printf("%d ", getrand());

           printf("\n");

           system("pause");

}

Напоследок посмотрим работу с файлами поверхностно. Тут не нужно подключать библиотеки.

1. Для работы с файлами создаём переменную-указатель типа FILE:

FILE *f;

2. Для открытия файла с записью туда пишем:

f= fopen("test.txt", "w");

Если файла с таким именем в папке с exe нет, то он создатся.

Запишем туда число 134: fprintf(f,"%d", 134);

3. Закрытие файла: fclose(f);

4. Открытие файла для чтения: f= fopen("test.txt", "r");

Извлечём число: int a; fscanf(f,"%d", &a);

5. Закроем файл и выведем в консоль:

fclose(f); printf("%d",a);

Ну вот и всё. На этом, думаю, общее знакомство с языком С мы закончим.


Дата добавления: 2018-09-22; просмотров: 223; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!