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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2016, 14:35   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
скажите, а я могу два раза писать раздел описания констант. типов, var ?
можно писать столько раз, сколько Вам нужно - хоть десять.

и ещё. если сомневаетесь - попробуйте. Если нельзя - компилятор Вам выдаст ошибку и даже напишет, что именно ему не понравилось!

Код:
что значит "заполнила?" о-это у меня переменная массива, который я отправляю в функции, там уже эта переменная заменяется местными переменными и они там обрабатываются
хорошо. допустим.
а что вот это?
Цитата:
Код:
for i:=1 to 10 do
   begin
   a[i]:=random(19);   
   write(a[i],'     ');
   end;
Вы какой массив заполняете?!

и ещё вопрос, Вы описали четыре массива:
Цитата:
Код:
var
o,a,b,g:massiv;
распишите, для чего они нужны.
ну, например,
массив O - основной, в нём мы ищем минимальное значение,
в нём мы ищем сумму элементов массива, расположенных между первым и последним положительными элементами и его мы преобразуем так, чтобы нулевые значения стояли в начале массива.

то же самое расскажите про массивы a,b,g.

и поймите, что "говорящие" имена переменных - это помощью и подсказка для программиста.
Компилятору всё равно, как у вас называются переменные, функции, процедуры и т.д.
Лишь идентификаторы были по правилам (начинались с буквы или подчёркивания и содержали только буквы, цифры и знак подчёркивания). Для комплятора можете называть переменные
Код:
type mmm=array[1..10] of word;
var s,ss,sss,ssss,sssssss,b,bb,aaaassssxxxxxssssdddff : word;
procedure aaa;
procedure aaaa;
function aaaaa:word;
function aaaaaa:mmm;
и т.д.
но для человека так делать НЕЛЬЗЯ!!

Давайте нормальные "смысловые" имена идентификаторам! Не когда-нибудь потом, завтра, а вот прямо сейчас. Вам же будет проще.

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

и получается каждый раз описание переменных в разделе(констант, вара,типа) будет относиться для всех элементов(подпрограмм(но в которых будут свои переменные)) до следующего описания? или как?

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

и получается каждый раз описание переменных в разделе(констант, вара,типа) будет относиться для всех элементов(подпрограмм(но в которых будут свои переменные)) до следующего описания? или как?

Код:
program Project1;
type
massiv=array[1..10] of word;

function minimaln (a:massiv):word;//минимальный элмнт z
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;
minimaln:=z; 
end;

function summa(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;
summa:=v; 
end;   
   
function Nulev_Mas(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;
//Nulev_Mas:=x; ОШИБКА: массивы.pas(63) : Нельзя преобразовать тип byte к array [1..10] of word//
end;

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 
   begin 
  for i:=1 to 10 do
   begin
   //a:=a[i];//выдает ошибку:Нет индексного свойства по умолчанию для типа word,пусть у сеня пользователь сам заполняет массив.Как правильно мне записать эту строчку?
   //write(a[i],'     ');
   end;
  t:=true;
   end;
end;
end;

 Procedure Vivod(var v,z:word; b:massiv); 
 var
 i:integer;
  begin
  writeln('минимальный элемент массива');
  write(v);
  writeln;
  writeln('сумма эллементов между первым и последним положительным эллементом в массиве');
    write(z);
    writeln;
  writeln('массив с нулями вначале:');
   for i:=1 to 10 do
    write(b[i]);
    writeln;
  end;  
  
var
o,g,b :massiv;
//о- основной массив
//b- массивы нужены для того чтобы в подпрогр вывода отправить 
//g- необходимо дать тип массив, т.к. она присваивается к функции у которой ответ массив и 
с,m,n,z,v:word; 
//с- отправляю в процедуру ввода, там он меняется на внутреннюю переменную а
//m,n- нужны для ссылки функций
//z,v- переменные(ответы функций), которые я отправляю в подпрграмму вывода 


begin
Vvod(с);
 m:=minimaln(o);// передаю массив о, в нем найдется z, функц присваивается к ответу, и переменной m дается ссылка на эту функцию
 n:=summa(o);// аналогично
 g:=Nulev_Mas(o);//передаю массив о (аналогично), он там преобразовывается в другой массив, но у меня трудности возникают с оформлением ответа
Vivod(z,v,b);
end.
Аксёнова Таня вне форума Ответить с цитированием
Старый 09.02.2016, 19:33   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Все функции описанные выше var o,g,b их просто не видят. Функции и код ниже видят
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.02.2016, 19:41   #15
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

почему?
Аксёнова Таня вне форума Ответить с цитированием
Старый 09.02.2016, 19:43   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Хороший вопрос Такие соглашения языка и компилятор тоже их придерживается
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.02.2016, 21:45   #17
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

я понимаю, что есть в паскале авс свой синтаксис. Я внесла некоторые изменения в код.
Код:
program Project1;
const  q=10;
type
massiv=array[1..q] of word;

function minimaln (a:massiv):word;//минимальный элмнт z
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;
minimaln:=z; 
end;

function summa(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;
summa:=v; 
end;   
   
function Nulev_Mas(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;
//Nulev_Mas:=x; ОШИБКА: массивы.pas(63) : Нельзя преобразовать тип byte к array [1..10] of word//
end;

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 
   begin 
  for i:=1 to 10 do
   begin
   //a:=a[i];//выдает ошибку:Нет индексного свойства по умолчанию для типа word,пусть у сеня пользователь сам заполняет массив.Как правильно мне записать эту строчку?
  // write(a[i],'     '); если сделаю а типом массив. то переменная с таким типом не будет проверяться на символ
   end;
  t:=true;
   end;
end;
end;

 Procedure Vivod(var v,z:word; b:massiv); 
 var
 i:integer;
  begin
  writeln('минимальный элемент массива');
  write(v);
  writeln;
  writeln('сумма эллементов между первым и последним положительным эллементом в массиве');
    write(z);
    writeln;
  writeln('массив с нулями вначале:');
   begin
   for i:=1 to 10 do
    write(b[i]);
    writeln;
   end;  
  end;  
  
var
a,g,b :massiv;
//о- основной массив
//b- массивы нужены для того чтобы в подпрогр вывода отправить 
//g- необходимо дать тип массив, т.к. она присваивается к функции у которой ответ массив и 
с,m,n,z,v:word; 
//с- отправляю в процедуру ввода, там он меняется на внутреннюю переменную а
//m,n- нужны для ссылки функций
//z,v- переменные(ответы функций), которые я отправляю в подпрграмму вывода 


begin
Vvod(с);
 m:=minimaln(a);// передаю массив a, в нем найдется z, функц присваивается к ответу, и переменной m дается ссылка на эту функцию
 n:=summa(a);// аналогично
 g:=Nulev_Mas(a);//передаю массив a (аналогично), он там преобразовывается в другой массив, но у меня трудности возникают с оформлением ответа
Vivod(z,v,a);//(я не могу пока это поверить, т.к. не )
end.
подскажите,пожалуйста, как мне сделать так, что бы пользователь вводил число, оно проверялось на символ, и это число потом вводилось в массив(в этот момент у меня идет конфликт типов в подпрограмме т.к. в любом случае приходится приравнивать эти два элемента)

и у меня не получается функцию (где я вначало переставляю нули) приравнять к результату-массиву.

помогите пожалуйста

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

Таня, Вы молодец, упорная.
Но программирование, видимо, даётся Вам трудно.

давайте поступим так. я Вам предложу вариант кода.
Вы его рассмотрите и скажите, что в нём работает не так, как нужно Вам по заданию.
Если разберётесь, как это поправить - хорошо. Нет, тогда я подскажу.

Код:
program Project1;

const
  MaxQ = 10;

type
  massiv = array[1..MaxQ] of integer;


procedure PrintArray(a: massiv);
var
  i: integer;
begin
  for i := 1 to MaxQ do Write(a[i]:2, ' ');
  WriteLn;
end;

function FillArrayRandomValue: massiv;
var
  i:byte;
  ResultA: massiv;
begin
  for i := 1 to MaxQ do ResultA[i] := Random(11)-5; // cлучайные числа от -5 до 5
  FillArrayRandomValue := ResultA
end;


function minimaln(a: massiv): integer;//вернуть минимальный элемент массива
var
  i: byte;
  min: integer;
begin
  min := a[1];
  for i := 2 to MaxQ do
    if (a[i] < min)
      then min := a[i];
  
  minimaln := min;
end;

function summa(a: massiv): integer;//сумма элнт массива между первым и последним положит.элементами
var
  sumresult: integer;
  i, iFirstPoz, iLastPoz: byte;
begin
  
  // сначала найдём индексы первого и последного положит.элемента
  iFirstPoz := 0;
  for i := 1 to MaxQ do
    if (a[i] > 0) then
    begin
      if (iFirstPoz = 0) then iFirstPoz := i; {если это первый положительный, запомним индекс}
      iLastPoz := i; {и в любом случае запомним номер,как индекс последнего положительного}
    end;
  
  sumresult := 0;
  for i := iFirstPoz + 1 to iLastPoz - 1 Do
    sumresult := sumresult + a[i];
  summa := sumresult;  
end;


function Nulev_Mas(a: massiv): massiv;//преобразованный массив с нулями
var
  k, i, x, j: byte;
  b: massiv;
begin
  for i := 1 to MaxQ do b[i] := a[i]; // скопируем все элементы массива в новый массив
  
  k := 0;
  for i := 1 to MaxQ do
    if b[i] = 0
    then
    begin
      inc(k);
      x := b[i];
      for j := i downto k + 1 do
        b[j] := b[j - 1];
      b[k] := x;
    end;
  Nulev_Mas := b; 
end;

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

procedure Vivod(c : word; pminEl, psumB: integer; newMas: massiv);
begin
  if c = 1 then 
    writeln('минимальный элемент массива = ', pminEl)
  else
  if c = 2 then 
    writeln('сумма элементов между первым и последним положительным эллементом в массиве = ', psumB)
  else
  if c = 3 then begin
    Write('Содержимое отсортированного массива :');
    PrintArray(newMas);
  end
  else if c=4 then WriteLn('Вы выбрали выход из программы. Спасибо, надеюсь на встречу. Bye!')
end;

var
  a, b: massiv;
     //a - основной массив
     //b - отсортированный массив (с нулевыми впереди)
  c: word;  //с выбор действия- отправляю в процедуру ввода
  minEl,   // для минимального элемента
  sumB     // для суммы между первым и последним положительными
    : integer; 


begin
  Randomize;
  a := FillArrayRandomValue;
  Write('Содержимое массива A: ');
  PrintArray(a);
  
  repeat
    Vvod(c);
    if c=1 then 
      minEl := minimaln(a);// передаю массив a, в нем найдется z, функц присваивается к ответу, и переменной m дается ссылка на эту функцию
    if c=2 then  
      sumB := summa(a);// аналогично
    if c=3 then  
       b := Nulev_Mas(a);//передаю массив a (аналогично), он там преобразовывается в другой массив
    Vivod(c, minEl, sumB, b);
 until c=4; // повторять,пока не выберут выход
 Readln
end.
p.s. а ещё, нужно отличать Pascal ABC от PascalABC.NET, судя по всему, у Вас как раз второй. Это два абсолютно разных компилятора (да и реализуемые ими диалекты Паскаля весьма и весьма отличаются).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.02.2016, 18:12   #19
Аксёнова Таня
Пользователь
 
Регистрация: 07.02.2016
Сообщений: 11
По умолчанию

Благодарю за помощь!) я разобралась в Вашей программе!
Аксёнова Таня вне форума Ответить с цитированием
Старый 10.02.2016, 18:37   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Всегда пожалуйста. Надеюсь, что наши уроки помогут Вам изучить Паскаль.
Успехов!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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