Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2013, 11:22   #1
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию Поправить код

Здравствуйте, мне нужно в этом коде сделать универсальной для любого количества элементов функцию CALCULATE.
Код:
uses crt;
const N=6;
type Tmas=array [1..N] of real;
var i:integer;
    SUM,A,znach:real;
    mas:Tmas;

Function CALCULATE (mas:Tmas):real;
 var summod:real;
  begin
   summod:=abs(mas[1])+abs(mas[2])+abs(mas[3])+abs(mas[4])+abs(mas[5])+abs(mas[6]);
   CALCULATE:=summod;
  end;

Procedure VIVOD (mas:Tmas);
 begin
  for i:=1 to N do
   if (mas[i]*mas[i])>=A then
    write (mas[i], ', ');
 end;

Begin
  writeln ('Vvedite massiv iz 6 elementov');
 for i:=1 to N do
  read (mas[i]);
  write ('Vvedite A= '); readln (A);
  SUM:=CALCULATE(mas);
  writeln ('Summa moduley elementov= ', SUM);
  write ('Elementi, udovletvoryauwie usloviyu');
   VIVOD(mas);
END.
А ещё, если такое возможно на паскале, при выводе элементов, удовлетворяющих условию, чтобы в конце была точка, ну или небыло запятой. Спасибо.
orandzheviyman вне форума Ответить с цитированием
Старый 15.11.2013, 11:45   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

В функции calculate
Код:
summod:=0;
For i:=1 to n do
  summod:=summod+abs(mad[i]);
В процедуре vyvod
Код:
Writeln(mas[i]:8:2);
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 15.11.2013, 11:49   #3
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от ZX Spectrum-128 Посмотреть сообщение
В функции calculate
Код:
summod:=0;
For i:=1 to n do
  summod:=summod+abs(mad[i]);
В процедуре vyvod
Код:
Writeln(mas[i]:8:2);
Спасибо) а как сделать так, чтобы операции проводились с любым по количеству элементов массивом?
orandzheviyman вне форума Ответить с цитированием
Старый 15.11.2013, 11:54   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

Open arrays (открытые/динамические массивы) изучали?
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 15.11.2013, 11:58   #5
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

У меня в коде опечатка - не mad, a mas
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 15.11.2013, 12:03   #6
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от ZX Spectrum-128 Посмотреть сообщение
Open arrays (открытые/динамические массивы) изучали?
Нет, сделал вот так
Код:
uses crt;
type Tmas=array [1..10000] of real;
var i,N:integer;
    SUM,A:real;
    mas:Tmas;

Function CALCULATE (mas:Tmas):real;
 var summod,modEl:real;
  begin
  summod:=0;
  for i:=1 to N do begin
  modEl:=abs(mas[i]);
  summod:=summod+modEl;
  end;
  CALCULATE:=summod;
  end;

Procedure VIVOD (mas:Tmas);
 begin
  for i:=1 to N do
   if (mas[i]*mas[i])>=A then
    write (mas[i], ', ');
 end;

Begin
  write ('Введите количество элементов массива', N); readln (N);
  writeln ('Введите массив');
 for i:=1 to N do
  read (mas[i]);
  write (Введите A= '); readln (A);
  SUM:=CALCULATE(mas);
  writeln ('Сумма элементов массива= ', SUM);
  write ('Элементы, удовлетворяющие условие:');
   VIVOD(mas);
END.
Теперь другая проблема, при компилировании откуда-то появляется 0 при вводе размерности массива(
orandzheviyman вне форума Ответить с цитированием
Старый 15.11.2013, 12:23   #7
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

В строке, где вводится количество элементов массива, в процедуре write убрать ,n
Потому что вы выводите n, которому еще не присвоено значение. Компилятор ему присваивает значение 0
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 15.11.2013, 12:36   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

позволю себе пояснить (раъяснить) совет ZX Spectrum-128

вместо:
Цитата:
Код:
write ('Введите количество элементов массива', N); readln (N);
должно быть
Код:
write ('Введите количество элементов массива'); readln (N);
ну и ещё. Мне очень не нравится, когда в процедуре/функции часть необходимых данных передаётся через параметры, а часть - берётся глобально.
Уж или так, или так!! (намного лучше, конечно, передавать параметрами!)
Если Вы передаёте в функцию CALCULATE массив, то почему Вы не передаёте туда же РАЗМЕРНОСТЬ массива?!!

и вообще, рекомендую ВСЕГДА описавать переменные ПОСЛЕ всех функции и процедур, это позволит избежать подобных казусов!

например, если бы Вы написали так:
Код:
uses crt;
type Tmas=array [1..10000] of real;

Function CALCULATE (mas:Tmas):real;
 var summod,modEl:real;
  begin
  summod:=0;
  for i:=1 to N do begin
  modEl:=abs(mas[i]);
  summod:=summod+modEl;
  end;
  CALCULATE:=summod;
  end;

Procedure VIVOD (mas:Tmas);
 begin
  for i:=1 to N do
   if (mas[i]*mas[i])>=A then
    write (mas[i], ', ');
 end;

var i,N:integer;
    SUM,A:real;
    mas:Tmas;

Begin
............
то сразу бы получили ошибки (о которых я и говорю)

сравните с кодом:
Код:
uses crt;
type Tmas=array [1..10000] of real;

Function CALCULATE (const mas:Tmas; const NMas : integer):real;
 var summod:real;
   i: integer;
  begin
    summod:=0;
    for i:=1 to NMas do
       summod:=summod+abs(mas[i]);
    CALCULATE:=summod;
  end;

Procedure VIVOD (const mas:Tmas; const NMas : integer; const AValue : real );
 var i: integer;
 begin
  write ('Элементы, удовлетворяющие условию:');
  for i:=1 to NMas do
   if (mas[i]*mas[i])>=AValue then
    write (mas[i], ', ');
 end;

var i,N:integer;
    SUM,A:real;
    mas:Tmas;

Begin
  write ('Введите количество элементов массива'); 
  readln (N);
  writeln ('Введите массив');
  for i:=1 to N do
     read (mas[i]);
  Readln;

  writeln ('Сумма элементов массива= ', CALCULATE(mas, n));

  write ('Введите A= '); readln (A);
  VIVOD(mas, N, A);

  Readln;
END.
p.s. я позволил себе ещё некоторые поправки, например, добавил префикс const и выкинул лишнюю переменную из функции CALCULATE...

p.p.s. 10000 элементов это явно много. Зачем Вам столько?! Даже если Вы будете вносить одно число в секунду, у Вас для ввода 10000 чисел уйдёт почти три часа времени! Вы думаете, это реально?!

Последний раз редактировалось Serge_Bliznykov; 15.11.2013 в 12:50.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2013, 12:38   #9
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,602
По умолчанию

Спасибо уважаемому модератору за пояснение. Дело не в лени моей. Я выхожу с телефона, копировать текст и править его весьма затруднительно.
Прошу прощения.
С уважением.
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поправить код? elf80 Microsoft Office Excel 27 07.05.2013 10:06
Нужно поправить код SenFeron Помощь студентам 2 04.01.2011 19:54
поправить код! Cruelbob Общие вопросы C/C++ 6 12.05.2010 23:33
Поправить Код... Lucchese Общие вопросы C/C++ 1 25.01.2010 20:00
Помогите поправить код SANTA_KLAUD Общие вопросы Delphi 5 30.05.2008 09:01