Korisnički Kontrolni Panel
Pogledajte svoj profil
Pogledajte svoje postove
ČPP
Prijavite se

Matematički forum na kojem možete da diskutujete o raznim matematičkim oblastima, pomognete drugima oko rešavanja zadataka, a i da dobijete pomoć kada vam zatreba


















Index stranica OSTALE MATEMATIČKE OBLASTI MATEMATIKA U INFORMATICI MATEMATIKA U PROGRAMIRANJU

[Pascal] Stringovi – izbacivanje 'and'

[Pascal] Stringovi – izbacivanje 'and'

Postod Miladin Jovic » Subota, 27. Decembar 2014, 14:55

Napisati program koji unosi niz od [inlmath]\mathtt{n}[/inlmath] stringova, a potom u svakom stringu koji u sebi sadrži reč "[inlmath]\mathtt{and}[/inlmath]", tu reč menja sa "[inlmath]\mathtt{\&}[/inlmath]".
Imam ovde nekoliko nedoumica. Prvo, ovde treba da unesemo [inlmath]\mathtt{n}[/inlmath] reči, pa da te reči posmatramo posle toga kao niz karaktera. Je li tako?
Evo kako sam ja radio, ali nije tačno:

Kôd: Obeleži sve
program stringovi;
  var n,i,j:integer;
      a:array[1..50] of string;
      b:string;

  Procedure Izmeni(s:string; var b:string);
    var n,indeks:integer;
    begin
      n:=length(s);
      For i:=1 to n do
        If ((s[i]='a') and (s[i+1]='n')) and (s[i+2]='d') then
          begin
            indeks:=i;
            For j:=1 to i-1 do b[j]:=s[j];
            b[indeks]:='&';
            indeks:=i+1;
            for j:=i+3 to n do
              begin
                b[indeks]:=s[j];
                indeks:=indeks+1;
              end;
          end;
    end;

  begin
    write('Unesite n:');
    readln(n);
    For i:=1 to n do readln(a[i]);
    For i:=1 to n do Izmeni(a[i],b);
    write(b);
  end.
Zaslužni forumaš
 
Postovi: 378
Zahvalio se: 243 puta
Pohvaljen: 138 puta

Sharuj ovu temu na:

Share on Facebook Facebook Share on Twitter Twitter Share on MySpace MySpace Share on Google+ Google+

Re: [Pascal] Stringovi – izbacivanje 'and'

Postod Miladin Jovic » Ponedeljak, 29. Decembar 2014, 12:05

Ne znam zašto sve komplikujem, kad postoji rešenje u par redova :?

Kôd: Obeleži sve
program domstring;
  var a:array[1..50] of string;
      i,j,n:integer;

  Procedure Uradi(var s:string);
    var pozicija:integer;
    begin
      pozicija:= Pos('and',s);
      If pozicija<>0 then
        begin
          Delete(s,pozicija,3);
          Insert('&',s,pozicija);
        end;
    end;

  Begin
    write('Unesi n:');
    readln(n);
    For i:=1 to n do readln(a[i]);
    writeln('Resenja:');
    For i:=1 to n do
      begin
        Uradi(a[i]);
        writeln(a[i]);
      end;
  end.
Zaslužni forumaš
 
Postovi: 378
Zahvalio se: 243 puta
Pohvaljen: 138 puta

Re: [Pascal] Stringovi – izbacivanje 'and'

Postod Miladin Jovic » Ponedeljak, 29. Decembar 2014, 13:16

A, evo i rešenja koje će menjati '[inlmath]\mathtt{and}[/inlmath]' sa '[inlmath]\mathtt{\&}[/inlmath]' koliko god puta se nalazila u jednom stringu

Kôd: Obeleži sve
program domstring;
  var a:array[1..50] of string;
      i,n:integer; pisi:boolean;

  Procedure Uradi(var s:string; var k:boolean);
    var pozicija,m,j,brojac:integer;
    begin
      m:=length(s);
      brojac:=0;
      k:=false;
      For j:=1 to m-3 do
        If ((s[j]='a') and (s[j+1]='n')) and (s[j+2]='d') then brojac:=brojac+1;
      If brojac>0 then
        begin
          k:=true;
          While brojac>0 do
            begin
              pozicija:=pos('and',s);
              Delete(s,pozicija,3);
              Insert('&',s,pozicija);
              brojac:=brojac-1;
            end;
        end;
    end;

  Begin
    write('Unesi n:');
    readln(n);
    For i:=1 to n do readln(a[i]);
    For i:=1 to n do
      begin
        Uradi(a[i],pisi);
        If pisi=true then write(a[i]);
      end;
  end.
Zaslužni forumaš
 
Postovi: 378
Zahvalio se: 243 puta
Pohvaljen: 138 puta

Re: [Pascal] Stringovi – izbacivanje 'and'

Postod Daniel » Subota, 03. Januar 2015, 10:55

Malo kasnim, tek sam sad pregledao ove kodove.

U prvoj verziji rešenja (ovoj u kojoj se vrši zamena samo jednog pojavljivanja '[inlmath]\mathtt{and}[/inlmath]' unutar svake od unetih reči) promenljiva [inlmath]\mathtt{j}[/inlmath] je suvišna. Sve ostalo je OK.

U ovoj drugoj (poslednjoj) verziji uočio sam nekoliko propusta.
– Unutar procedure, [inlmath]\mathtt{j}[/inlmath] ne treba da ide do [inlmath]\mathtt{m-3}[/inlmath], već do [inlmath]\mathtt{m-2}[/inlmath]. Ako bi išlo do [inlmath]\mathtt{m-3}[/inlmath], ne bi bili zamenjeni oni '[inlmath]\mathtt{and}[/inlmath]'-ovi koji se nalaze na samom kraju reči (primeri: [inlmath]\mathtt{1and}[/inlmath], [inlmath]\mathtt{1and2and}[/inlmath] itd.);
– umesto uslova
Kôd: Obeleži sve
If ((s[j]='a') and (s[j+1]='n')) and (s[j+2]='d')

može se iskoristiti funkcija [inlmath]\mathtt{copy}[/inlmath] radi pretrage pojavljivanja '[inlmath]\mathtt{and}[/inlmath]'-ova unutar reči:
Kôd: Obeleži sve
If (copy(s,j,3)='and')

– prilikom ispisa rezultata, radi preglednosti, koristio bih komandu [inlmath]\mathtt{writeln(a[i])}[/inlmath] umesto [inlmath]\mathtt{write(a[i])}[/inlmath];
– takođe, prilikom ispisa rezultata, ne vidim razloga da se ne prikazuju one reči u kojima nije izvršena promena (tj. reči koje ne sadrže nijedno '[inlmath]\mathtt{and}[/inlmath]'), budući da se u tekstu zadatka ništa ne kaže o tome; zato mislim da je promenljiva '[inlmath]\mathtt{pisi}[/inlmath]' suvišna.



Evo mog predloga za rešenje ovog zadatka (koristio sam i promenljivu '[inlmath]\mathtt{pisi}[/inlmath]', ali ako nije potrebna, a ja mislim da nije, ista se može i izostaviti):

Kôd: Obeleži sve
program domstring;
  var a:array[1..50] of string;
      i,n:integer; pisi:boolean;

  Procedure Uradi(var s:string; var k:boolean);
    var m,j:integer;
    begin
      m:=length(s);                              {u promenljivoj m čuvamo dužinu prvobitno
                                                 unete reči (tj. pre izvršene izmene)}
      k:=false;
      j:=1;
      while j<=length(s)-2 do                    {ispitivanje da li se pojavljuje 'and' vršimo od
                                                 prve pozicije, pa do treće pozicije od kraja}
        begin
          if copy(s,j,3)='and' then              {ako je na j-toj poziciji pronađen 'and'...}
            begin
              Delete(s,j,3);
              Insert('&',s,j);                   {zamena 'and' znakom '&'}
            end;
          j:=j+1;
        end;
      if length(s)<m then k:=true;               {ako je dužina nove reči manja od dužine
                                                 prvobitne reči, znači da je bilo izmena,
                                                 tj. da su bili pronađeni 'and'-ovi}
    end;

  Begin
    write('Unesi n:');
    readln(n);
    For i:=1 to n do readln(a[i]);
    writeln('Resenja:');
    For i:=1 to n do
      begin
        Uradi(a[i],pisi);
        If pisi=true then writeln(a[i]);
      end;
  end.

Glavna razlika ovog mog rešenja u odnosu na tvoje, to je što kod tvog rešenja petlja dvaput prolazi kroz svaku reč (prvi put da bi je skenirala i izbrojala pojavljivanja '[inlmath]\mathtt{and}[/inlmath]'-ova, a drugi put da bi se ti '[inlmath]\mathtt{and}[/inlmath]'-ovi izmenili u '[inlmath]\mathtt{\&}[/inlmath]'), dok se kod ovog rešenja koje sam predložio sve to obavlja u toku samo jednog prolaska kroz reč.
I do not fear death. I had been dead for billions and billions of years before I was born, and had not suffered the slightest inconvenience from it. – Mark Twain
Korisnikov avatar
Daniel  OFFLINE
Administrator
 
Postovi: 9300
Lokacija: Beograd
Zahvalio se: 5151 puta
Pohvaljen: 4951 puta


Povratak na MATEMATIKA U PROGRAMIRANJU

Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 15 gostiju


Index stranicaTimObriši sve kolačiće boarda
Danas je Četvrtak, 28. Mart 2024, 23:21 • Sva vremena su u UTC + 1 sat
Pokreće ga phpBB® Forum Software © phpBB Group
Prevod – www.CyberCom.rs