IPB
ЛогинПароль:

> Прочтите, прежде чем создать тему.

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

 
 Ответить  Открыть новую тему 
> Написание статей!
сообщение
Сообщение #1


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Есть ли у кого-нибудь из участников желание попробовать себя в сабже? Любые темы связанные с паскалем(но не делфи!).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






А чем это отличается от туториалов, которых тут и так достаточно?
Или ты предлагаешь написать книгу о паскале всем форумом? smile.gif

З. Ы. : Welcome back smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Кстати можно и книгу, но в общем я не это имел ввиду smile.gif
З. Ы. Сэнкью вери мачс!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 239
Пол: Женский
Реальное имя: Юлия

Репутация: -  3  +


[offtop]
WELCOME BACK MY DEAR DEAR ADMINISTRATOR!!!!! :D
[offtop]


--------------------
For every evil under the sun
There is a remedy or there is none
If there is one - try to find it
If there is none - never mind it!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 206
Пол: Мужской

Репутация: -  3  +


Можно бы, если кто подскажет тему, которая интересовала бы других, и по которой я бы хоть чего-нибудь знал. А так я вообще писать люблю... Написал в свое время туториал по созданию примитивного лабиринта на TP. Начал писать что-то типа "Введение в программирование для чайничков", в смысле для маленьких программистов и с юмором, да забросил, потому что описывать весь Паскаль долго, да и социального заказа не было.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Решено! Тогда пусть сюда постят интересующие пользователей темы!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Очень бы пригодились статьи, касающиеся работы с графикой! Будем обьективны - уроки совсем для новичков!
Есть ли у кого-нибудь желание?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Слов много, а дела 0. Похоже, что тут все благие намерения потиху затухают за отутствием эитузиастов smile.gif Начну короче.

Оговорюсь сразу - всё, что я пишу касается Borland Pascal этак 7.0, т. к. он наиболее распространён.

Что такое программа? Программа это нечто smile.gif Более подробное описание дать наверно невозможно smile.gif Одни скажут одно, другие другое, но все сойдутся в одном: программа обрабатывает информацию. Информация бывает разная: список разных мороженных у мороженщика, дни рождения друзей, график авиарейсов и т. д. Программа работает с какой-то информацией, что-то из неё выделяет и сообщает об этом пользователю. Это может быть стоимость крембрюле, напоминание о том, что пора поздравить Василия Пупкина с денюхой или скромный намёк на то, что в твой самолёт в Китай уже улетел, придётся итить пешком. Итого: программа получает данные, обрабатывает их и выдаёт результат. Теперь по-подробнее об этих этапах.
Начну со второго - обработка. Мы предполагаем, что нужную информацию мы можем получить силой мысли и писать для этого ничего не надо, но вот чтобы как-то её обработать придётся эту мысль материализовать. Чтобы работать с информацией надо её где-то хранить. Можно и не хранить в принципе, а постоянно черпать её из "первоисточника", но это, как показывает практика, очень даже не выход. Где же её можно хранить? Для этого есть такое понятие как переменные. Переменная - это кусочек памяти, с которым программа может работать бех каких-то затруднений и с большой скоростью (по сравнению с постоянным вводом пользователя...). Как обзавестись переменной? Это делается так:
Код

Var
 VariableName:VariableType;

Чего тут написано? Тут открывается блок Var, в которм и описываются переменые, затем указывается имя переменной и через двоеточие её тип. В конце ставится символ ';' как указатель того, что "предложение" закончено. В паскале это обязательно: заканчивать предложения точкой с запятой. Закрывать блок Var не надо - паскаль сам допрёт когда это надо сделать. Теперь обсудим, что значит VatiableName и VariableType. Имя переменной - это какой-то набор символов (допускаются только латинские буквы, цифры и знак подчёркивания, причём первой цифра быть не может), который указывает "имя" того участка памяти, в котором хранится значение переменной. По этому имени программа и будет с ним работать. Рекомендуется давать символические имена переменным. Например фамилию мороженщика лучше хранить в переменной Surname, а цену пломбира в переменной Cost, хотя никто и не запрещает назвать их например q и w.
Теперь поговорим о типе переменной. Что это такое? Информация бывает разная. У Васи есть имя, у мороженного есть цена, в месяце встречаются дни. Вся эта информация носит разный характер содержимого - имя - набор символов, цена - возможно дробное число, номер дня - натуральное число. Тип переменной как раз несколько конкретизирует хранимую в переменной инфу. Вот какие типы могут быть у переменных:
Char - один символ.
String - последовательность символов длиной не более 255.
Byte - целое число от 0 до 255.
ShortInt - целое от -128 до 127.
Integer - целое от -32768 до 32767.
Word - целое от 0 до 65535.
LongInt - целое от -2147483648 до 2147483647.
Есть ещё вещественные типы: Real, Single, Double, Extended. Они различаются по пределам чисел, которые можно в них хранить и по точности.
Надо точно определять тип переменной, который тебе понадобится. Есди в результате работы программы может получиться дробное число, то хранить его надо в переменной типа например Double, а, если нет, то лучше воспользоваться допустим Integer'ом. Так же, если есть уверенность, что число не превзойдёт допустим 1000, то не стоит под такие нужды отводить LongInt - достаточно Integer'а или Word'а.
Есть и более сложные типы данных, но о них поговорим позже.
Итак, для примера опишем переменные для хранения информации о каком-нидь человеке:
Код

Var
 Name:String[20];
 SurName:String[20];
 Address:String;
 Phone:String[15];
 Payment:Double;
 Age:Byte;

Strin[20], String[15]? Что это такое? Это ограничение максимального количества символов в строке. Это нужно для того, чтобы сэкономить память. Не надо кричать, что у меня этой памяти гигабайт и т. д. Без всяких трюков программе на паскале доступен лишь первый мегабайт памяти, в котором кроме самой программы и её переменных хранится куча всякой информации, так что иногда приходится экономить.
Ну вот есть у нас переменные. Я что с ними можно делать? А много чего. В паскале есть несколько типов операций над переменными. Опишу арифметические: +, -, *, /, Div, Mod. Первые 4 должны быть понятны, а последние опишу. Div делит одно число на другое нацело. То есть 6 Div 2 и 7 Div 2 возвращает 3 в обоих случаях. А Mod берёт остаток от деления. Например 11 Mod 7 = 4, 10 Mod 7 = 3, 18 Mod 7 = 4. Теперь уже можно написать программу, которая будет решать проблему всех веков и народов - вычислять 2*2 smile.gif
Код

Var
 n:Integer;
Begin
 n:=2*2;
End.

Тут определяется переменная n типа Integer. Затем начинается сама программа (со слова Begin). В ней вычисляется выражение 2*2, а результат запиывается в переменную n. Программа завершается словом End. В конце программы всегда ставится точка. Но писать такие программы никому не нужно. Они должны быть более сложные, чтобы приносить какую-то практическую пользу.
Рассмотрим операторы паскаля, которые позволяют усложнить программу.
If Then Else. Оператор проверки условия. Проверяет некоторое условие и выполняет блок команд описанный после слова Then. Если условие не верно, то выполняется блок Else, который в принципе может отсутствовать за ненадобностью. Посмотрим на примере:
Код

Var
 a:Integer;
 b:Integer;
Begin
 a:=Random(10);
 If a>5 Then
   a:=10-a;
 b:=Random(10);
 If b>5 Then
   b:=10-b
 Else
 Begin
   a:=a+2;
   b:=b+2
 End
End.

Тоже глупая программа, которая заимается никому не нужными вычислениями. Посмотрим, что в ней такого есть. Появилось новое слово: Random. Это функция такая. Она возвращает случайное число от нуля до девяти (10-1) в нашем случае. Далее идёт прмер блока If-Then-Else без Else, а затем пример с Else, в которм выполняется несколько команд. Если бы в блоке Else выполнялась одна команда, то Begin и End ставить было бы не обязательно. Так же надо отметить момент с ';'. Перед End её ставить не обязательно практически во всех случаях, а перед Else её ствить вообще НЕЛЬЗЯ. Едем дальше.
Case. Оператор выбора. Предназначен для рассмотрения значения переменной и каких-то действий в том или ином случае. Надо отметить, что переменная должна быть скалярной, т. е. всякие строки и дроби недопустимы. Рассмотрим на примере.
Код

Var
 a,b,c:Integer;
Begin
 a:=Random(10);
 c:=1;
 Case a Of
   1:b:=2;
   2:b:=3;
   3:
   Begin
     b:=4;
     c:=2
   End
   Else
     b:=7
 End
End.

В зависимости от сгенерированного числа в переменную b записывается то или иное число. Так же как и в блоке If-Then-Else, при необходимости выполнить несколко действий надо поставить слова Begin и End. Если значение переменной не находится в списке вариантов, то выполняется ветвь Else, которая так же как и в If-Then-Else может отсутствовать.
For. Оператор цикла. Предназначен для выполнения некоторых действий несколько раз.
Код

Var
 i,n:Integer;
Begin
 n:=1;
 For i:=1 To 5 Do
    n:=n*i
End.

Эта программа уже не такая бессмысленная. Она вычисляет 5!. Происходит это так:
1). В n записывается 1.
2). В i записывается 1.
3). n домнажатся на i.
4). i увеличивается на 1.
5). Проверяется не стало ли i больше 5 и, если не стало, то переходит к шагу 3.
Есть ещё вариант For ... DownTo ... Do ... Он отличается от предыдущего тем, что значение счётчика не увеличивается, а уменьшается.
[b]While и [Until]. Тоже операторы циклов, но в отличие от For, они не требуют счётчика, а проверяют некоторое условие.
Код

Var
 i,n:Integer;
Begin
 i:=1;
 n:=1;
 While n<1000 Do
 Begin
   n:=n*i;
   i:=i+1
 End
End.

Эта программа вычисляет первый факториал привышающий 1000. В цикле выполняется увеличение n и i, пока n не превзойдёт 1000. Так же эту программу можно реализовать и другими способами:
Код

Var
 i,n:Integer;
Begin
 i:=1;
 n:=1;
 Do
   n:=n*i;
   i:=i+1
 Until n>1000
End.

и
Код

Var
 i,n:Integer;
Begin
 n:=1;
 For i:=1 To 100 Do
 Begin
   n:=n*i;
   If n>1000 Then
     Break
 End
End.

В последнем варианте используется команда Break. Она служит для прерывания цикла. Есть ещё команда Continue, которая не прерывает цикл, а пропускает оставшееся его тело и переходит на проверку условия.

Ну вот, с основными моментами вроде разобрались. Теперь вернёмся к вопросу о вводе и выоде информации. Не станем пока затрагивать вопросы работы с файлами или сетью, а просто будем работать с клавиатурой и монитором. Ввод с клавиатуры осуществляется процедурой Raad или ReadLn, а вывод Write или WriteLn. Суффикс Ln в конце обозначает то, что по завершению работы курсор перейдёт на следующую строку.
Теперь уже можно написать полноценную программу. Она будет запашивать некоторое число и выводить его факториал.
Код

Var
 Result:LongInt;
 i,n:Integer;
Begin
 Write("Введите число: ");
 ReadLn(n);
 If n<=0 Then
   WriteLn("неверное число")
 Else
 Begin
   Result:=1;
   For i:=1 To n Do
     Result:=Result*i;
   WriteLn("Факториал этого числа = ",Result)
 End
End.

Разобраться в этой программе думаю не составит никакого труда.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Для тех кому тоже делать нефиг: попробуйте писать в этом же стиле, может в натуре книгу сварганим smile.gif
Для критиков: внимаю.
Для вредных критиков: множества я СПЕЦИАЛЬНО не описывал, т. к. о них надо писать много и интересно, потому что множество - рульная паскалевская фишка.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


Нефиг делать. Инфа о символьном типе. Где используеться...

Переменные данного типа хранят один символ, и под каждую из них отводится 1 байт памяти. Нужны такие переменные, в основном, когда от пользователя требуется подтвердить какое-то действие, например, нажать "у" в качестве подтверждения чего-либо. Объявляются переменные данного типа, как и все остальные, в разделе объявлений переменных (var). Объявление выглядит примерно так.

Код

var
name_of_variable:char;
...


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

Код

....
ch:=readkey;{должен быть объявлен модуль Crt}
....


Чтобы всем было понятнее, что я имел в виду, приведу пример проги. Эта прога практически ничего не будет делать, кроме как выводить просьбу о нажатии на 'y' или 'n'.

Код

uses crt;
var
ch:char;
begin
clrscr;
repeat
 textcolor(red);
 writeln('Вы хотите понажимать на кнопки(y/n)?');
 ch:=readkey;
 clrscr;
 if ch='y' then writeln('Мне тоже нравиться нажимать на кнопки!');
until ch='n';
end.


Тут мы читаем то, что нажал пользователь, пока он не нажмёт 'n' или Reset/Power. Если он нажимает 'y', то мы ему ещё одно сообщение выводим. Всё остальное прога игнорирует.
Теперь надо рассмотреть пару функций для работы с переменными данного типа. Дело в том, что переменная хранит не сам символ, а его номер в таблице ASCII. В нашей программе, если мы нажмём, например, какую-то из "стрелочек", то в переменную занесётся код нажатой клавиши. В наших программах мы можем печатать любой символ из этой таблицы. Поэкспериментируйте с такими строчками в своих программах.

Код

....
writeln(#1);
writeln(#100);
....


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

1) Ord(x); - возвращает порядковое значение выражения перечисляемого типа. В нашем случае, если в качестве параметра (вместо х) поставить переменную символьного типа, функция возвратит нам код этого символа.
2) Chr(x); - в качестве параметра передаём число от 0 до 255 и получаем соответствующий символ.
А теперь открываем Паскаль и набиваем следующий код

Код

uses crt;
var
c:char;
begin
clrscr;
repeat
 c:=readkey;

 if c=#0 then begin write(ord(c)); c:=readkey;
   writeln(' and ',ord(c));
 end
 else writeln(c,'=',ord(c));
until c=#27;
end.


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

Код

...
for ch:='a' to 'z' do write(ch);
for ch:='z' downto 'a' do write(ch);
...


На экран будет выведен алфавит, а потом алфавит в обратном порядке.
Напишем Paint в текстовом режиме. :D

Код

uses crt;
var x,y:byte;
begin
clrscr;
writeln('esc for exit');
x:=12;
y:=12;
repeat
 gotoxy(x,y);
 write(#1);
 c:=readkey;
 case c of
   #72: dec(y);
   #80: inc(y);
   #77: inc(x);
   #75: dec(x);
 end;
until c=#27;
end.



Объявляем пару переменных для положения "кисти". Чистим экран. Рисуем символ в позиции, заданной координатами х и у. Читаем у Юзверя клавишу. После этого сравниваем то, что он нажал с каждой из "стрелочек". В зависимости от того, что он нажал, увеличиваем\уменьшаем соответствующую координату на 1. Рисуем символ в позиции,... Всё это работает до нажатия Esc.

Вот и поизвращались с символьным типом.


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Мне опять делать нефиг. А ещё я вредный smile.gif
Несколько коментариев к "символьным типам".

Переменная символьного типа занимает 1 байт (8 бит) в памяти. Следовательно она может принимать значения от 0 до 255 (00000000 .. 11111111 в двоичной). По сути она хранит код символа, а паскаль расценивает переменную типа Char, как символ. То есть к ней нельзя прибавить или вычесть (точнее прибавить можно, но это уже будет 2 символа, а не один, но м иным кодом). Чтобы изменить код символа в переменной типа Char надо воспользоваться примерно следующим кодом:
Код

Var
 c:Char;
Begin
 c:=#20;
 c:=Char(Byte(c) + $10);
 WriteLn(c)
End.

В данном случае я использовал приём называемый приведением типов. Т. е. сначала значение переменной c расценивается как значение для переменной типа Byte (т. к. Byte по размеру не меньше чем Char, то мы просто получаем значение кода). Это аналогично вызову функции Ord, но без всяких вызовов. Далее к этому значению прибавляется 16 ($10), а затем обратно всё это расценивается как код символа. Вот и получаем в c $30 (код символа '0'). Прямое приведение типов не уступает вызову соответствующих функций, возможно даже привосходит, но в этом я не уверен.
Едем дальше. Упоминалась некая таблица символов. Есть такая. Она называется тблицей ASCII. В ней ровно 255 мест как раз под каждый символ. У каждого из них есть своё имя. Например символ с кодом 0 зовётся NUL, символ с кодом 7 - BEL, 13 - LF, 10 - CR, а вот 32 это всем знакомый SPC (пробел). Затем с 48 идут цифры, далее и буквы латинского алфавита... Но это всё только в первой половине таблицы (до 127). А вот вторая половина зависит как правило от языка установленного в системе. Функции ввода/вывода опираются на таблицы, в которых описан внешний вид символов, а вот эти таблицы устанавливаются либо ОС либо специальными программами типа KeyRus и т. д.
То есть, когда мы пытаемся вывести символ с кодом 48, мы можем быть уверены, что это '0', а когда символ с кодом где-нибудь 200, то не стоит быть слишком уверенным, что это кусок рамки smile.gif Да, если и ближе к жизни: все наверно сталкивались с проблемой, когда в досовских программах вместо русского бред какой-то. Это из-за того, что не совпадают именно эти таблички.
Интереса ради можно попробывать запустить следующий код:
Код

Var
 c:Char;
Begin
 For c:=#$00 To #$FF Do
   Write(c)
End.

Как видно, на экран будет выведена вся таблица.

Теперь перейду к функции ReadKey. Она действует так:
1). Проверяет пуст ли буфер клавиатуры.
2). Если он не пуст, то берёт первый символ оттуда, удаляет его из буфера и возвращает.
3). Если не пуст, то ждёт, когда пользователь что-нибудь нажмёт, и возвращает именно это.
Теперь надо отметить несколко особенностей. Клавиши типа '1', ' ', 'g' при нажатии генерируют один символ (как раз свой), а клавиши типа 'F1', '<-', и т. д. генерируют два символа: #00 и какой-то свой. Вот такая маленькая особенность.
Может возникнуть ситуация, когда хочется просто проверить, не нажал ли пользователь чего, но совсем не надо останавливать программу до нажатия (например часы, которые рисуются, пока пользователь не нажмёт кнопку). Тогда функция ReadKey совсем не подходит. Но можно воспользоваться KeyPressed. Она так же объявлена в модуле CRT и возвращает True, если буфер клавиатуры не пуст. Вот пример её использования:
Код

Uses CRT;
Var
 i:LongInt;
Begin
 i:=0;
 While Not KeyPressed Do
 Begin
   WriteLn(i);
   Inc(i)
 End;
 ReadKey
End.

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

Вот ыроде и всё smile.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 6:56
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name