Pereiti prie turinio

Pascal uzduotis su masyvo elementu salinimu


Rekomenduojami pranešimai

Sveiki, reikia pagalbos su pascal uzduotimi:

 

Faile parasytas eiluciu skaicius n, toliau - zuikiu sarasas, vardas, pavarde, gyvenamoji vieta. Keli zuikiu vardai, gyv vietos. Gali sutapti, tas eilutes reikia panaikinti, ir parasyti sarasa, be pasikartojanciu zuikiu.

 

Failas:

5

Zuikis Puikis Miskas1

Kiskis Ilgauodegis Laukas1

Zuikis Ilgaausis Miskas2

Ilgauodegis Puikis Miskas3

Kiskis Ilgauodegis Laukas1

 

 

Rezultatas:

Zuikis Puikis Miskas1

Kiskis Ilgauodegis Laukas1

Zuikis Ilgaausis Miskas2

Ilgauodegis Puikis Miskas3

 

 

 

bandziau kazka tokio daryti bet nesigavo kazko:

 

program Bevardë44;
 type mas=array[1..50] of string;
procedure ivedimas(var n:integer;var zuik:mas);
var d:text;
   i:integer;
   tarpas:char;
   vardas,pavarde,gyv:string;
begin
 Assign(d,'duomenys.txt');
 Reset(d);
 Readln(d,n);
 for i:=1 to n do
   Readln(d,vardas,tarpas,pavarde,tarpas,gyv);
 Close(d);
end;
procedure Salinimas(k: integer; var n: integer; var zuik:mas);
  var i:integer;
begin
  for i:=k to n-1 do
    zuik[i]:=zuik[i+1];
  n:=n-1;
end;
procedure Tikr(var n:integer;var zuik:mas);
 var j,i:integer;
begin
i:=1;
j:=i+1;
  while i<=n do
  begin
    while j<=n do
    begin
      if zuik[i]=zuik[j]
      then Salinimas(i,n,zuik)
      else
      j:=j+1;
      i:=i+1;
    end;
 end;
 Writeln(zuik[i]);
end;
   var zuik:mas;
   n:integer;
begin
 Ivedimas(n,zuik);
 Tikr(n,zuik);
 Readln;
end.

Redagavo Nully
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nelabai ginlinausi, kaip tas tavo kodas veikia, bet dvigubo ciklo čia tikrai nereikia.

 

Kaip atliekamos daugelis programavimo užduočių? Apgalvoji, kaip pats tai atliktum savo rankomis, be jokios kompiuterio pagalbos, ir tada viską užrašai programavimo kalba. Svarbiausia visą užduotį susmulkinti į kuo paprastesnius veiksmus, kuriuos nesunkiai gali įgyvendinti programa.

 

Pavyzdys: turi penkis butelius, sustatytus eilute vienas šalia kito. Reikia pašalinti trečią, todėl tu jį ir išėmi iš eilutės. Bet tada lieka tarpas tarp antro ir ketvirto butelio. Kaip jį pašalinti? Ketvirtą butelį pastatai į trečio vietą, ketvirto vietoje lieka tarpas. Tada pastatai penktą butelį į ketvirto vietą. Kadangi perkeliai visus butelius, pradedant einančiu po pašalinto ir baigiant paskutiniu, jokių tarpų turėjo nebelikti.

 

Verčiam į programos kodą (nelabai paskalį prisimenu, pasitaisysi, jei įvelsiu klaidų):

var k, n,    {k - kelintą pašalinti, n - kiek iš viso masyve}
   i, : integer;
   m : masyvas;

for i := k + 1 to n do
 m[i - 1] := m[i];
n := n - 1;

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Oi, blogai perskaičiau užduotį ir prirašiau nesamonių :)

 

Nerandu, kur tu zuikių duomenis į masyvą surašai. Be to, tam dvigubam cikle reiktų šalinti j-tąjį elementą:

if zuik[i]=zuik[j]
then Salinimas(j,n,zuik)

Kitaip rezultatą gausi korektišką, bet su paliktu paskutiniu pasikartojimu. Taip pat ir rezultatų išvedimas paliktas už ciklo ribų.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

program Bevardë44;
 type mas=array[1..50] of string;
procedure ivedimas(var n:integer;var zuik:mas);
var d:text;
   i:integer;
begin
 Assign(d,'duomenys.txt');
 Reset(d);
 Readln(d,n);
 for i:=1 to n do
   Readln(d,zuik[i]);
 Close(d);
end;
procedure Salinimas(k: integer; var n: integer; var zuik:mas);
  var i:integer;
begin
  for i:=k to n-1 do
    zuik[i]:=zuik[i+1];
  n:=n-1;
end;
procedure Tikr(var n:integer;var zuik:mas);
 var k,m,j,i:integer;
begin
k:=0;
i:=1;
j:=i+1;
  while i<n do
  begin
    while j<=n do
    begin
      if zuik[i]=zuik[j]
      then Salinimas(j,n,zuik)
      else
      j:=j+1;
      i:=i+1;
      k:=k+1;
   end;
   Salinimas(j,n,zuik);
   for m:=1 to n do
   writeln(zuik[m]);
 end;
end;
   var zuik:mas;
   n:integer;
begin
 Ivedimas(n,zuik);
 Tikr(n,zuik);
 Readln;
end.

 

Ziurekit, galit paaiskint kodel man neveikia sita vieta

if zuik[i]=zuik[j]
      then Salinimas(j,n,zuik)

 

dabar, pridejus salinima pasibaigus pirmam ciklui, jau naikina vienoda eilute, bet tik viena, o ju gali buti ir daugiau.. Gal dar gali uzmesti aki ir pataisyt? Nes nelabai suprantu, per daug supinta man cia :(

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Paėmiau fragmentą iš pirmo varianto, nes antrame šiek tiek begin ir end negerai sudėti.

 

while i<=n do
begin
 j := i + 1;
 while j<=n do
 begin
   if zuik[i]=zuik[j]
     then Salinimas(j,n,zuik)
   else
      j:=j+1;
 end;
 i:=i+1;
end;

 

Esmė tokia, kad kai iš pradžių priskiri i=1 ir j=2, tada tas vidinis ciklas prasisuka iki j=n+1, bet vėliau pastarojo kintamojo reikšmė nesumažinama. Dėl to išorinis ciklas prasisuka, bet vidinis daugiau nevykdomas. Be to, kintamąjį i didinai ne toje vietoje, jį reikia didinti išoriniame cikle.

 

Patarimas: jei reikia debuginti programą ir peržvelgus kodą nieko nesimato, tai prisidėk išvedimo į ekraną sakinių. Iš pradžių patikrini kaip nuskaito duomenis ir kokius rezultatus išveda. Jei nuskaito gerai, bet rezultatai neteisingi, tai spausdini tarpinius duomenis vietose, kur sudėtingiausia logika. Pavyzdžiui, pakeitęs fragmentą iš pirmojo kodo:

 

while i<=n do
begin
 while j<=n do
 begin
   WriteLn(i, ' ', j); //*
   if zuik[i]=zuik[j]
     then Salinimas(j,n,zuik)
   else
     j:=j+1;
   i:=i+1;
 end;
end;

būtum pastebėjęs, kad i ir j kyla beveik lygiagrečiai ir nepatikrinamos visos poros.

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ą...