PRIPREMA ZA OKRUŽNA TAKMIČENJA: 5 i 6. RAZRED
Sadržaj stranice
Dobrodošli na stranicu posvećenu pripremi za okružna takmičenja iz informatike za 5. i 6. razred. Ova stranica je deo sveobuhvatnog programa pripreme koji pretpostavlja osnovno znanje iz oblasti, a ovde se to znanje dopunjuje specifičnostima takmičarskog programa. Na ovoj stranici možete pronaći ključne teme, primere zadataka, objašnjenja i interaktivne alate koji će vam pomoći da se bolje pripremite za takmičenja.
Uvod
Složen ulaz i formatiran izlaz
Složen ulaz
- Sledeći primer pokazuje učitavanje iz više redova, gde se prvo učitava broj redova i gde svaki red sadrži jedan podatak.
Tekst zadatka(Deo zadataka "Majstor" sa prvog kruga kvalifikacija. Vidite 4. zadatak na strani kvalifikacije za okružna takmičenja - za 6 razred): U prvoj liniji standardnog ulaza unosi se ukupan broj kutija n ( 2 ≤ n ≤ 30). Zatim se u narednih n linija unose brojevi šrafova u kutijama ki (1≤ki ≤100), redom.
using namespace std;
int main() {
cout << "Unesite broj kutija: ";
cin >> n; // Učitavanje broja kutija (n)
int srafoviUKutijama[n]; // Kreiranje niza koji čuva broj šrafova po kutijama
cout << "Unesite broj šrafova za svaku kutiju: " << endl;
for (int i = 0; i < n; i++) { // Iteriranje kroz sve kutije
return 0; // Završetak programa
Formatiran izlaz
x=2.345677696787
a=23
x=2.3457
a=23.000
Za određivanje broja decimala pri zaokruživanju koristiti ugrađenu funkciju: precision(), a za određivanje broja decimalnih mesta za prikaz celog broja kao realni i samim tim broja pratecih nula, koristiti funkciju showpoint , što prikazuje sledeći kod:
Objašnjenje
U ovom zadatku se formatira izlaz korišćenjem manipulacija cout u C++. Metoda precision() postavlja ukupan broj značajnih cifara, dok manipulator showpoint osigurava da se prikaže decimalna tačka za promenljive tipa double. Na taj način se vrednosti x i a ispisuju u odgovarajućem formatu.
#include <iostream>
using namespace std;
int main() {
double x = 2.345677696787; // x se ispisuje sa 5 značajnih cifara
double a = 23; // a se ispisuje sa prikazom decimalne tačke
cout.precision(5); // Postavljanje preciznosti na 5 značajnih cifara
cout << "x=" << x << endl; // Ispis promenljive x
cout << "a=" << showpoint << a << endl; // Ispis promenljive a sa prikazom decimale
return 0; // Završetak programa
}
Izlaz
x=2.3457
a=23.000
Testirajte svoj kod ovde
Rad sa tekstualnim podacima (niskama) prvi deo
Ovaj odeljak je posvećen radu sa tekstualnim podacima, odnosno niskama, u programskom jeziku C++. Obradićemo operacije kao što su pronalaženje datog znaka, razdvajanje niske na delove, izdvajanje segmenata niske, obrtanje delova niske, konverzija ASCII karaktera u brojeve i obrnuto, kao i spajanje serije niska u veći niz.
Preporučujemo da pre nego što se upustite u ovu temu, pažljivo proučite stranicu Stringovi u C++, koja sadrži dodatna objašnjenja i primere za pripremu za takmičenja za 5. i 6. razred. Na toj stranici su obrađene teme kao što su:
- Nalažejenje datog znaka u niskoj
- Razdvajanje niske na dva dela – pre i posle datog znaka (npr. izdvajanje imena i prezimena)
- Razdvajanje niske na više delova razdvojenih datim znakom ili znakovima (npr. čitanje vremena u formatu hh:mm:ss)
- Izdvajanje karaktera ili segmenata niske i obrtanje delova niske
- Konverzija ASCII karaktera u broj (kod) i obrnuto
- Spajanje serije niska u veću nisku, sa ili bez umetanja posebnih znakova na spojevima
Ove teme će vam omogućiti da detaljno razumete rad sa tekstualnim podacima i primenite najbolje prakse pri rešavanju takmičarskih zadataka.
Razdvajanje niske na dva dela
Unesi ime i prezime odvojeno zapetama i prikaži poruku „Zdravo ime prezime!“.
Objašnjenje
Ovaj kod omogućava unos imena i prezimena korisnika. Prvi poziv funkcije getline čita unos iz standardnog ulaza (cin) sve dok ne naiđe na zarez, te smješta taj unos u promenljivu ime. Drugi poziv getline čita ostatak linije i smješta ga u promenljivu prezime. Na kraju, pomoću cout se ispisuje pozdrav u formatu: "Zdravo [ime] [prezime]!".
string ime, prezime; // Deklaracija promenljivih za ime i prezime
getline(cin, ime, ','); // Učitavanje imena do zareza
getline(cin, prezime); // Učitavanje prezimena (npr. Petar,Petrović)
cout << "Zdravo " << ime << " " << prezime << "!" << endl; // Ispis pozdrava
Ulaz
Petar,Petrović
Izlaz
Zdravo Petar Petrović!
Razdvajanje niske na više delova razdvojenih datim znakom ili znakovima
Unesi današnji dan, mesec i godinu u formatu dd/mm/yyyy i prikaži ih u yyyy-mm-dd formatu.
Objašnjenje
Ovaj zadatak omogućava unos današnjeg datuma u formatu dd/mm/yyyy
i njegovo prikazivanje u formatu yyyy-mm-dd
.
Prvo se uključuje zaglavlje <string> (kao i <iostream>), a zatim se unutar funkcije
main definišu promenljive:
dan, mesec, godina za čuvanje numeričkih vrednosti i danStr, mesecStr za unos dana i meseca u obliku stringa.
Funkcija getline čita unos iz standardnog ulaza (cin) sve dok ne naiđe na delimiter (zarez '/'),
a stoi vrši konverziju unetog stringa u celobrojnu vrednost. Na kraju se datum ispisuje u formatu yyyy-mm-dd
pomoću cout.
#include <iostream>
#include <string>
using namespace std;
int main() {
int dan, mesec, godina; // Deklaracija promenljivih za dan, mesec i godinu
string danStr, mesecStr; // Deklaracija string promenljivih za unos dana i meseca
getline(cin, danStr, '/'); // Učitavanje dana kao string do delimitera '/'
dan = stoi(danStr); // Konverzija stringa u int
getline(cin, mesecStr, '/'); // Učitavanje meseca kao string do delimitera '/'
mesec = stoi(mesecStr); // Konverzija stringa u int
cin >> godina; // Učitavanje godine
cout << godina << "-" << mesec << "-" << dan; // Ispis datuma u formatu yyyy-mm-dd
return 0; // Završetak programa
}
Unesi trenutno vreme (sate i minute) u obliku hh:mm i prikaži ih.
Pozicioni zapis brojeva sa datim brojem cifara i mešovite jedinice mere
Izvlačenje cifara. Operator %
Zadatak 1: Odredi cifre jedinica, desetica i stotina iz broja
U ovom zadatku se izračunavaju cifre jedinica, desetica i stotina iz unetog broja. Program koristi operaciju modulo (%) i celobrojno deljenje kako bi se odredila svaka od ovih cifara.
int broj, jedinice, desetice, stotina; // Deklaracija promenljivih
cin >> broj; // Učitavanje broja
// Izračunavanje cifre jedinica
jedinice = broj % 10;
// Izračunavanje cifre desetica
desetice = broj / 10 % 10;
// Izračunavanje cifre stotina
stotina = broj / 100 % 10;
cout << stotina << ' '
<< desetice << ' '
<< jedinice; // Ispis rezultata
Ulaz
753
Izlaz
7 5 3
Napiši program koji iz dekadnog zapisa broja izbacuje cifru stotina. Npr. Ako je unet broj 9678 na izlazu treba da se dobije broj 978.
U četvorocifrenom broju (npr. 9753) izdvoj prve i poslednje dve cifre (npr. 97 i 53)
Izvlačenje cifara iz broja sa nepoznatim brojem cifara
Pozicioni zapis broja sa nepoznatim brojem cifara
Ovaj odeljak objašnjava kako se broj, predstavljen kao skup cifara, može analizirati tako što se svaka cifra izdvoji sa desna na levo. Nakon izdvajanja, cifre se mogu ponovo kombinovati pomoću Hornerovog šema kako bi se rekonstruisao originalni broj. Ova tehnika je osnova za razumevanje načina na koji računari predstavljaju brojeve i često se primenjuje u algoritmima za obradu numeričkih podataka.
Određivanje cifara (zdesna nalevo)
Da biste izdvojili cifre iz broja, koristite operaciju modulo (%) da biste dobili poslednju cifru, a zatim broj celobrojno podelite sa 10 da biste uklonili tu cifru. Ovaj postupak se ponavlja sve dok broj ne postane 0.
Formiranje broja pomoću Hornerovog šema
Kada su cifre izdvojene, one se mogu rekonstruisati u broj koristeći Hornerov šem. Ako su cifre broja, od najznačajnije do najmanje značajne, označene kao dn, dn-1, …, d0, onda se broj može izračunati kao:
B = (((dn * 10 + dn-1) * 10 + dn-2) * 10 + ... + d0)
Ovaj metod omogućava efikasno rekonstruisanje broja uz minimalan broj aritmetičkih operacija.
Za više informacija, pogledajte dodatne resurse na stranici: Stringovi u C/C++ jeziku.
Objašnjenje zadatka: Izvlačenje cifara iz broja sa nepoznatim brojem cifara
Cilj ovog zadatka je izdvojiti sve cifre iz unetog broja, bez obzira na to koliko cifara broj sadrži. Koristićemo while petlju koja se izvršava sve dok broj ne postane nula. U svakom prolazu petlje, operator % sa 10 se koristi za izdvajanje poslednje cifre broja, a zatim se broj celobrojno deli sa 10 kako bi se uklonila ta cifra. Ovaj proces se ponavlja sve dok broj ne bude jednak nuli.
Pre nego što se krene u ovaj zadatak, preporučuje se pregled nekoliko primera korišćenja while petlje (pogledajte sekciju "Petlje - primeri") za bolje razumevanje.
#include <iostream>
using namespace std;
int main() {
int broj;
cout << "Unesite broj: ";
cin >> broj;
// Izvlačenje cifara iz broja
while (broj != 0) {
int cifra = broj % 10; // Izdvajanje poslednje cifre
cout << cifra << " "; // Ispis trenutne cifre
broj = broj / 10; // Smanjenje broja za jednu cifru
}
return 0; // Završetak programa
}
Primer ulaza i izlaza
Ulaz: 7531
Izlaz: 1 3 5 7
Učitati ceo broj sa brojem cifara <15, a zatim zameniti mesta ciframa tako što se zamene prva i poslednja, druga i pretposlednja itd.
Npr. za učitani broj 18734 treba pretvoriti u broj 43781
Zadaci sa kvalifikacija
Beskonačan ciklus
Beskonačan ciklus je struktura u kojoj se petlja izvršava neprekidno, odnosno bez prirodnog završetka, osim ako se eksplicitno ne prekine (na primer, pomoću break). Ovakve petlje se često koriste u situacijama kada se očekuje stalno izvršavanje koda ili kada se čeka na određeni događaj.
U pripremama za okružna takmičenja iz informatike, razumevanje beskonačnih ciklusa je veoma važno jer se one često primenjuju u algoritmima koji moraju da obrade ulazne podatke u realnom vremenu ili da čekaju na određene ulaze.
Za dodatne primere i detaljnija objašnjenja o petljama u programskom jeziku C++, preporučujemo posetu stranici /petlje_u_programskom_jeziku_cpp.html.
for( ; ; ) {
// Naredbe koje se izvršavaju u beskonačnoj petlji
}
while(true) {
// Naredbe koje se izvršavaju u beskonačnoj petlji
}
Upotreba break i continue
U programiranju, naredbe break i continue služe za kontrolu toka izvršavanja petlji.
Break: Naredba break momentalno prekida izvršavanje petlje i izlazi iz nje. Koristi se kada, na osnovu određenog uslova, želite odmah da prekinete dalji rad petlje, bez obrade preostalih iteracija.
Continue: Naredba continue preskače ostatak koda u trenutnoj iteraciji petlje i prelazi na sledeću iteraciju. Ovo je korisno kada želite da izbegnete izvršavanje određenog dela koda za trenutni prolaz, ali da nastavite sa ostatkom petlje.
Primeri 1 i 2:
for(int i = 0; i < 10; i++) {
if (i == 5) {
break; // Prekida petlju kada je i jednako 5
}
cout << i << " ";
}
for(int j = 0; j < 10; j++) {
if (j % 2 == 0) {
continue; // Preskače parne brojeve
}
cout << j << " ";
}
Za dodatne primere i detaljnija objašnjenja, preporučujemo pregled stranice: Petlje u programskom jeziku C.
ObjašnjenjeOvaj zadatak koristi beskonačnu for petlju koja omogućava unos brojeva sve dok korisnik ne unese -1. Svaki put kada se unese broj različit od -1, brojač (broj) se uvećava. Kada se unese -1, petlja se prekida i promenljiva broj sadrži ukupan broj unetih brojeva (bez unosa -1).
|
ObjašnjenjeOvaj program koristi beskonačnu for petlju za unos brojeva. Svaki uneti broj se analizira prema sledećim pravilima:
|
Naredba continue unutar ciklusa prebacuje izvršenje sledećeg ciklusa. Ukoliko se u telu ciklusa posle continue nalaze naredbe, one se neće izvršiti za tekući ciklus. U primeru desno, ako se učitaju negativni brojevi ciklusi se ne broje jer se tada ne izvršava broj++
Uneti broj, npr. 13524. Odrediti koliko ima cifara. koristiti do-while petlju, u kojoj treba:
- Odrediti cifru sa leve strane(npr 1) ostatka broja(u početku je ovaj ostatak taj broj npr.13524
- Skratiti taj broj za cifru levo npr. posle prvog skraćivanja bice 3524
- Ako je u pitanju prvi ciklus, zapamtiti tekuću cifru kao prethodnu za sledeći ciklus, a zatim preći u sledeći ciklus(continue naredba)
- Uporediti tekuću i prethodnu cifru. Ako je tekuća cifra veća od prethodne, onda znači da je u pitanju rastući poredak pa treba zapamtiti tekuću cifru kao prethodnu za sledeći ciklus, a zatim preći u sledeći ciklus(continue naredba)
- Ako je tekuća cifra manja zaključujemo da dalje ne važi rastući redosled cifara i beležimo koliko smo cifara prošli. Prekidamo ciklus
#include < cmath >
using namespace std;
int main()
{
cin >> br;//13524
if(br==0) // Ako je ucitana nula rezultat je 1. Prekida se dalje izvrsenje
{
return 0;
d=(int)log10(br)+1;//5, broj cifara
if(d==1) //Ako je jednocifreni vraca 1 kao resenje
{
return 0;
int i=0;
int pret,c,j;
j=d; //stepen delioca za uklanjanje cifre i izvlacenje cifre sa leve strane
x=br;
do{
x=x%(int)pow(10,j-1); //uklanja cifru sa desne strane,3524=13524 % 10000
j--;
if(i==0){
i++;
continue;
if(c >pret){
i++;
continue;
else{
while(i < d);
cout << i << endl;
return 0;
Rad sa tekstualnim podacima (niskama) - drugi deo
Stringovi
string predstavlja nisku karaktera (tekstualni podatak) u C++-u. Korišćenjem klase string možete lako manipulisati tekstom, vršiti operacije spajanja, pretrage, izdvajanja podstringova i poređenja.
Ova klasa je deo standardne biblioteke i pruža bogat skup metoda koje olakšavaju rad sa tekstom.
#include <string>
Da biste koristili metode za rad sa stringovima, potrebno je uključiti navedeno zaglavlje. Za više informacija o string klasama i njihovim metodama, posetite stranicu: Stringovi u C/C++ jeziku.
Učitavanje charactera iz stringa
Uneti niz brojeva u jednom redu razdvojenih sa ",", npr 2,5,7,4,3. Razdvojiti cifre iz teksta i pretvoriti u brojeve koji su za 10 veći od unetih cifara. to bi u pomenutom primeru bili brojevi 12 15 17 14 13.
Objašnjenje
Ovaj program omogućava unos niza brojeva u jednom redu, razdvojenih zarezima (","), zatim ih razdvaja i konvertuje u brojeve koji su za 10 veći od unetih vrednosti.
Postupak obrade ulaznog niza:
- Koristi se getline funkcija za unos celog niza kao string.
- Uneseni string se prolazi karakter po karakter.
- Ako je karakter cifra (proverava se funkcijom isdigit), pretvara se u broj i povećava za 10.
- Brojevi se ispisuju u istom redosledu kao u ulazu, ali uvećani za 10.
#include <iostream>
#include <string>
using namespace std;
int main() {
// Deklaracija promenljivih
string ulaz;
// Učitavanje stringa sa brojevima razdvojenim zarezima
cout << "Unesite niz brojeva razdvojenih zarezima: ";
getline(cin, ulaz);
// Obrada stringa
cout << "Rezultat: ";
for (char c : ulaz) { // Prolazak kroz string
if (isdigit(c)) { // Ako je karakter cifra
int broj = (c - '0') + 10; // Pretvaranje u broj i povećanje za 10
cout << broj << " ";
}
}
return 0;
}
Primer unosa i izlaza
Ulaz:
2,5,7,4,3
Izlaz:
12 15 17 14 13
Uneti niz brojeva u jednom redu razdvojenih sa ",", npr 22,35,71,24,33. Razdvojiti brojeveiz teksta i pretvoriti u brojeve koji su za 10 veći od unetih cifara. to bi u pomenutom primeru bili brojevi 32 45 81 34 43.
Izdvajanje broja i datuma iz stringa. Upotreba funkcije substr
Primer 1:
Poznati su svi fiskalni računi koje je izdala jedna prodavnica. Sa svakog računa se može pročitati datum kada je taj račun izdat i iznos koji je naplaćen. Izdvojiti iz ulaznih podataka sledeće podatke kao posebne nizove datume i zaradu i ispisati na ekranu. Datume čuvati kao string podatke, a zaradu kao podatke tipa double. Datumi se unose u formatu dd-mm-yyyy, a na izlazu treba da se prikažu u obrnutom redosledu dana meseca i godine tj. u obliku: yyyy-mm-dd
Objašnjenje
Ovaj program omogućava unos svih fiskalnih računa jedne prodavnice, gde svaki račun sadrži datum i iznos naplate. Program obrađuje unete podatke, izdvaja ih u posebne nizove (string niz za datume i double niz za zaradu) i ispisuje ih u traženom formatu.
Postupak obrade:
- Prvo se učitava broj računa.
- Za svaki red podataka, odvojeno se čita datum i zarada.
- Datum se formatira iz oblika dd-mm-yyyy u yyyy-mm-dd.
- Svi podaci se skladište u nizove i zatim ispisuju u tabelarnom obliku.
#include <iostream>
#include <string>
using namespace std;
int main() {
// Deklaracija promenljivih
int n;
cin >> n;
cin.ignore(); // Ignorisanje preostalog newline karaktera
string datumi[n];
double zarade[n];
int ind = 0; // Indeks za nizove
while (ind < n) {
string red;
getline(cin, red); // Učitavanje celog reda
int poz = red.find(" "); // Pronalaženje razmaka koji razdvaja datum i zaradu
string datum = red.substr(0, poz);
double zarada = stod(red.substr(poz + 1)); // Konverzija stringa u double
// Izdvajanje dana, meseca i godine
string dd = datum.substr(0, 2);
string mm = datum.substr(3, 2);
string yyyy = datum.substr(6);
// Formiranje novog formata datuma
string datumKontra = yyyy + "-" + mm + "-" + dd;
// Skladištenje u nizove
datumi[ind] = datumKontra;
zarade[ind] = zarada;
ind++;
}
// Ispis rezultata
cout << "Datum: Zarada:" << endl;
for (int i = 0; i < n; i++) {
cout << datumi[i] << " " << zarade[i] << endl;
}
return 0;
}
Primer unosa i izlaza
Ulaz:
5 03-07-2021 340.00 05-04-2021 285.50 03-07-2021 100.50 04-07-2021 270.00 05-04-2021 155.00
Izlaz:
Datum: Zarada: 2021-07-03 340.00 2021-04-05 285.50 2021-07-03 100.50 2021-07-04 270.00 2021-05-04 155.00
Npr: getline(cin,datum,' ');
Ovo ostaje čitaocu da isproba.
Takođe, više o substr() funkciji i stringovima možete naći na strani: Stringovi u C/C++ jeziku
Napredno grananje u C++
Primena grananja u geometriji prave i ravni u C++
U geometriji prave i ravni, grananje (if-else konstrukcije) se koristi za određivanje odnosa između prave i ravni. Na primer, možemo odrediti da li prava:
- leži u ravni,
- je paralelna sa ravni, ili
- seče ravan u jednoj tački.
Pretpostavimo da je ravan data jednačinom: Ax + By + Cz + D = 0, a prava je predstavljena parametarskim jednačinama:
x = x₀ + t·dx, y = y₀ + t·dy, z = z₀ + t·dz
Da bismo odredili odnos, prvo se računa skalarni proizvod normalnog vektora ravni (A, B, C) i smernog vektora prave (dx, dy, dz). Ako je taj skalarni proizvod jednak nuli, prava je paralelna sa ravni. Dalje, ako se proveri da li je jedna tačka prave (npr. (x₀, y₀, z₀)) zadovoljava jednačinu ravni, onda se može zaključiti:
- Ako ta tačka leži u ravni, prava je u potpunosti sadržana u ravni.
- Ako ta tačka ne zadovoljava jednačinu, prava je paralelna i ne seče ravan.
Ako skalarni proizvod nije nula, prava i ravan se seku u jednoj tački.
Primer implementacije u C++
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double A = 1.0, B = -2.0, C = 3.0, D = -4.0; // Koeficijenti ravni: Ax + By + Cz + D = 0
double x0 = 2.0, y0 = 3.0, z0 = 1.0; // Tačka na pravu
double dx = 1.0, dy = 0.0, dz = -1.0; // Smerni vektor prave
double dotProduct = A * dx + B * dy + C * dz;
if (fabs(dotProduct) < 1e-6) { // Ako je skalarni proizvod 0, prava je paralelna sa ravni
double value = A * x0 + B * y0 + C * z0 + D;
if (fabs(value) < 1e-6) {
cout << "Prava leži u ravni." << endl;
} else {
cout << "Prava je paralelna sa ravni, ali ne leži u njoj." << endl;
}
} else {
cout << "Prava i ravan se seku u jednoj tački." << endl;
}
return 0;
}
Objašnjenje koda:
- Prvo se definišu koeficijenti ravni: A, B, C, D.
- Zatim se definiše tačka (x₀, y₀, z₀) i smerni vektor prave (dx, dy, dz).
- Izračunava se skalarni proizvod normalnog vektora ravni (A, B, C) i smernog vektora prave. Ako je taj proizvod jednak nuli (uz malu toleranciju), prava je paralelna sa ravni.
- Ako je prava paralelna, proverava se da li ta tačka prave zadovoljava jednačinu ravni. Ako zadovoljava, prava leži u ravni, u suprotnom je samo paralelna.
- Ako skalarni proizvod nije nula, prava i ravan se seku u jednoj tački.
Gde se koristi ova tehnika?
- Pretraga u sortiranom nizu.
- Određivanje najveće dužine podniza sa određenim svojstvima.
- Preuređivanje niza bez dodatne memorije (npr. premještanje svih nula na kraj).
- Određivanje trougaonih tripleta u sortiranom nizu.
Zadatak: Položaj dve prave
Date su dve prave izražene implicitnim jednačinama oblika Ax + By + C = 0. Vaš zadatak je da odredite njihov međusobni položaj:
- Poklapaju se – prave su identične.
- Paralelne su – prave nemaju zajedničku tačku.
- Seku se – prave se ukrštaju u jednoj tački.
Ulaz: U 6 linija standardnog ulaza nalaze se po jedan realan broj. Prva tri broja predstavljaju koeficijente A1, B1, C1 prve prave, a druga tri broja predstavljaju koeficijente A2, B2, C2 druge prave.
Izlaz: U prvoj liniji standardnog izlaza se ispisuje tekst: "poklapaju se" za prave koje se poklapaju, "paralelne su" za paralelne prave, ili "seku se" za prave koje se seku. Ako se prave seku, u drugoj liniji se ispisuju koordinate presečne tačke (dva realna broja sa dve decimale).
Primer
Ulaz:
5 0 -10 1 1 0
Izlaz:
seku se 2.00 -2.00
Objašnjenje rešenja
Umesto da se koriste skalarni i vektorski proizvodi, ovaj zadatak se može rešiti jednostavnije rešavanjem sistema linearnih jednačina:
Prva prava: A1x + B1y + C1 = 0
Druga prava: A2x + B2y + C2 = 0
Rešenje sistema se dobija metodom eliminacije ili korišćenjem determinanti. Na osnovu rezultata:
- Ukoliko sistem ima beskonačno mnogo rešenja, prave se poklapaju.
- Ukoliko sistem nema rešenja, prave su paralelne.
- Ukoliko sistem ima jedno jedinstveno rešenje, prave se seku u toj tački, pa se u drugoj liniji izlaza ispisuju koordinate presečne tačke.
Ovakav pristup je pogodan za učenike 5. i 6. razreda, jer ne zahteva poznavanje skalarnih ili vektorskih operacija, već se oslanja na rešavanje sistema linearnih jednačina.
Objašnjenje pojednostavljenog rešenja za odnose dve prave
Da, problem se može rešiti jednostavnije ako se prave predstavljaju u opštem obliku: A1x + B1y + C1 = 0 i A2x + B2y + C2 = 0. U tom slučaju se mogu upoređivati koeficijenti kako bi se utvrdilo da li se prave poklapaju, da li su paralelne ili se seku u jednoj tački. Preciznije:
- Ako su koeficijenti proporcionalni, tj. ako je A1/A2 = B1/B2 = C1/C2 (uz odgovarajuću toleranciju za poređenje realnih brojeva), prave se poklapaju.
- Ako su odnos A1/A2 = B1/B2 isti, ali se C1/C2 razlikuje, prave su paralelne.
- U suprotnom, prave se seku u jednoj tački.
Ovaj metod je jednostavniji, ali je važno da se koeficijenti pravilno normalizuju ili uporede uz malu toleranciju zbog mogućih grešaka pri radu sa realnim brojevima.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double A1, B1, C1, A2, B2, C2;
// Učitavanje koeficijenata prve prave
cin >> A1 >> B1 >> C1;
// Učitavanje koeficijenata druge prave
cin >> A2 >> B2 >> C2;
double tol = 1e-6; // Tolerancija za poređenje realnih brojeva
if (fabs(A1 * B2 - A2 * B1) < tol) { // Ako su smerni koeficijenti proporcionalni, prave su paralelne ili poklapaju
if (fabs(A1 * C2 - A2 * C1) < tol && fabs(B1 * C2 - B2 * C1) < tol) {
cout << "Prave se poklapaju." << endl;
} else {
cout << "Prave su paralelne." << endl;
}
} else {
cout << "Prave se seku u jednoj tački." << endl;
}
return 0;
}
Problemi sa odnosima tačaka i duži
Ova tema pokriva zadatke u kojima je potrebno odrediti odnose između tačaka i duži na pravoj ili na vremenskoj osi. Takvi problemi se često pojavljuju na takmičenjima iz informatike i pomažu u razvoju logičkog razmišljanja i razumevanja osnovnih geometrijskih principa.
Ovi zadaci mogu uključivati:
- Proveru da li određena tačka pripada datoj duži;
- Izračunavanje rastojanja između tačke i duži (ako tačka ne pripada duži);
- Određivanje preseka dve duži;
- Pronalaženje minimalnog intervala koji sadrži dve duži;
- Određivanje redosleda tačaka, tj. koja od tri tačke se nalazi između ostalih.
Primeri:
1. Da li tačka pripada duži?
Data je dužina [L, R] i tačka P. Tačka pripada duži ako važi: L ≤ P ≤ R.
2. Rastojanje tačke od duži
Ako tačka P ne pripada duži [L, R], rastojanje se računa kao:
- Ako je P manji od L, rastojanje je L - P;
- Ako je P veći od R, rastojanje je P - R.
3. Presek dve duži
Za dužine [L1, R1] i [L2, R2], presek postoji ako je max(L1, L2) ≤ min(R1, R2). Presek je onda definisan kao interval [max(L1, L2), min(R1, R2)].
4. Minimalan interval koji sadrži dve duži
Minimalan interval koji sadrži dužine [L1, R1] i [L2, R2] je interval [min(L1, L2), max(R1, R2)].
5. Redosled tačaka
Za tri tačke P, Q i R, tačka Q je između ako važi: P ≤ Q ≤ R ili R ≤ Q ≤ P. Ovo pomaže u određivanju relativnog položaja tačaka na pravoj ili vremenskoj osi.
Ovi zadaci su korisni za pripremu za takmičenja, a razumevanje ovih principa je važno za rešavanje složenijih problema u geometriji i analizi podataka.
Za dodatne primere i vežbe, preporučujemo da pogledate dodatne resurse iz oblasti geometrijskih problema, kao i zadatke sa prethodnih takmičenja.
Primer 1: Da li tačka pripada duži?
U ovom primeru, korisnik unosi krajeve duži (L i R) i tačku P. Program proverava da li se tačka nalazi u intervalu [L, R]. Ako je uslov zadovoljen, ispisuje se poruka da tačka pripada duži; u suprotnom, ispisuje se da tačka ne pripada duži.
#include <iostream>
using namespace std;
int main() {
int L, R, P;
cout << "Unesite krajeve duži (L i R): ";
cin >> L >> R;
cout << "Unesite tačku P: ";
cin >> P;
if (P >= L && P <= R) {
cout << "Tačka pripada duži." << endl;
} else {
cout << "Tačka ne pripada duži." << endl;
}
return 0;
}
Primer unosa i izlaza:
Ulaz: 10 20 15
Izlaz: Tačka pripada duži.
Primer 2: Rastojanje tačke od duži
U ovom primeru, korisnik unosi krajeve duži (L i R) i tačku P. Program računa rastojanje tačke od duži:
- Ako tačka pripada duži, rastojanje je 0.
- Ako je tačka levo od duži, rastojanje je L - P.
- Ako je tačka desno od duži, rastojanje je P - R.
#include <iostream>
using namespace std;
int main() {
int L, R, P;
cout << "Unesite krajeve duži (L i R): ";
cin >> L >> R;
cout << "Unesite tačku P: ";
cin >> P;
double rastojanje = 0;
if (P >= L && P <= R) {
rastojanje = 0; // Tačka pripada duži
} else if (P < L) {
rastojanje = L - P; // Tačka je levo od duži
} else {
rastojanje = P - R; // Tačka je desno od duži
}
cout << "Rastojanje tačke od duži je: " << rastojanje << endl;
return 0;
}
Primer unosa i izlaza:
Ulaz: 10 20 5
Izlaz: Rastojanje tačke od duži je: 5
Primer 3: Presek dve duži
U ovom primeru se unose krajevi dve duži. Presek se dobija kao interval [max(L1, L2), min(R1, R2)]. Ako je max(L1, L2) ≤ min(R1, R2), duži se seku; u suprotnom, duži se ne seku.
#include <iostream>
using namespace std;
int main() {
int L1, R1, L2, R2;
cout << "Unesite krajeve prve duži (L1 R1): ";
cin >> L1 >> R1;
cout << "Unesite krajeve druge duži (L2 R2): ";
cin >> L2 >> R2;
int L_int = max(L1, L2);
int R_int = min(R1, R2);
if (L_int <= R_int) {
cout << "Presek duži: ["
<< L_int << ", "
<< R_int << "]" << endl;
} else {
cout << "Duži se ne seku." << endl;
}
return 0;
}
Primer 4: Minimalan interval koji sadrži dve duži
Ovaj primer pokazuje kako se određuje minimalan interval koji obuhvata obe duži. Minimalan interval se dobija kao [min(L1, L2), max(R1, R2)].
#include <iostream>
using namespace std;
int main() {
int L1, R1, L2, R2;
cout << "Unesite krajeve prve duži (L1 R1): ";
cin >> L1 >> R1;
cout << "Unesite krajeve druge duži (L2 R2): ";
cin >> L2 >> R2;
int L_min = min(L1, L2);
int R_max = max(R1, R2);
cout << "Minimalan interval koji sadrži obe duži: ["
<< L_min << ", " << R_max
<< "]" << endl;
return 0;
}
Primer 5: Redosled tačaka
U ovom primeru se unose tri tačke (P, Q i R) na pravoj ili vremenskoj osi. Program određuje koja tačka se nalazi između ostalih, odnosno koja je medijana.
#include <iostream>
using namespace std;
int main() {
int P, Q, R;
cout << "Unesite tri tačke: ";
cin >> P >> Q >> R;
int med;
if ((Q >= P && Q <= R) || (Q >= R && Q <= P))
med = Q;
else if ((P >= Q && P <= R) || (P >= R && P <= Q))
med = P;
else
med = R;
cout << "Tačka koja je između ostalih je: "
<< med << endl;
return 0;
}
Algoritmi sa ugnežđenim petljama: Generisanje kombinacija i varijacija k-torki od n brojeva
U ovom zadatku, cilj je generisati sve moguće kombinacije (ili varijacije) k-elemntnih torki od n brojeva. K-torka predstavlja skup od k brojeva gde se, u kombinacijama, redosled ne računa, dok u varijacijama redosled ima značaj. Za ovaj primer, k je fiksno podešeno (na primer, k = 3), a n se učitava od korisnika.
Primer prikazuje generisanje svih kombinacija 3-torki iz skupa brojeva od 1 do n. Ovo se postiže korišćenjem ugnežđenih petlji: prva petlja bira prvi element, druga petlja bira drugi element, a treća petlja bira treći element, pri čemu se obezbeđuje da su indeksi strogo rastući (i, j, k) da bi se izbeglo dupliranje istih kombinacija.
Za više informacija o algoritmima sa ugnežđenim petljama, posetite stranicu: Ugnježdene petlje u programskom jeziku C++.
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Unesite n: ";
cin >> n;
cout << "Kombinacije 3-torki:" << endl;
for (int i = 1; i <= n - 2; i++) {
for (int j = i + 1; j <= n - 1; j++) {
for (int k = j + 1; k <= n; k++) {
cout << "(" << i << ", " << j << ", " << k << ")" << endl;
}
}
}
return 0;
}
Crtanje trouglova i rombova pomoću ASCII karaktera
Ovaj primer demonstrira kako se koriste zvezdice, crtice i drugi ASCII karakteri za crtanje geometrijskih oblika, kao što su trougao i romb. Kroz ugneždene petlje, program generiše oblik na osnovu unete visine. Ova tehnika je korisna u takmičarskom okruženju za poboljšanje logičkog razmišljanja i rada sa petljama.
Za više informacija i primere o radnom sistemu sa petljama, posetite stranicu: Petlje u programskom jeziku C.
Ovaj program omogućava korisniku da unese visinu oblika, a zatim crta jednakokraki trougao i romb koristeći znak *
. Program koristi ugnježdene petlje kako bi generisao željene oblike.
#include <iostream>
using namespace std;
int main() {
int n; // Deklaracija promenljive za visinu oblika
cout << "Unesite visinu oblika: "; // Traži unos visine od korisnika
cin >> n; // Unos visine sa tastature
// Crtanje jednakokrakog trougla
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
for (int k = 1; k <= 2 * i - 1; k++) {
cout << "*";
}
cout << endl;
}
// Crtanje romba (gornja polovina)
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
for (int k = 1; k <= n + 2 * i - 1; k++) {
cout << "*";
}
cout << endl;
}
// Crtanje romba (donja polovina)
for (int i = n - 1; i >= 1; i--) {
for (int j = 1; j <= n - i; j++) {
cout << " ";
}
for (int k = 1; k <= 2 * i - 1; k++) {
cout << "*";
}
cout << endl;
}
return 0;
}
Priprema za državna takmičenja
Sledeće
Priprema za okružna takmičenja 2 >| |