KMA
Долгожитель
|
Ошибка может быть еще в том, какой тип ты используешь. Вообще, если ты пользуешься real, то это только учебный процесс, т. к. реально он сам по себе (этот тип данных глючный). Используй для всех тип extended. Тогда и посмотрим что получиться. Поменяй, потом скажи о результатах. А собствено у тебя же куб косинуса, так? А было написано, что это косинус произведения 3 на разность счетчика итерации и 2, 5, извини разница есть. В постановке задачи одно, а в программе другое, поэтому я и написал, что не улавливаю логики. Собственно, со стремлением записать все в одну формулу возникают проблемы, т. к. сложность вычислений ТАКОГО дела очень большая. Я бы вообще сделал так:
Code Sample:
for i:=1 to l do begin buf:=cos (i-2,5); W[ i ]:=5*ln(0.1*i)+12*buf*buf*buf; write(W[ i ]:4:2,' ':2) end;
Во всяком случае это упростило бы задачу. По поводу ошибок не удивляйся. Это нормально ошибаться для каждого человека. И на первых этапах у многих такие типовые ошибки возникают. Но благодаря этому и формируется опыт... Поэтому все нормально. Главное не терять боевого духа.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 14 нояб. 2007 22:20 | IP
|
|
snakeq
Новичок
|
Помогите пожайлуста с этой задачей. Помогите пожайлуста дополнить её удалением и так же проверить правильноли она написанна Использовать подпрограммы (ввода, вывода, обрабатывающей части). Дан массив целых чисел А[M,N], где M,N<=10. Удалить все столбцы, в которых нет нулевого элемента.
Code Sample:
program lab4; const k=10; var A:array [1..10, 1..10] of integer; M,N:integer; procedure inputArray; var i,j:integer; begin write ('M='); readln (M); if M>10 then begin writeln ('M must be <=10'); N:=0; M:=0; exit; end; write ('?N='); readln (N); if N>10 then begin writeln ('N must be <=10'); N:=0; M:=10; exit; end; for i:=1 to M do begin write ('?A[',i,',',',j]='); readln (A[i,j]); end; end; procedure printArray; var i,j:integer; begin writeln ('A='); if (N>0) and (M>0) then begin for i:=1 to M do begin write (A[i,j]); end; writeln; end; end; procedure ydalenia; end; begin inputArray; printArray; vstav; printArray; end.
(Сообщение отредактировал snakeq 14 нояб. 2007 23:21)
|
Всего сообщений: 6 | Присоединился: ноябрь 2007 | Отправлено: 14 нояб. 2007 23:20 | IP
|
|
bekas
Долгожитель
|
Для начала: циклы ввода и печати массива A должны быть двойными (кто j будет менять?)...
|
Всего сообщений: 379 | Присоединился: январь 2006 | Отправлено: 15 нояб. 2007 0:41 | IP
|
|
Zheka
Новичок
|
to KMA: Попробовал записать по-твоему, то же самое получается. А когда поменял тип real на extended выдало в условии: (A[ i ]>0) вот такую ошибку: "Must be 8087 mode to compile this". (Сообщение отредактировал Zheka 15 нояб. 2007 2:00)
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 15 нояб. 2007 2:59 | IP
|
|
KMA
Долгожитель
|
To Zheka. Компилировал BP 7.0 на третьем пеньке. Исходник проги:
Code Sample:
program Lb9; CONST n=8; m=10; l=4; TYPE massiv=array[1..n] of real; VAR X,Y,Z,W: massiv; Dobutok, maxY, maxZ, maxW, buf:real; i:integer; procedure maxInArray(A: massiv; const k: byte; var max: real); Var i, j:integer; Begin j:=1; while A[ j ]>=0 do inc (j); max:=A[ j ]; for i:=j to k do if (max<A[ i ]) and (A[ i ]<0) then max:=A[ i ]; if (max=A[ n ]) and (A[ n ]>=0) then max:=1; End; function Dob(b,c,d:real): real; Var P:real; Begin P:=b*c*d; Dob:=P; End; BEGIN writeln(' ':10,'MASSIV X '); for i:=1 to n do begin X[ i ]:=2*sqr(i)-10*(5-i); write(X[ i ]:4:2,' ':4); end; writeln; writeln; writeln(' ':10,'MASSIV Y '); for i:=1 to n do begin Y[ i ]:=4*sin(2*i)+6*exp(i-5); write(Y[ i ]:4:2,' ':4); end; writeln; writeln; writeln(' ':10, 'MASSIV Z '); for i:=1 to m do begin Z[ i ]:=8*(i-4)+3*sqr(sin(1.5*i)); write(Z[ i ]:4:2,' ':2); end; writeln; writeln; writeln(' ':10, 'MASSIV W '); for i:=1 to 10 do begin buf:=cos (i-2.5); W[ i ]:=5*ln(0.1*i)+12*buf*buf*buf; write(W[ i ]:4:2,' ':2) end; writeln; writeln; MaxInArray(Y,n,maxY); MaxInArray(Z,m,maxZ); MaxInArray(W,l,maxW); Dobutok:=Dob(maxY,maxZ,maxW); writeln('maxY=',maxY:4:2,'; ','maxZ=',maxZ:4:2,'; ','maxW=',maxW:4:2,'; '); writeln('Dobutok=',Dobutok:4:2); readLn; END.
Программа выдала следующее:
MASSIV X -38.00 -22.00 -2.00 22.00 50.00 82.00 118.00 158.00 MASSIV Y 3.75 -2.73 -0.31 6.16 3.82 14.16 48.30 119.36 MASSIV Z -21.02 -15.94 -5.13 0.23 10.64 16.51 26.32 32.86 41.94 49.27 MASSIV W -11.51 0.06 2.09 -4.58 -9.64 -12.41 -1.90 3.16 maxY=-0.31; maxZ=-5.31; maxW=-1.90; Dobutok=-2.97
Думаю, это правильное решение. Напиши, все ли получилось потом. (Сообщение отредактировал KMA 15 нояб. 2007 16:06) (Сообщение отредактировал KMA 16 нояб. 2007 21:47)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 15 нояб. 2007 16:06 | IP
|
|
KMA
Долгожитель
|
Как сказал bekas.
Code Sample:
procedure inputArray; var i,j:integer; Begin write ('M='); readln (M); if M>10 then begin writeln ('M must be <=10'); N:=0; M:=0; exit; end; write ('?N='); readln (N); if N>10 then begin writeln ('N must be <=10'); N:=0; M:=10; exit; end; for i:=1 to M do for j:=1 to N do begin write ('?A[',i,',',',j]='); readln (A[i,j]); end; End;
Аналогично и для prinArray; Как сделаешь, пиши...
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 15 нояб. 2007 16:16 | IP
|
|
snakeq
Новичок
|
а как сделать удаление столбца ввод и вывод у меня работают
|
Всего сообщений: 6 | Присоединился: ноябрь 2007 | Отправлено: 15 нояб. 2007 16:37 | IP
|
|
KMA
Долгожитель
|
Смотря что ты понимаешь под удалением столбца. Обычно дают имеют ввиду затирание значений элементов 0. Можно сделать просто сдвиг, на другой столбик, а потом просто не выводить последние, т. е. такого типа: 1 0 6 0 6 0 6 6 2 3 5 a стало 3 5 хотя реально 3 5 5 3 6 0 6 0 6 0 0 Т. е. такого типа. Выбирай любой! Попробуй реализовать, что не получиться, помогу.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 15 нояб. 2007 19:39 | IP
|
|
snakeq
Новичок
|
Я делал по второму типу но возникает ошибка
Code Sample:
program z11111; const k=10; var a:array[1..10,1..10] of integer; m,n,i,j,p:integer; procedure InputArray; begin write('m=');readln(m); if m>10 then begin writeln('m must be <=10');readln; n:=0;m:=0; exit; end; write('n=');readln(n); if n>10 then begin writeln('n must be <=10');readln; n:=0;m:=0; exit; end; for i:=1 to m do for j:=1 to n do begin write('a[',i,',',j,']=');readln(a[i,j]); end; for i:=1 to m do begin for j:=1 to n do write(a[i,j]:3); writeln; end;readln; end; procedura ydalenia; var m,n,t,a:integer; i,j:byte; begin for i:=t to n-1 do for j:=1 to m do if a[i,j]<>0 then for i:=1 to m do a[n,i]:=0 end; begin InputArray; end.
|
Всего сообщений: 6 | Присоединился: ноябрь 2007 | Отправлено: 15 нояб. 2007 22:12 | IP
|
|
Zheka
Новичок
|
to KMA: Скопировал твою программу, странно, но у меня опять выдаёт ошибку, если l сделать равным 15, как в условии задачи. Причём пробовал компилировать как на Turbo так и на Borland Паскале, выдаёт одно и то же.
|
Всего сообщений: 19 | Присоединился: октябрь 2007 | Отправлено: 16 нояб. 2007 15:49 | IP
|
|
|