Zadaci za vežbu (rešenja nekih od zadataka)
U cilju vežbe, u nastavku su rešenja nekih od zadataka koji su prvobitno dati za vežbu .... neki su rešeni delimično, a neki u potpunosti .... proučiti kod kuće.
S obzirom da su u pitanju konzolne aplikacije, ako neko nema Visual Studio ili nešto slično, za ove zadatke se mogu koristiti i online platforme (Programiz, OnlineGDB, W3Schools TryIt Editor, tutorialspoint Online C# Compiler, codechef Online C# Compiler, nextleap C# Online Compiler, ...)
...
NAPOMENA: Na proveri znanja dolaze SLIČNI zadaci - ali ne isti. !
Generičke metode
Zadatak 1. (generička metoda) Kreirati generičku metodu u kojoj se ispisuje poruka da prvi argument voli drugi argument ( poziv tipa voli('a','b') vraćа "а voli b", a poziv voli(1,2) vraća "1 voli 2")
class Program
{
public static void voli<T>(T prvi, T drugi)
{
Console.WriteLine(prvi + " voli " + drugi);
}
static void Main(string[] args)
{
voli(1, 2);
voli('a','b');
voli("Ana", "Milovana");
// ...
Zadatak 1 - 1. Kreirati generičku metodu u kojoj se 3 puta ispisuje poruka koja je parametar metode (npr ispis("j") treba da ispiše u tri reda slovo j )
// ...
class Program
{
public static void poruka3x<T>(T poruka)
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(poruka);
}
}
static void Main(string[] args)
{
poruka3x("riba ribi grize rep");
poruka3x(2);
poruka3x(true); // ...
Zadatak 1 - 2. Kreirati generičku metodu koja vraća veći od dva broja bilo kog tipa (int, float, double).
Da bi bili sigurni da se vrednosti mogu porediti, potrebno je da metoda implementira interfejs IComparable - u prevodu: da je nešto što je moguće porediti.
Pošto ne znamo koji su tipovi, ne koristimo operator > niti <, već metodu CompareTo. Na primer: za y.CompareTo(z) dobija se broj >0 ako je y veće od z, 0 ako si jednaki, i broj koji je <0 ako je y manje od z.
class Program
{
public static T veci<T>(T x, T y) where T : IComparable<T>
{
T maks = x;
if (y.CompareTo(maks) > 0)
{
maks = y;
}
return maks;
}
static void Main(string[] args)
{
int a = 1, b = 101;
int veci1 = veci(a, b);
Console.WriteLine("za a="+a+" i b="+b+" veći je "+veci1);
string rec1 = "Ana";
string rec2 = "Pera";
string veci2 = veci(rec1, rec2);
Console.WriteLine("za prvu reč = " + rec1 + " i drugu reč = " + rec2 + " veći je " + veci2);
// ...
Sličan primer je postavljen u lekciji Generičke metode
Zadatak 1 - 3. Napisati generičku metodu FindMin koja vraća minimalnu vrednost između tri elementa
Da bi bili sigurni da se vrednosti mogu porediti, potrebno je da metoda implementira interfejs IComparable - u prevodu: da je nešto što je moguće porediti. (Kao u prethodnom primeru)
class Program
{
public static T FindMin<T>(T x, T y, T z) where T : IComparable<T>
{
T min = x;
if (y.CompareTo(min) < 0)
{
min = y;
}
if (z.CompareTo(min) < 0)
{
min = z;
}
return min;
}
static void Main(string[] args)
{
int a = 1, b = 101, c=1001;
int manji1 = FindMin(a, b, c);
Console.WriteLine("za a="+a+", b="+b+"c="+c +" najmanji je "+manji1);
float z = 0.23f;
float x = 1.23f;
float y = 159.26f;
float manji2 = FindMin(z, x, y);
Console.WriteLine("za z=" + z + ", x=" + x + ", y=" + y + " najmanji je " + manji2);
// ...
Generičke klase
Zadatak 2. (generička klasa) Kreirati generičku klasu Storage<T> koja može da čuva i vraća elemente različitih tipova. U glavnom programu kreirati dva objekta kreirane klase i prikazati elemente iz njega.
Rešenja: Ako se koriste atributi koji su public, u nastavku je za zadatak 3, a ako se koriste private atributi, rešenje (Box) imate u lekciji: Generičke klase
// ...
public class Storage<T>
{
public T element;
}
class Program
{
static void Main(string[] args)
{
Storage<string> rec = new Storage<string>();
rec.element = "riba ribi grize rep";
Console.WriteLine("prvi objekat sadrži: "+ rec.element);
Storage<int> broj = new Storage<int>();
broj.element = 101;
Console.WriteLine("drugi objekat sadrži: " + broj.element); // ...
Zadatak 2 - 1. Kreirati generičku klasu Pair<T1,
T2> koja može čuvati par vrednosti različitih tipova podataka. U glavnom programu kreirati bar jedan objekat kreirane klase i prikazati elemente iz njega.
I za ovaj zadatak rešenje imate u lekciji Generičke klase
Zadatak 2 - 2. Kreirati klasu Triplet<T1, T2,
T3> koja može da čuva tri elementa različitih tipova. U glavnom programu kreirati bar jedan objekat kreirane klase i prikazati elemente iz njega.
Slično kao prethodni zadatak, samo treba dodati još jedan element:
// ...
public class Triplet<T1, T2, T3>
{
public T1 a;
public T2 b;
public T3 c;
public Triplet(T1 prvi, T2 drugi, T3 treci)
{
a = prvi;
b = drugi;
c = treci;
}
}
class Program
{
static void Main(string[] args)
{
Triplet<int, string, string> trio = new Triplet<int, string, string>(1, "Ana", "Marija");
Console.WriteLine("Prvi deo: " + trio.a + " , Drugi deo: " + trio.b + ", treći deo: " + trio.c);
// Output: Prvi deo: 1, Drugi deo: Ana, treći deo: Marija
}
}
Zadatak 2 - 3. Kreirati generičku klasu Pair<T1,
T2> koja može čuvati par vrednosti različitih tipova podataka i implementirati metodu za prikaz ovih vrednosti. Dodatno kreirati i metodu koja pronalazi da li postoji par u kojem se nalazi neka zadata vrednost i ispisuje poruku da li postoji ili ne ... .
public class Pair<T1, T2>
{
// Polja koja čuvaju vrednosti
public T1 Prvi { get; set; }
public T2 Drugi { get; set; }
// Konstruktor za inicijalizaciju vrednosti para
public Pair(T1 first, T2 second)
{
Prvi = first;
Drugi = second;
}
// Metoda za prikaz vrednosti para
public void Prikaz()
{
Console.WriteLine("Prvi: "+ Prvi + ", Drugi: "+ Drugi);
}
// Metoda za pronalaženje da li par sadrži zadatu vrednost
public bool ImaVrednost<T>(T value)
{
if (Prvi.Equals(value) || Drugi.Equals(value))
{
Console.WriteLine("Vrednost "+ value + " postoji u paru.");
return true;
}
else
{
Console.WriteLine("Vrednost " + value + " NE postoji u paru.");
return false;
}
}
}
class Program
{
static void Main(string[] args)
{
// Primer kreiranja para
Pair<int, string> par = new Pair<int, string>(1, "Hello");
// Prikaz vrednosti para
par.Prikaz();
// Provera da li par sadrži vrednost 1
par.ImaVrednost(1);
// Provera da li par sadrži vrednost "World"
par.ImaVrednost("World");
// **
List
Zadatak 3. (List) Kreirati listu koja skladišti nazive proizvoda. Dodati nekoliko proizvoda u listu. Ispisati sve elemente iz liste...
static void Main(string[] args)
{
List<string> proizvod = new List<string>();
proizvod.Add("kikiriki");
proizvod.Add("semenke");
proizvod.Add("kokice");
foreach (var stavka in proizvod)
{
Console.WriteLine(stavka);
}
}
Zadatak 3 - 1. (List) Kreirati listu koja skladišti nazive proizvoda. korisnik dodaje nekoliko proizvoda u listu. Ispisati sve elemente iz liste. ...
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// Kreiranje liste za skladištenje naziva proizvoda
List<string> products = new List<string>();
string input;
Console.WriteLine("Unesite nazive proizvoda (unesite 'kraj' za prekid unosa):");
// Petlja koja omogućava unos proizvoda sve dok korisnik ne unese 'kraj'
do
{
// Čitanje unosa korisnika
input = Console.ReadLine();
// Ako unos nije 'kraj', dodaje proizvod u listu
if (input.ToLower() != "kraj")
{
products.Add(input);
Console.WriteLine("Proizvod "+ input + " je dodat.");
}
} while (input.ToLower() != "kraj"); // Petlja se završava kada korisnik unese 'kraj'
// Prikaz svih unesenih proizvoda nakon završetka unosa
Console.WriteLine("\nLista unesenih proizvoda:");
foreach (var product in products)
{
Console.WriteLine(product);
}
}
}
Zadatak 3 - 2. (List) Kreirati generičku metodu koja pronalazi određeni proizvod na osnovu unetog naziva. Ako proizvod postoji u listi ispisati poruku da proizvod postoji i njegov index, a ako ga nema u listi, onda ispisati odgovarajuću poruku ....
//****
// Generička metoda koja pronalazi proizvod po nazivu static void FindProduct<T>(List<T> productList, T product) { // Provera da li proizvod postoji u listi int index = productList.IndexOf(product); if (index != -1) { Console.WriteLine("Proizvod "+ product + " postoji na indeksu "+ index); } else { Console.WriteLine("Proizvod " + product + " NE postoji u listi."); } }
static void Main(string[] args) { //**** // Traženje proizvoda po nazivu Console.WriteLine("\nUnesite naziv proizvoda koji želite da pronađete:"); string inputProduct = Console.ReadLine(); // Pozivanje generičke metode za pronalazak proizvoda FindProduct(products, inputProduct);
//****
Zadatak 3 - 3. (List) Kreirati metodu koja treba da obriše proizvod iz liste na osnovu unetog indeksa elementa u listi. Ako takav element ne postoji, ispisati odgovarajuću poruku....
//****
// Metoda koja briše proizvod iz liste na osnovu indeksa static void DeleteProductByIndex(List<string> productList, int index) { // Provera da li je indeks u granicama liste if (index >= 0 && index < productList.Count) { // Ispisujemo poruku i brišemo element Console.WriteLine("Proizvod " + productList[index] + " na indeksu "+ index + " je obrisan."); productList.RemoveAt(index); } else { // Ako indeks nije validan, ispisujemo poruku Console.WriteLine("Nema proizvoda na indeksu + "index"); } } //****
static void Main(string[] args) {
//****
// Poziv metode za brisanje proizvoda po indeksu DeleteProductByIndex(products, index); // Prikaz proizvoda nakon brisanja Console.WriteLine("\nLista proizvoda nakon brisanja:"); foreach (var product in products) { Console.WriteLine(product); }
//******
Zadatak 3 - 4. (List) Kreirati metodu koja treba da obriše proizvod iz liste na osnovu unetog naziva proizvoda, gde se briše prvi element sa takvim nazivom. Ako nijedan takav element ne postoji, ispisati odgovarajuću poruku. Ako ima makar jedan, ispisati poruku na kojem je indeksu taj element bio pre brisanja....
//****
// Metoda koja briše prvi element sa unetim nazivom static void DeleteProductByName(List<string> productList, string productName) { // Provera da li se proizvod nalazi u listi i dobijanje njegovog indeksa int index = productList.IndexOf(productName); if (index != -1) { Console.WriteLine("Proizvod "+ productName + " na indeksu "+ index + " je obrisan."); productList.RemoveAt(index); // Brisanje proizvoda na pronađenom indeksu } else { Console.WriteLine("Proizvod "+ productName + " nije pronađen u listi."); } }
static void Main(string[] args) { //****
// Poziv metode za brisanje proizvoda po nazivu DeleteProductByName(products, productName); //****
Dictionary (rečnik)
Zadatak 4. Kreirati rečnik stranih reči. Dodati nekoliko stranih reči i njihovo značenje na našem jeziku. Zatim ispisati sve....
static void Main(string[] args)
{
Dictionary<string, string> recnik = new Dictionary<string, string>();
recnik["year"] = "godina";
recnik["popcorn"] = "kokice";
recnik["month"] = "mesec";
foreach (var rec in recnik)
{
Console.WriteLine(rec.Key + " : " + rec.Value);
} //...
Zadatak 4 - 1: Kreirati rečnik koji povezuje imena sa godinama. Dodati nekoliko parova ključ-vrednost i prikazati sve parove.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Kreiramo rečnik sa parovima ime-godine
Dictionary<string, int> imenaIGodine = new Dictionary<string, int>();
// Dodavanje nekoliko parova u rečnik
imenaIGodine.Add("Ana", 25);
imenaIGodine.Add("Marko", 30);
imenaIGodine.Add("Jelena", 22);
imenaIGodine.Add("Ivan", 28);
// Prikaz svih parova (ime-godine)
Console.WriteLine("Imena i godine:");
foreach (KeyValuePair<string, int> par in imenaIGodine)
{
Console.WriteLine("Ime: " + par.Key + ", Godine: " + par.Value);
}
}
}
Objašnjenje:
Dictionary<string, int>je rečnik gde je ključstring(ime), a vrednostint(godine).- Metoda
Adddodaje nove parove ključ-vrednost (ime-godine) u rečnik. KeyValuePair<string, int>omogućava da iteriramo kroz rečnik i pristupimo svakom paruKey(ime) iValue(godine).foreachpetlja prolazi kroz svaki par u rečniku i ispisuje ih.
Zadatak 4 - 2:Kreirati metodu kojom se traži značenje neke reči, a ako je u rečniku nema, ispisati odgovarajuću poruku .
Rešenje može da se dobije na više načina. Prvi način (koji je rađen u školi) je da se koristi metoda TryGetValue: , a drugi način je da se koristi metoda ContainsKey, i za to je , a iza sledećeg dugmenceta možete videti jedan
Console.WriteLine("Unesi reč koju tražiš u rečniku: ");
string rec = Console.ReadLine();
string znacenje;
bool imaReci = recnik.TryGetValue(rec, out znacenje);
if (imaReci)
{
Console.WriteLine("značenje reči je "+znacenje);
}
else
{
Console.WriteLine("nema tražene reči u rečniku");
}
Console.WriteLine("Unesi reč koju tražiš u rečniku: ");
string rec = Console.ReadLine();
if(recnik.ContainsKey(rec))
{
Console.WriteLine("značenje reči "+ rec +" je " + recnik[rec]);
}
else
{
Console.WriteLine("nema tražene reči u rečniku");
}
//***
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Kreiranje rečnika sa parovima ključ-vrednost (reči i značenja)
Dictionary<string, string> recnik = new Dictionary<string, string>()
{
{ "jabuka", "Vrsta voća." },
{ "kompjuter", "Elektronski uređaj za obradu podataka." },
{ "programiranje", "Pisanje instrukcija koje kompjuter izvršava." }
};
// Poziv metode za traženje značenja reči
PronadjiZacenje(recnik, "kompjuter");
PronadjiZacenje(recnik, "telefon");
}
// Metoda za pronalaženje značenja reči u rečniku
static void PronadjiZacenje(Dictionary<string, string> recnik, string rec)
{
if (recnik.ContainsKey(rec))
{
Console.WriteLine("Reč: "+ rec + ", Značenje: "+ recnik[rec]);
}
else
{
Console.WriteLine("Reč " + rec + " nije pronađena u rečniku.");
}
}
}
Objašnjenje:
- Rečnik (
Dictionary<string, string>) sadrži paroveključ-vrednostgde jeključreč, avrednostnjeno značenje. - Metoda
PronadjiZacenjeproverava da li se reč nalazi u rečniku pomoću metodeContainsKey. - Ako reč postoji, ispisuje njeno značenje, a ako ne postoji, ispisuje poruku da reč nije pronađena.
Zadatak 4 - 3. Kreirati rečnik koji povezuje imena sa godinama. Dodati nekoliko parova ključ-vrednost i prikazati sve parove. Kreirati metodu koja radi ažuriranje vrednosti za određeni ključ. Zatim kreirati generičku metodu koja briše par iz rečnika, tako što se kao parametar navodi i ključ i vrednost, pa ako ih ima u rečniku, onda ih izbrisati, a ako ih nema, ispisati odgovarajuću poruku. Alternativno, može se kreirati generička metoda za unos određenog broja novih parova u rečnik. ... ...
using System;
using System.Collections.Generic;
class Program
{
// Kreiramo rečnik koji povezuje imena sa godinama
static Dictionary<string, int> nameAgeDictionary = new Dictionary<string, int>();
// Metoda za prikaz svih parova iz rečnika
static void DisplayAllPairs()
{
foreach (var pair in nameAgeDictionary)
{
Console.WriteLine("Name: "+pair.Key+ ", Age: "+ pair.Value);
}
}
// Metoda za ažuriranje vrednosti (godina) za određeni ključ (ime)
static void UpdateValue(string key, int newValue)
{
if (nameAgeDictionary.ContainsKey(key))
{
nameAgeDictionary[key] = newValue;
Console.WriteLine("Updated: " + key + "is now "+ newValue + " years old.");
}
else
{
Console.WriteLine("Key " +key+ " not found.");
}
}
// Generička metoda za brisanje para ako se ključ i vrednost poklapaju
static void DeletePairIfMatch<TKey, TValue>(TKey key, TValue value)
{
if (nameAgeDictionary.ContainsKey(key.ToString()) && nameAgeDictionary[key.ToString()].Equals(value))
{
nameAgeDictionary.Remove(key.ToString());
Console.WriteLine("Removed pair: " +key+ " - "+ value);
}
else
{
Console.WriteLine("Pair " + key + " - " + value + " NOT found in dictionary.");
}
}
// Generička metoda za unos određenog broja novih parova u rečnik
static void AddPairs<TKey, TValue>(List<KeyValuePair<TKey, TValue>> pairs)
{
foreach (var pair in pairs)
{
if (!nameAgeDictionary.ContainsKey(pair.Key.ToString()))
{
nameAgeDictionary.Add(pair.Key.ToString(), Convert.ToInt32(pair.Value));
Console.WriteLine("Added pair: "+ pair.Key + " - " + pair.Value);
}
else
{
Console.WriteLine("Key " + pair.Key + " already exists.");
}
}
}
static void Main(string[] args)
{
// Dodajemo nekoliko parova u rečnik
nameAgeDictionary.Add("John", 25);
nameAgeDictionary.Add("Alice", 30);
nameAgeDictionary.Add("Bob", 22);
// Prikaz svih parova
Console.WriteLine("All pairs:");
DisplayAllPairs();
// Ažuriranje vrednosti za određeni ključ
Console.WriteLine("\nUpdating John's age to 26:");
UpdateValue("John", 26);
// Ponovni prikaz nakon ažuriranja
Console.WriteLine("\nAll pairs after update:");
DisplayAllPairs();
// Brisanje para ako se ključ i vrednost poklapaju
Console.WriteLine("\nAttempting to delete pair (Alice, 30):");
DeletePairIfMatch("Alice", 30);
// Ponovni prikaz nakon brisanja
Console.WriteLine("\nAll pairs after deletion:");
DisplayAllPairs();
// Unos novih parova
Console.WriteLine("\nAdding new pairs:");
List<KeyValuePair<string, int>> newPairs = new List<KeyValuePair<string, int>>
{
new KeyValuePair<string, int>("Eve", 29),
new KeyValuePair<string, int>("Charlie", 35),
new KeyValuePair<string, int>("John", 40) // John već postoji
};
AddPairs(newPairs);
// Prikaz svih parova nakon unosa novih parova
Console.WriteLine("\nAll pairs after adding new pairs:");
DisplayAllPairs();
}
}
Stack
Zadatak 5. Implementirati jednostavan algoritam koji koristi stek za obrnut redosled niza reči i rečenica. Korisnik treba preko tastature da unosi reči i rečenice, sve dok se ne unese -1 kao oznaka za kraj unosa. Nakon toga ispisati sve što je unošeno, ali u obrnutom redosledu od unosa.
static void Main()
{
// Kreiramo stek (Stack) za reči/rečenice
Stack<string> stek = new Stack<string>();
string unos;
Console.WriteLine("Unosite reči i rečenice. Za kraj unosa unesite '-1'.");
// Unos reči/rečenica sve dok korisnik ne unese '-1'
do
{
unos = Console.ReadLine();
if (unos != "-1")
{
stek.Push(unos); // Dodajemo unos na vrh steka
}
} while (unos != "-1");
// Ispis unetih reči/rečenica u obrnutom redosledu
Console.WriteLine("\nUnete reči/rečenice u obrnutom redosledu:");
while (stek.Count > 0)
{
Console.WriteLine(stek.Pop()); // Skidamo sa vrha steka i ispisujemo
}
}
Objašnjenje:
Stack<string>predstavlja stek koji se koristi za skladištenje unetih reči i rečenica.Pushmetoda dodaje elemente na vrh steka.Popmetoda skida elemente sa vrha steka (ovim ostvarujemo obrnut redosled unosa).- Petlja
do-whileomogućava unos korisničkih podataka dok se ne unese"–1"kao oznaka za kraj. - Na kraju, petlja
whilese koristi za ispis unosa u obrnutom redosledu sve dok stek nije prazan
Ovaj program koristi stek da bi prikazao sve unesene podatke u obrnutom redosledu, pošto je stek struktura podataka koja radi po principu LIFO (Last In, First Out).
Zadatak 5 - 1 (Stack) Implementirati jednostavan algoritam koji koristi stek za obrnut redosled niza brojeva.....
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Kreiramo stek (Stack) za brojeve
Stack<int> stek = new Stack<int>();
// Unos brojeva od strane korisnika
Console.WriteLine("Unesite niz brojeva. Za kraj unosa unesite -1.");
int broj;
do
{
broj = int.Parse(Console.ReadLine());
if (broj != -1)
{
stek.Push(broj); // Dodajemo broj na vrh steka
}
} while (broj != -1);
// Ispis brojeva u obrnutom redosledu
Console.WriteLine("\nBrojevi u obrnutom redosledu:");
while (stek.Count > 0)
{
Console.WriteLine(stek.Pop()); // Skidamo sa vrha steka i ispisujemo
}
}
}
Objašnjenje:
Stack<int>predstavlja stek koji se koristi za skladištenje unetih brojeva.Pushmetoda dodaje broj na vrh steka.Popmetoda skida broj sa vrha steka, omogućavajući ispis brojeva u obrnutom redosledu.- Korisnik unosi brojeve sve dok ne unese
-1kao znak za završetak unosa. whilepetlja ispisuje brojeve iz steka po principu LIFO (Last In, First Out).
Queue (red)
Zadatak 6. Napraviti aplikaciju koja simulira red čekanja za servis. Dodati nekoliko zadataka. Nakon toga ispisati sve zadatke, onim redom kojim su uneti.
, a iza sledećeg dugmenceta možete videti jedan kompletan primer :
static void Main(string[] args)
{
Queue<string> redServis = new Queue<string>();
redServis.Enqueue("kompjuter od kuma Pere");
redServis.Enqueue("laptop popa Sime");
redServis.Enqueue("monitor male Milene");
while (redServis.Count > 0)
{
Console.WriteLine(redServis.Dequeue());
}
//...
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Kreiramo red čekanja (Queue) za zadatke
Queue<string> redCekanja = new Queue<string>();
// Dodavanje nekoliko zadataka u red
redCekanja.Enqueue("Zadatak 1: Popravka računara");
redCekanja.Enqueue("Zadatak 2: Instalacija softvera");
redCekanja.Enqueue("Zadatak 3: Čišćenje virusa");
redCekanja.Enqueue("Zadatak 4: Ažuriranje operativnog sistema");
// Ispis svih zadataka onim redom kojim su uneti
Console.WriteLine("Zadaci u redu čekanja:");
foreach (string zadatak in redCekanja)
{
Console.WriteLine(zadatak);
}
// Simulacija izvršavanja zadataka (prvi ulazi, prvi izlazi)
Console.WriteLine("\n Izvršavanje zadataka:");
while (redCekanja.Count > 0)
{
string trenutniZadatak = redCekanja.Dequeue();
Console.WriteLine("Izvršava se: " + trenutniZadatak);
}
}
}
Objašnjenje:
Queue<string>predstavlja red čekanja za zadatke. Koristimo generičku kolekcijuQueuegde su zadaci tipastring.Enqueuemetoda dodaje zadatke u red onim redom kojim stižu.Dequeuemetoda skida zadatak s početka reda i vraća ga, simulirajući izvršavanje.Countvraća broj zadataka u redu, što koristimo da proverimo kada red postane prazan.- Prvo se ispisuju svi zadaci u redu čekanja, a zatim se simulira njihovo izvršavanje po principu "prvi ulazi, prvi izlazi" (FIFO - First In, First Out).
Nasleđivanje sa ograničenjima
Zadatak 7. Kreirati klasu koja nasleđuje generičku klasu Pair<T1, T2> sa ograničenjem da generički tip mora biti string.
Korak 1: Definisanje generičke klase Pair<T1, T2>
public class Pair<T1, T2>
{
public T1 First { get; set; }
public T2 Second { get; set; }
public Pair(T1 first, T2 second)
{
First = first;
Second = second;
}
public void DisplayPair()
{
Console.WriteLine("First: "+ First + ", Second: " + Second);
}
}
Korak 2: Kreiranje klase koja nasleđuje Pair<T1, T2>, ali ograničava generički tip na string
public class StringPair : Pair<string, string>
{
public StringPair(string first, string second) : base(first, second)
{
}
}
Objašnjenje:
Pair<T1, T2>je generička klasa koja može primati bilo koji tip zaT1iT2.- Ima dva svojstva:
FirstiSecond, koja predstavljaju generičke vrednosti. - Konstruktor klase prima vrednosti za
T1iT2, koje postavlja u odgovarajuća svojstva. - Metoda
DisplayPairispisuje par vrednosti.
- Ima dva svojstva:
StringPairje specifična klasa koja nasleđuje generičku klasuPair<T1, T2>ali je ograničena tako daT1iT2moraju bitistring.- Koristi konstruktor roditeljske klase
baseda prosledi vrednosti tipuPair<string, string>.
- Koristi konstruktor roditeljske klase
Primer korišćenja:
static void Main()
{
// Kreiramo objekat klase StringPair sa dva stringa
StringPair par = new StringPair("Hello", "World");
// Ispisujemo vrednosti
par.DisplayPair();
}
Jedan zadatak sa nizovima:
Zadatak 8. Kreirati metodu PrintArray koja treba da ispiše sve elemente niza redom, bez obzira na tip podataka u nizu. Zatim u glavnom programu kreirati nizove od po 5 elemenata (nizReči, nizSlova, nizBrojeva). Korisnik treba da unosi, pomoću tastature, elemente svakog od nizova. Primenom kreirane metode ispisati elemente samo jednog niza uz adekvatne oznake prilikom ispisa - izbor niza da je na korisniku.
using System;
class Program
{
// Generička metoda za ispis elemenata niza
public static void PrintArray<T>(T[] array)
{
Console.WriteLine("Elementi niza su:");
foreach (T element in array)
{
Console.WriteLine(element);
}
}
static void Main(string[] args)
{
// Kreiranje nizova
string[] nizReci = new string[5];
char[] nizSlova = new char[5];
int[] nizBrojeva = new int[5];
// Unos elemenata za niz reči
Console.WriteLine("Unesite 5 reči:");
for (int i = 0; i < nizReci.Length; i++)
{
Console.Write("Reč " + (i + 1) + ": ");
nizReci[i] = Console.ReadLine();
}
// Unos elemenata za niz slova
Console.WriteLine("Unesite 5 slova:");
for (int i = 0; i < nizSlova.Length; i++)
{
Console.Write("Slovo " + (i + 1) + ": ");
nizSlova[i] = Convert.ToChar(Console.ReadLine());
}
// Unos elemenata za niz brojeva
Console.WriteLine("Unesite 5 brojeva:");
for (int i = 0; i < nizBrojeva.Length; i++)
{
Console.Write("Broj "+ (i + 1) + ": ");
nizBrojeva[i] = Convert.ToInt32(Console.ReadLine());
}
// Izbor niza za ispis
Console.WriteLine("Izaberite niz za ispis: (1 - Reči, 2 - Slova, 3 - Brojevi)");
int izbor = Convert.ToInt32(Console.ReadLine());
// Ispis odgovarajućeg niza
switch (izbor)
{
case 1:
Console.WriteLine("Izabrali ste niz reči.");
PrintArray(nizReci);
break;
case 2:
Console.WriteLine("Izabrali ste niz slova.");
PrintArray(nizSlova);
break;
case 3:
Console.WriteLine("Izabrali ste niz brojeva.");
PrintArray(nizBrojeva);
break;
default:
Console.WriteLine("Neispravan izbor.");
break;
}
}
}
Objašnjenje:
-
Generička metoda
PrintArray<T>: Ova metoda prihvata niz bilo kog tipa (zahvaljujući generikuT) i ispisuje sve njegove elemente koristećiforeachpetlju. -
Unos podataka: Korisnik unosi podatke za nizove reči, slova i brojeva pomoću
Console.ReadLine()i odgovarajuće konverzije podataka (Convert.ToChariConvert.ToInt32). -
Izbor niza: Korisnik bira jedan od nizova za ispis (1 - Reči, 2 - Slova, 3 - Brojevi), a program ispisuje odabrani niz koristeći generičku metodu
PrintArray. -
Ispis uz oznake: Pre ispisa, program prikazuje odgovarajuću oznaku koji je niz izabran.