Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Помощ за задачи на Pascal (merged)

Featured Replies

Имам тука да се състави една програмка на Паскал и в условието се иска да се напише функция за присвояване на стойности от един масив в друг, като тези стойности трябва да са в предварително зададен интервал.

Е, не успях. ;)

Но обаче направих процедура за тази работа. :)

Проблема е, че това ми е курсова работа и трябва да се напише както го иска даскала. :wors:

Та молбата ми е който има желание и свободно време да помогне, щото след 10 дни мъдруване не успях да го наглася както се иска. :wors:

П.П.: Ето и процедурата, която съм написал, ако помогне с нещо:

Procedure Izbor (var K: Massiv;
                  var J: Integer);
         const A=-4.3;
               B=13.;
         var I,H: Integer;
             L: Massiv;
            begin
               H:=0;
                  for I:=1 to J do
                     if (A<=K[I]) and (B>=K[I]) then
                              begin
                                 H:=H+1;
                                 L[H]:=K[I];
                              end;
                  Writeln ('Broia elementi(NS) na masiwa S e ',H);
                     for I:=1 to H do
                        begin
                           Writeln ('S[',I,']=',L[I]:8:3);
                        end;
            end;
Мерси предарително на всеки който реши да помогне

Редактирано от peter2003 (преглед на промените)

  • Отговори 622
  • Прегледи 131,9k
  • Създадено
  • Последен отговор

Здравей

Разликите между функцията и процедурата са две

1) функцията се декларира с function, а не с procedure

2) функцията връща стойност и следователно има тип

Ако ми дадеш пълното условие на задачата ще ми е по-лесно да ти помогна, а иначе ако това, което си написал, ти трябва просто под формата на функция:

function Izbor (var K: Massiv;
                 var J: Integer):boolean;
        const A=-4.3;
              B=13.;
        var I,H: Integer;
            L: Massiv;
           begin
              H:=0;
                 for I:=1 to J do
                    if (A<=K[I]) and (B>=K[I]) then
                             begin
                                H:=H+1;
                                L[H]:=K[I];
                             end;
                 Writeln ('Broia elementi(NS) na masiwa S e ',H);
                    for I:=1 to H do
                       begin
                          Writeln ('S[',I,']=',L[I]:8:3);
                       end;
             Izbor:=true; //обикновено учениците ги учат да връщат стойност по този начин;)
           end;

Редактирано от DarkLight (преглед на промените)

  • Автор

Май нещо не съм уточнил както трябва, защото това дето си го поместил не сработва, пък и определено няма начин да сработи. Значи казвам пълното условие:

Да се състави програма на Паскал, в която:

а)Да се опише процедура за въвеждане на броя на елементите N и на стойностите на елементите на масив M от реални числа.

б)Да се опише процедура за извеждане на въведените N елемента на масива.

в)Да се опише функция за прехвърляне на елементи на масив от реални числа, чийто стойности лежат в зададен затворен интервал, в нов масив.

г)В главната програма да се опише масива S, съдържащ съответно NS на брой реални елементи (NS<=45) и като се използват съставените процедури да се въведат броя на елементите и стойностите на елементите на масива S, чийто стойности лежат в затворения интервал [-4.3,13]. Да се изведат Въведените стойности на масива и получените резултати.

Аз съм направил това:

Program Kursow_Proekt;
   const Len=45;
   type Massiv=array [1..Len] of Real;
   var M: Massiv;
       N: Integer;
      Procedure Vhod(var K: Massiv;
                     var J: Integer);
         var I: Integer;
            begin
               repeat
                  Write ('Wuwedi broia elementi N:');
                  Readln (J);
               until ((J>1) and (J<=Len));
                  for I:=1 to J do
                    begin
                       Write ('Wuwedi stoinost za M[',I,']=');
                       Readln (K[I]);
                    end;
           end;
      Procedure Pregled (var K: Massiv;
                         var J: Integer);
         var I: Integer;
            begin
               for I:=1 to J do
                  Writeln ('M[',I,']=',K[I]:8:3);
            end;
      Procedure Izbor (var K: Massiv;
                       var J: Integer);
         const A=-4.3;
               B=13.;
         var I,H: Integer;
             L: Massiv;
            begin
               H:=0;
                  for I:=1 to J do
                     if (A<=K[I]) and (B>=K[I]) then
                              begin
                                 H:=H+1;
                                 L[H]:=K[I];
                              end;
                  Writeln ('Broia elementi(NS) na masiwa S e ',H);
                     for I:=1 to H do
                        begin
                           Writeln ('S[',I,']=',L[I]:8:3);
                        end;
            end;
   begin
      Vhod(M,N);
      Pregled(M,N);
      Izbor (M,N);
      Readln;
   end.
Както се вижда а) и б) са като условиено, обаче не можах да измисля как да изпълня условие в), а го направих с процедура, която освен че върши същата работа, свежда главната програма до три реда, но това не ми помага, щото даскала иска да се напише както е по условие ;)

Доколкото разбрах трябва ти функция, която взима масив, мин и макс стойност и връща масив, съдържащ елементите между min и max

За по-лесно ще си дефинираме тип "масив от real":

type:
rArray = Array[1..100] of real;

След това пишем функция която приема подобен масив и две real стойности и връща масив:

function subArray(original: rArray; min, max: real):rArray
var returnArray: rArray;
i, current: integer;
begin
current := 1;
 for i:=1 to 100 do
   if (original[i]>=min) and (original[i]<=max) then begin
    returnArray[current] := original[i];
    inc(current,1);
  end;
subArray:=returnArray;
end;

Е нямам под ръка компилатор, но нещо такова трябва да се получи ;)

Успех!

  • Автор

Не се получава обаче :)

Дава ми грешка при типа на функцията. Имам подозрение, че тя не може да приема повече от една стойност, докато масива има няколко стйности (за всеки член от масива-стойност). Ето как съм я написал:

Function Izbor (K: Massiv;
                 J: Integer;
                 A,B: Real): Massiv;
         var L: Massiv;
             I,H: Integer;
            begin
               H:=0;
                  for I:=1 to J do
                     if (A<=K[I]) and (B>=K[I]) then
                        begin
                           H:=H+1;
                           L[H]:=K[I];
                        end;
               Izbor:=L;
            end;
Типа Massiv е дефиниран предварително (виж втория ми пост), добавил съм и променливите S и NS. Извиквам функцията с: S:=Izbor(S,NS);

Може би не я извиквам както трябва. Знам ли вече. направо откачам ;)

При мен кода:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
  type Massiv=array [1..45] of Real;

  { TODO -oUser -cConsole Main : Insert code here }

  Function Izbor (K: Massiv;
                J: Integer;
                A,B: Real): Massiv;
        var L: Massiv;
            I,H: Integer;
           begin
              H:=0;
                 for I:=1 to J do
                    if (A<=K[I]) and (B>=K[I]) then
                       begin
                          H:=H+1;
                          L[H]:=K[I];
                       end;
              Izbor:=L;
           end;
begin
end.

се компилира

За извикването: трябва да я извикаш с толкова параметъра, с колкото си я декларирал

С:=Izbor (K, J, A,B):

Съвет: давай смислени имена на проблемливите

  • Автор

При мен обаче не иска. Ето пак пълния текст:

Program Kursow_Proekt;
   const Len=45;
         A=-4.3;
         B=13.;
   type Massiv= array [1..Len] of Real;
   var M,S: Massiv;
       N,NS,I: Integer;
      Procedure Vhod(var K: Massiv;
                     var J: Integer);
         var I: Integer;
            begin
               repeat
                  Write ('Wuwedi broia elementi N:');
                  Readln (J);
               until ((J>1) and (J<=Len));
                  for I:=1 to J do
                    begin
                       Write ('Wuwedi stoinost za M[',I,']=');
                       Readln (K[I]);
                    end;
           end;
      Procedure Pregled (var K: Massiv;
                         var J: Integer);
         var I: Integer;
            begin
               for I:=1 to J do
                  Writeln ('M[',I,']=',K[I]:8:2);
            end;
      Function Izbor (K: Massiv;J: Integer;min,max: Real): Massiv;
        var I,H: Integer;
            L: Massiv;
           begin
              H:=0;
                 for I:=1 to J do
                    begin
                       if (min<=K[I]) and (max>=K[I]) then
                       H:=H+1;
                       L[H]:=K[I];
                    end;
              Pregled(L,H);
              Izbor:=L;
           end;
begin
   Vhod (M,N);
   Pregled (M,N);
   S:= Izbor(M,N,A,B);
   Readln;
end.
Дава ми: Error 34 : Invalid function result type

Ако намериш грешката ще е супер, ако не - здраве да е и мерси много за усилията.

П.П.: Свалих си друг Паскал и резултата е същия :)

Какъв компилатор ползваш?

Ако не поддържа custom типове на функциите, винаги можеш да върнеш масива през out параметър, а функцията да върне просто true:

Function Izbor (K: Massiv;J: Integer;min,max: Real; out ResultArr: Massiv): Boolean;
       var I,H: Integer;
           L: Massiv;
          begin
             H:=0;
                for I:=1 to J do
                   begin
                      if (min<=K[I]) and (max>=K[I]) then
                      H:=H+1;
                      L[H]:=K[I];
                   end;
             Pregled(L,H);
             ResultArr:=L;
             Izbor:=true;
          end;
  • Автор

Честно да ти кажа идея си нямам какъв е компилатора. Ползвам Borland Pascal 7.0. Демек нали си има някакъв собствен и не знам какво поддържа и какво не. Сега ще пробвам дали ще стане по този начин и ще пиша какво се е получило.

EDIT

Има ли промяна в извикването. Щото ми дава грешка за параметъра out?

Всъщност out изобщо не го разпознава като кодова дума.

Редактирано от peter2003 (преглед на промените)

Пробвай с указатели и динамични променливи - винаги има по-малко проблеми.

Честно да ти кажа идея си нямам какъв е компилатора. Ползвам Borland Pascal 7.0. Демек нали си има някакъв собствен и не знам какво поддържа и какво не. Сега ще пробвам дали  ще стане по този начин  и ще пиша какво се е получило.

EDIT

Има ли промяна в извикването. Щото ми дава грешка за параметъра out?

<{POST_SNAPBACK}>

Да, при извикване трябва да подадеш променлива (самата променлива) от същия тип, от който е out... и функцията променя нейната стойност, т.е. запълва масива
  • Автор

Значи сега излежда 1:1 с това, дето си го написал. Функцията извиквам с T:=Izbor(M,N,A,B,S) "T" е дефинирана от тип "Boolean", a "S" като "Massiv". При опит за компилация дава: ":" expected след "out". Май не разпознава "out" като кодова дума?!?!?!?!?..... :) Прави ми впечатление, че тя не е удебелена като: array, for, to, do, then и т.н.

Редактирано от peter2003 (преглед на промените)

Да Ви кажа честно напразно се опитвате да направите по този начин функцията понеже на Паскал тя никога няма да проработи. В Паскал за резултат на функция може да се зададат само 5 типа данни: целочислени, реални, низови, указатели и булеви. Огледайте още веднъж условието. П.С. DarkLight ти доколкото виждам си писал функцията на Делфи където е възможно да се задава тип на функцията масив :)

П.С.

DarkLight ти доколкото виждам си писал функцията на Делфи където е възможно да се задава тип на функцията масив :)

<{POST_SNAPBACK}>

Да, а да не искаш да кажеш че Borland Pascal 7 не поддържа дори out параметър?

Просто искам да кажа, че не можеш да върнеш резултат на функция от тип масив. Ако забелязваш не съм говорил никъде за параметри а само за типа на резултата на функция

Просто искам да кажа, че не можеш да върнеш резултат на функция от тип масив. Ако забелязваш не съм говорил никъде за параметри а само за типа на резултата на

функция

<{POST_SNAPBACK}>

Имах предвид, че явно не поддържа out след като не компилира кода. Аз не пиша з а Borland Pascal, Free Pascal би трябвало да го компилира... Не знам Borland Pascal поддържа ли указатели иначе и така може да се реши... А може би условието е формулирано некоректно?

Намерих решението. В стандартния паскал просто слагаш var вместо out!

function Izbor (K: Massiv;J: Integer;min,max: Real; var ResultArr: Massiv): Boolean;

Редактирано от DarkLight (преглед на промените)

  • Автор

Ееее, супер. Като смених out с var работата стана. :yanim: Обаче както каза Kalanag май функцията трябва да има низов тип. Сега мисля да видя дали ще стане така. Благодаря на всички ви. Длъжник съм ви. Пак мерси :)

Тея дъртите преподаватели много ме дразнят. Все нещо не са доуточнили. Тука например ако ще бъде с var параметър тая функция то може си баде и обикновенна процедура понеже не виждам да има смисъл да връща никакъв резултат.

Може би функцията трябва да върне броя прехвърлени числа?

А иначе наистина може да връща само стойност от прост тип:

http://www.xploiter.com/mirrors/pascal/pas046.htm

Program Kursova_rabota;

uses

WinCrt;

const

cMaxArray = 45;

cMin = -4.3;

cMax = 13;

type

TArray = array [1..cMaxArray] of Real;

PArray = ^TArray;

var

vLenArray: Integer;

vArray: TArray;

procedure FillArray(var AArray: TArray);

var

I: Integer;

begin

Write('Въведете желаната големина на масив: ');

ReadLn(vLenArray);

I := 1;

WriteLn;

WriteLn('Натисни бутон за да продължиш...');

ReadLn;

while I <= vLenArray do

begin

Write('Въведете стойност за ', I, ' позиция от масива: ');

ReadLn(vArray);

if (vArray < cMin) or (vArray > cMax) then

begin

WriteLn;

WriteLn('Трябва да въведете стойност от ', cMin, ' до ', cMax, '.Опитайте отново.');

WriteLn('Натисни бутон за да продължиш...');

ReadLn;

I := I;

end else I := I + 1;

end;

end;

procedure PrintArray(const AArray: TArray);

var

I: Integer;

begin

I := 1;

while I <= vLenArray do

begin

WriteLn('Стойността за ', I, ' позиция от масива е: ', vArray);

I := I + 1;

end;

end;

{function CopyArray(const AArray: TArray): PArray;

begin

CopyArray := @AArray;

end;}

{Така върши работа определено ама няма смисъл да се пише цяла функция за един ред}

{ function CopyArray(const AArray: TArray; var ASubArray: TArray): Boolean;

var

I: Integer;

begin

CopyArray := False;

I := 1;

while I <= vLenArray do

begin

ASubArray := AArray;

I := I + 1;

end;

CopyArray := True;

end;}

{Така също върши работа ама не виждам за какво трябва се използва функция като няма зададено конкретно какво да връща}

begin

FillArray(vArray);

WriteLn;

WriteLn('Натисни бутон за да видиш всички въведени стойности ...');

ReadLn;

PrintArray(vArray);

WriteLn;

WriteLn('Натисни бутон за да край ...');

ReadLn;

end.

Мисля, че това е решението на курсовата ти задача освен ако не бъркам :cheers:

Мисля. това е решението на задачата. поправи ме ако бъркам ама малко бързах и не знам доколко е точно

Program Kursova_rabota;

uses
    WinCrt;

const
   cMaxArray = 45;
   cMin = -4.3;
   cMax = 13;

type
   TArray = array [1..cMaxArray] of Real;
   PArray = ^TArray;

var
   vLenArray: Integer;
   vArray: TArray;



   procedure FillArray(var AArray: TArray);
   var
      I: Integer;
      begin
           Write('Въведете желаната големина на масив: ');
           ReadLn(vLenArray);
           I := 1;
           WriteLn;
           WriteLn('Натисни бутон за да продължиш...');
           ReadLn;
           while I <= vLenArray do
           begin
                Write('Въведете стойност за ', I, ' позиция от масива: ');
                ReadLn(vArray[I]);
                if (vArray[I] < cMin) or (vArray[I] > cMax) then
                begin
                     WriteLn;
                     WriteLn('Трябва да въведете стойност от ', cMin, ' до ', cMax, '.Опитайте отново.');
                     WriteLn('Натисни бутон за да продължиш...');
                     ReadLn;
                     I := I;
                end else I := I + 1;
           end;
     end;

   procedure PrintArray(const AArray: TArray);
   var
      I: Integer;
   begin
        I := 1;
        while I <= vLenArray do
        begin
             WriteLn('Стойността за ', I, ' позиция от масива е: ', vArray[I]);
             I := I + 1;
        end;
   end;

  {function CopyArray(const AArray: TArray): PArray;
   begin
      CopyArray := @AArray;
   end;}
   {Така върши работа определено ама няма смисъл да се пише цяла функция за един ред}

{   function CopyArray(const AArray: TArray; var ASubArray: TArray): Boolean;
   var
      I: Integer;
   begin
        CopyArray := False;
        I := 1;
        while I <= vLenArray do
        begin
             ASubArray[I] := AArray[I];
             I := I + 1;
        end;
        CopyArray := True;
   end;}
   {Така също върши работа ама не виждам за какво трябва се използва функция като няма зададено конкретно какво да връща}

begin
     FillArray(vArray);
     WriteLn;
     WriteLn('Натисни бутон за да видиш всички въведени стойности ...');
     ReadLn;
     PrintArray(vArray);
     WriteLn;
     WriteLn('Натисни бутон за да край ...');
     ReadLn;
end.

Мисля. това е решението на задачата. поправи ме ако бъркам ама малко бързах и не знам доколко е точно

 {function CopyArray(const AArray: TArray): PArray;
   begin
      CopyArray := @AArray;
   end;}

<{POST_SNAPBACK}>

Мисля, че целта не е да се копира целия масив, а само тези елементи, чиито стойности са в определен интервал

Хаха мисля че открих загадката около функцията. Трябва да е integer, за да може да принтира стойностите от втория масив. Гледайте колко просто е било ама кой да се сети бързо :cheers:

Program Kursova_rabota;

uses
    WinCrt;

const
   cMaxArray = 45;
   cMin = -4.3;
   cMax = 13;

type
   TArray = array [1..cMaxArray] of Real;

var
   vLenArray: Integer;
   vArray, vArray1: TArray;
   T: Integer;

   procedure FillArray(var AArray: TArray);
   var
      I: Integer;
      begin
           Write('Âúâåäåòå æåëàíàòà ãîëåìèíà íà ìàñèâ: ');
           ReadLn(vLenArray);
           I := 1;
           WriteLn;
           WriteLn('Íàòèñíè áóòîí çà äà ïðîäúëæèø...');
           ReadLn;
           while I <= vLenArray do
           begin
                Write('Âúâåäåòå ñòîéíîñò çà ', I, ' ïîçèöèÿ îò ìàñèâà: ');
                ReadLn(vArray[I]);
                I := I + 1;
           end;
     end;

   procedure PrintArray(const AArray: TArray; ALenArray: Integer);
   var
      I: Integer;
   begin
        I := 1;
        while I <= ALenArray do
        begin
             WriteLn('Ñòîéíîñòòà çà ', I, ' ïîçèöèÿ îò ìàñèâà å: ', AArray[I]);
             I := I + 1;
        end;
   end;

   function CopyArray(const AArray: TArray; var ASubArray: TArray; AMin, AMax: Real): Integer;
   var
      I, J: Integer;
   begin
        I := 1;
        J := 0;
        while I <= vLenArray do
        begin
             if (AArray[I] >= AMin) and (AArray[I] <= AMax) then
             begin
                J := J + 1;
                ASubArray[J] := AArray[I];
             end;
             I := I + 1;
        end;
        CopyArray := J;
   end;

begin
     FillArray(vArray);
     WriteLn;
     WriteLn('Íàòèñíè áóòîí çà äà âèäèø âñè÷êè âúâåäåíè ñòîéíîñòè ...');
     ReadLn;
     PrintArray(vArray, vLenArray);
     WriteLn;
     WriteLn('Íàòèñíè áóòîí çà äà âèäèø ñòîéíîñòèòå â èíòåðâàëà [-4.3, 13.0] ...');
     ReadLn;
     PrintArray(vArray1, CopyArray(vArray, vArray1, cMin, cMax));
     WriteLn;
     WriteLn('Íàòèñíè áóòîí çà êðàé ...');
     ReadLn;
end.
  • 1 година по-късно...

Трябва ми програма, с която да се намери сумата на няколко числа кратни на 3. Пресмятането спира при въвеждане на първото число, което не е кратно на 3 и не участва в сумирането. Благодаря предварително :rolleyes:

Редактирано от stanley56 (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.