Реферат: Вание в честь великого французского математика и физика Блеза Паскаля, который в 1642 году изобрел счетную машину для арифметических операций паскалево колесо


Введение в язык программирования Паскаль  




3.3 Примеры использования строковых величин.  










1.

Общие сведения о языке.  



















Язык Pascal (Паскаль) был разработан в 70-х годах 20-го века профессором Швейцарского федерального института технологии в Цюрихе Никалаусом Виртом. Этот язык получил свое название в честь великого французского математика и физика Блеза Паскаля, который в 1642 году изобрел счетную машину для арифметических операций – паскалево колесо. Язык разрабатывался, прежде всего, для целей обучения программированию, но этим не ограничена сфера его применения. Основными достоинствами Паскаля являются легкость при изучении и наглядность программ. Кроме того, в языке Паскаль отражена концепция структурного программирования, имеется богатый набор различных типов данных и программные средства, позволяющие доказывать правильность написанных программ.  







В 1984 году на рынке программных продуктов появляется интегрированная система программирования Turbo Pascal. До этих пор предпочтение отдавалось языку программирования Basic – простому, дешевому и легко усваиваемому. Паскаль же был языком для избранных – аппаратно зависимым, дорогим и сложным в обращении. С появлением среды Turbo Pascal положение резко изменилось. Начиная с 6-ой версии, система Turbo Pascal обладает такими качествами, как:  


















многооконный и многофайловый режим работы;  









встроенные средства верификации данных и программ;  









режимы трассировки;  









поддержка работы манипулятора мышь;  









применение объектно-ориентированного программирования;  









наличие большой библиотеки модулей и т.п.  



















В 1992 году фирма Borland International выпустила 2 пакета программирования на языке Паскаль: Borland Pascal 7.0 и Turbo Pascal 7.0.  
















2.

Общие правила записи программы  



















При записи программы на языке программирования Паскаль необходимо придерживаться некоторых общепринятых соглашений:  
















1)

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







2)

заглавные и прописные буквы не различаются;  







3)

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



















Общая структура паскаль-программы может быть представлена в виде следующей схемы:  







Program <имя>  







   var <раздел описания переменных>;  







Begin  







   <раздел операторов>  







End.  
















3.

Основные элементы языка.  



















Любой язык программирования есть совокупность трех составляющих: набора символов (алфавита), правил образования (синтаксис) и истолкования (семантика) конструкций из символов для задания алгоритмов.  







Алфавит.  







Основные элементы, составляющие алфавит языка Паскаль, можно разбить на несколько групп в соответствии с их смысловыми значениями:  


















основные символы (буквы латинского и русского алфавитов, цифры, знаки арифметических операций, знаки отношений, кавычки, точка, запятая, точка с запятой, двоеточие, апостроф, скобки и т.п.);  









служебные слова (and, array, begin, case и т.п.);  









стандартные идентификаторы (true, false, integer, sin, abs и т.п.).  



















Данные.  







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







Имя используется для обозначения элемента данных. В качестве имени в языке Паскаль используется идентификатор – последовательность букв латинского алфавита и цифр, начинающаяся с буквы. Все идентификаторы, используемые в программе, обязательно должны быть определены, т.е. описаны в соответствующем разделе программы.  







В качестве данных в паскаль-программе могут использоваться постоянные и переменные величины. Значение постоянной величины (константы) не изменяется в процессе выполнения программы.  







Значение элемента данных определяется типом данных. В языке Паскаль существует 4 стандартных типа данных:  







 
















1)

integer – целый  



















значения этого типа данных лежат в диапазоне от -32768 до 32767.  







Целые числа в языке Паскаль записываются в обычном виде. Над ними определены следующие операции: сложение (+), вычитание (-), умножение (*), деление (/), нахождение целой части от деления (div) и остатка от деления (mod). Результат всех операций, кроме деления, целое число.  







К типу integer относятся некоторые стандартные функции: нахождение предыдущего элемента в множестве (pred), нахождение последующего элемента (succ), модуль числа (abs), квадрат числа (sqr) и др.  







Существует несколько ограничений и расширений целого типа:  










shortint (-128..127); longint (- 2 млрд. .. 2 млрд.); byte (0.. 255); word (0..65535).




2)

real – вещественный  



















В языке Паскаль существует два способа записи вещественный чисел:  


















с фиксированной десятичной точкой;  









с плавающей десятичной точкой (в экспоненциальной форме) вида mEn, т.е. m*10n.  



















Например: 314E-2; 2.76E11; .5E-3  







Операции +, -, *. / выполняются с принятой в данном компьютере точностью и не всегда дают точный результат.  







 
















3)

Boolean – логический или булевский  



















Множество значений данного типа – это {true, false}.  







В языке паскаль определены 6 операций отношения (<, >, <=, >=, =, <>) и логические операции: отрицание (not), логическое умножение – конъюнкция (and), логическое сложение – дизъюнкция (or). С помощью этих операций строятся выражения отношения, значения которых относятся к логическому типу данных.  
















4)

char – символьный  



















Значением переменной символьного типа является символ. Множество символов отвечает следующим требованиям:  


















любой символ имеет свой порядковый номер;  









порядковые номера цифр 0..9 упорядочены по возрастанию и следуют друг за другом;  









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



















Константы символьного типа записываются в языке Паскаль в виде символов, заключенных в апострофы. Например: 'a', '1', 'z', 'ш'.  







Над данными символьного типа определены только операции отношения.  







К символьному типу относятся некоторые стандартные функции языка Паскаль: нахождение порядкового номера символа (ord), нахождение символа по его порядковому номеру (chr).  







 
















4.

Структура программы на языке Паскаль.  



















Program <имя программы>  







   uses <раздел подключения внешних модулей>;  







   label <раздел описания меток>;  







   const <раздел описания констант>;  







   type <раздел описания типов>;  







   var <раздел описания переменных>;  







   procedure <раздел описания пользовательских процедур>;  







   function <раздел описания пользовательских функций>;  







Begin  







   <раздел операторов или основной блок программы>  







End.  







Метки перечисляются обычным списком, константы и типы описываются в стиле: <идентификатор>=<значение>, переменные перечисляются с указанием своих типов: <имя>:<тип>.  







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

^ Операторы языка Паскаль. Часть 1.  
















1.

Простые и составные операторы.  



















Простые операторы.  
















1)

Оператор присваивания.  



















Синтаксис:  







<имя переменной>:=<выражение>  







Выполнение: вычисляется значение выражения, стоящего в правой части оператора, и полученное значение присваивается переменной, имя которой указано в левой части оператора.  







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
















2)

Вызов процедуры.  



















Синтаксис:  







<имя процедуры>[(<список значений параметров>)];  







Выполнение: происходит переход к стандартной или определенной пользователем процедуре с неявным присваиванием фактических значений формальным параметрам процедуры.  







Организовать ввод и вывод данных в языке Паскаль можно с помощью стандартных процедур read, readln, write, writeln.  







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







Синтаксис:  







read([<имя устройства ввода>,]<список имен переменных>);  







readln([<имя устройства ввода>,]<список имен переменных>);  







write([<имя устройства вывода>,]<список значений>);  







writeln([<имя устройства вывода>,]<список значений>);  







Выполнение:  







ввод данных: с устройства ввода последовательно считываются значения и присваиваются переменным, имена которых указаны в списке. При этом, необходимо следить за тем, чтобы совпадали типы у переменных и присваиваемых им значений (нельзя присвоить символьное значение вещественной переменной и т.п.);  







вывод данных: значения, указанные в списке, последовательно выводятся на устройство вывода данных.  







Отличие процедур read и readln, write и writeln состоит в том, что при выполнении процедур writeln и readln к последнему значению автоматически дописывается управляющий символ конца строки, что означает переход на новую строку экрана или файла.  







 







Составные операторы.  
















Составной оператор представляет собой последовательность операторов, заключенных в операторные скобки begin и end.  
















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
















2.

Структурные операторы.  



















1)

Условный оператор  



















Синтаксис:  







if <условие>  







then <оператор>  







[else <оператор>];  










где    <условие> - выражение булевского типа;




<оператор> - любой оператор языка Паскаль (в том числе и составной).  
















Выполнение: вычисляется значение выражения, стоящего в условии. Если это значение истинно, то выполняется оператор, следующий за служебным словом then. Если условие ложно, то выполняется оператор, стоящий за служебным словом else.  







Условный оператор может использоваться и в сокращенной форме, когда отсутствует часть оператора, начиная со служебного слова else. В этом случае оператор выполняется при истинном условии, а если условие ложно, то происходит переход к оператору, следующему за условным. Например:  







if x>y          |   if x>y  







then            |   then  







   begin         |   x:=0;  







      x:=0;      |   y:=0;  







      y:=0;  







   end;  







В условном операторе за служебными словами then и else могут следовать любые операторы языка Паскаль, в том числе и условные. Поэтому возможны «вложенные» условные операторы. Например,  







   if x>y  







   then x:=x-y  







   else if x=y  







      then x:=0  







      else y:=y-x;  







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







   if (x>5) and (x<15)  







   if (a=b) or (not(t))  
















2)

Оператор варианта  



















C помощью условного оператора осуществляется выбор одного из двух возможных действий в зависимости от значения булевского выражения. Однако, часто бывает необходимо выбрать одно из нескольких (больше двух) действий. Для реализации такого рода ситуаций в языке Паскаль предусмотрен специальный оператор варианта.  







Синтаксис:  







case <выражение> of  
















<значение 1>: <оператор>;  







…  







<значение n>: <оператор>;  







[else <оператор>]  










   end;
где    <выражение> - выражение любого скалярного типа (кроме real);




<оператор> - любой оператор языка Паскаль.  
















Выполнение: вычисляется значение выражения, стоящего после case. Это значение используется для выбора одного из возможных действий. Если полученное значение выражения совпадает с одним из перечисленных после of, то выполняется соответствующий оператор. Если один и тот же оператор должен выполняться при различных значениях выражения, то эти значения могут быть указаны через запятые или в виде интервала. Если в операторе присутствует часть else, то оператор, указанный за данным служебным словом, выполняется тогда, когда значение выражения не совпадает ни с одним из значений, перечисленных после of. Например:  










   Пусть m – номер месяца, y – порядковый номер года. Определить d – количество дней в соответствующем месяце.




case m of  










      1,3,5,7,8,10,12: d:=31;
      4,6,9,11: d:=30;
      2: if (y mod 4=0) and (y mod 100 <>0)
         then d:=29
         else d:=28
   end;

^ Операторы языка Паскаль. Часть 2.  
















Структурные операторы.  
















3)

Оператор цикла  



















Оператор цикла используется для организации многократного повторения выполнения одних и тех же операторов. В языке Паскаль существует три типа оператора цикла.  







а) оператор цикла с предусловием  







Синтаксис:  







while <условие> do  
















<оператор>;  










где    <условие> - булевское выражение;




<оператор> - любой оператор языка Паскаль, называемый «телом цикла».  







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







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







Замечание.  







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







б) оператор цикла с постусловием  







Синтаксис:  







repeat  
















<оператор>  
















until <условие>;  










где    <условие> - булевское выражение;




<оператор> - любой оператор языка Паскаль.  







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







Для оператора цикла с постусловием справедливо замечание, сделанное выше.  







Отличие циклов с предусловием и с постусловием:  


















при выполнении цикла с предусловием тело цикла выполняется, если условие истинно, а в цикле с постусловием повторение осуществляется, если значение условия ложно;  









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









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



















в) оператор цикла с параметром  







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







1. Синтаксис:  







for <имя перем.>:= <выражение 1> to <выражение 2> do  
















<оператор>;  










где    <имя переменной> - идентификатор переменной целого типа, называемой параметром цикла;




<выражение 1> и <выражение 2> - выражения, задающие начальное и конечное значения параметра цикла;  







<оператор> - любой оператор языка Паскаль.  







Для объяснения выполнения обозначим:  







i – имя переменной, z1 и z2 – выражения 1 и 2 соответственно, s – оператор, образующий тело цикла.  







Тогда цикл имеет вид:  







for i:= z1 to z2 do s;  







Выполнение: вычисляются значения выражений z1 и z2. Если z1>z2, то выполнение оператора цикла завершается. Если z1<=z2, то переменной i присваивается значение z1 и выполняется оператор s. Затем значение переменной I увеличивается на 1 и вычисляется значение булевского выражения i<=z2. Если это значение истинно, то вновь выполняется оператор s, берется следующее значение параметра цикла и т.д. Выполнение оператора цикла с параметром завершается тогда, когда станет ложным значение булевского выражения i<=z2.  







2. Синтаксис:  







for <имя перем.>:= <выражение 1> downto <выражение 2> do  
















<оператор>;  
















В обозначениях из предыдущего раздела оператор цикла принимает следующий вид:  







for i:= z1 downto z2 do s;  







В этом случае z1>z2 и значение параметра цикла при каждом повторении цикла не увеличивается, а уменьшается на 1.  







Выполнение: вычисляются значения выражений z1 и z2. Если z1=z2, то переменной i присваивается значение z1 и выполняется оператор s. Затем значение переменной i уменьшается на 1 и вычисляется значение булевского выражения i>=z2. Если это значение истинно, то вновь выполняется оператор s, берется следующее значение параметра цикла и т.д. Выполнение оператора цикла с параметром завершается тогда, когда станет ложным значение булевского выражения i>=z2.  







Замечание.  







После завершения выполнения оператора цикла значение параметра цикла не определено.  
















4)

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



















1.

Вычислить значение факториала числа.  













Program factorial;
   uses crt;
   var n, i:integer; p:longint;
Begin
   clrscr;
   readln(n);
   p:=1;
   for i:=1 to n do
      p:=p*i;
   write(n,'! = ', p);
End.




2.

Вычислить наибольший общий делитель двух целых чисел a и b.  













Program NOD;
   uses crt;
   var a,b: integer;
Begin
   clrscr;
   readln(a,b);
   a1:=a;
   b1:=b;
   while a<>b do
      if a>b then a:=a-b
      else b:=b-a;
   writeln('НОД(',a1,',',b1,') = ',a);
   readln;
End.




3.

Вычислить наименьшее из 20 целых чисел.  













Program min_of_20;
   uses crt;
   var n, min, i: integer;
Begin
   clrscr;
   writeln('Введите первое число');
   readln(n);
   min:=n;
   for i:=2 to 20 do
   begin
      writeln('Введите ',i , '-е число');
      readln(n);
      if n   end;
   writeln('min = ', min);
   readln;
End.

^ Нестандартные типы данных.  
















В языке Паскаль существуют типы данных, характеристики которых определяются пользователем, работающим с программой. Такое определение дается в разделе описания типов, начинающегося служебным словом type.  







Необходимость в описании нестандартных типов данных возникает тогда, когда пользователь имеет дело с некоторым набором конкретных значений. Например, наша эра, двадцатый век, цвета радуги, дни недели и т.п.  
















1. Скалярный или перечислимый тип данных.  
















При определении перечислимого типа данных в круглых скобках через запятую просто перечисляются все возможные значения переменных этого типа.  







Пример.  







type st_sv=(North, South, East, West);  
















   month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dek);  










   den_ned = (pn, wt, sr, ch, pt, sb, ws);




Имена значений, перечисленные в списке, есть константы описываемого типа. Поэтому, если в разделе описания переменных описаны переменные  







var komp: st_sv; m: month; d: den_ned;  










то их значениями могут быть только значения, перечисленные в соответствующем типе. Например:
   komp:=West;
   m:=Nov;
Недопустимы операторы присваивания типа: komp:=sb; d:=Feb;




 







Над переменными перечислимого типа можно выполнять только операции отношения. Значения переменных перечислимого типа считаются упорядоченными в соответствии с естественным порядком их следования в списке описания данного типа. Поэтому отношения  







North









имеют значение true, а отношения
   May>Oct, West< North, ch
имеют значение false.




 







Для данных перечислимого типа определены функции pred() и succ(). Например:  







pred(West)=East; succ(sr)=wt;  







Первый элемент списка не имеет предшествующего, а последний элемент – следующего, поэтому значение функций pred от первого элемента и succ от последнего не опеределены.  







 







Если к данным перечислимого типа применить функцию odd(), то в результате будет получен порядковый номер значения в списке определения перечислимого типа. Например:  







ord(Mar) = 3; ord(ws)=7;  







 







Данные перечислимого типа не могут быть параметрами стандартных процедур ввода и вывода данных (read, readln, write, writeln). Недопустимо использование, например, таких операторов:  







a:=West;  







writeln(a);  







Но данные перечислимого типа могут быть использованы в операторе цикла с параметром. Например:  







for i:= Jan to Dec do …  
















2. Ограниченный тип данных.  
















Синонимы: отрезочный, интервальный.  







При определении данного типа данных накладываются ограничения на стандартный или уже заданный тип данных, множество значений которого является перенумерованным (integer, char, boolean, перечислимый тип).  







Таким образом, из всего множества значений выбранного типа берется некоторый диапазон (или интервал), который задается двумя константами, разделенными двумя точками. Например:  







type ne = 1..2004;  
















   l_alph = 'a'..'z';  







   polugodie = Jun .. Jun;  







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







Определение отрезочного типа верно только тогда, когда выполнено условие:  







нижняя граница <= верхняя граница.  







Переменные ограниченного типа могут быть описаны так:  







var year: ne: bukva: l_alph;  







Эти переменные будут принимать значения того же типа, что и константы, ограничивающие отрезок.  







К переменным ограниченного типа применимы операции и функции, которые применимы к данным тех типов, к которым относятся константы, ограничивающие диапазон значений.  
















3. Пример использования нестандартных типов данных.  
















Составить программу определения победителя шахматного турнира, в котором участвовало 6 человек, каждый из которых сыграл по 1 партии с каждым.  










Program turnir;
   uses crt;
   type fam = (Ivanov, Pavlov, Kotov, Sidorov, Petrov, Vasin);
   var win, uch: fam; k, max: integer;
Begin
   clrscr;
   max:=-1;
   i:=1;
   writeln('Итоги турнира');
   for uch:=Ivanov to Vasin do
      begin
         write ('Сколько очков набрал ', i, '-й участник?');
         readln(k);
         if k>max then
            begin
               win:=uch;
               max:=k
            end;
         i:=i+1;
      end;
   write('');
   case win of
      Ivanov: writeln('Иванов');
      Pavlov: writeln('Павлов');
      Kotov: writeln('Котов');
      Sidorov: writeln('Сидоров');
      Petrov: writeln('Петров');
      Vasin: writeln('Васин');
   end;
   readln;
End.

^ Нестандартные типы данных.  
















3. Строковый тип данных.  







Для общения человека с компьютером необходимы средства работы с символьной информацией. С этой целью в языке Паскаль разработан специальный тип данных, который занимает промежуточное положение между простым (символьным) и структурированным (массив) типами данных. Этот тип называется строковым.  







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







Описание строкового типа состоит из ключевого слова string и указания максимальной длины строки. Длина строки – это количество символов, составляющих данную строку (считая пробелы). Если максимальная длина строки не указана, то она принимается равной 255 символам. Описать строковый тип можно одним из двух способов:  
















1)

type <имя_типа> = string[];  



















var <имя_переменной> : <имя_типа>;  
















2)

var <имя_переменной> : string[];  



















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







Представление строковой переменной в виде набора символьных переменных дает возможность обращения к отдельным символам строковой переменной по их индексу (порядковому номеру в строке), указываемому в квадратных скобках после имени строковой переменной. Первый символ строки соответствует первому порядковому номеру.  







Пример.  







stroka = 'Это строковая переменная';  







for i:=1 to 10 do  







writeln(stroka[i]);  
















3.1 Операции над строковыми величинами.  
















Над переменными строкового типа определены операции:  
















1)

отношения  



















сравнение двух символьных величин происходит посимвольно слева направо в соответствии с их кодами;  










Например, 'abc'< 'abd'; 'вода' < 'огонь'; '111' < '121'; '99' > '100'




2)

сложения (склеивания, конкатенации)  



















результат данной операции – строка, поэтому ее длина не должна превосходить 255 символов.  










Например, '12' + '23' = '1223'; 'это ' + 'конкатенация' = 'это конкатенация'




3.2 Процедуры и функции, определенные для строковых величин.  
















Функции:  
















1)

length (<строка>)  













возвращает число, равное длине строки.
Например, length('В этой фразе двадцать восемь букв' ) = 33




2)

copy (<строка>, <позиция>, <длина>)  













возвращает строковую величину указанной длины, вырезанную из данной строки с указанной позиции.
Например, copy('прототип',4,3) = 'тот'




3)

pos (<строка1>, <строка2>)  













возвращает число, равное номеру начальной позиции вхождения первой строки во вторую. Если строка1 не входит в строку2, то возвращается 0.
Например, pos('бас', 'контрабас') = 7; pos('лето', 'котлета') = 0




Процедуры:  
















1)

delete (<строка>, <позиция>, <количество>)  













удаляет из строки указанное количество символов, начиная с данной позиции
Например, delete('лаванда', 3, 3) = 'лада'




2)

insert (<строка1>, <строка2>, <позиция>)  













вставляет строку1 в строку2, начиная с указанной позиции.
Например, insert('ади', 'стон', 3)




3.3 Примеры использования строковых величин.  
















^ 1. Составить программу инвертирования строки (т.е. получение строки, читаемой в обратном порядке).  










Program invertor;
   uses crt;
   type stroke = string[20];
   var str1, str2: stroka; i, len: integer;
Begin
   clrscr;
   readln(str1);
   str2:= '';
   len:=lingth(str1);
   for i:=len downto 1 do   |   for i:=1 to len do
      str2:=str2+str1[i];   |   str2:=str1[i]+str2;
   writeln(str2);
   readln
End.




2. Составить программу вычисления количества слов в тексте. Слово – это последовательность символов между пробелами.  










Замечание: слова могут быть набраны не через один, а через несколько пробелов. Кроме того, перед первым словом и после последнего пробелы отсутствуют. Поэтому, чтобы решить задачу, исходную строку необходимо некоторым образом преобразовать.
Program kolich_slov;
   uses crt;
   var s: string; i, ln, k: byte;
Begin
   clrscr;
   readln(s);
   i:=0;
   while i      begin
      i:=i+1;
      if (s[i] = ' ') and (s[i+1]= ' ') then
      begin
      delete(s,i,1);
      i:=i-1;
      end
      end;
еще рефераты
Еще работы по разное