Задача по Turbo Pascal

Ответить
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ну, сказано было - синтаксически верно, а не лексически. Синтаксически действительно все верно.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

C_O_D_E писал(а):и кстати процедура вывода на экран Writeln , а в коде Writelen
Спасибо, поправил. Опечатка :)
Отвечая на (резюмируя) написанное.
C_O_D_E писал(а):Следовательно, он закрывает НЕ предыдущую строку, а иенно текущую?!
Ребят, ну вы ЧЕГО? :) В Паскале же нет .... как это выразиться... структурной единицы языка "строка исходного текста". А есть оператор. Причем, в одной строке (исходного текста) можно написать несколько операторов. А можно, "наоборот", один оператор написать на нескольких строках (исходного текста). Т.е. с точки зрения компилятора, перенос строки и, скажем, пробел - ЭКВИВАЛЕНТНЫ.

Признаком отделения одного оператора от другого в Паскале является символ "точка с запятой". Таким образом, с учетом вышенаписанного (а именно, что "перенос строки" и "пробел" - одно и то же), действительно получается, что ';', стоящая в начале строки (исходного текста) отделяет оператор на предыдущей строке (исходного текста) и на данной строке (исходного текста)

Теперь к:
C_O_D_E писал(а):после Begin, a соответственно и перед i:=1 точка с запятой не нужна. :)
Да, не необходима, но и не является ошибочной.
Разгадка в том, что оператор может быть пустым. Т.е. формально получается, что после begin находится пустой оператор, который (согласно синтаксису Паскаля) "закрыт" символом "точка с запятой". Так что тут никакой мистики! :) )

Кстати, из этого следует, что не будет ошибкой ставить несколько ';' подряд, например так:
[syntax=Delphi]begin
writeln ('First Output Line');;;
writeln ('Second Output Line');;;
end;[/syntax]
Объяснение опять простое. Сколько, вы думаете, операторов в вышеприведенном тексте? Два? Он нет! Шесть (или даже семь). Ведь между двумя соседними ';' находится пустой оператор!


UPD.
Правда, встроенный Help Turbo Pascal-я об операторах пишет как:

Код: Выделить всё

   Statements
  ============
 A statement is one of the following:
  assignment (:=)
  begin..end
  case..of..else..end
  for..to/downto..do
  goto
  if..then..else
  inline(...)
  procedure call
  repeat..until
  while..do
  with..do
Т.е. про пустые операторы ничего не упоминает. Но, полагаю, приведенный выше пример (и то, что он компилируется) однозначно демонстрирует существование пустого оператора.
assis2007
Сообщения: 79
Зарегистрирован: 04 ноя 2007, 19:17

У меня вопрос по коду

Код: Выделить всё

const
  N=100;
var
 words:array[1..N]of string;
 w:array[1..N]of string;
 cn,k:integer;
 s:string;
 wd:string;
 i,j:integer;
 index:integer;
 count:integer;
 cnt:integer;
 max:integer;
 wc:integer;
 b:boolean;
 function ParceText(txt:string):integer;
var l,c:integer;
begin
 c:=0;
 l:=length(txt);
 for i:=1 to l+1 do
 begin
  if ((txt[i]<>' ')and(i<>l+1)) then
   wd:=wd+txt[i]
   else
   begin
    inc(c);
    words[c]:=wd;
    wd:='';
   end;
 end;
 ParceText:=c;
end;
   begin
 writeln('Введите текст:');
 readln(s);
 count:=ParceText(s);
 for i:=1 to count do
 begin
  cnt:=0;
  for j:=1 to count do
   if words[j]=words[i] then
 inc(cnt);
  if cnt>max then
  begin
   max:=cnt;
   index:=i;
  end;
  end;
    writeln;
  writeln('Чаще всего встречаются слова:');
   for i:=1 to count do
 begin
  wc:=0;
  for j:=1 to count do
   if words[i]=words[j] then
    inc(wc);
  if wc=max then
  begin
   b:=true;
   for k:=1 to cn do
    if w[k]=words[i] then
     b:=false;
    if b then
     begin
      writeln(words[i]);
     inc(cn);
     w[cn]:=words[i];
    end;
  end;
 end;
 readln;
end.
Как мне сделать так чтобы я мог вводить не одну строку а столько скольку захочу , т.е. после нажатия Enter я буду переходить на новую строку и писать там текст. Текст я должен вводить до введения символа '&' наприер
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Ну например так:
[syntax='Delphi']
var
S:string;
T:Array[1..100]of string;
C:integer;

begin
writeln('Введите текст');
C:=0;
repeat
readln(S);
if S<>'&' then
begin
Inc(C);
T[C]:=S;
end;
until S='&';
end.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
assis2007
Сообщения: 79
Зарегистрирован: 04 ноя 2007, 19:17

А можно прямо относительно моего кода? т.е. прямо в нем исправить
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

assis2007 писал(а):А можно прямо относительно моего кода? т.е. прямо в нем исправить
Нужно вставить приведенный код вместо

Код: Выделить всё

writeln('Введите текст:');
readln(s);
count:=ParceText(s);
переменную C из функции ParceText вывести в глобальный раздел Var, также убрать из ParceText строку потом после замененного кода вызвать функцию ParceText для каждой строки из массива T.
Переменную C в приведенном мной коде нужно переименовать, чтобы не менять значение переменной C из раздела Var.
Вроде бы так.
Ни что так не ограничивает фантазию программиста, как компилятор...
Medved
Сообщения: 256
Зарегистрирован: 14 фев 2008, 20:51
Контактная информация:

&quot писал(а):У меня вопрос по коду
Небольшой совет по коду- красоты ради обьединяйте переменные одного типа при их объявлении
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
assis2007
Сообщения: 79
Зарегистрирован: 04 ноя 2007, 19:17

Код: Выделить всё

const
  N=100;
var
 words:array[1..N]of string;
 w:array[1..N]of string;
 cn,k:integer;
 s:string;
 wd:string;
 i,j:integer;
 isk_slovo:integer;
 kolislov:integer;
 kolpovt:integer;
 max,m,c:integer;
 wc:integer;
 a,b:boolean;
function Kolslov(txt:string):integer;
var
 l,c:integer;
begin
 l:=length(txt);
 for i:=1 to l+1 do
 begin
  if ((txt[i]<>' ')and(i<>l+1)) then
   wd:=wd+txt[i]
   else
   begin
    c:=c+1;
    words[c]:=wd;
    wd:='';
   end;
 end;
 if c>10 then
  begin
   writeln('Obrabativaetsa tolko 10 slov');
   Kolslov:=10;
  end
 else
  Kolslov:=c;
end;
begin
 writeln('Vvedite tekst');
 m:=0;
 repeat
  readln(s);
   if s<>'$' then
    begin
     inc(m);
     words[m]:=S;
    end;
 until s='$';
 kolislov:=kolslov(s);
 a:=false;
 if kolislov>1 then
  begin
   for i:=1 to kolislov do
    begin
     kolpovt:=0;
     for j:=1 to kolislov do
      if words[j]=words[i] then
       kolpovt:=kolpovt+1;;
       if kolpovt>1 then
         begin
          isk_slovo:=i;
          a:=true;
         end;
    end;
   writeln;
   if a then
    begin
     writeln('Clova vstrechayshiesa bolee odnogo raza:');
     for i:=1 to kolislov do
      begin
       wc:=0;
       for j:=1 to kolislov do
        if words[i]=words[j] then
         inc(wc);
         if wc>1 then
          begin
           b:=true;
           for k:=1 to cn do
            if w[k]=words[i] then
             b:=false;
             if b then
              begin
               writeln(words[i]);
               inc(cn);
               w[cn]:=words[i];
              end;
          end;
      end;
    end
   else
    writeln('V texte net slov povtorayshihsa bolee odnogo raza');
  end
 else
 writeln('Text otsytstvyet');
 readln;
end.
Пишет что текст отсутствует. что я делаю не так?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

until s='$';
kolislov:=kolslov(s);
Количество слов в строке '$', согласно вашей функции, равно 1. И условие if kolislov>1 обращается в false
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Exter
Сообщения: 1
Зарегистрирован: 04 апр 2008, 14:54

кто может помочь решить задачку срочно нужно вот условие Дано натуральное число. Получить число получаемое при прочтении его цифр справа налево нужно использовать оператор while
Ответить