Pereiti prie turinio

Rekomenduojami pranešimai

Problema:

 

Syntax error, . expected but , found

 

Niekaip nesurandu?

Jeigu ivedu, kad gyventojai:Mas tai meta:

 

Duplicate identifier GYVENTOJAI

Identifier already defined in gyventojai.pas at line 2

Syntax error, . expected but , found

 

KAME SAKNYS?

 

program gyventojai;
type Mas = array [1..100] of integer;

procedure Skaitymas(numeriai:Mas; gyventojai:Mas; n:integer);
var i : integer; /// Skaitikliai
   F, R : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       Assign (R, 'U1rez.txt');
       Rewrite(R);
       Read(F, n);

           for i:=1 to n do
               begin
               ReadLn(F, numeriai[i]);
               WriteLn(R, numeriai[i]);
               end;

           for i:=1 to n do
               begin
               ReadLn(F, gyventojai[i]);
               WriteLn(R, gyventojai[i]);
               end;

       Close(F);
       Close(R);
   end;

   var numeriai: Mas;
       n : integer;

   begin

   Skaitymas(numeriai, gyventojai, n);

   end.

Redagavo Mantonijo
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Beda, kad atsakymas 0. Nesuprantu kame problema.

 

 

 

program gyventojai1;
type Mas = array [1..100] of integer;

procedure Skaitymas(var numeriai:Mas; var gyventojai:Mas; n:integer);
var i : integer; /// Skaitikliai
   F : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       ReadLn(F, n);

           for i:=1 to n do
               begin
               Read(F, numeriai[i]);
               Read(F, gyventojai[i]);
               // WriteLn(R, numeriai[i], ' ', gyventojai[i]);
               end;

       Close(F);

   end;

/////////////////////////

function Vidgyventoju(gyv:Mas; m:integer) : real;
var i, vidurkis, vid, k : integer;

   begin

       for i:= 1 to m do
           begin
           vidurkis:= vidurkis + gyv[i];
           end;
           vid:=vidurkis div 10;
           Vidgyventoju:=vid;

   end;

/////////////////////////

function Vidgyventojupuse(num:Mas; gyve:Mas; k:integer) : real;
var i, vidurkisd: integer;
   vidd : real;

   begin
       for i:= 1 to k do
           begin
               if num[k] mod 2 = 0 then
                   begin
                   vidurkisd:=vidurkisd + gyve[k];
                   end;
                   vidd:= vidurkisd div k;
                   Vidgyventojupuse:=vidd;

               end;
               end;
/////////////////////////

   var numeriai: Mas;
       gyventojai: Mas;
       n, k : integer;
       Vidurkis : real;
       R : text;

   begin

   Assign(R, 'U1rez.txt');
   Rewrite(R);

   Skaitymas(numeriai, gyventojai, n);
   Vidurkis:=Vidgyventojupuse(numeriai, gyventojai, n);
   WriteLn(R, Vidurkis:5:2);

   Close(R);
   end.

 

Duomenys:

 

10
1 5
2 4
3 4
4 5
5 6
6 5
7 0
8 0
9 5
10 0

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Beda, kad atsakymas 0. Nesuprantu kame problema.

 

 

 

program gyventojai1;
type Mas = array [1..100] of integer;

procedure Skaitymas(var numeriai:Mas; var gyventojai:Mas; n:integer);
var i : integer; /// Skaitikliai
   F : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       ReadLn(F, n);

           for i:=1 to n do
               begin
               Read(F, numeriai[i]);
               Read(F, gyventojai[i]);
               // WriteLn(R, numeriai[i], ' ', gyventojai[i]);
               end;

       Close(F);

   end;

/////////////////////////

function Vidgyventoju(gyv:Mas; m:integer) : real;
var i, vidurkis, vid, k : integer;

   begin

       for i:= 1 to m do
           begin
           vidurkis:= vidurkis + gyv[i];
           end;
           vid:=vidurkis div 10;
           Vidgyventoju:=vid;

   end;

/////////////////////////

function Vidgyventojupuse(num:Mas; gyve:Mas; k:integer) : real;
var i, vidurkisd: integer;
   vidd : real;

   begin
       for i:= 1 to k do
           begin
               if num[k] mod 2 = 0 then
                   begin
                   vidurkisd:=vidurkisd + gyve[k];
                   end;
                   vidd:= vidurkisd div k;
                   Vidgyventojupuse:=vidd;

               end;
               end;
/////////////////////////

   var numeriai: Mas;
       gyventojai: Mas;
       n, k : integer;
       Vidurkis : real;
       R : text;

   begin

   Assign(R, 'U1rez.txt');
   Rewrite(R);

   Skaitymas(numeriai, gyventojai, n);
   Vidurkis:=Vidgyventojupuse(numeriai, gyventojai, n);
   WriteLn(R, Vidurkis:5:2);

   Close(R);
   end.

 

Duomenys:

 

10
1 5
2 4
3 4
4 5
5 6
6 5
7 0
8 0
9 5
10 0

 

 

 

Netikrinau ar veikia, bet perbėgus akim - skaitymo funkcijoj prieš n turėtu būti žodelis var, kadangi kimtąjį n tu vėliau naudoji (vidurkio funkcijoj n = 0, tad ciklas nevyksta)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jau pasidariau, isejo :)

 

program gyventojai1;
type Mas = array [1..100] of integer;

procedure Skaitymas(var numeriai:Mas; var gyventojai:Mas; var n:integer);
var i : integer; /// Skaitikliai
   F : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       ReadLn(F, n);

           for i:=1 to n do
               begin
               Read(F, numeriai[i]);
               Read(F, gyventojai[i]);
               // WriteLn(R, numeriai[i], ' ', gyventojai[i]);
               end;

        Close(F);
   end;

/////////////////////////

function Vidgyventoju(gyv:Mas; n:integer) : real;
var i, vidurkis, daliklis : integer;


   begin
   vidurkis:=0;
       for i:= 1 to n do
           begin
           vidurkis:=vidurkis + gyv[i];
           daliklis:= daliklis + 1;
           end;
           Vidgyventoju:=vidurkis div n;
   end;

/////////////////////////

   var numeriai, gyventojai: Mas;
       n : integer;
       Vidurkis : real;
       R : text;

   begin

   Assign(R, 'U1rez.txt');
   Rewrite(R);

       Skaitymas(numeriai, gyventojai, n);
       Vidurkis:=Vidgyventoju(gyventojai, n);
       WriteLn(R, Vidurkis:5:2);

   Close(R);
   end.

Redagavo Mantonijo
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tikslas suskaiciuoti vidutini gyventoju skaiciu namuose, kuriu numeris yra lyginis

Problema kita:

 

Division by zero

 

Jeigu funkcijoje apsirasau, kad daliklis:= 0 tai meta si error'a nors turetu dalinti is 5.

Jeigu funkcijoje apsirasau, kad daliklis:= 1 tai nemeta error'o, bet man turi dalinti is 5, o ne is 6.

 

program gyventojai1;
type Mas = array [1..100] of integer;

procedure Skaitymas(var numeriai:Mas; var gyventojai:Mas; var n:integer);
var i : integer; /// Skaitikliai
   F : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       ReadLn(F, n);

           for i:=1 to n do
               begin
               Read(F, numeriai[i]);
               Read(F, gyventojai[i]);
               // WriteLn(R, numeriai[i], ' ', gyventojai[i]);
               end;

        Close(F);
   end;

/////////////////////////

function Vidgyventoju(gyv:Mas; n:integer) : real;
var i, vidurkis, daliklis : integer;


   begin
   vidurkis:=0;
       for i:= 1 to n do
           begin
           vidurkis:=vidurkis + gyv[i];
           daliklis:= daliklis + 1;
           end;
           Vidgyventoju:=vidurkis div n;
   end;

/////////////////////////

function Vidgyventojupuse(gyv:Mas; num:Mas; n:integer) : real;
var i, daliklis, k, vidurkispuse: integer;
   R : text;

   begin
   Assign(R, 'U1rez.txt');
   Rewrite(R);
   vidurkispuse:=0;
   daliklis:=1;
           for i:= 1 to n do
               begin
               if num[i] mod 2 = 0 then
                   begin
                   k:=num[i];
                   vidurkispuse:= vidurkispuse + gyv[k];
                   daliklis:= daliklis + 1;
                   WriteLn(R, vidurkispuse, ' ', daliklis, ' ', k);
                   end;
               Vidgyventojupuse:= vidurkispuse div daliklis;
       end;
       Close(R);
     end;
/////////////////////////

   var numeriai, gyventojai: Mas;
       n, k : integer;
       Vidurkis : real;
       R : text;

   begin

       Skaitymas(numeriai, gyventojai, n);
       Vidurkis:=Vidgyventojupuse(gyventojai, numeriai, n);

   end.

Redagavo Mantonijo
Nuoroda į pranešimą
Dalintis kituose puslapiuose

iskelk

Vidgyventojupuse:= vidurkispuse div daliklis;

is for ciklo.

 

Beje, cia kaip sidenote, bet ziuriu, tu tikiesi is Vidgyventojupuse 'real' tipo atsakymo. Taciau, tu naudoji 'div', kai bandai surasti vidurki, kuris grazina rezultata be liekanos. Tad, del kodo tikslumo, reiktu arba nurodyt, kad grazinsi integer arba dalyba daryti naudojant '/':

Vidgyventojupuse:= vidurkispuse / daliklis;

 

EDIT: turejau laisvesnio laiko ir supaprastinau tavo koda

program project1;

type
 MultiMas = array of array of integer;

var
 namai: MultiMas;
 vidurkis: real;

 procedure Skaitymas(failas: string);
 var
   i, n: integer;
   F: Text;
 begin
   Assign(F, failas);
   Reset(F);

   ReadLn(F, n);
   SetLength(namai, n, 2);

   for i := 0 to n - 1 do
     ReadLn(F, namai[i, 0], namai[i, 1]);

   Close(F);
 end;

 procedure Rasymas(failas, prefix: string);
 var
   F: Text;
 begin
   Assign(F, failas);
   Rewrite(F);
   WriteLn(F, prefix, vidurkis: 5: 2);
   Close(F);
 end;

 function getVidurkis(namai: MultiMas): real;
 var
   i, namu, gyventoju: integer;
 begin
   namu := 0;
   gyventoju := 0;

   for i := 0 to Length(namai) - 1 do
   begin
     if namai[i, 0] mod 2 = 0 then
     begin
       namu := namu + 1;
       gyventoju := gyventoju + namai[i, 1];
     end;
   end;

   getVidurkis := gyventoju / namu;
 end;

begin
 Skaitymas('U1.txt');
 vidurkis := getVidurkis(namai);
 Rasymas('U1rez.txt', 'Gyventoju vidurkis:');
end.

Redagavo Imago
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu, bet mokaus dar mokykloje ir tiek dar nesu pazanges :D

iskelk

Vidgyventojupuse:= vidurkispuse div daliklis;

is for ciklo.

 

Beje, cia kaip sidenote, bet ziuriu, tu tikiesi is Vidgyventojupuse 'real' tipo atsakymo. Taciau, tu naudoji 'div', kai bandai surasti vidurki, kuris grazina rezultata be liekanos. Tad, del kodo tikslumo, reiktu arba nurodyt, kad grazinsi integer arba dalyba daryti naudojant '/':

Vidgyventojupuse:= vidurkispuse / daliklis;

 

EDIT: turejau laisvesnio laiko ir supaprastinau tavo koda

program project1;

type
 MultiMas = array of array of integer;

var
 namai: MultiMas;
 vidurkis: real;

 procedure Skaitymas(failas: string);
 var
   i, n: integer;
   F: Text;
 begin
   Assign(F, failas);
   Reset(F);

   ReadLn(F, n);
   SetLength(namai, n, 2);

   for i := 0 to n - 1 do
     ReadLn(F, namai[i, 0], namai[i, 1]);

   Close(F);
 end;

 procedure Rasymas(failas, prefix: string);
 var
   F: Text;
 begin
   Assign(F, failas);
   Rewrite(F);
   WriteLn(F, prefix, vidurkis: 5: 2);
   Close(F);
 end;

 function getVidurkis(namai: MultiMas): real;
 var
   i, namu, gyventoju: integer;
 begin
   namu := 0;
   gyventoju := 0;

   for i := 0 to Length(namai) - 1 do
   begin
     if namai[i, 0] mod 2 = 0 then
     begin
       namu := namu + 1;
       gyventoju := gyventoju + namai[i, 1];
     end;
   end;

   getVidurkis := gyventoju / namu;
 end;

begin
 Skaitymas('U1.txt');
 vidurkis := getVidurkis(namai);
 Rasymas('U1rez.txt', 'Gyventoju vidurkis:');
end.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu, bet mokaus dar mokykloje ir tiek dar nesu pazanges :D

 

Na, mano kodas daug desiskiria nuo tavo, tiesiog isnaudoju fakta, kad procedure 'mato' tavo programos kintamuosius, tad ju nebutina perduoti, o galima tiesiogiai kreiptis. Priedui dar naudoju dinamini masyva, kuri tikrai turetu pristatyti pamoku metu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, mano kodas daug desiskiria nuo tavo, tiesiog isnaudoju fakta, kad procedure 'mato' tavo programos kintamuosius, tad ju nebutina perduoti, o galima tiesiogiai kreiptis. Priedui dar naudoju dinamini masyva, kuri tikrai turetu pristatyti pamoku metu.

 

 

 

Na čia nelabai geras būdas, nes jei ruošiasi žmogus laikyt egzaminą, tai kiek pamenu, globalūs kintamieji nėra leidžiami. Geriau išmokt juos tinkamai perduot į procedūras/funkcijas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na čia nelabai geras būdas, nes jei ruošiasi žmogus laikyt egzaminą, tai kiek pamenu, globalūs kintamieji nėra leidžiami. Geriau išmokt juos tinkamai perduot į procedūras/funkcijas.

Na, nezinau egzamino reikalavimu, bet ar yra kokia priezastis, del ko jie to neleidzia? Mano nuomone, tvarkingas supratimas kokiame scope yra kiekvienas kintamasis yra ganetinai svarbu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, nezinau egzamino reikalavimu, bet ar yra kokia priezastis, del ko jie to neleidzia? Mano nuomone, tvarkingas supratimas kokiame scope yra kiekvienas kintamasis yra ganetinai svarbu.

 

Funkcija praranda savo lankstumą, jeigu jos veikimui reikalingi globalūs kintamieji.

 

Kai naudojami globalūs kintamieji, prarandamas dependency injection galimybė. Tarkim, turim funkciją void rikiuoti(), kuri pasiima globalų masyvą A[] ir jį surikiuoja. Kas atsitinka, jei prireikia surikiuoti ne vieną, o du masyvus – A[] ir B[]? Iš pradžių surikiuoji A[], tada sukeiti A[] ir B[] vietomis, tada surikiuoja A[] (buvusį B[]), galiausiai atkeiti atgal. Kaip viskas atrodytų su normaliai implementuotais parametrais?

rikiuoti(A);
rikiuoti(B);

 

Kitas dalykas – glaudus kodo susiejimas (angl. tight coupling). Kai naudojami globalūs kintamieji, funkcija negali būti nepriklausomu vienetu (t. y. jei norėtum perkelti funkciją į kitą failą, neužtektų tiesiog perkopijuoti visos funkcijos – tektų dar ir sukurti globalius kintamuosius). Kita vertus, jei norėtume perkelti void rikiuoti(int a[]) {...} funkciją, užtektų tiesiog nukopijuoti jos deklaraciją ir kūną (bei, tikriausiai, atnaujinti import'us / include'us). Taigi, tokia funkcija turi viską ko reikia savo aprašyme ir nepriklauso nuo kažkokio išorinio kodo.

 

Trečias dalykas – su globaliais kintamaisiais labai užteršiamas scope'as. Tarkim, sukuriame globalų kintamąjį vardu max. Tada jau jokioje kitoje funkcijoje būtų nepatartina sukurti kintamojo su tokiu pačiu vardu, nes tai sukeltų papildomo painumo ir palengvintų klaidų atsiradimą (neaišku, kurį kintamąjį tam tikroje vietoje naudoji, sudėtinga, kai reikia pasiekti ir globalų, ir privatų kintąmąjį vienodu vardu tame pačiame scope'e, kt.). Panašių problemų neatsiranda, kai naudojami išskirtinai lokalūs kintamieji.

 

Į galvą šauna tik du atvejais, kuriais toleruojami globalūs kintamieji:

  • kai aprašomos programos konstantos
  • konkursinio/olimpiadinio programavimo atveju (šiuo atveju svarbiau parašyti kodą, kuris tinkamai veiktų, ir tai padaryti greitai, nei išlaikyti gerą programavimo stilių).

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Funkcija praranda savo lankstumą, jeigu jos veikimui reikalingi globalūs kintamieji.

 

Kai naudojami globalūs kintamieji, prarandamas dependency injection galimybė. Tarkim, turim funkciją void rikiuoti(), kuri pasiima globalų masyvą A[] ir jį surikiuoja. Kas atsitinka, jei prireikia surikiuoti ne vieną, o du masyvus – A[] ir B[]? Iš pradžių surikiuoji A[], tada sukeiti A[] ir B[] vietomis, tada surikiuoja A[] (buvusį B[]), galiausiai atkeiti atgal. Kaip viskas atrodytų su normaliai implementuotais parametrais?

rikiuoti(A);
rikiuoti(B);

 

Kitas dalykas – glaudus kodo susiejimas (angl. tight coupling). Kai naudojami globalūs kintamieji, funkcija negali būti nepriklausomu vienetu (t. y. jei norėtum perkelti funkciją į kitą failą, neužtektų tiesiog perkopijuoti visos funkcijos – tektų dar ir sukurti globalius kintamuosius). Kita vertus, jei norėtume perkelti void rikiuoti(int a[]) {...} funkciją, užtektų tiesiog nukopijuoti jos deklaraciją ir kūną (bei, tikriausiai, atnaujinti import'us / include'us). Taigi, tokia funkcija turi viską ko reikia savo aprašyme ir nepriklauso nuo kažkokio išorinio kodo.

 

Trečias dalykas – su globaliais kintamaisiais labai užteršiamas scope'as. Tarkim, sukuriame globalų kintamąjį vardu max. Tada jau jokioje kitoje funkcijoje būtų nepatartina sukurti kintamojo su tokiu pačiu vardu, nes tai sukeltų papildomo painumo ir palengvintų klaidų atsiradimą (neaišku, kurį kintamąjį tam tikroje vietoje naudoji, sudėtinga, kai reikia pasiekti ir globalų, ir privatų kintąmąjį vienodu vardu tame pačiame scope'e, kt.). Panašių problemų neatsiranda, kai naudojami išskirtinai lokalūs kintamieji.

 

Į galvą šauna tik du atvejais, kuriais toleruojami globalūs kintamieji:

  • kai aprašomos programos konstantos
  • konkursinio/olimpiadinio programavimo atveju (šiuo atveju svarbiau parašyti kodą, kuris tinkamai veiktų, ir tai padaryti greitai, nei išlaikyti gerą programavimo stilių).

 

Manau, kad Imago puikiai supranta koks skirtumas tarp global ir ne global kintamuju, jo klausimas buvo labau susijes su tuom ar yra koks skirtumas egzamine ka naudosi, jeigu taves praso uzduoti ispresti, ypac, kad tai mokyklinio lygio egzaminas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Funkcija praranda savo lankstumą, jeigu jos veikimui reikalingi globalūs kintamieji.

 

Kai naudojami globalūs kintamieji, prarandamas dependency injection galimybė. Tarkim, turim funkciją void rikiuoti(), kuri pasiima globalų masyvą A[] ir jį surikiuoja. Kas atsitinka, jei prireikia surikiuoti ne vieną, o du masyvus – A[] ir B[]? Iš pradžių surikiuoji A[], tada sukeiti A[] ir B[] vietomis, tada surikiuoja A[] (buvusį B[]), galiausiai atkeiti atgal. Kaip viskas atrodytų su normaliai implementuotais parametrais?

rikiuoti(A);
rikiuoti(B);

 

Kitas dalykas – glaudus kodo susiejimas (angl. tight coupling). Kai naudojami globalūs kintamieji, funkcija negali būti nepriklausomu vienetu (t. y. jei norėtum perkelti funkciją į kitą failą, neužtektų tiesiog perkopijuoti visos funkcijos – tektų dar ir sukurti globalius kintamuosius). Kita vertus, jei norėtume perkelti void rikiuoti(int a[]) {...} funkciją, užtektų tiesiog nukopijuoti jos deklaraciją ir kūną (bei, tikriausiai, atnaujinti import'us / include'us). Taigi, tokia funkcija turi viską ko reikia savo aprašyme ir nepriklauso nuo kažkokio išorinio kodo.

 

Trečias dalykas – su globaliais kintamaisiais labai užteršiamas scope'as. Tarkim, sukuriame globalų kintamąjį vardu max. Tada jau jokioje kitoje funkcijoje būtų nepatartina sukurti kintamojo su tokiu pačiu vardu, nes tai sukeltų papildomo painumo ir palengvintų klaidų atsiradimą (neaišku, kurį kintamąjį tam tikroje vietoje naudoji, sudėtinga, kai reikia pasiekti ir globalų, ir privatų kintąmąjį vienodu vardu tame pačiame scope'e, kt.). Panašių problemų neatsiranda, kai naudojami išskirtinai lokalūs kintamieji.

 

Į galvą šauna tik du atvejais, kuriais toleruojami globalūs kintamieji:

  • kai aprašomos programos konstantos
  • konkursinio/olimpiadinio programavimo atveju (šiuo atveju svarbiau parašyti kodą, kuris tinkamai veiktų, ir tai padaryti greitai, nei išlaikyti gerą programavimo stilių).

Bendrinio naudojimo metu, sutinku su tavo teiginiais, taciau sprendziant egzamino tipo uzduotis, daznai galima interpretuoti, kad uzduoties sprendimas - tai klases sukurimas, kuri skirta tik tai situacijai (tinka tik specifinio tipo duomenim ir neturi buti dinamiska), tad mokejimas isnaudoti kalbos galimybes yra pliusas. Priedui, kad mokejimas ir zinojimas, kaip veikia kintamuju scope, pades, kai prieisi prie OOP.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, nezinau egzamino reikalavimu, bet ar yra kokia priezastis, del ko jie to neleidzia?

Neleidžiama, nes tai yra blogas programavimo stilius. Kodėl blogas, išvardijau aukščiau.

 

Mano nuomone, tvarkingas supratimas kokiame scope yra kiekvienas kintamasis yra ganetinai svarbu.

Imtis neteiktinų programavimo praktikų tam, kad parodytum, kaip gerai supranti, kas yra scope'as, manau, yra negerai. Netgi priešingai, padaręs visus kintamuosius globaliais tu parodai, kaip nemoki panaudoti scope'o.

 

Bendrinio naudojimo metu, sutinku su tavo teiginiais, taciau sprendziant egzamino tipo uzduotis, daznai galima interpretuoti, kad uzduoties sprendimas - tai klases sukurimas, kuri skirta tik tai situacijai (tinka tik specifinio tipo duomenim ir neturi buti dinamiska), tad mokejimas isnaudoti kalbos galimybes yra pliusas. Priedui, kad mokejimas ir zinojimas, kaip veikia kintamuju scope, pades, kai prieisi prie OOP.

Nesvarbu, ar tai egzamino užduotis, ar tavo asmeninis puslapis, ar visą pasaulį aptarnaujanti programinė sistema – blogas programavimo stilius yra blogas programavimo stilius.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sukūriau programą, kurios tikslas aprašytas Rašymas procedūroje. Kaip vertinate? Gal yra kokių pasiūlymų

program gyventojai1;
type Mas = array [1..100] of integer;

procedure Skaitymas(var numeriai:Mas; var gyventojai:Mas; var n:integer);
var i : integer; /// Skaitikliai
   F : text;

   begin
       Assign(F, 'U1.txt');
       Reset(F);
       ReadLn(F, n);

           for i:=1 to n do
               begin
               Read(F, numeriai[i]);
               Read(F, gyventojai[i]);
               // WriteLn(R, numeriai[i], ' ', gyventojai[i]);
               end;

        Close(F);
   end;

/////////////////////////

function visiGyventojai(gyv:Mas; n:integer) : integer;
var i, Visi: integer;


   begin
   Visi:=0;
       for i:= 1 to n do
           begin
           Visi:=Visi + gyv[i];
           end;
       visiGyventojai:=Visi;
   end;

/////////////////////////

function visiGyventojaiDesine(num:Mas; gyv:Mas; n:integer) : integer;
var i, visiGyventojai, k: integer;

begin
   visiGyventojai:=0;
           for i:= 1 to n do
               begin
               if num[i] mod 2 = 0 then
                   begin
                   k:=num[i];
                   visiGyventojai:= visiGyventojai + gyv[k];
                   end;

       end;
       visiGyventojaiDesine:= visiGyventojai;
     end;

/////////////////////////

function visiGyventojaiKaire(num:Mas; gyv:Mas; n:integer) : integer;
var i, visiGyventojai, k : integer;

begin
   visiGyventojai:=0;
           for i:= 1 to n do
               begin
               if num[i] mod 2 <> 0 then
                   begin
                   k:=num[i];
                   visiGyventojai:= visiGyventojai + gyv[k];
                   end;

       end;
       visiGyventojaiKaire:= visiGyventojai;
     end;

////////////////////////

function vidGyventoju(gyv:Mas; n:integer) : integer;
var i, vidurkis, daliklis : integer;


   begin
   vidurkis:=0;
       for i:= 1 to n do
           begin
           vidurkis:=vidurkis + gyv[i];
           daliklis:= daliklis + 1;
           end;
           Vidgyventoju:=vidurkis div n;
   end;

/////////////////////////

function vidGyventojuDesine(gyv:Mas; num:Mas; n:integer) : real;
var i, daliklis, k, vidurkispuse: integer;

   begin
   vidurkispuse:=0;
   daliklis:=0;
           for i:= 1 to n do
               begin
               if num[i] mod 2 = 0 then
                   begin
                   k:=num[i];
                   vidurkispuse:= vidurkispuse + gyv[k];
                   daliklis:= daliklis + 1;
                   end;

       end;
       Vidgyventojudesine:= vidurkispuse / daliklis;
     end;
/////////////////////////

function vidGyventojuKaire(gyv:Mas; num:Mas; n:integer) : real;
var i, daliklis, k, vidurkispuse: integer;

   begin
   vidurkispuse:=0;
   daliklis:=0;
           for i:= 1 to n do
               begin
               if num[i] mod 2 <> 0 then
                   begin
                   k:=num[i];
                   vidurkispuse:= vidurkispuse + gyv[k];
                   daliklis:= daliklis + 1;
                   end;

       end;
       Vidgyventojukaire:= vidurkispuse / daliklis;
     end;

/////////////////////////

procedure Rasymas(numeriai:Mas; gyventojai:Mas; n:integer);
var VidurkisDesine, VidurkisKaire : real;
   Kaire, Desine, AllGyventojai : integer;
   R : text;

   begin

   Assign(R, 'U1rez.txt');
   Rewrite(R);

       /////////// Skaièiavimai

       Skaitymas(numeriai, gyventojai, n);    /// Nuskaito duomenys á masyvus
       AllGyventojai:= visiGyventojai(gyventojai, n); /// Suranda gyventojø skaièiø
       Kaire:=visiGyventojaiKaire(numeriai, gyventojai, n); /// Suranda gyventojø skaièiø kairëje
       Desine:=visiGyventojaiDesine(numeriai, gyventojai, n); /// Suranda gyventojø skaièiø deðinëje
       VidurkisDesine:=Vidgyventojudesine(gyventojai, numeriai, n); /// Suranda vid. gyventojø skaièiø deðinëje
       VidurkisKaire:=Vidgyventojukaire(gyventojai, numeriai, n);  /// Suranda vid. gyventojø skaièiø kairëje

       ////////// Spausdinimas

       WriteLn(R, AllGyventojai);
       WriteLn(R, Kaire);
       WriteLn(R, Desine);
       WriteLn(R, VidurkisKaire:5:2);
       WriteLn(R, VidurkisDesine:5:2);

   Close(R);
 end;

var numeriai, gyventojai : Mas;
   n : integer;

begin

Skaitymas(numeriai, gyventojai, n);
Rasymas(numeriai, gyventojai, n);

   end.

?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, visu pirma, yra klaidu. Bet pirma, keli pastebejimai.

 

1. Nereikalingas kodo atkartojimas. visiGyventojaiKaire/visiGyventojaiDesine ir Vidgyventojudesine/Vidgyventojukaire yra identiskas kodas, su vienu mazu skirtumu, ar tai lyginis ar nelyginis skaicius. Tad buvo galima tiesiog sukurti dvi funkcijas visiGyventojaiPuseje ir vidGyventojuPuseje, kurie priima papildoma kintamaji 'puse:integer'. Tad kodas galejo buti, kazkas pan:

function visiGyventojaiPuseje(num, gyv: Mas; n, puse: integer): integer;
 var
   i, visiGyventojai: integer;

 begin
   visiGyventojai:= 0;
   for i := 1 to n do
     if num[i] mod 2 = puse then
       visiGyventojai := visiGyventojai + gyv[i];

   visiGyventojaiPuseje := visiGyventojai;
 end;

 

2. Nezinau koks mokykloje/pascal yra siulomas standartas, taciau pas tave daug yra vienos eilutes for/if bloku, kuriuos galima uzrasyti ir be begin ... end; (kaip pavyzdyje virsuj)

 

Klaidos:

1. visiGyventojaiKaire/visiGyventojaiDesine - nereikalingas ir klaidingas kintamojo 'k' naudojimas.Yra suluzes. Tavo kode

k := num[i];
visiGyventojai := visiGyventojai + gyv[k];

Turetu buti

visiGyventojai := visiGyventojai + gyv[i];

Kodel: imkim tavo duomenis

1 5
2 4
3 4

Kas sukuria du masyvus su:

namai: [1]=1, [2]=2, [3]=3
zmones: [1]=5, [2]=4, [3]=4

Tavo kodas siuo atveju neluzta, nes namo 'numeris' atitinka index'a, kuriame yra aprasyta gyventoju kiekis tame name, taciau esant duomenim:

1 5
6 4
3 4

Antrame ciklo rate, k bus 6, taciau tokio index'o gyventoju masyve nera ir programa nebeveikia.

 

2. vidGyventoju

Vidgyventoju:=vidurkis div n; => Vidgyventoju:=vidurkis div daliklis;

Ir uzmirsai nustatyti daliklis:=0;

 

3. vidGyventojuKaire/Desine - ta pati klaida su 'k'

 

 

Nezinau ar cia klaida, kai kopijuoji i uzdarbius, bet dabartine kodo lygiuoti yra paini ir daznai neaisku kur prasideda/pasibaigia kodo blokas bei kam jis priklauso.

Redagavo Imago
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na, visu pirma, yra klaidu. Bet pirma, keli pastebejimai.

 

1. Nereikalingas kodo atkartojimas. visiGyventojaiKaire/visiGyventojaiDesine ir Vidgyventojudesine/Vidgyventojukaire yra identiskas kodas, su vienu mazu skirtumu, ar tai lyginis ar nelyginis skaicius. Tad buvo galima tiesiog sukurti dvi funkcijas visiGyventojaiPuseje ir vidGyventojuPuseje, kurie priima papildoma kintamaji 'puse:integer'. Tad kodas galejo buti, kazkas pan:

function visiGyventojaiPuseje(num, gyv: Mas; n, puse: integer): integer;
 var
   i, visiGyventojai: integer;

 begin
   visiGyventojai:= 0;
   for i := 1 to n do
     if num[i] mod 2 = puse then
       visiGyventojai := visiGyventojai + gyv[i];

   visiGyventojaiPuseje := visiGyventojai;
 end;

 

2. Nezinau koks mokykloje/pascal yra siulomas standartas, taciau pas tave daug yra vienos eilutes for/if bloku, kuriuos galima uzrasyti ir be begin ... end; (kaip pavyzdyje virsuj)

 

Klaidos:

1. visiGyventojaiKaire/visiGyventojaiDesine - nereikalingas ir klaidingas kintamojo 'k' naudojimas.Yra suluzes. Tavo kode

k := num[i];
visiGyventojai := visiGyventojai + gyv[k];

Turetu buti

visiGyventojai := visiGyventojai + gyv[i];

Kodel: imkim tavo duomenis

1 5
2 4
3 4

Kas sukuria du masyvus su:

namai: [1]=1, [2]=2, [3]=3
zmones: [1]=5, [2]=4, [3]=4

Tavo kodas siuo atveju neluzta, nes namo 'numeris' atitinka index'a, kuriame yra aprasyta gyventoju kiekis tame name, taciau esant duomenim:

1 5
6 4
3 4

Antrame ciklo rate, k bus 6, taciau tokio index'o gyventoju masyve nera ir programa nebeveikia.

 

2. vidGyventoju

Vidgyventoju:=vidurkis div n; => Vidgyventoju:=vidurkis div daliklis;

Ir uzmirsai nustatyti daliklis:=0;

 

3. vidGyventojuKaire/Desine - ta pati klaida su 'k'

 

 

Nezinau ar cia klaida, kai kopijuoji i uzdarbius, bet dabartine kodo lygiuoti yra paini ir daznai neaisku kur prasideda/pasibaigia kodo blokas bei kam jis priklauso.

 

 

Dėkui, kad pasiryžai padėti. Tačiau nelabai suprantu pirmo pastebėjimo esmės. Ką pagal tave reikėtų įrašyt vietoj 'puse'? Ir nesuprantu gali gautis jos atsakymas 0 arba per kablelį.

 

Dėl 2 pastebėjimo su tavim sutinku, mano klaida.

 

Dėl 1 klaidos nelabai suprantu. Atsakymai gaunasi gerai, tai vadinasi funkcija nėra sulūžus ar ne taip?

 

Dėl 3 klaidos taipogi nesuprantu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui, kad pasiryžai padėti. Tačiau nelabai suprantu pirmo pastebėjimo esmės. Ką pagal tave reikėtų įrašyt vietoj 'puse'? Ir nesuprantu gali gautis jos atsakymas 0 arba per kablelį.

 

Dėl 2 pastebėjimo su tavim sutinku, mano klaida.

 

Dėl 1 klaidos nelabai suprantu. Atsakymai gaunasi gerai, tai vadinasi funkcija nėra sulūžus ar ne taip?

 

Dėl 3 klaidos taipogi nesuprantu.

1) Del kodo kartojimosi. Tavo logikoje, namas bus desineje, jei jo numeris lyginis, ir kaireje jei nelyginis. Tad

// lyginis kai
num[i] mod 2 = 0
// nelyginis kai
num[i] mod 2 = 1
// pastaba, mod 2 grazins 0 arba 1 ir nieko kito

Naudojantis sia logika, namas bus desineje, kai x mod 2 = 0, kaireje, kai x mod 2 = 1, kur x - namo numeris.

Tad, naudojantis mano pateikta visiGyventojaiPuseje funkcija:

namaiDesineje:= visiGyventojaiPuseje(numeriai, gyventojai, n, 0);
namaiKaireje:= visiGyventojaiPuseje(numeriai, gyventojai, n, 1);

 

2) 1 ir 3 klaida yra ta pati, tad pameginsiu bendrai isaiskinti

Paimkim tavo duomenis:

10        
1 5    
2 4        
3 4        
4 5        
5 6        
6 5        
5 0        
8 0        
9 5            
10 0

Tavo Skaitymas() juos sudes i 2 masyvus: numeriai ir gyventojai, kurie atrodys

// numeriai, [index]=value    
[1]=1, [2]=2, [3]=3, [4]=4, [5]=5, [6]=6, [7]=5, [8]=8, [9]=9, [10]=10    
// gyventojai, [index]=value    
[1]=5, [2]=4, [3]=4, [4]=5, [5]=6, [6]=5, [7]=0, [8]=0, [9]=5, [10]=0

Kai tavo kodas atlieka cikla

for i := 1 to n do        
begin        
 if num[i] mod 2 = 0 then        
 begin        
k := num[i];        
vidurkispuse := vidurkispuse + gyv[k];        
daliklis := daliklis + 1;        
 end;        
end;

Stai kaip atrodo kintamuju reiksmes

i=2, k=4, gyv[k]=4        
i=3, k=4, gyv[k]=4        
i=5, k=6, gyv[k]=6        
i=7, k=0, gyv[k]=0        
i=8, k=0, gyv[k]=0        
i=10, k=0, gyv[k]=0

Viskas atrodytu kaip ir veikia, taip yra del to, nes num = i (kai i=5, num irgi bus 5). Taciau, esant situacijai, kai tavo duomenys nera tokie tvarkingi, sakykim:

10        
3 5        
4 4        
5 4        
6 5        
9 6        
12 5        
13 0        
14 0        
21 5        
22 0

Sukurti masyvai atrodys:

    
// numeriai    
[1]=3, [2]=4, [3]=5, [4]=6, [5]=9, [6]=12, [7]=13, [8]=14, [9]=21, [10]=22    
// gyventojai    
[1]=5, [2]=4, [3]=4, [4]=5, [5]=6, [6]=5, [7]=0, [8]=0, [9]=5, [10]=0    

Ir vel paleidus tavo cikla, num != i. T.y. kai i=1, k bus 3 (num[1]=3). Atrodytu lyg ir ok, taciau tu turi gyv[k], kuris siuo atveju tampa gyv[3] ir laiko treciojo namo (namo numeris 5) gyventoju kieki. Tad gaunasi, kai esi ties pirmu namu, tu istrauki treciojo namo gyventoju kieki. O dar blogiau, kai ciklas eis tolyn, tu ieskosi gyv[12], kuris tavo duomenyse ne neegzistuoja.

Redagavo Imago
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...