На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Нужна еще две програмки!!!
    Я извиняюсь за надоедливость, ну не умею я писать программы на паскаль, вот по железу это ко мне, но нужна еще две маленькие програмки:

    1)Вычислить модуль отношения максимального и минимального ненулевого элементов массива.

    2)Декодировать римскую запись числа, состоящего из любого количества знаков.
    Правила: I-1, V-5, X-10, L-50, C-100, D-500, M-1000. Значения римской цифры не зависит от позиции, а знак зависит.
      Проклятье, голова не варит sad.gif ph34r.gif По второму неясно: вроде бы римское число больше чем 20 знаками (MMMDCCCLXXXVIII это что я смог представить) не запишешь... А то появится на входе что-нибудь вроде IVCDM и разбирайся... Если число легальное, где-то в ФАКе чуть ли не прога по этому была.
        Строковые Функции >> romarab
        Roman to Arabian Numbers Convertor
        Функции для преобразования Римских чисел в обычные Арабские и наоборот.
        http://pascal.sources.ru/string/romarab.htm
          Вот тебе первая:
          ExpandedWrap disabled
            const
              n=15;
            var
              a:array[1..n] of integer;
              p:byte;
              max,min:integer;
            begin
              max:=low(integer);
              min:=high(integer);
              randomize;
              for p:=1 to n do
              begin
                a[p]:=random(2000)-1000;
                writeln('a(',p,')=',a[p]);
                if a[p]<>0 then
                begin
                  if a[p]>max then max:=a[p];
                  if a[p]<min then min:=a[p];
                end;
              end;
              writeln('max:',max);
              writeln('min:',min);
              writeln('|max/min|=',abs(max/min):0:5);
            end.
            Заглянь завтра, после 24:00. Постараюсь помочь со 2-й прогой.
              Цитата Some1 @ 19.11.03, 00:46
              Вот тебе первая:
              Спасибо за первую прогу.
                К сожалению но проги по ссылке работаю с ошибками (не все числа переводят в арабские)
                  Попробуй вот эту прогу:
                  type letval=record
                     l:char;
                     v:word;
                  end;
                  const tabl:array[1..13] of letval=
                   ((l:'Y';v:9),
                    (l:'W';v:4),
                    (l:'I';v:1),
                    (l:'V';v:5),
                    (l:'K';v:40),
                    (l:'F';v:90),
                    (l:'X';v:10),
                    (l:'L';v:50),
                    (l:'E';v:400),
                    (l:'N';v:900),
                    (l:'C';v:100),
                    (l:'D';v:500),
                    (l:'M';v:1000));

                  var s:string;
                     res:word;
                     state:byte;
                     i,j:byte;
                     ppos:byte;
                     mor:byte;
                  procedure checkvalid(var s:string);
                  var i:integer;
                  begin
                   for i:=1 to length(s) do
                     case s[i] of
                       ' ':delete(s,i,1);{remove spaces, why not?}
                       'i','I':s[i]:='I';
                       'v','V':s[i]:='V';
                       'd','D':s[i]:='D';
                       'x','X':s[i]:='X';
                       'l','L':s[i]:='L';
                       'c','C':s[i]:='C';
                       'm','M':s[i]:='M';
                       else begin
                         writeln('Symbol no. ',i,' is incorrect! Symbol is ',s[i]);
                         halt(1);
                       end;
                     end;
                  end;
                  begin
                   write('Input me a roman number: ');
                   readln(s);
                   checkvalid(s);
                   res:=0;
                   state:=pos('CD',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('E',s,state);
                   end;
                   state:=pos('CM',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('N',s,state);
                   end;
                   state:=pos('XL',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('K',s,state);
                   end;
                   state:=pos('XC',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('F',s,state);
                   end;
                   state:=pos('IV',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('W',s,state);
                   end;
                   state:=pos('IX',s);
                   if state<>0 then begin
                     delete(s,state,2);
                     insert('Y',s,state);
                   end;
                   state:=13;
                   ppos:=1;
                   {main}
                   mor:=0;
                   for i:=1 to length(s) do
                     for j:=1 to 13 do begin
                       if s[i]=tabl[j].l then begin
                         if state<j then begin
                           writeln('Symbol ''',s[i],''' at position ',ppos,' is incorrect!');
                           writeln('Even if it''s a non-Roman symbol.');
                           readln;
                           halt(2);
                         end else if state=j then begin
                           if j in [1,2,5,6,9,10] then begin
                             {IV's and others are allowed only once}
                             writeln('Symbol ''',s[i],''' at position ',ppos,' is incorrect!');
                             writeln('Even if it''s a non-Roman symbol.');
                             readln;
                             halt(2);
                           end else begin
                             inc(mor);
                             if mor>=3 then begin
                               writeln('Only 3 of symbols ''',s[i],''' are allowed.');
                               readln;
                               halt(2);
                             end else begin
                               res:=res+tabl[j].v;
                               inc(ppos);
                             end;
                           end
                         end else begin
                           state:=j;
                           res:=res+tabl[j].v;
                           inc(ppos);
                           mor:=0;
                           if j in [1,2,5,6,9,10] then inc(ppos);
                         end;
                       end;
                     end;
                   writeln('Result is ',res,'.');
                   readln
                  end.

                  Вроде бы на все оттестил.
                  Сообщение отредактировано: vesper1 -
                    To vesper1: %)) Кочмар %))))))
                    И (к сожалению) неправильно работает :))
                    Вот ТУТ почитай про то, как формируются римские числа %)
                    ExpandedWrap disabled
                      const
                        rs='IVXLCDM';
                        rv:array[1..7] of word=(1,5,10,50,100,500,1000);
                      var
                        s:string;
                        i:byte;
                        value,v:integer;
                      begin
                        writeln('Пример чисел:');
                        writeln('44=XXXXIIII=XXIIXXVI=VIXL=IVL=IVXLX');
                        writeln('1997=IIIMM=IIMIDD=IDIDIDD=MCMXCVII');
                        write('Введите римское число: ');
                        readln(s);
                        v:=rv[pos(s[1],rs)];
                        value:=0;
                        for i:=2 to length(s) do if pos(s[i-1],rs)<>pos(s[i],rs) then
                        begin
                          inc(value,v*(byte(pos(s[i-1],rs)>pos(s[i],rs))*2-1));
                          v:=rv[pos(s[i],rs)];
                        end else inc(v,rv[pos(s[i],rs)]);
                        inc(value,v);
                        writeln('Это-же число в арабском представлении: ',value);
                      end.
                    Сообщение отредактировано: volvo877 -
                      Не понял.... Нельзя по правилам написать 1999=MIM, а пишется оно MCMXCIX. Вот так.
                      И вообще, я сразу спросил, что считается легальным римским числом, а правила формирования я взял из оригинала.
                      А "неправильно работает" - это где? Если на IX выдает 8 smile.gif ..... заметил уже позже, могу поправить прямо здесь. А если еще где... делись инфой.
                        Объясните почему некоторые проги чисел подобных IM либо не работает, либо выдает что это не правильная запись а To Some1: а почему твоя прога выдает что это не римское число а потом выводит 999???
                          Чего ?????? Моя прога пишет, что IM не римское число ?:)))))))
                          Не пишет оно такого. Пишет так:
                          Пример чисел:');
                          44=XXXXIIII=XXIIXXVI=VIXL=IVL=IVXLX
                          1997=IIIMM=IIMIDD=IDIDIDD=MCMXCVII
                          Введите римское число: IM
                          Это-же число в арабском представлении: 999

                          И где тут написано, что IM не римское ???

                          На счёт твоего вопроса: потому что написаны неправильно, и не учитывают, что римские числа состоят из положительных и отрицательных компонент. В IM - I - отрицательная компонента (-1) и M - положительная (1000). В сумме получится 999. А если не знать этого, то можно считать, что I это 1 и M - это 1000, и в сумме даст скажем 1001. Хотя на счёт неправильной записи, и что касается сказанного vesper1 - я не знаю, может я и не прав, я делал пологаясь на ту ссылку, которую уже дал в пред. посте и поэтому считаю что правильные записи - все возможные комбинации, удовлетворяющие условию, описанному в ссылке.

                          А какими источниками пользовался ты, vesper1 ?
                          Как можно говорить о верности, если в разных местах по разному написано ?
                          Давай скажем, так: твоя прога работает правильно соответствуясь твоему пониманию римской записи, а моя - соответственно моему :))
                          З.Ы. Ошибок я у тебя вобще не искал. Я просто смотрю - veter2003 говорит, что твоя работает не всегда верно, вот и написал :) Не обижайся, я не из подлости натуры :))))
                            biggrin.gif А я и не обижаюсь wink.gif Я пользовался книгой "За страницами учебника математики", где естественно (книга еще советская) были расписаны строгие правила формирования римских чисел, т.е. точно в таком виде, в каком они написаны (иногда) на старых зданиях, в конце титров фильмов итд. Поэтому я и выстроил всю эту систему ограничений. rolleyes.gif
                            Цитата
                            Давай скажем, так: твоя прога работает правильно соответствуясь твоему пониманию римской записи, а моя - соответственно моему smile.gif)
                            А давай biggrin.gif
                            Только вопрос: чему равно IVXLCDM? Согласно записи 44=IVL, получается 334 smile.gif Твоя прога его и выдает. И еще вопрос: можно же написать IIIIIIIIIIIIIIIIIII и получится 19 (ну если я правильно сосчитал smile.gif) а если в конце поставить V, будет -14... Хм. Вроде изначально римскими знаками нельзя было записать отрицательное число...
                            Хеееее, щас тестирую твою прогу... она на DDM выдает 0, а на DIDM - 999 laugh.gif Сколько я понял, результат должен был быть -1?
                              to Some1: Все понял это я что-то не то прочитал. Вопрос: Почему твоя прога при вводе IM выводит 999 а при вводе im результат 0 ???
                                потому, что такого римского обозначения "im" - не существует.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0353 ]   [ 15 queries used ]   [ Generated: 25.04.24, 06:37 GMT ]