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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2016, 16:21   #1
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию Паскаль АВС. массивы, проблема с типом

Здравствуйте! Помогите пожалуйста, написала программу, но мне выдает ошибку ( Нельзя преобразовать тип word к array [1..10] of word). Не понимаю что нужно изменить

вот код:

Код:
program Project1;
type
massiv=array[1..10] of word;
var
a,m,n,g,z:word;


Procedure Vvod(var a:word);
 var
 code:integer;
 S:string;
 t:boolean;
begin
  writeln( '1. Найти минимальный элемент массива.');
  writeln( '2. Найти сумму элементов массива, расположенных между первым и последним положительными элементами' );
  writeln( '3. Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом — все остальные.');
t:=false;
while (t=false) do
begin
  writeln('a= ');
  readln(S);
  val(S,a,code);
  if (code<>0) then
      writeln('oshibka')
  else 
t:=true;

  end;
end;

function S (a:massiv):word;
var
 i:integer;
 min,z:word;
begin
min:=a[1];
 for i:=2 to 10 do
  begin
   if (a[i]< min)
    then 
    min:=a[i];
  end;
min:=z;
S:=z; 
end;

function s1(a:massiv):word;
var
i,k,h,v:byte;
begin
for i:=1 to 10 do
 if (a[i]>0)
  then 
  begin
  h:=a[i];
  break;
  end;
For i:=10 Downto 1 Do 
 if (a[i]<>-1)
  then
  begin
  k:=a[i];
  break;
  end;
begin  
v:=0;
for i:=h+1 to k-1 do
v:=v+a[i]; 
end;
s1:=v; 
end;   
   
function s2(a:massiv):massiv; 
var
k,i,x,j:byte;
b:massiv;
begin   
k:=0;
for i:=1 to 10 do
    if a[i]=0
    then
    begin
         inc(k);
         x:=a[i];
         for j:=i downto k+1 do
         a[j]:=a[j-1];
         a[k]:=x;       
    end;
end;

 Procedure Vivod(var z:word; a,b:massiv); 
 var
 i:integer;
  begin
  writeln('минимальный элемент массива');
  write(z);
  writeln;
  writeln('сумма эллементов между первым и последним положительным эллементом в массиве');
   for i:=1 to 10 do
    write(a[i]);
    writeln;
  writeln('массив с нулями вначале:');
   for i:=1 to 10 do
    write(b[i]);
    writeln;
  end;  
    
   begin
   Vvod(a);
   m:=S(a);
   n:=s1(a);
   g:=s2(b);
   Vvod(z,a,b);
   end.

Последний раз редактировалось Аватар; 07.02.2016 в 16:28.
Аксёнова Таня вне форума Ответить с цитированием
Старый 07.02.2016, 16:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Vvod(z,a,b);
Не тут ли? И не хорошо, word и byte вперемешку. Да еще и сравнение с -1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.02.2016 в 16:37.
Аватар вне форума Ответить с цитированием
Старый 07.02.2016, 16:39   #3
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

нет, ошибку выдает в основной прогр, где я функцию приравниваю к "m". На счет:Vvod(z,a,b)-я исправила на правильное имя процедуры, но прогр не работает
Аксёнова Таня вне форума Ответить с цитированием
Старый 07.02.2016, 18:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Аксёнова Таня, у Вас смешались в одну кучу разные переменные.
вот глобальная переменная a:word - она для чего?
ввод типа задачи, судя по:
Код:
Vvod(a);
хорошо.

следующей строчкой идёт
Код:
m:=S(a);
а что мы должны передавать в процедуру S?
массив:
Цитата:
function S (a:massiv):word;
а что Вы туда передаёте вместо массива? Переменную типа word.
так нельзя.

ну и ещё, не вижу, а где собственно ввод массива? (где массив заполняется значениями?)

ну и совет - не экономьте на буквах - вместо функции S напишите MinMassiv
вместо S1 - SumMegduPologitel
и т.д.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2016, 20:27   #5
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

как мне в функцию в основной прогр отправить массив
если я записываю так: m:=S(massiv); , то у меня в самой функции идет сбой, массиву ведь нужно придать тип, допустим тип word, но тогда мне выдают ошибку,что для а -Нет индексного свойства по умолчанию, так как оно типа word (который я присвоила этой переменной в самом начале)


каким типом лучше мне обозначить "a" ?
Аксёнова Таня вне форума Ответить с цитированием
Старый 07.02.2016, 23:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если я правильно понял ваш вопрос, то
Код:
type
massiv=array[1..10] of word;
......

var
  Otvet,m,n,g,z:word;
  MyMas : massiv;
begin
   Vvod(Otvet);
   m:=S(MyMas);
   n:=s1(MyMas);
   g:=s2(MyMas);
но очень сильно рекомендую Вам:
1) сначала набросать блок-схему алгоритма (что в какой процедуре должно делаться, что где вводиться, что где заполняться
2) разобраться, чем формальные параметрые отличаются от фактических (чтобы понять что a в процедуре это совсем не то же самое, что a - в главной программе.
3) исправить код согласно моим замечаниям выше (и согласно вашей блок-схеме) - это дать переменным и процедурам/функция корректные имена, выкинуть a, например, не забыть заполнить массив значениями (она сами по себе в массиве не заведуются, их туда надо поместить) и т.д.

по поводу логике. в процедуре Vvod Вы заставляете вводить число a, типа меню выбора.
А зачем? Где Вы потом это значение используете? Вы же всё равно вычисляете все параметры массива, вне зависимости от того, что выбрал пользователь!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.02.2016, 23:43   #7
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

...

Цитата:
Сообщение от Аксёнова Таня Посмотреть сообщение
я исправила ошибки. Вроде все верно. но выдает вот что: "Ошибка времени выполнения: Индекс находился вне границ массива." - это на вот этой строке - v:=v+a[i]; -

( пусть у меня в подпрограмме ввода вводится число (пусть оно проверяется на символ) и пусть в дальнейшем оно нигде не используется, пусть. И пусть у меня функции будут с такими именами, это играет не большую роль, в дальнейшем буду давать корректные имена)
вот мой обновленный код:
Код:
program Project1;
type
massiv=array[1..10] of word;
var
o,a,b,g:massiv;
i:integer;
c,m,n,r,p:word;


Procedure Vvod(var a:word);
 var
 code:integer;
 S:string;
 t:boolean;
 i:byte;
begin
  writeln( '1. Найти минимальный элемент массива.');
  writeln( '2. Найти сумму элементов массива, расположенных между первым и последним положительными элементами' );
  writeln( '3. Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом — все остальные.');
t:=false;
while (t=false) do
begin
  writeln('a= ');
  readln(S);
  val(S,a,code);
  if (code<>0) then
      writeln('oshibka')
  else 
t:=true;

end;
end;

function S (a:massiv):word;
var
 i:integer;
 min,z:word;
begin
min:=a[1];
 for i:=2 to 10 do
  begin
   if (a[i]< min)
    then 
    min:=a[i];
  end;
min:=z;
S:=z; 
end;

function s1(a:massiv):word;
var
i,k,h,v:byte;
begin
for i:=1 to 10 do
 if (a[i]>0)
  then 
  begin
  h:=a[i];
  break;
  end;
For i:=10 Downto 1 Do 
 if (a[i]<>-1)
  then
  begin
  k:=a[i];
  break;
  end;
begin  
v:=0;
for i:=h+1 to k-1 do
v:=v+a[i]; 
end;
s1:=v; 
end;   
   
function s2(a:massiv):massiv; 
var
k,i,x,j:byte;
b:massiv;
begin   
k:=0;
for i:=1 to 10 do
    if a[i]=0
    then
    begin
         inc(k);
         x:=a[i];
         for j:=i downto k+1 do
         a[j]:=a[j-1];
         a[k]:=x;       
    end;
end;

 Procedure Vivod(var p,r:word; b:massiv); 
 var
 i:integer;
  begin
  writeln('минимальный элемент массива');
  write(p);
  writeln;
  writeln('сумма эллементов между первым и последним положительным эллементом в массиве');
   for i:=1 to 10 do
    write(a[i]);
    writeln;
  writeln('массив с нулями вначале:');
   for i:=1 to 10 do
    write(b[i]);
    writeln;
  end;  
    
begin
Vvod(c);
 begin 
  randomize ; 
  for i:=1 to 10 do
   begin
   a[i]:=random(19);   
   write(a[i],'     ');
   end;
 end;  
 m:=S(o);
 n:=s1(o);
 g:=s2(o);
Vivod(p,r,b);
end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 09.02.2016 в 07:42.
Аксёнова Таня вне форума Ответить с цитированием
Старый 09.02.2016, 07:57   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

уже лучше. Хотя ошибки, на мой взгляд, связаны с тем, что Вы сами путаете свои же переменные!

Вы объявили 4(ЧЕТЫРЕ) разных массива (четыре переменные типа массив):
Цитата:
Код:
var
o,a,b,g:massiv;
Можете объяснить, зачем Вам столько?!! Вы же вроде бы один массив заполнять и обрабатывать должны?

Дальше. Поймите, что брать (обращаться к переменной) можно только после того, как что-то туда положил (иницилизировал значение переменной).
Вы заполняете массив a случайными значениями. Допустим (хотя сразу минус - почему это не вынесено в отдельную процедуру?! Чем этот код заслужил такой чести, что вынесен в главный блок?!!). Но заполняете массив A, а потом ищете минимальный, сумму и прочее в каком массиве?
Цитата:
Код:
 m:=S(o);
 n:=s1(o);
 g:=s2(o)
Почему то это всё вы ищите в массиве o!
Это неверно! Где заполнили, там и нужно искать.
Да и одного массива достаточно в данной задаче, четыре не нужны.

ещё Вы не понимаете, что означает запись
Цитата:
Код:
function s2(a:massiv):massiv;
что должна вернуть функция s2 и где в коде Вы прописываете ВОЗВРАЩАЕМОЕ значение?

ну и ещё совет.
Новички часто внутри процедур и функции СЛУЧАЙНО используют глобальные переменные (так, как это Вы сделали)!

чтобы увидеть эти ошибки, рекомендую Вам такую структуру программы (не только данной, а вообще, всех ваших программ)
Код:
program Project1;

// описание типов и констант
const MasN = 10;
type
   massiv=array[1..MasN] of word;

// потом все процедуру и функции

Procedure Vvod(var a:word);
....

Procedure Vivod(var p,r:word; b:massiv); 
....

// вот только потом блок с описанием переменных,
// которые будут использованы в главном блоке (это и есть ФАКТИЧЕСКИЕ переменные
var
  o:massiv;
  c,m,n,g:word;

// теперь основной блок программы (программа)
begin
   
   // Тут код программы

end.
поверьте мне, ошибки компилятора сразу укажут Вам, где Вы ошибаетесь.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.02.2016, 12:53   #9
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

скажите, а я могу два раза писать раздел описания констант. типов, var ? первый раз для подпрограмм,а второй раз для переменных, которые используются в основной прогр.
обязательно использовать константу? можно работать без нее?

Последний раз редактировалось Аксёнова Таня; 09.02.2016 в 13:23.
Аксёнова Таня вне форума Ответить с цитированием
Старый 09.02.2016, 13:34   #10
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

"Почему то это всё вы ищите в массиве o!
Это неверно! Где заполнили, там и нужно искать.
Да и одного массива достаточно в данной задаче, четыре не нужны."

что значит "заполнила?" о-это у меня переменная массива, который я отправляю в функции, там уже эта переменная заменяется местными переменными и они там обрабатываются.
Аксёнова Таня вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
паскаль авс LiliyaD Помощь студентам 1 07.06.2014 21:10
2 программки (массивы) на паскале АВС Кутяшка Фриланс 7 29.05.2014 12:04
Двумерные массивы. Написать программу на языке Паскаль АВС. Helen1 Помощь студентам 9 13.12.2012 12:25
Как можно в Паскаль АВС (Паскаль-Турбо) вставлять в результаты печати программы графики, таблицы, схемы, набранные формулы, выраже IZOPGRAM Паскаль, Turbo Pascal, PascalABC.NET 0 11.06.2012 10:54
из С++ в Паскаль АВС Aidar9119 Паскаль, Turbo Pascal, PascalABC.NET 1 04.01.2011 22:30