Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Вывести на экран в паскале можно любой текст, состоящий из букв, цифр, или некоторых других символов типа ",.№%*!_%" и тому подобных.
Для этого есть две стандартные паскалевские процедуры: Write и WriteLn. Чтобы понять разницу между ними нужно знать что такое курсор. Курсор: Если мы хотим вывести текст на экран, то мы должны определиться, куда он будет выводиться в данный момент. Это место называется активной позицией. Курсор указывает на текущую активную позицию, в которую можно вывести буковку на экране. Обычно вы могли видеть курсор в виде мигающей горизонтальной чёрточки, или вертикальной чёрточки (например тут в форуме). Как и в любом текстовом редакторе курсор можно двигать. Курсор имеет свои координаты - координату по горизонтали, и координату по вертикали. Эти две координаты указывают, где на экране в данный момент он находится. Когда команды Write и WriteLn выводят текст, то они двигают курсор (обычно вправо), и пишут буквы. Команда Write: пишет текст, и оставляет курсор в конце текстовой строки. Текст пишется начиная с текущего месторасположения курсора. К примеру: Если на экране до этого написано было Цитата (курсор я обозначил красной чёрточкой), то команда write(' Его вербальные способности и харизма поражают каждого %)') cделает так:Владимир - Это талант!!!_ Цитата Если же было так:Владимир - Это талант!!! Его вербальные способности и харизма поражают каждого %)_ Цитата То эта же команда сделает так:Владимир - Это талант!!! Цитата То есть перезапишет всё то что было после курсора новым текстом и сдвинет курсор.Владимир - Его вербальные способности и харизма поражают каждого %)_ Возможно у вас может возникнуть вполне закономерный вопрос - А что будет, если строка длиннее ширины экрана (80 символов) или курсор находится уже в правой части экрана, и мы туда пытаемся вывести строку ? Ответ довольно очевиден - в этом случае вмещающаяся часть выводимого текста будет дописана в конец экранной строки, после чего курсор переместится на начало следующей экранной строки, и будет дописан оставшийся текст (естественно курсор после этого установится на конец этого оставшегося текста). Важно понимать - что паскаль, это вам не Word, и переносы он расставлять не умеет. Если у вас не вмещается слово "Синхрофазотрон", то это слово будет безжалостно разбито на две части, одна в конце одной строки, и другая в начале следующей. Так что если вам нужны переносы - добавляйте их сами (ставьте в слово минусы). Команда WriteLn: Эта команда имеет одно принципиальное отличие от её побратима - write. После вывода текста она перемещает курсор на начало новой строки. Это почти всегда очень удобно. Вот пример: writeln('Имя: Василий'); writeln('Отчество: Искандерович'); writeln('Фамилия: Пупкин'); writeln('Возраст: 17 лет'); Имя: Василий Отчество: Искандерович Фамилия: Пупкин Возраст: 17 лет Если же использовать команду Write, то получится конфуз - все строки будут идти одна за одной, и текст смешается в нечитабельную бяку %)))) У этой команды есть ещё одна хорошая особенность: Её можно использовать вообще без параметров вот так: writeln;. В таком случае на экране будет пропущена одна строка. Вот пример: writeln('---===Описание одного моего "горячо любимого друга"===---'); writeln; writeln('Имя: Василий'); writeln('Отчество: Искандерович'); writeln('Фамилия: Пупкин'); writeln('Возраст: 17 лет'); ---===Описание одного моего "горячо любимого друга"===--- Имя: Василий Отчество: Искандерович Фамилия: Пупкин Возраст: 17 лет Теперь хотелось бы осветить довольно сложную тему: Параметры процедур Write и WriteLn Оговорюсь сразу же. Параметры этих функций это всё то, что заключено в скобочки после них. Например Write('Число ',data,' время ',time') Параметр может быть один, несколько, или даже ни одного (как в функции writeLn) Эти функции выводят по порядку значения всех своих параметров на экран. Параметрами могут выступать следующие типы, определённые в паскале: Если параметров больше чем один, то они по синтаксису паскаля должны быть разделены запятой. Например: writeln(c,s,v,'A','Hi Ho!!!',12) Если в качестве параметра выступает переменная (строка, символ, число), то на экран выводится значение этой переменной. ЗАМЕТЬТЕ, именно значение. Очень часто новички путают значение переменной с её именем, и думают, что на экране появится имя переменной. Это не так. Рассмотрим следующий пример: var MyString:string; MyString2:string; MyValue:longint; MySymbol:char; begin MyString:='Привет, вот вам число: '); MyString2:=' а вот и символ: '); MyValue:=-12345; MySymbol:='*'; writeln(MyString,MyValue,MyString2,MySymbol); end. Привет, вот вам число: -12345 а вот и символ: * В параметрах часто бывает удобно комбинировать переменные, и константные значения. Давайте, в качестве закрепления материала, и примера к вышесказанному напишем программу, которая отображает текущее время, стоящее на компьютере: uses dos; const TimeString='Вот время на компьютере:'; DataString='А вот дата на компьютере:'; var Hour,Minute,Second,Sec100:Word; Year, Month, Day, DayOfWeek:Word; begin GetTime(Hour,Minute,Second,Sec100); WriteLn(TimeString,' Час - ',Hour,' Минута - ',Minute,'- Секунда - ', Second); GetDate(Year, Month, Day, DayOfWeek); WriteLn(DataString,' Год - ',Year,' Месяц - ',Month,' День - ',Day); end. Вот время на компьютере: Час - 14 Минута - 15 Секунда - 34 А вот дата на компьютере: Год - 2003 Месяц - 12 День 7 Надеюсь всё понятно ? Если есть вопросы, то спрашивайте прямо тут, с удовольствием отвечу. |
Сообщ.
#2
,
|
|
|
Вот ещё два способа вывода строки.
В них не используются стандартные команды паскаля (write и writeln) Обе команды в качестве параметра получают строку. Поэтому при помощи них нельзя напрямую вывести на экран любое числовое значение, не преобразовав его предварительно к строковому типу. Первый способ: {write через DOS} program wrDOS; {наверное можно компактнее} procedure writeS(s:string);assembler; asm push ds {сохраняем сегмент данных} mov ah,40h {номер функции прерывания} mov bx,1{стандартный вывод это 1} lds dx,s {адрес строки в ds:dx} mov si,dx {адрес строки в ds:si для lodsb} lodsb {длинну строки в al (первый байт в строке это ее длина!)} inc dx{чтобы не напечатать первый байт} xor cx,cx;mov cl,al{чтобы в сх была длинна строки} int 21h {DOS} pop ds {восстанавливаем ds} {как видишь всё просто :) } end; begin writeS('123456'#10#13); {это типа writeLn если убрать последние символы получиться просто write} end. {write через BIOS} program wrBIOS; procedure writeXYS(x,y:byte;s:string);assembler; asm mov dh,y{понятно} mov dl,x{понятно} mov ax,1301h{13h функция 1 подфункция }{ Вместо mov ah,13h;mov al,1} les bp,s {адрес s в es:bp} mov bh,0{ номер страницы} mov bl,16*2+15{атрибут символа} xor ch,ch mov cl,byte ptr es:[bp] {в сх положим длину строки} inc bp {Чтобы не напечатать нулевой символ в s} int 10h end; {------------} begin writeXYS(40,10,'123456'); readln; end. Часто в университетах требуют, чтобы код программы не содержал ассемлерных вставок, и был бы написан полностью на паскале. Вот возможное решение для таких случаев (использует аналог ассемблерных вставок, но написан при помощи исключительно паскалевских команд). Первый способ: program wrDOS; uses DOS; procedure writeS(s:string); var R:registers; begin R.AH:=$40; R.BX:=1; R.DX:=ofs(s); R.DS:=seg(s); R.SI:=R.DX; R.AL:=ord(s[0]); INC(R.DX); R.CX:=R.CX xor R.CX; R.CL:=R.AL; intr($21,R); end; begin writeS('123456'#10#13); readln; end. program wrBIOS; uses DOS; procedure writeXYS(x,y:byte;s:string); var R:registers; begin with R do begin DH:=Y;{mov dh,y понятно} DL:=X;{mov dl,x понятно} AX:=$1301;{mov ax,1301h 13h функция 1 подфункция } BP:=ofs(s);ES:=seg(s);{les bp,s адрес s в es:bp} BH:=0;{mov bh,0 номер страницы} BL:=16*2+15;{mov bl,16*2+15 атрибут символа} CH:=CX xor CX;{xor ch,ch } CL:=mem[ES:BP];{mov cl,byte ptr es:[bp] в сх положим длину строки} INC(BP);{inc bp Чтобы не напечатать нулевой символ в s} end; intr($10,R); end; {------------} begin writeXYS(40,10,'123456'); readln; end. [Я надеюсь Mixxx не обидится на меня за некоторую корректировку, в целях читабельности] |