MAPA ČASA
Od ideje do prvog C programa
1
program
2
podaci
3
promenljiva
4
pseudokod
5
C program
Na kraju je dovoljno da:
- Pre pisanja koda izdvoji ulaz, rezultat, stanje i potrebne resurse.
- Samostalno napiši programe sa ciframa, nizom i strukturama.
- Ispravi program koji učitava matricu iz fajla.
- Proveri negativne vrednosti, granične dimenzije i jednake kandidate.
- Upravljaj dinamičkom memorijom i fajlovima bez curenja resursa.
- Objasni ključne odluke u programu kratko i precizno.
01 · KORAK
Prvo rastavi zahtev, zatim piši program
Pre prvog reda koda napiši šta se učitava, šta program mora da pamti, šta je konačan rezultat i da li koristi niz, fajl ili dinamičku memoriju. Tako biraš potrebne petlje i provere pre nego što se izgubiš u sintaksi.
Odmah zapiši i bar tri probna slučaja: običan primer, najmanji dozvoljeni ulaz i primer koji bi otkrio verovatnu grešku. Probni ulaz nije ukras posle programa, već deo rešavanja zadatka.
ULAZ: koje vrednosti stižu i koje su granice
STANJE: šta mora da se sačuva između koraka
OBRADA: funkcije, petlje i uslovi
RESURSI: niz, malloc ili fajl
IZLAZ: tačan sadržaj i format ispisa
Napravi plan za jedan zadatak bez C sintakseZa zadatak sa ciframa napiši pet redova plana i označi koja petlja prolazi kroz brojeve, a koja kroz cifre jednog broja.
Dve petlje ne znače uvek matricuKada obrađuješ više brojeva, spoljašnja petlja bira broj, a unutrašnja prolazi kroz njegove cifre.
02 · KORAK
Dve zastavice pamte dve nezavisne osobine
Ako broj treba da ima bar jednu parnu i bar jednu neparnu cifru, ne treba pamtiti sve cifre. Dovoljne su dve zastavice koje za svaku cifru beleže da li je njena vrsta pronađena.
Apsolutna vrednost uklanja znak broja, a do-while obrađuje makar jednu cifru. Funkcija vraća logički izraz parna && neparna, pa main samo uvećava konačan brojač.
int parna = 0, neparna = 0;
do {
int cifra = x % 10;
if (cifra % 2 == 0) parna = 1;
else neparna = 1;
x /= 10;
} while (x != 0);
return parna && neparna;
Prati samo ono što utiče na odlukuZa brojeve 28, 444, 731 i -50 popuni dve zastavice i odluči koji brojevi ispunjavaju oba uslova.
Zastavica odgovara na pitanje da ili neBrojanje parnih i neparnih cifara bilo bi potrebno samo kada zadatak traži njihove količine, a ne samo postojanje.
03 · KORAK
Prvo izračunaj merilo, pa menjaj niz
Kada odluka o brisanju zavisi od proseka originalnog niza, prosek mora biti izračunat pre prve promene sadržaja. Za realan prosek bar jedan operand deljenja pretvaramo u double.
Brisanje bez pomoćnog niza radi se indeksom w. Indeks i čita svaki stari element, a w označava sledeće slobodno mesto za element koji ostaje. Na kraju nova dužina postaje w.
int w = 0;
for (int i = 0; i < n; i++) {
int brise_se = a[i] % 2 != 0 && a[i] > prosek;
if (!brise_se) a[w++] = a[i];
}
n = w;
Odvoji računanje proseka od transformacijeZa niz 4 9 2 7 10 3 prvo izračunaj prosek parnih elemenata, zatim u tabeli označi stare i nove pozicije elemenata koji ostaju.
Indeks čitanja i indeks upisa nemaju isti posaoi uvek ide kroz originalnih n elemenata, dok w raste samo kada element ostaje u nizu.
04 · KORAK
Najveći zbir mora da počne stvarnim kandidatom
Program iz fajla prvo proverava fopen, zatim svako fscanf čitanje i dozvoljenu dimenziju. Fajl se zatvara posle poslednjeg čitanja, kao i pre svakog ranijeg izlaska koji se desi nakon uspešnog otvaranja.
Ako svi zbirovi kolona mogu biti negativni, početna vrednost nula nije siguran kandidat. Maksimum se postavlja na zbir prve kolone, a preostale kolone se porede strogim znakom > kako bi kod jednakih zbirova ostala prva.
int imax = 0;
long maksimum = 0;
for (int i = 0; i < n; i++) maksimum += a[i][0];
for (int j = 1; j < n; j++) {
long zbir = 0;
for (int i = 0; i < n; i++) zbir += a[i][j];
if (zbir > maksimum) { maksimum = zbir; imax = j; }
}
Proveri slučaj koji obara početnu nuluZa matricu čiji su zbirovi kolona -18, -10 i -17 prati maksimum posle svake kolone i odredi koju kolonu program prikazuje.
Prvi element ili prva grupa je često najbolja inicijalizacijaTako početni kandidat pripada skupu koji zaista pretražujemo, bez posebnog slučaja za negativne vrednosti.
05 · KORAK
Struktura opisuje zapis, funkcije opisuju odluke
Četiri stranice čuvaju se u jednom zapisu Cetvorougao. Funkcije Romb, Paralelogram i Obim imaju po jedan jasan posao, pa main ostaje zadužen za unos, sabiranje i upravljanje dinamičkim nizom.
Ako zadatak kaže da romb ne treba ponovo računati kao paralelogram, uslov za paralelogram mora izričito da isključi Romb(x). Memoriju zauzima main i zato je oslobađa posle poslednje upotrebe, kao i pre ranog izlaska posle malloc-a.
int Romb(Cetvorougao x) {
return x.a == x.b && x.b == x.c && x.c == x.d;
}
int Paralelogram(Cetvorougao x) {
return !Romb(x) && x.a == x.b && x.c == x.d;
}
Odbrani granicu između funkcije i main-aObjasni zašto funkcija Obim ne treba da menja zbir svih obima i zašto funkcija Paralelogram proverava samo jedan četvorougao.
Jedna funkcija, jedna odlukaKratka funkcija se lakše proverava pojedinačnim primerom i lakše objašnjava na usmenom.
06 · KORAK
Pre predaje proveri rezultat i pripremi dva zašto
Prevođenje potvrđuje sintaksu, ali ne potvrđuje da je algoritam tačan. Pokreni običan, graničan i namerno nezgodan ulaz, a rezultat makar jednog primera izračunaj ručno.
Za odbranu pripremi kratke odgovore na dva pitanja: zašto je izabrana baš ta promenljiva ili funkcija i koji bi primer otkrio najverovatniju grešku. Ako koristiš malloc ili fopen, u odgovoru obavezno pokaži gde se resurs oslobađa ili zatvara.
1. Šta program pamti između dva koraka?
2. Koji ulaz proverava granicu?
3. Zašto početna vrednost maksimuma radi?
4. Ko menja dužinu niza?
5. Ko je vlasnik memorije ili fajla?
6. Šta se ispisuje i da li format tačno odgovara zahtevu?
Objasni kod bez čitanja svakog redaIzaberi jedan od četiri programa, sažmi algoritam u najviše šest rečenica i odgovori na dva dodatna pitanja o granicama ili resursima.
Tačan program moraš moći i da proverišAko ne znaš koji ulaz bi otkrio grešku, verovatno još nisi proverila najvažniju odluku u algoritmu.
ZATVARANJE
Brza provera pre domaćeg
- Koja je razlika između algoritma i programa?
- Šta je ime, a šta vrednost promenljive?
- Kako svojim rečima čitaš x = x + 1?
- Koji red prvog programa računa, a koji prikazuje rezultat?