Важная информация
Показано с 1 по 10 из 10

Тема: Ребят, помогите понять суть программы.

  1. #1 Ребят, помогите понять суть программы. 
    Новичок
    Регистрация
    23.02.2012
    Сообщений
    7
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    ПРОГРАММИРОВАНИЕ ЗАДАЧ ОБРАБОТКИ СИМВОЛЬНЫХ ДАННЫХ
    Задание:
    составить и отладить программу, обеспечивающую ввод массива символьных строк (20 элементов массива по 70 символов в строке) и, если необходимо по условию варианта задания, то и ввод дополнительного символа или группы символов, а также выполнение процедуры, сущность которой сформулирована ниже. Результаты решения задачи либо сообщение о невозможности её выполнения (в случае отсутствия строк, соответствующих условию) вывести на экран монитора.

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

    ------------------------------------------------------------------------------------------------------
    Объясните мне пожалуйста как понять это условие?
    я ед что понял что в программе будет:

    Код :
    Type mas=array[1..20] of string[70];

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

  2. #2  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Код :
    Type mas=array[1..20] of string[70];
    Ну все правильно, в этой строке определяется новый (пользовательский) тип данных, строка длиной 70 символов, и на основе этого типа данных создается массив строк, количество элементов массива 20 штук.

    далее пишем:
    Код :
     ClrScr;
      Write ('Введите строку ');
      Readln (str);
    , где первая строка- очистка экрана, вторая строка - вывод сообщения о предстоящем вводе, третья строка - считываение данных с клавиатуры. Это ввод одной строки.

    Однако Вам необходимо ввести 20 строк, для этого используем цикл for.

    Код :
    ClrScr;
    for i := 1 to 20 do
      begin
         Write ('Введите строку '+IntToStr(i));
         Readln ( mas[i]);
      end;
    Цикл будет повторяться, до тех пор пока переменная i не примет значение 20, в начале цикла она равна 1, и после каждой итерации автоматически увеличивается на 1. В цикл входит все содержащееся между словами begin и end.
    Строка Write - такой же вывод сообщения, только добавлен номер строки, "IntToStr(i)" преобразование целого в строку.
    Строка Readln - такой же ввод, только в каждой итерации присваивание выполняется для i-го элемента массива.
    Итак с вводом строк мы справились!... хотя возможен ввод не только с клавиатуры, но и из файла...

    Теперь как я понимаю, из этого массива строк нужно выбрать строки, которые представляют собой комментарии паскаля. Комментарии в Паскале либо начинаются с двойного слэша и до конца строки "//коментарий", либо заключены в фигурные скобки {коментарий}.
    Ну как со строками справиться разберетесь? Если нет спрашивайте дальше.
    Последний раз редактировалось Dimon012; 24.02.2012 в 17:05.
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    gernsback (24.02.2012)

  4. #3  
    Новичок
    Регистрация
    23.02.2012
    Сообщений
    7
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    Dimon012 , Спасибо .. это я понял ...
    потом мне в программе надо будет выполнить процедуру поиска ..
    т.е. будет использоваться опять же цикл For от 1 до 20 ...
    и в нем должна получается искаться строка начинающаяся с символа "{"

    я правильно понимаю?
    и если строка найдена ... то она выводится... а если нет .. то пишется сообщение что таких строк нет ?
    Последний раз редактировалось gernsback; 24.02.2012 в 18:03.
    Ответить с цитированием  
     

  5. #4  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    [QUOTE=gernsback;4580]а не подскажете как описывается эта процедура в Turbo Pascal .
    Код :
    ClrScr;
    Uses srt;
    Ну я так понимаю модуль называется CRT!!!

    uses crt;
    тщительней надоть, тщительней!
    Ответить с цитированием  
     

  6. #5  
    Новичок
    Регистрация
    23.02.2012
    Сообщений
    7
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    Да ) я исправил .) модуль заработал )
    Ответить с цитированием  
     

  7. #6  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    ...потом мне в программе надо будет выполнить процедуру поиска ..
    т.е. будет использоваться опять же цикл For от 1 до 20 ...
    и в нем должна получается искаться строка начинающаяся с символа "{"
    Не совсем так, Нужно еще один цикл, чтобы в строке искать или символ "//", тогда можно выбирать все до конца строки, а вот если нашли символ "{", то необходимо искать до следующего символа "}", который может быть и в следующей строке и далее...
    Думаю все должно выглядеть так:
    Код :
      for i := 1 to 20 do
      begin
         str:='';
         j:=1;
         while j < 70 do
         begin
             // здесь все и будет!
     
              j:=j+1;
         end;
         if length(str)>0 then write(str);
      end;
    Последний раз редактировалось Dimon012; 24.02.2012 в 19:50.
    Ответить с цитированием  
     

  8. #7  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Ну я тут напрягся и учитывая, что строка представляет собой массив символов то, получилось что то вроде этого:
    Код :
      for i := 1 to 20 do
      begin
         str:='';
         j:=1;
         while j < 70 do
         begin
              If (mas[i,j]='{') Then sim:='{';
              If (sim='{') Then
              begin
                   j:=j+1;
                   while (mas[i,j]<>'}') and (j<70) do
                   begin
                         str:=str+mas[i,j];
                         j:=j+1;
                   end;
                   If (mas[i,j]='}') then sim:='';
              end;
              If (mas[i,j]='/') and (mas[i,(j+1)]='/') and (j<70) Then
              begin
                   j:=j+2;
                   while j < 70 do
                   begin
                         str:=str+mas[i,j];
                         j:=j+1;
                   end;
              end;
              j:=j+1;
         end;
         if length(str)>0 then write(str);
      end;
    Тут присутствует 2 части одна для многострочных комментариев типа "{....}" и вторая для однострочных комментариев типа "//".
    Последний раз редактировалось Dimon012; 24.02.2012 в 19:53.
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    gernsback (27.02.2012)

  10. #8  
    Новичок
    Регистрация
    23.02.2012
    Сообщений
    7
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    Dimon012 , премного благодарен за помощь!)
    Ответить с цитированием  
     

  11. #9  
    Новичок
    Регистрация
    23.02.2012
    Сообщений
    7
    Сказал(а) спасибо
    2
    Поблагодарили 0 раз(а) в 0 сообщениях
    вот что я написал

    Код программы
    Код :
    Program lab10; 
    Const  A='{'; B='}'; 
              n=6; 
    Type mas=array[1..n] of string[70]; 
    Var str,rez,poz:mas; i,v,x,l,p,k:byte; 
     
    Begin 
    Writeln('Please Enter Strings'); 
    For i:=1 to n do begin 
    write('Stroka: '); Readln(str[i]); end; 
    For i:=1 to n do begin 
    l:=length(str[i]); 
    p:=pos(A,str[i]); 
    k:=pos(B,str[i]); 
    If (p=0) then writeln('Commenttarii otsytstvyut') else 
    if (p=0) and (k>=0) then writeln('Commenttarii otsytstvyut')else 
    begin    
    rez[i]:=copy(str[i],p,k); 
    delete(str[i],p,k); 
    x:=pos(A,str[i]); 
    v:=pos(B,str[i]); 
    If x>v then begin    
    poz[i]:= copy(str[i],x,v); 
    rez[i]:= rez[i]+poz[i]; 
    writeln('coment:', rez[i]); end else 
    writeln('coment:', rez[i]); 
    end; 
    end; 
    end.

    Проблема в том что когда я ввожу строку вида:
    }text{
    Программа считает её комментарием и выводит:
    coment: {}
    Помогите плиз решить эту проблему. Заранее спасибо.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  12. #10  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Цитата Сообщение от gernsback Посмотреть сообщение
    Проблема в том что когда я ввожу строку вида:
    Программа считает её комментарием и выводит:
    проблема в том, что у Вас неверно/нелогично записаны условия
    Код :
    If (p=0) then writeln('Commenttarii otsytstvyut') else 
    if (p=0) and (k>=0) then writeln('Commenttarii otsytstvyut')else
    В первом условии Вы проверяете имеется ли найденная позиция "{" (p=0) если она не найдена то коментарий отсутствует, в противном случае идет второе условие, где вы опять повторяете первое условие (p=0), зачем? Если (p=0) верно, то это проверено в первом случае, и второй проверки не будет. Проанализируйте мой вариант
    Код :
    If (p=0) then writeln('Commenttarii otsytstvyut') else 
    if (k>p) then begin ...
    Внимание! В моем варианте второе условие противоположно вашему...

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

    Теперь объявление переменных, Вы хоть разные типы определяйте в разных строках (еще лучше каждая переменная в одной строке).
    Код :
    Var str,rez,poz:mas; i,v,x,l,p,k:byte;
    Код :
    Var 
    str,rez,poz:mas; 
    i,v,x,l,p,k:byte;

    Теперь операторы
    Код :
    write('Stroka: '); Readln(str[i]); end;
    Оно конечно компактная запись, но гораздо удобнее записывать один оператор в одной строке.
    Код :
    write('Stroka: '); 
    Readln(str[i]); 
    end;
    Я уже молчу об отступах в условиях и циклах...
    Последний раз редактировалось Dimon012; 14.03.2012 в 03:25.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Помогите понять программу
    от Black Doomer в разделе QBasic
    Ответов: 1
    Последнее сообщение: 15.12.2011, 18:12
  2. Ответов: 0
    Последнее сообщение: 07.12.2011, 22:10
  3. Помогите исправить код программы
    от azalivin в разделе QBasic
    Ответов: 3
    Последнее сообщение: 10.05.2011, 18:52
  4. Ответов: 5
    Последнее сообщение: 10.04.2011, 21:20
  5. Ответов: 6
    Последнее сообщение: 09.12.2010, 18:40
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •