Koriscenje naredbi za kontrolu toka u obradi niza

Moze. Opet C#
Parsiranje teksta
Dat je sledeći string kojim se predstavljaju podaci tri osobe:

string text = 'John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow'.

Potrebno je napraviti logiku koja će iz ovog zapisa izvući pojedinačne podatke:

  • ime;
  • prezime;
  • mesto rođenja.
Drugim rečima, potrebno je obraditi prikazani string korišćenjem metoda klase String i izvući pojedinačne podatke svake osobe. Osnovna metoda koju je potrebno koristiti jeste ona za podelu stringova na više delova.

Dobijene pojedinačne delove (ime, prezime, grad), potrebno je iskoristiti za kreiranje objekata tipa Person. Stoga je u programu potrebno napraviti klasu Person, kao i adekvatna polja u okviru nje (ime, prezime, grad). Dakle, u klasi Person treba da postoje tri polja i konstruktor za inicijalizaciju njihovih vrednosti.

Sve objekte koji predstavljaju osobe potrebno je upakovati u jedan niz (niz treba da bude tipa Person[]). Kako biste se uverili da je sve obavljeno kako treba, na kraju je potrebno proći kroz niz objekata i ispisati podatke o osobama. Stoga je unutar klase Person potrebno da postoji i metoda za ispis podataka objekata, koja će da formira ispis u sledećem obliku:

John Davidson Belgrade
Michael Barton Krakow
Ivan Perkinson Moscow

Ukratko, tok programa treba da bude ovakav:

  • dati string delite na više delova kako biste dobili imena, prezimena i gradove
  • dobijene podatke koristite za kreiranje tri objekta tipa Person
  • dobijene objekte tipa Person smeštate unutar jednog Person[] niza
  • na kraju, prolazite kroz niz osoba i na izlazu prikazujete njihove podatke.
Evo, jedino nisam hteo da se smaram sa formatiranjem outputa, jer mislim da je besmisleno :P
(Haskell)
Kod:
text = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow"
data Person = Person String String String
 deriving Show
parse_text t = pt (words t) []
             where
               pt [] d = d
               pt (x:xs) d = split x : pt xs d
               split xs = split' xs []
               split' (x:xs) c = if x == '/' then split'' (c,xs) [] [] else split' xs (x:c)
               split'' (x:xs,y) c d = if x == '.' then Person (reverse xs) c y:d else split'' (xs,y) (x:c) d
main = print $ parse_text text
a ovako izgleda output:
Kod:
~/.../examples/haskell >>> ./parse_fnlnc
[[Person "John" "Davidson" "Belgrade"],[Person "Michael" "Barton" "Krakow"],[Person "Ivan" "Perkinson" "Moscow"]]
 
Evo, jedino nisam hteo da se smaram sa formatiranjem outputa, jer mislim da je besmisleno :P
(Haskell)
Kod:
text = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow"
data Person = Person String String String
 deriving Show
parse_text t = pt (words t) []
             where
               pt [] d = d
               pt (x:xs) d = split x : pt xs d
               split xs = split' xs []
               split' (x:xs) c = if x == '/' then split'' (c,xs) [] [] else split' xs (x:c)
               split'' (x:xs,y) c d = if x == '.' then Person (reverse xs) c y:d else split'' (xs,y) (x:c) d
main = print $ parse_text text
a ovako izgleda output:
Kod:
~/.../examples/haskell >>> ./parse_fnlnc
[[Person "John" "Davidson" "Belgrade"],[Person "Michael" "Barton" "Krakow"],[Person "Ivan" "Perkinson" "Moscow"]]
A sto haskel?
 
Da. "For petljom treba da prođete kroz niz array i da IF uslovom proverite pozitivne i negativne brojeve, pa u zavisnosti od toga da ih upišete u odgovarajuće nizove (niz za pozitivne i niz za negativne)." Kaze profesor.
Да, али најпре једном проћи for петљом да увтрдиш колико имаш позитивних, па на основу тог броја формираш низ фиксне дужине, па тек онда радиш то.

Ево ти ово друго. Недостају get и set методе у класи, да би било како он хоће. То можеш и сама.
C#:
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<Person> persons = new List<Person>();
        string str = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow";
        string[] strlist = str.Split(' ');
        foreach (String s in strlist)
        {
            string[] strlist2 = s.Split('/');
            Person person = new Person();
            person.city = strlist2[1];
            string[] strlist3 = strlist2[0].Split('.');
            person.name = strlist3[0];
            person.surname = strlist3[1];
            persons.Add(person);
        }

        for (int i = 0; i < persons.Count; i++)
        {
            persons[i].writeMe();
        }
    }
}

public class Person
{
    public string name;
    public string surname;
    public string city;
    public void writeMe()
    {
        Console.WriteLine(this.name + " " + this.surname + " " + this.city);
    }
}
 
Poslednja izmena:
Да, али најпре једном проћи for петљом да увтрдиш колико имаш позитивних, па на основу тог броја формираш низ фиксне дужине, па тек онда радиш то.

Ево ти ово друго. Недостају get и set методе у класи, да би било како он хоће. То можеш и сама.
C#:
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<Person> persons = new List<Person>();
        string str = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow";
        string[] strlist = str.Split(' ');
        foreach (String s in strlist)
        {
            string[] strlist2 = s.Split('/');
            Person person = new Person();
            person.city = strlist2[1];
            string[] strlist3 = strlist2[0].Split('.');
            person.name = strlist3[0];
            person.surname = strlist3[1];
            persons.Add(person);
        }

        for (int i = 0; i < persons.Count; i++)
        {
            persons[i].writeMe();
        }
    }
}

public class Person
{
    public string name;
    public string surname;
    public string city;
    public void writeMe()
    {
        Console.WriteLine(this.name + " " + this.surname + " " + this.city);
    }
}
Hvala😊
 
C# ima Linq biblioteku, i pomoću nje moze da se to resi u dve linije koda.

Kucam sa mobilnog, pa oprostite na gresci u sintaksi, ali odprilike bi islo ovako:

var positiveArray = array.Where(x => x >0);
var negativeArray = array.Where(x=> x<0);

Printujes ih kako zelis i to je to.
kog je tipa array?
u Haskellu isto to bez biblioteke:
Kod:
filt' xs = (filter (\x -> x > 0) xs,filter (\x  -> x < 0)  xs)
 
Solucija 1

solucija1.png


Solucija 2

solucija2.png
 
kog je tipa array?
u Haskellu isto to bez biblioteke:
Kod:
filt' xs = (filter (\x -> x > 0) xs,filter (\x  -> x < 0)  xs)

array je naziv promenljive tipa int[], a podrazumeva se da je u njega smesten ulazni niz.
array moze biti i List<int>, isto cr da radi, posto biblioteka System.Linq ima ekstenzije i za nizove i za liste.

Jos preciznije: bazna klasa za liste je IEnumerable<T>, tako da bi ovo radilo i da je ulazni niz smesten i u promenljivu generickog tipa IEnumerable<int>.

Linq je mnogo mocna biblioteka, i nema dana da je ne koristim :)
 
Edit prethodnog posta:
IEnumerable<T> je interfejs koji implementiraju sve klase koje imaju enumerator u sebi.
A Linq biblioteka klasa sadrzi ekstenzije za sve klase koje implementiraju taj interfejs.
Te ekstenzije omogucuju mnogo cistiji kod, i izbegavanje pisanja silnih petlji.
Logika koriscenja je slicna kao kod SQL-a, te zato imamo ekstenzije Where, OrderBy, GroupBy, zatim First, FirstOrDefault, i mnoge druge.
Ali ovih 5 je dovoljno za mnogo magije 😎
 
array je naziv promenljive tipa int[], a podrazumeva se da je u njega smesten ulazni niz.
array moze biti i List<int>, isto cr da radi, posto biblioteka System.Linq ima ekstenzije i za nizove i za liste.

Jos preciznije: bazna klasa za liste je IEnumerable<T>, tako da bi ovo radilo i da je ulazni niz smesten i u promenljivu generickog tipa IEnumerable<int>.

Linq je mnogo mocna biblioteka, i nema dana da je ne koristim :)
Da li je klasican staticki niz IENumerable, tj da li mozes da dodas to na obican niz? To je fora iz funkcionalnih jezika, a svi moderni
su preuzeli... Rust recimo to koristi maks, a mislim da su uveli i u C++, mada C++ to mozes i bez specifikacije
jer su takvi templatei.
 
Da li je klasican staticki niz IENumerable, tj da li mozes da dodas to na obican niz? To je fora iz funkcionalnih jezika, a svi moderni
su preuzeli... Rust recimo to koristi maks, a mislim da su uveli i u C++, mada C++ to mozes i bez specifikacije
jer su takvi templatei.

IEnumerable je interfejs, a njegove implementacije su razlicite vrste kolekcija.
Klasican niz je niz. Nista ni manje ni vise.

Linq biblioteka, sve ekstenzije koje je implementirala za implementacije IEnumerable interfejsa, implementirala je i za klasicne nizove, tako da "Where", "OrderBy" i ostale funkcije/extenzije rade i za klasicne nizove.

To znaci da mozes da napises:

var arrayOfPositive = array.Where(x => x>0);

......gde je array definisaj kao klasican niz integera:

int[] array
 
Kompajira se kao Java u bytecode koji izvrsava interpreter/virtualna masina. C# ne kompajilra u native binary.
JS takodje moze u bytecode da se kompajlira, sto da ne?
C# se ne kompajlira u native CPU code, ali se ni ne kompajlira ni u byte code - nema nikakve veze sa time kako Java to radi.
Nemo' da zbunjujes decu :) Dovoljno su svi zamutili vodu sa raznim idejama i implementacijama.

Aj da se segacimo i na dalje... TypeScript je takodje kompajler. Samo sto se kompajlira u interpreter (t.j. u Javascript) a mogao bi sto se mene licno tice da se kompajlira u PHP, Python, Rust ili Go :cepanje: jedino sto ne znam kako bi simulirali OO u jezicima koji nemaju taj koncept.
 
C# se ne kompajlira u native CPU code, ali se ni ne kompajlira ni u byte code
Nego u sta se kompajlira nego u bytecode?
https://en.wikipedia.org/wiki/Common_Intermediate_Language#:~:text=CIL is object-oriented, stack-based bytecode. Runtimes typically just-in-time,bytecode is now officially known as CIL.
Due to standardization of C# and the CLI, the bytecode is now officially known as CIL.
a sad ti zamucujes vodu:
"TypeScript je takodje kompajler. Samo sto se kompajlira u interpreter"
Po tome se i JS kompajlira, isto... na isti nacin kao i C# jer mozes da zapakujes u exe
sve sa interpreterom :P
No dobro znamo sta je kompajler, misli se na kompajliranje u native binary...
 
Poslednja izmena:
Да, али најпре једном проћи for петљом да увтрдиш колико имаш позитивних, па на основу тог броја формираш низ фиксне дужине, па тек онда радиш то.

Ево ти ово друго. Недостају get и set методе у класи, да би било како он хоће. То можеш и сама.
C#:
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<Person> persons = new List<Person>();
        string str = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow";
        string[] strlist = str.Split(' ');
        foreach (String s in strlist)
        {
            string[] strlist2 = s.Split('/');
            Person person = new Person();
            person.city = strlist2[1];
            string[] strlist3 = strlist2[0].Split('.');
            person.name = strlist3[0];
            person.surname = strlist3[1];
            persons.Add(person);
        }

        for (int i = 0; i < persons.Count; i++)
        {
            persons[i].writeMe();
        }
    }
}

public class Person
{
    public string name;
    public string surname;
    public string city;
    public void writeMe()
    {
        Console.WriteLine(this.name + " " + this.surname + " " + this.city);
    }
}
Koristila sam tvoj kod, dobio si pohvale😁. Medjutim, treba napisati u niz string, ne list string. Pokusala sam izmeniti kod, ali mi ne ide. Mozes li mi reci gdje grijesim?
 

Prilozi

  • Screenshot_20221127-125019_Gallery.jpg
    Screenshot_20221127-125019_Gallery.jpg
    70,6 KB · Pregleda: 35

Back
Top