На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила ЧаВо (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Также читать Требования к оформлению статей
Модераторы: volvo877, Romtek
  
> Как вывести текст (строку) ?, вывод текста в паскале на экран
    Вывести на экран в паскале можно любой текст, состоящий из букв, цифр, или некоторых других символов типа ",.№%*!_%" и тому подобных.
    Для этого есть две стандартные паскалевские процедуры: Write и WriteLn.
    Чтобы понять разницу между ними нужно знать что такое курсор.
    Курсор:
    Если мы хотим вывести текст на экран, то мы должны определиться, куда он будет выводиться в данный момент. Это место называется активной позицией. Курсор указывает на текущую активную позицию, в которую можно вывести буковку на экране.
    Обычно вы могли видеть курсор в виде мигающей горизонтальной чёрточки, или вертикальной чёрточки (например тут в форуме). Как и в любом текстовом редакторе курсор можно двигать.
    Курсор имеет свои координаты - координату по горизонтали, и координату по вертикали. Эти две координаты указывают, где на экране в данный момент он находится.
    Когда команды Write и WriteLn выводят текст, то они двигают курсор (обычно вправо), и пишут буквы.


    Команда Write:
    пишет текст, и оставляет курсор в конце текстовой строки. Текст пишется начиная с текущего месторасположения курсора. К примеру: Если на экране до этого написано было
    Цитата
    Владимир - Это талант!!!_
    (курсор я обозначил красной чёрточкой), то команда write(' Его вербальные способности и харизма поражают каждого %)') cделает так:
    Цитата
    Владимир - Это талант!!! Его вербальные способности и харизма поражают каждого %)_
    Если же было так:
    Цитата
    Владимир - Это талант!!!
    То эта же команда сделает так:
    Цитата
    Владимир - Его вербальные способности и харизма поражают каждого %)_
    То есть перезапишет всё то что было после курсора новым текстом и сдвинет курсор.
    Возможно у вас может возникнуть вполне закономерный вопрос - А что будет, если строка длиннее ширины экрана (80 символов) или курсор находится уже в правой части экрана, и мы туда пытаемся вывести строку ?
    Ответ довольно очевиден - в этом случае вмещающаяся часть выводимого текста будет дописана в конец экранной строки, после чего курсор переместится на начало следующей экранной строки, и будет дописан оставшийся текст (естественно курсор после этого установится на конец этого оставшегося текста).
    Важно понимать - что паскаль, это вам не Word, и переносы он расставлять не умеет. Если у вас не вмещается слово "Синхрофазотрон", то это слово будет безжалостно разбито на две части, одна в конце одной строки, и другая в начале следующей. Так что если вам нужны переносы - добавляйте их сами (ставьте в слово минусы).


    Команда WriteLn:
    Эта команда имеет одно принципиальное отличие от её побратима - write.
    После вывода текста она перемещает курсор на начало новой строки. Это почти всегда очень удобно.
    Вот пример:
    ExpandedWrap disabled
      writeln('Имя: Василий');
      writeln('Отчество: Искандерович');
      writeln('Фамилия: Пупкин');
      writeln('Возраст: 17 лет');
    даст следующий результат на экране:
    ExpandedWrap disabled
      Имя: Василий
      Отчество: Искандерович
      Фамилия: Пупкин
      Возраст: 17 лет

    Если же использовать команду Write, то получится конфуз - все строки будут идти одна за одной, и текст смешается в нечитабельную бяку %))))
    У этой команды есть ещё одна хорошая особенность: Её можно использовать вообще без параметров вот так: writeln;.
    В таком случае на экране будет пропущена одна строка. Вот пример:
    ExpandedWrap disabled
      writeln('---===Описание одного моего "горячо любимого друга"===---');
      writeln;
      writeln('Имя: Василий');
      writeln('Отчество: Искандерович');
      writeln('Фамилия: Пупкин');
      writeln('Возраст: 17 лет');
    Даст такой результат:
    ExpandedWrap disabled
      ---===Описание одного моего "горячо любимого друга"===---
       
      Имя: Василий
      Отчество: Искандерович
      Фамилия: Пупкин
      Возраст: 17 лет



    Теперь хотелось бы осветить довольно сложную тему:
    Параметры процедур Write и WriteLn

    Оговорюсь сразу же. Параметры этих функций это всё то, что заключено в скобочки после них.
    Например Write('Число ',data,' время ',time')
    Параметр может быть один, несколько, или даже ни одного (как в функции writeLn)

    Эти функции выводят по порядку значения всех своих параметров на экран.
    Параметрами могут выступать следующие типы, определённые в паскале:
    • Cтрока символов (String)
    • Числовое значение (Word, Byte, Integer, Longint, Real, Double, может ещё что-нибудь числовое)
    • Символ (char)
    • Любая константа определённых выше типов
    Если параметров больше чем один, то они по синтаксису паскаля должны быть разделены запятой. Например: writeln(c,s,v,'A','Hi Ho!!!',12)
    Если в качестве параметра выступает переменная (строка, символ, число), то на экран выводится значение этой переменной. ЗАМЕТЬТЕ, именно значение. Очень часто новички путают значение переменной с её именем, и думают, что на экране появится имя переменной. Это не так. Рассмотрим следующий пример:
    ExpandedWrap disabled
      var
        MyString:string;
        MyString2:string;
        MyValue:longint;
        MySymbol:char;
      begin
        MyString:='Привет, вот вам число: ');
        MyString2:=' а вот и символ: ');
        MyValue:=-12345;
        MySymbol:='*';
        writeln(MyString,MyValue,MyString2,MySymbol);
      end.
    В результате на экране мы увидим такое:
    ExpandedWrap disabled
      Привет, вот вам число: -12345 а вот и символ: *
    а не строка "MyStringMyValueMyString2MySymbol" и уж тем более не строка "MyString,MyValue,MyString2,MySymbol", как могли бы подумать некоторые.

    В параметрах часто бывает удобно комбинировать переменные, и константные значения.
    Давайте, в качестве закрепления материала, и примера к вышесказанному напишем программу, которая отображает текущее время, стоящее на компьютере:
    ExpandedWrap disabled
      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.
    Результат будет примерно такой:
    ExpandedWrap disabled
      Вот время на компьютере: Час - 14 Минута - 15 Секунда - 34
      А вот дата на компьютере: Год - 2003 Месяц - 12 День 7


    Надеюсь всё понятно ?
    Если есть вопросы, то спрашивайте прямо тут, с удовольствием отвечу.
      Вот ещё два способа вывода строки.
      В них не используются стандартные команды паскаля (write и writeln)
      Обе команды в качестве параметра получают строку. Поэтому при помощи них нельзя напрямую вывести на экран любое числовое значение, не преобразовав его предварительно к строковому типу.
      Первый способ:
      ExpandedWrap disabled
        {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.
      Второй способ:
      ExpandedWrap disabled
        {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.


      Часто в университетах требуют, чтобы код программы не содержал ассемлерных вставок, и был бы написан полностью на паскале.
      Вот возможное решение для таких случаев (использует аналог ассемблерных вставок, но написан при помощи исключительно паскалевских команд).
      Первый способ:
      ExpandedWrap disabled
        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.
      Второй способ:
      ExpandedWrap disabled
        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 не обидится на меня за некоторую корректировку, в целях читабельности]
      /(bb|[^b]{2})?/ ©Уильям Шекспир
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,1051 ]   [ 17 queries used ]   [ Generated: 25.06.19, 16:08 GMT ]