Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
| 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, то вообше ничего не говорит, даже результат |
| 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 |
счас ещё подправил уже лучше стало
вот прога: Код 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 Вот специально для етого программа и выдает на какой их линий ошибка! Когда у меня в программах много ошибок я сижу и по сказанной линии думаю что в ней не так а ты целую прогу переписуешь! ВОзьми участок с ошибкой и пиши и т.д.(если есть еще ошибки)
|
![]() ![]() |
|
Текстовая версия | Сейчас: 22.5.2012, 9:29 |