PRIPREMA ZA OKRUŽNA TAKMIČENJA
Ova stranica je vodič za pripremanje rešavanja zadatka koja se pojavljuju na okružnim takmičenjima iz informatike, za osnovne škole. Takođe su pokazani jednostavni primeri koji su sastavni deo većih zadataka.
Složen ulaz i formatiran izlaz
- 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.
#include < iostream >
using namespace std;
int main(){
using namespace std;
int main(){
int n;
cin >> n;//Ucitava broj redova n(broj kutija)
int srafoviUKutijama[n];//niz koji predstavlja brojeve srafova po kutijama
for(int i = 0; i < n; i++)
{
}cin >> n;//Ucitava broj redova n(broj kutija)
int srafoviUKutijama[n];//niz koji predstavlja brojeve srafova po kutijama
for(int i = 0; i < n; i++)
{
cin >> srafoviUKutijama[i];
}Uradite primer Majstori kompletno, radi vežbe. Podrazume va se prethodno znanje iz petlji(for) i nizova.
Formatirani izlaz:
Tekst zadatka: Data su dva broja
x=2.345677696787
a=23
a=23
Prvi broj zaokruziti na 4 decimale. Drugi broj ispisati sa decimalnom tačkom i prikazati sa 3 decimalna mesta. Izlaz bi trebalo bude:
x=2.3457
a=23.000
a=23.000
Rešenje:
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:
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:
#include < iostream >
using namespace std;
int main()
{
using namespace std;
int main()
{
double x=2.345677696787;
double a=23;
cout.precision(5);
cout << "x=" << x << endl;
cout << "a=" << showpoint << a << endl;
return 0;
}double a=23;
cout.precision(5);
cout << "x=" << x << endl;
cout << "a=" << showpoint << a << endl;
return 0;
Zadatak 3:
Unesi ime i prezime odvojeno zapetama i prikaži poruku „Zdravo ime prezime!“.
Unesi ime i prezime odvojeno zapetama i prikaži poruku „Zdravo ime prezime!“.
string ime, prezime;
getline(cin, ime, ',');
getline(cin, prezime); // Na primer Petar,Petrović
cout << "Zdravo " << ime << " " << prezime << "!" << endl;
getline(cin, ime, ',');
getline(cin, prezime); // Na primer Petar,Petrović
cout << "Zdravo " << ime << " " << prezime << "!" << endl;
Zadatak 4:
Unesi današnji dan, mesec i godinu u formatu dd/mm/yyyy i prikaži ih u yyyy-mm-dd formatu.
Rešenje:
Prvo treba uključiti zaglavlje <string>
Unesi današnji dan, mesec i godinu u formatu dd/mm/yyyy i prikaži ih u yyyy-mm-dd formatu.
Rešenje:
Prvo treba uključiti zaglavlje <string>
#include< string >
a zatim unutar main metode:
int dan, mesec, godina;
string danStr,mesecStr;
getline(cin,danStr '/');
dan = stoi( danStr);
getline(cin,mesecStr, '/');
mesec = stoi( mesecStr );
cin >> godina;
cout << godina << "-" << mesec << "-" << dan;
string danStr,mesecStr;
getline(cin,danStr '/');
dan = stoi( danStr);
getline(cin,mesecStr, '/');
mesec = stoi( mesecStr );
cin >> godina;
cout << godina << "-" << mesec << "-" << dan;
Zadatak 5:
Unesi trenutno vreme (sate i minute) u obliku hh:mm i prikaži ih.
Unesi trenutno vreme (sate i minute) u obliku hh:mm i prikaži ih.
Izvlačenje cifara. Operator %
Zadatak 1:
Odredi cifre jedinica, desetica i stotina iz broja.
Rešenje:
Odredi cifre jedinica, desetica i stotina iz broja.
Rešenje:
int broj,jedinice,desetice,stotine;
cin >> broj;
jedinice = broj % 10; // 75[3]
desetice = broj / 10 % 10; // 753 // 10 -> 75 -> 7[5]
stotine = broj / 100 % 10; // 753 // 100 -> [7]
cout << stotine << ' ' << desetice << ' ' << jedinice;
cin >> broj;
jedinice = broj % 10; // 75[3]
desetice = broj / 10 % 10; // 753 // 10 -> 75 -> 7[5]
stotine = broj / 100 % 10; // 753 // 100 -> [7]
cout << stotine << ' ' << desetice << ' ' << jedinice;
Zadatak 2:
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.
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.
Zadatak 3:
U četvorocifrenom broju (npr. 9753) izdvoj prve i poslednje dve cifre (npr. 97 i 53)
U četvorocifrenom broju (npr. 9753) izdvoj prve i poslednje dve cifre (npr. 97 i 53)
Izvlačenje cifara iz broja sa nepoznatim brojem cifara
Uputstvo: Koristiti while petlju ili do-while petlju i unutar ciklusa koristiti %10 za izdvajanje poslednje cifre, a zatim deljenje sa 10 da bi se broj smanjio za jednu cifru.
Ukoliko je potrebno, uradite prethodno nekoliko zadataka sa while petljom sa strane: Petlje - primeri
Ukoliko je potrebno, uradite prethodno nekoliko zadataka sa while petljom sa strane: Petlje - primeri
Zadatak 4:
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
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
Zadatak 1: Uraditi zadatak Katanac sa prvog kruga kvalifikacija za 7. razred(Zadatak br. 14)
Zadatak 2: Uraditi zadatak Stubići od kockica, sa prvog kruga kvalifikacija za 8. razred(Zadatak br. 16)
Zadatak 3: Uraditi zadatak Šljive, sa drugog kruga kvalifikacija za 6. razred(Zadatak br. 17)
Zadatak 5: Uraditi zadatak Fudbalska grupa- tabela, sa drugogkruga kvalifikacija za 6. razred(Zadatak br. 19)
Zadatak 6: Uraditi zadatak Najviše odličnih sa drugogkruga kvalifikacija za 6. razred(Zadatak br. 20)
Beskonačan ciklus
Beskonačan ciklus se može dobiti kada naredbu for ili while napišemo na sledeći način:
for( ; ; ) {
//naredbe
} |
while(true) {
//naredbe
} |
Upotreba break i continue
Ako treba prekinuti ciklus pre kraja izvršenja koristi se naredba break,
Primer 1:Unositi brojeve dok se ne unese -1. Ispisati broj ostvarenih ciklusa.(Vidi kod levo)
Primer 1:Unositi brojeve dok se ne unese -1. Ispisati broj ostvarenih ciklusa.(Vidi kod levo)
int broj=0,X; for( ; ; ) {
cin >> X; //Ucitava broj X
}if(X == -1)break; broj++; |
int broj=0,X; for( ; ; ) {
cin >> X; //Ucitava broj X
}if(X == -1)break; if(X < 0)continue; broj++; |
Primer 2: Proširiti primer 1 tako da se ne broje ciklusi ako se unese negativan broj različit od -1;
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++
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++
Zadatak 2: Uneti ceo broj, a zatim odredi koliko je cifara počev sa leve strane ka desnoj sortirano po rastućem redosledu:
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 < iostream >
#include < cmath >
using namespace std;
int main()
{
#include < cmath >
using namespace std;
int main()
{
int br,d,x;
cin >> br;//13524
if(br==0) // Ako je ucitana nula rezultat je 1. Prekida se dalje izvrsenje
{
d=(int)log10(br)+1;//5, broj cifara
if(d==1) //Ako je jednocifreni vraca 1 kao resenje
{
int i=0;
int pret,c,j;
j=d; //stepen delioca za uklanjanje cifre i izvlacenje cifre sa leve strane
x=br;
do{
while(i < d);
cout << i << endl;
return 0;
}cin >> br;//13524
if(br==0) // Ako je ucitana nula rezultat je 1. Prekida se dalje izvrsenje
{
cout << "1" << endl;
return 0;
}return 0;
d=(int)log10(br)+1;//5, broj cifara
if(d==1) //Ako je jednocifreni vraca 1 kao resenje
{
cout << "1" << endl;
return 0;
}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{
c=(int)(x/pow(10,j-1));//1, izvlaci cifru sa leve strane
x=x%(int)pow(10,j-1); //uklanja cifru sa desne strane,3524=13524 % 10000
j--;
if(i==0){
if(c >pret){
else{
}x=x%(int)pow(10,j-1); //uklanja cifru sa desne strane,3524=13524 % 10000
j--;
if(i==0){
pret=c;
i++;
continue;
}i++;
continue;
if(c >pret){
pret=c;
i++;
continue;
}i++;
continue;
else{
break;
}while(i < d);
cout << i << endl;
return 0;
Stringovi
string predstavlja nisku karaktera(tekstualni podatak). Da bi koristili metode za rad sa stringovima, potrebno je uključiti zaglavlje string
#include < string >
Više o stringovima pročitajte na strani: Stringovi u C/C++ jeziku
Učitavanje charactera iz stringa
Primer 1:
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.
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.
#include < iostream >
#include < cmath >
using namespace std;
int main()
{
#include < cmath >
using namespace std;
int main()
{
string brojevi;
getline(cin,brojevi);
cout << brojevi << endl;
int ch;
int b = 0; //broj unetih brojeva
for(char c: brojevi)//izvlaci charactere iz stringa
{
cout << b << endl;
return 0;
}getline(cin,brojevi);
cout << brojevi << endl;
int ch;
int b = 0; //broj unetih brojeva
for(char c: brojevi)//izvlaci charactere iz stringa
{
if(c != ',')
{
}{
ch=c - '0';//pretvara cifru iz char u ceo broj int
cout << (ch+10) << endl;
b++;// povecava broj brojeva za 1
}cout << (ch+10) << endl;
b++;// povecava broj brojeva za 1
cout << b << endl;
return 0;
Zadatak 1:
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.
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.
Zadatak 2: Uraditi zadatak Spisak Proizvoda sa 1. kruga kvalifikacija za 6. razred
Zadatak 3: Uraditi zadatak Slovarica sa 1. kruga kvalifikacija za 7. razred
Zadatak 4: Uraditi zadatak Note sa 1. kruga kvalifikacija za 8. razred
Zadatak 5: Uraditi zadatak "Datum sa najvećom zaradom" sa 1. kruga kvalifikacija za 8. razred
Izdvajanje broja i datuma iz stringa. Upotreba funkcije substr
U pojedinim zadacima se neke informacije učitavaju u vidu stringa i to tako da se u jednom redu može naći više informacija, pa se posle učitavanja jednog reda teksta(stringa) iz njega moraju izvući podaci. Na primer ako se u redu teksta nalazi podatak o dnevnoj zaradi i datumu kad je ta zarada ostvarena (npr. 21_11_2021 32.5). Ovo je pokazano u sledećem primeru:
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
Primer:
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.00
2021-07-03 100.00
2021-07-04 270.00
2021-05-04 155.00
Primer:
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.00
2021-07-03 100.00
2021-07-04 270.00
2021-05-04 155.00
#include < iostream >
#include < string >
using namespace std;
int main()
{
#include < string >
using namespace std;
int main()
{
int n;
cin >> n;
string redTeksta;
cin.ignore();
string datumi[n];
double dnevnice[n];
int pozicije[2]= {2,5};//pozicije na kojima se nalaze "-" separatori za odvajanje godine, meseca i dana u datumu
int ind=0;
/*Ucitavanje redova*/
while(getline(cin,redTeksta))
{
//Ispis
cout<<"Datum: Zarada:" << endl;
for(int i=0;i < n;i++){
return 0;
}cin >> n;
string redTeksta;
cin.ignore();
string datumi[n];
double dnevnice[n];
int pozicije[2]= {2,5};//pozicije na kojima se nalaze "-" separatori za odvajanje godine, meseca i dana u datumu
int ind=0;
/*Ucitavanje redova*/
while(getline(cin,redTeksta))
{
int poz=line.find(" ");/*trazi na kojoj je poziciji " " koji razdvaja datum i zaradu*/
string datum=line.substr(0,poz);
//izdvaja deo teksta od pozicije 0, dok je poz u stvari dužina podstringa string dd=datum.substr(0,pozicije[0]);
string mm=datum.substr(pozicije[0]+1,2);
string yyyy=datum.substr(6);
string datumKontra=yyyy+"-"+mm+"-"+dd;
double zarada = stod(line.substr(poz+1));
datumi[ind] = datumKontra;
dnevnice[ind] = zarada;
ind++;
if(ind == n)break;
}string datum=line.substr(0,poz);
//izdvaja deo teksta od pozicije 0, dok je poz u stvari dužina podstringa string dd=datum.substr(0,pozicije[0]);
string mm=datum.substr(pozicije[0]+1,2);
string yyyy=datum.substr(6);
string datumKontra=yyyy+"-"+mm+"-"+dd;
double zarada = stod(line.substr(poz+1));
datumi[ind] = datumKontra;
dnevnice[ind] = zarada;
ind++;
if(ind == n)break;
//Ispis
cout<<"Datum: Zarada:" << endl;
for(int i=0;i < n;i++){
cout << datumi[i] << " " << dnevnice[i] << endl;
}return 0;
Napomena: Za izdvajanje datuma iz reda teksta moglo je da se uradi upotrebom getline() funkcije sa 3. parametrom koji predstavlja separator, kao što je pokazano u prethodnim primerima na ovoj stranici.
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
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
Da bi ste nastavili sa pripremom za viši nivo takmičenja kliknite na sledeći link:
Priprema za državna takmičenja
Priprema za državna takmičenja
Sledeće
Kvalifikacije za okružna takmičenja >| |