IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Помогите перевести прогу с Pascal в MatLAB
yanovskiy
сообщение 16.7.2006, 13:12
Сообщение #1


Пользователь


Группа: Пользователи
Сообщений: 5
Регистрация: 16.7.2006
Пользователь №: 12 296



Ребят, помогите пожалуйста перевести прогу из Паякаля в Матлаб.
Код
Program Delenie;

Uses

 Crt;

Const

 Max=1000;

Type

 Mas=Array[1..Max] Of ShortInt;

Var

 S:Boolean;

 M1,M2:String;

 A1,A2,Mm1,Mm2,P:Mas;

 Cod:Integer;

 f,k,l,i,j,z,C,q,sum:Integer;

 M,N1,N2:Integer;

Function Sravn(M:Integer;A1,Mm2:Mas):Boolean;

Var

 k:Integer;

Begin

 if M <> N2 Then Sravn := (M > N2)

 Else Begin

   Sravn := True; k := 1;

   While (k <= M) and (A1[k] = Mm2[k]) Do inc(k);

   If (k <= M) Then Sravn := (A1[k] > Mm2[k])

 End;

End;

Begin

 ClrScr;

 WriteLn(' Vvedite delimoe');

  Write(' -> ');

   ReadLn(M1);

    N1:=LengTh(M1);

     For i:=1 To N1 Do Val(M1[i],Mm1[i],Cod);

 WriteLn(' Vvedite delitel');

  Write(' -> ');

   ReadLn(M2);

    N2:=LengTh(M2);

     For i:=1 To N2 Do Val(M2[i],Mm2[i],Cod);

 For i:=1 To N2-1 Do A1[i]:=Mm1[i];

 M:=N2-1;

 i:=M;

 While(i<N1)Do

   Begin

         While ((Sravn(M,A1,Mm2)=False) And (i<N1)) Do

       Begin

         sum:=0;

           for q := 1 to M do begin

           sum := sum + a1[q]; if sum <> 0 then break;

         end;

         if ((M > 0) and (sum <> 0)) or (M = 0) then M:=M+1;                                        

         i:=i+1;

         A1[M]:=Mm1[i];

       End;

     j:=0;

     While(Sravn(M,A1,Mm2)=True)Do

       Begin

         f:=N2+1;

         For k:=M DownTo M-N2 Do

           Begin

             f:=f-1;

             If A1[k]>=Mm2[f]

               Then

                 A2[k]:=A1[k]-Mm2[f]

               Else

                 Begin

                   A1[k]:=A1[k]+10;

                   A1[k-1]:=A1[k-1]-1;

                   For l:=k DownTo 1 Do

                     If A1[l]<0 Then

                       Begin

                         A1[l-1]:=A1[l-1]-1;

                         A1[l]:=A1[l]+10;

                       End;

                   A2[k]:=A1[k]-Mm2[f];

                 End;

            End;

         For l:=M-N2-1 DownTo 1 Do A2[l]:=A1[l];

         j:=j+1;

         P[i-N2+1]:=j;

         While((A2[1]=0)And(M>0))Do

           Begin

             For z:=1 To M-1 Do A2[z]:=A2[z+1];

             M:=M-1;

             A2[M+1]:=0;

           End;

         For z:=1 To M Do A1[z]:=A2[z];

       End;

     While((A1[1]=0)And(M>0))Do

       Begin

         For z:=1 To M-1 Do A1[z]:=A1[z+1];

         M:=M-1;

         A1[M+1]:=0;

       End;

   End;

 WriteLn(' Chastnoe: ');

  Write(' -> ');

   j:=1;

    While ((P[j]=0)And(j>=N1-N2)) Do j:=j+1;

     while p[j]=0 do inc(j);

     For i:=j To N1-N2+1 Do Write(P[i]);

 WriteLn;

 If M=0 Then

   Begin

     M:=1;

     A1[M]:=0;

   End;

 WriteLn(' Ostatok');

  Write(' -> ');

   For i:=1 To M Do Write(A1[i]);

 ReadLn;

End.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 17.7.2006, 8:14
Сообщение #2


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



yanovskiy, в чем сложность? на Паскале-то работает правильно?

Описание переменных пропускаем...
Создаем m-файл и пишем в него функцию, слегка изменив (языки очень похожи: чуть другой if, индексы массивов в круглых скобках, а не в квадратных,...), N2 бы в функцию еще передать... сохраняем под именем функции

Далее основную чать программы
Ее в виде скрипта или тоже функции делаешь. Опять создаешь m-файл,
ввод/вывод пропускаем (передаем как параметры)или делаем из/в файл
остальное слегка меняем. Сравни if, while, for в обоих языках...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yanovskiy
сообщение 17.7.2006, 12:54
Сообщение #3


Пользователь


Группа: Пользователи
Сообщений: 5
Регистрация: 16.7.2006
Пользователь №: 12 296



Вот, попытался, чего-то ему ненравится. Вводвывод менять не нужно. Погляди, может найдёшь ошибку.
сама прога:
Код
disp(' Vvedite delimoe');

  M1=input(' -> ', 's');

  N1=size(M1,2);

   for i=1:size(M1,2)

     Mm1(i)=str2num(M1(i));

 end

 disp(' Vvedite delitel');

  M2=input(' -> ', 's');

  N2=size(M2,2);

    for i=1:size(M2,2)

     Mm2(i)=str2num(M2(i));

       for i=1:(N2-1);

 A1(i)=Mm1(i);

 M==(N2-1);

 i==M;

end

v=Sravn(M,A1,Mm2,N2);

 while i<N1

    while (v==False)&(i<N1)

          sum==0;

           for q=1:M

           sum==sum + a1(q);

           if (sum~=0) break;

           end

         if ((M > 0)&(sum~=0)) or (M==0)

       M==M+1;                                        

         i==i+1;

         A1(M)==Mm1(i);

     end

      j==0;

     while(Sravn(M,A1,Mm2)==True)

        f==N2+1;

         for k=M DownTo (M-N2)

           f==f-1;

             if A1(k)>=Mm2(f)

                A2(k)==A1(k)-Mm2(f)

             else

                   A1(k)==A1(k)+10;

                   A1(k-1)==A1(k-1)-1;

                   for l=k DownTo (1)

                     if A1(l)<0

                         A1(l-1)==A1(l-1)-1;

                         A1(l)==A1(l)+10;

                     end

                       A2(k)==A1(k)-Mm2(f);

                   end

               end

              for l=(M-N2-1) DownTo (1)

             A2(l)==A1(l);

         j==j+1;

         P(i-N2+1)==j;

         while (A2(1)==0)&(M>0)

             for z=1:M-1

             A2(z)==A2(z+1);

             M==M-1;

             A2(M+1)==0;

         end

              for z=1:M

           A1(z)==A2(z);

       end

         while (A1(1)==0)&(M>0)

              for z=1:(M-1)

             A1(z)==A1(z+1);

         M==M-1;

         A1(M+1)==0;

     end

 end

      disp(' Chastnoe: ');

  disp(' -> ');

   j==1;

    while (P(j)==0)&(j>=N1-N2)

        j==j+1;

     while p(j)==0

         inc(j);

     for i=j:(N1-N2+1)

         disp(P(i));

  if M==0 then

     M==1;

     A1(M)==0;

 end

 disp(' Ostatok');

  disp(' -> ');

   for i=1:M

       disp(A1(i));

   end

end

end

end

end

end

end

end

end

end

end

end

end

end


вот пдпрограмма:
Код
function v=Sravn(M,A1,Mm2,N2)  

if (M~=N2)

     Sravn == False;

 else

   Sravn==True;

   k==1;

   while (k <= M)&(A1(k) == Mm2(k))  

       inc(k);

   if (k <= M)

       Sravn == (A1(k) > Mm2(k))

   end

end

end
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
omni
сообщение 17.7.2006, 18:39
Сообщение #4


Пользователь


Группа: Пользователи
Сообщений: 1 442
Регистрация: 25.9.2004
Из: Уфа
Пользователь №: 1 256



чтонить в бонус будет? а то так не охота возаиться рутиной.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 18.7.2006, 5:32
Сообщение #5


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



yanovskiy, при сравнении два равно ==, а при присваивании ОДНО =
- самая частая твоя ошибка

Ну и end-ы все почему в конце?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yanovskiy
сообщение 20.7.2006, 3:36
Сообщение #6


Пользователь


Группа: Пользователи
Сообщений: 5
Регистрация: 16.7.2006
Пользователь №: 12 296



:cry: исправил все ошибки связанные с равно (==; =), end-ы на место поставил.. но всё равно отказывается работать. Может быть обращение к подпрограммне неверное?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 20.7.2006, 5:10
Сообщение #7


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



четвертый параметр потерял...

в FOR не должно быть никакого downto,
начало: шаг: конец
шаг -1, если downto
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yanovskiy
сообщение 20.7.2006, 11:30
Сообщение #8


Пользователь


Группа: Пользователи
Сообщений: 5
Регистрация: 16.7.2006
Пользователь №: 12 296



дбавил четвертый параметр, изменил DownTo, всё равно ошибка..
Вот что у меня счас получилось.
Сама прга:
Код
disp(' Vvedite delimoe');

  M1=input(' -> ', 's');

  N1=size(M1,2);

   for i=1:size(M1,2)

     Mm1(i)=str2num(M1(i));

 end

 disp(' Vvedite delitel');

  M2=input(' -> ', 's');

  N2=size(M2,2);

    for i=1:size(M2,2)

     Mm2(i)=str2num(M2(i));

       for i=1:(N2-1);

 A1(i)=Mm1(i);

 M=(N2-1);

 i=M;

end

 while i<N1

    while (Sravn(M,N2,A1,Mm2)==False)&(i<N1)

          sum=0;

           for q=1:M

           sum=sum + a1(q);

           if (sum~=0) break;

           end

         if ((M > 0)&(sum~=0)) or (M==0)

       M=M+1;                                        

         i=i+1;

         A1(M)=Mm1(i);

     end

      j=0;

     while(Sravn(M,N2,A1,Mm2)==True)

        f=N2+1;

         for k=M:-1:(M-N2)

           f=f-1;

             if A1(k)>=Mm2(f)

                A2(k)=A1(k)-Mm2(f)

             else

                   A1(k)=A1(k)+10;

                   A1(k-1)=A1(k-1)-1;

                   for l=k:-1:1

                     if A1(l)<0

                         A1(l-1)=A1(l-1)-1;

                         A1(l)=A1(l)+10;

                     end

                       A2(k)=A1(k)-Mm2(f);

                   end

               end

              for l=(M-N2-1):-1:1

             A2(l)=A1(l);

         j=j+1;

         P(i-N2+1)=j;

         while (A2(1)==0)&(M>0)

             for z=1:M-1

             A2(z)=A2(z+1);

             M=M-1;

             A2(M+1)=0;

         end

              for z=1:M

           A1(z)=A2(z);

       end

         while (A1(1)==0)&(M>0)

              for z=1:(M-1)

             A1(z)=A1(z+1);

         M=M-1;

         A1(M+1)=0;

     end

 end

      disp(' Chastnoe: ');

  disp(' -> ');

   j=1;

    while (P(j)==0)&(j>=N1-N2)

        j=j+1;

     while p(j)==0

         inc(j);

     for i=j:(N1-N2+1)

         disp(P(i));

  if M==0 then

     M=1;

     A1(M)=0;

 end

 disp(' Ostatok');

  disp(' -> ');

   for i=1:M

       disp(A1(i));

   end

end

end

end

end

end

end

end

end

end

end

end

Кстати, без end-ов в конце тож нехочет работать.

Вот подпрогрмма:
Код
function Sravn(M,N2,A1,Mm2)

if (M~=N2)

     Sravn = (M>N2);

 else

   Sravn=True;

   k=1;

   while (k <= M)&(A1(k) == Mm2(k))  

       inc(k);

   if (k <= M)

       Sravn = (A1(k) > Mm2(k))

   end

end

end


вот такую ошибку выдает:
>> Vvedite delimoe
-> 3486374867384
Vvedite delitel
-> 42537654
??? Error using ==> sravn
Too many output arguments.

Error in ==> C:matlab.m
On line 18 ==> while (Sravn(M,N2,A1,Mm2)==False)&(i<N1)


а если простые числ делить, например 1255, то вообше ничего не говорит, даже результат sad.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 20.7.2006, 14:31
Сообщение #9


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



А зачем ты из функции v= убрал?
Вроде Как раз этой v и надо все присваивать, а не имени функции...

И end-ы у тебя все еще в куче - в конце
пиши нормально, с отступами, чтоб было понятно где for,if, и где end к ним
Цитата
Кстати, без end-ов в конце тож нехочет работать.

они должны быть, но не все именно в конце
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yanovskiy
сообщение 20.7.2006, 15:41
Сообщение #10


Пользователь


Группа: Пользователи
Сообщений: 5
Регистрация: 16.7.2006
Пользователь №: 12 296



счас ещё подправил уже лучше стало smile.gif но всё же..
вот прога:
Код
disp(' Vvedite delimoe');

  M1=input(' -> ', 's');

  N1=size(M1,2);

   for i=1:size(M1,2)

     Mm1(i)=str2num(M1(i));

   end

 disp(' Vvedite delitel');

  M2=input(' -> ', 's');

  N2=size(M2,2);

    for i=1:size(M2,2)

     Mm2(i)=str2num(M2(i));

    end

       for i=1:(N2-1);

 A1(i)=Mm1(i);

 M=(N2-1);

 i=M;

       end

 while i<N1

     v=Sravn(M,A1,Mm2,N2);

    while (v==False)&(i<N1)

          sum=0;

           for q=1:M

           sum=sum + a1(q);

           end

           if (sum~=0) break;

           end

         if ((M > 0)&(sum~=0)) or (M==0)

       M=M+1;                                        

         i=i+1;

         A1(M)=Mm1(i);

         end

      j=0;

     while(v==True)

        f=N2+1;

         for k=M:-1:(M-N2)

           f=f-1;

         end

             if A1(k)>=Mm2(f)

                A2(k)=A1(k)-Mm2(f)

             else

                   A1(k)=A1(k)+10;

                   A1(k-1)=A1(k-1)-1;

                   for l=k:-1:1

                     if A1(l)<0

                         A1(l-1)=A1(l-1)-1;

                         A1(l)=A1(l)+10;

                     end

                       A2(k)=A1(k)-Mm2(f);

                   end

               end

              for l=(M-N2-1):-1:1

             A2(l)=A1(l);

         end

         j=j+1;

         P(i-N2+1)=j;

         while (A2(1)==0)&(M>0)

             for z=1:M-1

             A2(z)=A2(z+1);

             M=M-1;

             A2(M+1)=0;

             end

              for z=1:M

           A1(z)=A2(z);

              end

         while (A1(1)==0)&(M>0)

              for z=1:(M-1)

             A1(z)=A1(z+1);

         M=M-1;

         A1(M+1)=0;

              end

         end

     end

 end

end

end

        disp(' Chastnoe: ');

  disp(' -> ');

   j=1;

    while (P(j)==0)&(j>=N1-N2)

        j=j+1;

    end

     while p(j)==0

         inc(j);

     end

     for i=j:(N1-N2+1)

         disp(P(i));

     end

  if M==0 then

     M=1;

     A1(M)=0;

  end

 disp(' Ostatok');

  disp(' -> ');

   for i=1:M

       disp(A1(i));

   end


вот подпрограмма:
Код
function v=Sravn(M,A1,Mm2,N2);

if (M~=N2)

     Sravn = (M>N2);

 else

   Sravn=True;

   k=1;

   while (k <= M)&(A1(k) == Mm2(k))  

       inc(k);

   if (k <= M)

       Sravn = (A1(k) > Mm2(k))

   end

end

end


теперь он вот такие ошибки выдает:
>> Vvedite delimoe
-> 125
Vvedite delitel
-> 5
Chastnoe:
->
??? Undefined function or variable 'P'.

Error in ==> C:matlab.m
On line 79 ==> while (P(j)==0)&(j>=N1-N2)

>> Vvedite delimoe
-> 46543634575347
Vvedite delitel
-> 575
??? One or more output arguments not assigned during call to 'sravn'.

Error in ==> C:matlab.m
On line 19 ==> v=Sravn(M,A1,Mm2,N2);


может он не понимает что v это логическая переменная? как это можно задать?

И ещё, может я туплю, а к while разве нужен end?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 21.7.2006, 5:40
Сообщение #11


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



Цитата
??? Undefined function or variable 'P'.

У тебя то маленькая, то большая... Может из-за этого

Цитата

??? One or more output arguments not assigned during call to 'sravn'.

Внутри функции присваивай результат не имени функции а переменной v


Цитата
И ещё, может я туплю, а к while разве нужен end?

нужен
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Nemo
сообщение 30.7.2006, 10:50
Сообщение #12


Пользователь


Группа: Пользователи
Сообщений: 158
Регистрация: 12.6.2004
Из: Саранск
Пользователь №: 922



Исправь еще раз, учитывая, что в Matlab имена переменных регистрозависимые...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NICE
сообщение 9.8.2006, 1:00
Сообщение #13


Пользователь


Группа: Пользователи
Сообщений: 80
Регистрация: 12.7.2006
Пользователь №: 12 187



2yanovskiy Вот специально для етого программа и выдает на какой их линий ошибка! Когда у меня в программах много ошибок я сижу и по сказанной линии думаю что в ней не так а ты целую прогу переписуешь! ВОзьми участок с ошибкой и пиши и т.д.(если есть еще ошибки) wink.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 22.5.2012, 9:29