Другие языки программирования и технологии

Нужно подправить программу в Pascal на одномерные массивы.

Задание: Дан одномерный массив, который содержит не более 40 вещественных чисел. Составить новый массив, элементами которого будут отрицательные числа старого массива. Program zadacha; type massiv=Array [1..40] of real; procedure vvod(var n: integer; var a: massiv); var i: integer; begin for i:=1 to n do a:=(0,5-Random)*100; end; procedure work(a: massiv; n: integer; var new_mas: massiv; k:integer); var i:integer; begin k:=1; for i:=1 to n do if(a<0) then begin new_mas[k]:=a; k:=k+1; end; k:=k-1; end; procedure vivod(n: integer; a: massiv); var i: integer; begin for i:=1 to n do write(a:10:1); writeln(' '); end; var new_mas, a: massiv; n: integer; Begin writeln('Ввести размер массива'); readln(n); vvod(n,a); writeln('Исходный массив:'); vivod(n,a); work(a,n,new_mas,k); writeln('Новый массив:'); vivod(k,new_mas); end. процедуры vvod и vivod вроде бы написаны правильно, нужно подправить наверно процедуру work
Напишу полностью задачу:
program MyProg;
type MyArray = array[1..40] of real;

function SetArray():MyArray
var i:integer;
returnedArray:MyArray;
begin
for i:=1 to 40 do
returnedArray:=(0.5-random())*100;
SetArray = returnedArray;
end;

procedure PrintArray(anyArray : MyArray)
var i:integer;
begin
for i:=1 to 40 do
writeln("anyArray[",i,"]=", anyArray);
end;

function Work(curArray : MyArray)
var i,k:integer;
returnedArray:MyArray;
begin
k=1;
for i:=1 to 40 do begin
if(curArray<0) then begin
returnedArray[k]:=curArray;
k:=k+1;
end;
end;
Work := returnedArray;
end;
{===ВСЁ===}
Только в данном случае грамотнее и рациональнее возвращать из функции Work не массив фиксированный длинны, а динамический список (если, конечно, Вам объясняли что это такое)
Петр Чусовитин
Петр Чусовитин
886
Лучший ответ
Рамазон Шокиров 1. В условии "содержит не более 40 вещественных чисел", т.е. может быть и меньше. Вы же "железно" делаете их сорок.

2. Для чего вам в теле функции Work переменная k, если она там же и хоронится? И сколько элементов вы возвратите из функции Work? (см. третий пункт в моем ответе).

3. К сожалению, чел не указал в какой среде пишется прога, но если это турбо паскаль, то за подобный тип функций получите Error 34: Invalid function result type.
Андрей Сорокин нет, ещё не объясняли про список, но надеюсь, всё ещё ждёт нас впереди :)
спасибо :)
Что, настолько все запущено, что содранную программу не можем заставить работать?

1. В процедуре ввода замените запятую на точку.

2. Ваша процедура work не возвращает число элементов в результирующем массиве. Надо добавить служебное слово var перед формальным параметром k.

3. В самой процедуре изначально k лучше инициализировать нулем, а при отрицательном элементе исходного массива сначала инкрементировать значение индекса, а затем присваивать значение элементу. При таком подходе отпадает надобность в строчке k:=k-1;

4. Процедуру vivod можно изменить.

procedure vivod(Title: String; n: integer; a: massiv);
var i: integer;
begin
WriteLn(Title);
for i:=1 to n do write(a[ i ]:10:1);
writeln;
end;

Тогда основная программа будет выглядеть так

vvod(n,a);
vivod('Исходный массив: ', n, a);
work(a,n,new_mas,k);
vivod('Новый массив: ', k, new_mas);

5. У вас нет обращения к процедуре инициализации генератора случайных чисел. Как результат - при каждом запуске генерируется одинаковая последовательность.

6. И последнее. Перед последним end. добавьте ReadLn;, чтобы программа не завершилась и можно было бы увидеть результат (ужасно не люблю всякие там Alt+F5).
Андрей Сорокин 1. я сам писал эту программу
2. в упор не вижу в процедуре ввода запятую
3. дописал программу самостоятельно, чуточку поработав серым веществом. способ намного легче и понятнее для только начавшего изучать программирование и без изменения каких либо других процедур, кроме work
за остальное спасибо :)