Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Помогите с задачей на паскале |
Философия, технологии, алгоритмы! |
|
Опции темы |
06.03.2012, 12:33 | #1 |
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31
Не в сети |
Помогите с задачей на паскале
В одномерном массиве, состоящем из 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. |
06.03.2012, 14:19 | #2 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Цитата:
Код:
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. |
|
06.03.2012, 14:28 | #3 |
como estas?
Сообщений: 133
Регистрация: 23.06.2007
Возраст: 35
Не в сети |
Если я не ошибаюсь, то в последнем шаге находишь элемент по модулю больше единицы, после него все элементы двигаешь на позицию вперед и последнему элементу присваиваешь ноль.
if abs(z[i])<=1 then begin for j:=i to n-1 do z[j]:=z[j+1]; z[n] := 0; end; Вроде так, соответственно это внутри ещё одного цикла. А с типами что? ЗЫ. У авторы выше получче код) |
06.03.2012, 14:40 | #4 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Brick, что тебе с типами не понятно?
В таких прогах(учебных) лучше делай заполнение по рандому или с "заготовками" - что-бы на ввод много времени не тратить. Ручной ввод нужен если что-то конкретное вводишь или когда отлаживаешь Ну и смекалку проявляй. Зачем тебе пробегаться по всему массиву в 1-ом задании если тебе всё равно только элементы с нечётными индексами нужны. |
06.03.2012, 21:47 | #5 |
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31
Не в сети |
Преподаватель придирается, спасибо, завтра попробую переделать задачку, отпишусь. С типами разобрался, динамический массив немного с толку сбивал, так как я раньше о нем не знал, а преподаватель сказал делать через него.
|
06.03.2012, 22:42 | #6 |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Там переделывать немного.
Выделил память. Заполнил по рандому или вручную. сделал так что-бы все обращения к массиву начинались с 0 а не с 1. под конец освободил память тебе работы на 10-15 минут. справишься! |
09.03.2012, 14:46 | #7 |
Форумец
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31
Не в сети |
Код:
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. |
09.03.2012, 15:19 | #9 | |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Что-то мне лень сегодня думать, но попробуй тут:
//Сжимаем массив for i:=0 to n-1 do сделать цикл до n и во вложенном цикле тоже с границами поэкспериментируй. Ошибка наверняка с этим связана. Цитата:
2 Brick: пользуйтесь тэгом CODE. Когда вставляете текст программы, обрамляйте его тэгами, которые написал silly. Нажмите кнопку "редактировать" на своем сообщении, которое я поправил, и посмотрите - как именно это делается. Последний раз редактировалось Spectator; 09.03.2012 в 15:37. |
|
09.03.2012, 15:47 | #11 | |
Форумец
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
И точно помню что границы можно указывать явно при объявлении. Лучше это сделать, чтобы было наверняка известно - в каких пределах индексы изменяются. |
|
09.03.2012, 16:20 | #12 |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
В iso pascal, если я ничего не путаю, есть только статические массивы, в них действительно можно использовать произвольные числа (не только 0 и 1) для начального индекса и выход за пределы вроде как тоже проверяется. Здесь используются динамические массивы из дельфей, эквивалентные сишным.
|
09.03.2012, 18:40 | #13 |
Форумец
Сообщений: 18
Регистрация: 13.07.2010
Не в сети |
|
09.03.2012, 18:52 | #14 | |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
Цитата:
|
|
09.03.2012, 20:19 | #15 |
Форумец
Сообщений: 18
Регистрация: 13.07.2010
Не в сети |
Последний раз редактировалось spirochaete; 09.03.2012 в 22:23. |
09.03.2012, 20:48 | #16 | |
highly mean
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35
Не в сети |
Мне кажется, я четко написал, что в динамическом массиве нумерация идет с 0. Еще чуть выше об этом написал Hopkroft. В документации функции SetLength написано то же самое:
Цитата:
Последний раз редактировалось silly; 09.03.2012 в 22:58. |
|
09.03.2012, 23:36 | #17 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Brick, я тебе выслал кусок отлаженного кода!
Теперь твоя задача была переделать её для работы с динамическим массивом. Зачем ты туда свой первоначальный код пихаешь? Я про этот ужасный кусок... Цитата:
Тебе не стыдно? P.S. переделай тот кусок который я тебе прислал. по крайней мере он работает Последний раз редактировалось Hopkroft; 10.03.2012 в 20:25. |
|
09.03.2012, 23:37 | #18 | |
Registered User
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56
Не в сети |
Цитата:
|
|