MAPA ČASA
Od ideje do prvog C programa
1
program
2
podaci
3
promenljiva
4
pseudokod
5
C program
Na kraju je dovoljno da:
- Razlikuj definiciju strukturnog tipa od promenljive tog tipa.
- Koristi tačku za član promenljive i strelicu za član preko pokazivača.
- Obradi statički niz struktura i sačuvaj prvi element koji ispunjava uslov maksimuma.
- Napravi strukturu koja sadrži drugu strukturu i pristupi unutrašnjim članovima.
01 · KORAK
Definicija opisuje tip, a promenljiva pravi jedan zapis
Struktura povezuje podatke koji zajedno opisuju jednu stvar. Proizvod, na primer, može imati šifru, naziv i cenu. Članovi mogu biti različitih tipova i svaki ima svoje ime.
Sama definicija struct Proizvod opisuje raspored članova. Tek deklaracija struct Proizvod p pravi promenljivu u memoriji. Članu promenljive pristupa se tačkom: p.sifra, p.naziv i p.cena.
struct Proizvod {
int sifra;
char naziv[30];
double cena;
};
struct Proizvod p = {104, "Sveska", 180.0};
printf("%s %.2f\n", p.naziv, p.cena);
Tip ili konkretan zapisU kodu označi definiciju tipa, promenljivu p i sva tri izraza koji biraju po jedan član. Zatim napiši promenljivu druga i postavi joj šifru 205.
Tačka bira član promenljiveLevo od tačke mora biti strukturna promenljiva. p.cena je double, dok je p ceo zapis tipa struct Proizvod.
02 · KORAK
Ceo zapis se kopira naredbom dodele
Strukturna promenljiva može da se inicijalizuje redom kojim su članovi definisani. Ako su a i b istog strukturnog tipa, naredba b = a kopira sve članove. Posle toga su to dve odvojene promenljive.
Niz znakova unutar strukture se pri kopiranju celog zapisa takođe kopira. Ali kasnija naredba b.naziv = "Mesija" nije dozvoljena, jer se niz znakova ne menja znakom jednakosti. Za to koristimo strcpy ili učitavanje u postojeći niz.
#include <string.h>
struct Knjiga { char naziv[30]; int godina; int stranica; };
struct Knjiga a = {"Dina", 1965, 412};
struct Knjiga b = a;
b.godina = 2021;
strcpy(b.naziv, "Mesija");
Prati oba zapisaNapiši konačne članove promenljivih a i b. Objasni zašto promena b.godina ne menja a.godina i ispravi pokušaj b.naziv = "Fondacija".
typedef skraćuje ime tipaPosle typedef struct { ... } Knjiga; promenljiva se piše kao Knjiga k. typedef ne pravi objekat i ne menja način na koji se članovi čuvaju.
03 · KORAK
Jedan indeks bira ceo zapis u nizu
Niz struktura čuva više zapisa istog tipa. Izraz s[i] bira jednog studenta, a s[i].poeni bira njegove poene. Tako ime i poeni istog studenta uvek koriste isti indeks.
Za prvi maksimum postavljamo imax na 0, krećemo od indeksa 1 i menjamo ga samo uz strogo veće >. Ako se maksimum ponovi, prvi pronađeni zapis ostaje izabran.
int imax = 0;
for (int i = 1; i < n; i++) {
if (s[i].poeni > s[imax].poeni) imax = i;
}
printf("%s %d\n", s[imax].ime, s[imax].poeni);
Prvi i poslednji maksimumZa poene 72, 91, 91 i 84 prati imax posle svakog prolaza. Zatim promeni samo operator tako da se kod jednakih maksimuma izabere poslednji zapis.
Ne razdvajaj podatke koji pripadaju zajednoKada nađemo indeks, preko istog indeksa prikazujemo sve članove tog elementa. Poseban maksimum bez sačuvanog indeksa nije dovoljan ako treba i ime ili drugi podatak.
04 · KORAK
Kopija za računanje, adresa za promenu originala
Kada funkcija primi strukturu po vrednosti, dobija kopiju zapisa. To je dovoljno za računanje koje ne menja original. Član kopije bira se tačkom, na primer a.cena.
Kada funkcija treba da promeni original, prima pokazivač. Tada a->cena znači isto što i (*a).cena. Pri pozivu šaljemo adresu, na primer promeni_cenu(&x, 1350).
double vrednost(struct Artikal a) {
return a.cena * a.komada;
}
void promeni_cenu(struct Artikal *a, double nova) {
a->cena = nova;
}
Izaberi pravi parametarNapiši funkciju dodaj_komade koja menja član komada originalnog artikla. Zatim napiši funkciju vrednost koja samo vraća cena * komada.
Tačka i strelica nisu proizvoljan izborZa strukturnu promenljivu koristi se tačka. Za pokazivač na strukturu koristi se strelica. Ako napišeš a.cena, a je promenljiva; ako napišeš a->cena, a je adresa.
05 · KORAK
Struktura može da sadrži drugi strukturni tip
Centar kružnice prirodno čine dve koordinate, pa ga možemo predstaviti posebnom strukturom Tacka. Kružnica tada sadrži jedan član tipa Tacka i jedan poluprečnik.
Pristup prati putanju kroz članove: k.centar.x za promenljivu ili pk->centar.x preko pokazivača. Strelica se odnosi na prvi korak kroz pokazivač, a zatim tačka bira x unutar člana centar.
struct Tacka { double x, y; };
struct Kruznica {
struct Tacka centar;
double poluprecnik;
};
struct Kruznica k = {{2.0, -1.0}, 5.0};
Pomeri samo centarNapiši funkciju pomeri koja prima adresu kružnice i dx, dy, pa menja samo koordinate centra. Poluprečnik mora ostati isti.
Broj tačaka prati broj nivoak.centar je ceo član tipa Tacka. Tek k.centar.x je jedna double vrednost. Kod pokazivača je odgovarajući izraz pk->centar.x.
06 · KORAK
Ispit traži definiciju, primer i upotrebu
Pitanje 58 glasi: 'Navesti: a) linearne strukture podatka, b) nelinearne strukture podataka.' Linearne su nizovi, povezane liste, stekovi i redovi; nelinearne su stabla i grafovi.
Pitanja 59-61 traže primer kompleksnog broja, objašnjenje strukturnog tipa sa podacima o studentu i strukturu za kružnicu sa koordinatama centra i poluprečnikom. Nije dovoljno samo nabrojati članove: napiši validnu definiciju i bar jednu promenljivu ili pristup članu.
struct Kompleksan { double realni, imaginarni; };
struct Student { char ime[50]; unsigned broj_indeksa; double prosek; };
struct Tacka { double x, y; };
struct Kruznica { struct Tacka centar; double poluprecnik; };
Odgovor bez gledanjaZa svako pitanje 59-61 prvo reci jednu jasnu definiciju, zatim napiši primer koda i pokaži pristup jednom članu.
PAŽNJA UZ PITANJE 60Podela na linearne i nelinearne strukture pripada pitanju 58, ne definiciji C struct tipa. Ako stari odgovor to meša ili koristi void main, objasni ispravnu podelu i koristi standardni int main(void).
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?