
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Помогите с задачей на паскале
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 33
|
Помогите с задачей на паскале
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) Сумму элементов массива с нечетными номерами. 2) Сумму элементов массива, расположенных между первым и последним отрицательным элементом. 3) Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями. Вот что наделал, с типами никак не разберусь и не получается сделать последний шаг, объясните как, это сделать. program Project2; uses SysUtils; type a=array of real; var z:a; i,n,otr1,otr2,p: integer; s1,s2: real; begin //определение размерности массива writeln('vvedite coli4estvo 4isel'); readln(n); setlength(z,n); //заполнение массива writeln('vvedite 4isla'); for i := 1 to n do readln(z[i]); s1 := 0; //Сумма элементов на нечетных местах for i := 1 to n do if i mod 2 <> 0 then s1 := s1 + z[i]; //Первый отрицательный элемент for i := 1 to n do if z[i] < 0 then begin otr1 := i; break; end; //Второй отрицательный элемент for i := n downto 1 do if z[i] < 0 then begin otr2 := i ; break; end; s2 := 0; //Сумма элементов между отрицательными элементами for i := otr1 + 1 to otr2 - 1 do s2 := s2 + z[i]; writeln; writeln('S1=',s1:0:2); writeln('S2=',s2:0:2); readln; for i:=0 to n-1 do if abs(z[i])<=1 then .................... end. |
|
|
|
|
#2 | |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
Код:
program Soft;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n=10;
var
arr:array[1..n] of double;
sum:double;
i, j, first, last:integer;
begin
randomize();
writeln('Source array');
//Заполняем массив
for I := 1 to n do
begin
arr[i]:=random(50)/( random(50)+1)-random(10);
write(arr[i]:8:2);
end;
//Получаем сумму элементов стоящих на нечётных позициях
j:=1; sum:=0;
while j<=n do
begin
sum:=sum+arr[j];
j:=j+2;
end;
writeln;
writeln('The sum of elements with odd positions = ',sum:8:2);
//ищем первый отрицательный элемент
first:=1;
while (first<=n) and (arr[first]>=0) do inc(first);
//ищем последний отрицательный элемент
last:=n;
while (last>0) and (arr[last]>=0) do dec(last);
writeln('First elem = ',first,' last element = ',last);
if last>first then
begin
i:=first+1;
sum:=0;
while i<last do
begin
sum:=sum+arr[i];
i:=i+1;
end;
writeln('Sum between first and last negative elements = ',sum:8:2);
end
else
writeln('Sum = 0');
//Собственно сжимаем массив
i:=1;
last:=n;
while i<=last do
begin
if abs(arr[i])<=1 then
begin
//Сдвигаем
for first := i to last-1 do
arr[first]:=arr[first+1];
arr[last]:=0.0;
dec(last)
end;
i:=i+1;
end;
writeln('Array after pack');
//Печатаем массив
for I := 1 to n do write(arr[i]:8:2);
readln;
end.
Последний раз редактировалось Hopkroft; 06.03.2012 в 17:50. |
|
|
|
|
|
#3 |
|
como estas?
Сообщений: 131
Регистрация: 23.06.2007
Возраст: 37
|
Если я не ошибаюсь, то в последнем шаге находишь элемент по модулю больше единицы, после него все элементы двигаешь на позицию вперед и последнему элементу присваиваешь ноль.
if abs(z[i])<=1 then begin for j:=i to n-1 do z[j]:=z[j+1]; z[n] := 0; end; Вроде так, соответственно это внутри ещё одного цикла. А с типами что? ЗЫ. У авторы выше получче код) |
|
|
|
|
#4 |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Brick, что тебе с типами не понятно?
В таких прогах(учебных) лучше делай заполнение по рандому или с "заготовками" - что-бы на ввод много времени не тратить. Ручной ввод нужен если что-то конкретное вводишь или когда отлаживаешь ![]() Ну и смекалку проявляй. Зачем тебе пробегаться по всему массиву в 1-ом задании если тебе всё равно только элементы с нечётными индексами нужны. |
|
|
|
|
#5 |
|
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 33
|
Преподаватель придирается, спасибо, завтра попробую переделать задачку, отпишусь. С типами разобрался, динамический массив немного с толку сбивал, так как я раньше о нем не знал, а преподаватель сказал делать через него.
|
|
|
|
|
#6 |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Там переделывать немного.
Выделил память. Заполнил по рандому или вручную. сделал так что-бы все обращения к массиву начинались с 0 а не с 1. под конец освободил память ![]() тебе работы на 10-15 минут. справишься! |
|
|
|
|
#7 |
|
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 33
|
Код:
program Project4nep;
type a=array of real;
var
z:a;
i,j,n,otr1,otr2,k: integer;
s1,s2: real;
begin
//определение размерности массива
writeln('vvedite coli4estvo 4isel');
readln(n); setlength(z,n);
//заполнение массива
writeln('vvedite 4isla');
for i := 0 to n-1 do
readln(z[i]);
s1 := 0;
//Сумма элементов на нечетных местах
for i := 0 to n-1 do
if i mod 2 = 0 then s1 := s1 + z[i];
//Первый отрицательный элемент
for i := 0 to n-1 do
if z[i] < 0 then
begin
otr1 := i; break;
end;
//Второй отрицательный элемент
for i := n-1 downto 0 do
if z[i] < 0 then
begin
otr2 := i ; break;
end;
s2 := 0;
//Сумма элементов между отрицательными элементами
for i := otr1 + 1 to otr2 - 1 do s2 := s2 + z[i];
writeln;
writeln('S1=',s1:0:2);
writeln('S2=',s2:0:2);
//Сжимаем массив
for i:=0 to n-1 do
if abs(z[i])<=1 then
begin
for j:=i to n-1 do
z[j]:=z[j+1];
z[n] := 0;
end;
for i := 0 to n - 1 do
write(' ',z[i]:2:1);
readln;
end.
Последний раз редактировалось Spectator; 09.03.2012 в 15:21. |
|
|
|
|
#9 | |
|
Форумец
Сообщений: 44,389
Регистрация: 27.05.2003
Возраст: 47
|
Что-то мне лень сегодня думать, но попробуй тут:
//Сжимаем массив for i:=0 to n-1 do сделать цикл до n и во вложенном цикле тоже с границами поэкспериментируй. Ошибка наверняка с этим связана. Цитата:
2 Brick: пользуйтесь тэгом CODE. Когда вставляете текст программы, обрамляйте его тэгами, которые написал silly. Нажмите кнопку "редактировать" на своем сообщении, которое я поправил, и посмотрите - как именно это делается. Последний раз редактировалось Spectator; 09.03.2012 в 15:37. |
|
|
|
|
|
#11 | |
|
Форумец
Сообщений: 44,389
Регистрация: 27.05.2003
Возраст: 47
|
Цитата:
И точно помню что границы можно указывать явно при объявлении. Лучше это сделать, чтобы было наверняка известно - в каких пределах индексы изменяются. |
|
|
|
|
|
#12 |
|
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36
|
В iso pascal, если я ничего не путаю, есть только статические массивы, в них действительно можно использовать произвольные числа (не только 0 и 1) для начального индекса и выход за пределы вроде как тоже проверяется. Здесь используются динамические массивы из дельфей, эквивалентные сишным.
|
|
|
|
|
#13 |
|
Форумец
Сообщений: 18
Регистрация: 13.07.2010
|
|
|
|
|
|
#14 | |
|
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36
|
Цитата:
|
|
|
|
|
|
#15 |
|
Форумец
Сообщений: 18
Регистрация: 13.07.2010
|
Последний раз редактировалось spirochaete; 09.03.2012 в 22:23. |
|
|
|
|
#16 | |
|
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36
|
Мне кажется, я четко написал, что в динамическом массиве нумерация идет с 0. Еще чуть выше об этом написал Hopkroft. В документации функции SetLength написано то же самое:
Цитата:
Последний раз редактировалось silly; 09.03.2012 в 22:58. |
|
|
|
|
|
#17 | |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Brick, я тебе выслал кусок отлаженного кода!
Теперь твоя задача была переделать её для работы с динамическим массивом. Зачем ты туда свой первоначальный код пихаешь? Я про этот ужасный кусок... Цитата:
Тебе не стыдно? P.S. переделай тот кусок который я тебе прислал. по крайней мере он работает
Последний раз редактировалось Hopkroft; 10.03.2012 в 20:25. |
|
|
|
|
|
#18 | |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
|
|
|
|