Onaj stog je napisan bedasto, misli se na liste, sve je s listama u prvom. Riječ stog zamjeni s listama.
Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 351.017
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
Vrlo pogrešno. Bolje da si taj novac dao nekome da ti pokaže ovo kaj te muči, kad si nisu u stanju naći džaba pomoć.
Dok sam učio programirati nikome nikada nisam ništa plaćao, al' to je lijen ili nije sposoban sam nešto shvatiti, onda neka plati.
Novac je najpoštenija i najjefitnija solucija rješavanja problema.
ovaj prvi me muči, ne kužim e trebaju bit liste il lista i stog? ili 2 liste i stog?
i kad sam radio taj kod uvjek nešt promašim tak da sam se nasekiro i otišo se zapit.
U zadatku kažu da listu realiziraš preko pokazivača, dakle, traži se vezana lista.
E onda ti traže da tu vezanu listu tretiraš kao stog, što znači da čitaš elemente sa vrha stoga, odnosno posljednji unutra prvi van.
To možeš postići jednostruko vezanom listom, dakle napraviš strukturu koja ima pokazivač prev, odnosno pokazivač nazad i uvijek pomičeš vrh liste na zadnji element koji si unio.
Kad ubaciš tu vezanu listu u proceduru, za argument uzmeš pokazivač na vrh stoga, odnosno na element koji si posljednji unio, sa pokazivačem prev odnosno pokazivačem nazad ideš na prethodno uneseni element i tako do prvog unesenog elementa.
Što se tiče koliko listi, bili su jasni, dvije, pa dvije i napravi, naravno, kroz jedan unos. To znači da kod čitanja tih listi kao stoga skidaš element sa stoga kojeg si prošitao, a element na koji pokazuje pokazivač prev odnosno pokazivač nazad postaje novi vrh stoga.
Evo primjer, jednostruka lista kao stog gdje se računa suma unesenih elemenata.
#include<iostream>
using namespace std;
typedef struct element
{
int broj;
element* prev;
};
element* Add(element* vrh, int n)
{
element* novi = (element*)malloc(sizeof(element));
novi->broj = n;
novi->prev = vrh;
vrh = novi;
return vrh;
}
int Sum(element* vrh)
{
int suma = 0;
while (vrh != NULL)
{
suma += vrh->broj;
element* elem = vrh;
vrh = vrh->prev;
free(elem);
}
return suma;
}
int main()
{
int suma;
element* vrh = NULL;
vrh = Add(vrh, 5);
vrh = Add(vrh, 1);
vrh = Add(vrh, 8);
suma = Sum(vrh);
printf("%d\n", suma);
return 0;
}
Pozdrav svima! E ovako, na faksu smo imali zadatak koji je od nas trazio da napravimo program gdje korisnik sam unosi koliko ima kandidata, te koliko svaki kandidat ima sudaca. Zatim je bilo potrebno od svakog sudca unijeti ocjenu za određenog kandidata. Onda se ocjene salju proceduri 'izracunajProsjek' koja vraca prosjek ocjene za svakog kandidata. Ja sam do sada napravio ovo:
#include<stdio.h>
#include<conio.h>
void racunajProsjek(float ocjene[], float prosjek[], int abrojPonavljanja){
int aindeks;
prosjek[abrojPonavljanja];
for(aindeks=0;aindeks<abrojPonavljanja;aindeks++){
prosjek[aindeks]=prosjek[aindeks]+ocjene[aindeks]/abrojPonavljanja;
}
}
main(){
int i, brojKandidata, brojSudaca, indeks;
printf("Unesite broj kandidata: ");
scanf("%d",&brojKandidata);
for(i=0;i<brojKandidata;i++){
printf("\nUnesite broj sudaca %d. kandidata: ",i+1);
scanf("%d",&brojSudaca);
float ocjena[brojSudaca];
float prosjekOcjena[brojSudaca];
prosjekOcjena[brojSudaca]=0.0;
for(indeks=0;indeks<brojSudaca;indeks++){
printf("Unesite ocjenu %d. sudca: ",indeks+1);
scanf("%f",&ocjena[indeks]);
racunajProsjek(ocjena, prosjekOcjena, brojSudaca);
}
printf("PROSJEK=%.2f\n",prosjekOcjena[indeks]);
}
}
ugl. Prosjek mi ne racuna dobro, a ja iskreno nemam pojma zasto i ne znam kako uopce postici da se izracuna.
Ovak' izgleda .exe:
Funkcija koja računa prosjek kod tebe nema načina vratiti vrijednost. Možeš staviti printf u "racunajProsjek", pa da ti ispiše rezultat na ekran
ili da sama funkcija vrati vrijednost kada se izvrši. Zadnja opcija je da koristiš pointere na liste ali u ovom slučaju to nije potrebno.
Imaš par variabli previše, i ako sam dobro shvatio zadatak nema potrebe imati listu prosjeka jer se ta informacija dobije na ekran.
U for petlji možeš deklarirati varijablu koju ćeš koristiti kao brojač, tako da slobodno možeš koristiti variablu imena "i" u svakoj for petlji.
Evo, prepravio sam kod:
#include <stdio.h>
float racunajProsjek(float ocjene[], int brojPonavljanja);
int main(){
int brojKandidata = 0;
printf("Unesite broj kandidata: ");
scanf("%d", &brojKandidata);
for(int i = 0; i < brojKandidata; i++)
{
int brojSudaca = 0;
printf("\nUnesite broj sudaca %d. kandidata: ",i + 1);
scanf("%d", &brojSudaca);
float ocjene[brojSudaca];
for(int i = 0; i < brojSudaca; i++)
{
printf("Unesite ocjenu %d. sudca: ", i + 1);
scanf("%f", &ocjene[i]);
}
printf("PROSJEK=%.2f\n", racunajProsjek(ocjene, brojSudaca));
}
return 0;
}
float racunajProsjek(float ocjene[], int brojPonavljanja){
float prosjekOcjena = 0;
for(int i = 0; i < brojPonavljanja; i++){
prosjekOcjena += ocjene[i];
}
return prosjekOcjena / brojPonavljanja;
}
Ne znam koji kompajler koristite na faksu (conio.h, Borland?) ali gcc mi je izbacio par upozorenja za tvoj kod. Jedno od njih je bilo da main funkcija mora biti tipa int.
Na faksu koristimo conio.h i main inace ne deklariramo, tj. nismo nikad u ovih 15 tjedana. Hvala na prepravci :D!
scanf("%d", &brojSudaca);
float ocjene[brojSudaca];
na ovu liniju koda će compiler-i koji ne podržavaju c99 buniti i neće proć jer stariji standard ne podržava VLA(variable length array).
Da bi se to izbjeglo, koristi se dinamička alokacija memorije iz standardne biblioteke stdlib.h, odnosno calloc(), malloc();
float *ocjene = calloc(sizeof(float), brojSudaca);
for (int i = 0; i < brojSudaca; i++)
{
printf("Unesite ocjenu %d. sudca: ", i + 1);
scanf("%f", &ocjene[i]);
}
printf("PROSJEK=%.2f\n", racunajProsjek(ocjene, brojSudaca));
free(ocjene);
jel mi može netko objasniti kako ovo funkcionira
#include <stdio.h>
int main(void){
int i;
for (i = 0; i < 20; i++)
printf("i = %d\n", i);
i = 0;
while (i++ < 20)
printf("i = %d\n", i);
i = 0;
do
printf("i = %d\n", i);
while (++i < 20);
return 0;
}
dakle, jasno mi je za for da će odraditi 20 koraka i da će raditi inkrement nad brojačem nakon što odradi naredbu unutar petlje.
e sad while, stoji u uvjetu postfiks inkrement i++ < 20, razumijem da će povećavati i, no nije mi jasno što se prvo odrađuje. inkremet (++) je većeg prioriteta nego relacijski operator (<), dakle prvo će očito uvećati i pa provjeriti uvjet, što znači da će u prvom koraku i biti 1, no kako je onda u posljednjem koraku kada je i = 20, uvijet se ne može ispuniti?
za do - while, stoji prefiks uvećanja, prvo će ući u petlju, ispisati i = 0, pa zatim provjeriti uvjet. dakle prvi korak će svakako odraditi. do zadnjeg će povećavati za 1 i ispisat će 19. zašto?
Stoji u slici dolje:
Dvije su vrste inkrementa, nije isto ++x i x++
++x prvo poveca vrijednost varijable x i onda napravi nešto
x++ prvo napravi nešto a tek onda poveca vrijednost od x
x = 2
if (x++ == 3)
printf("DA")
else
printf("NE")
Ovaj kod će ispisati "NE"
x = 2
if (++x == 3)
printf("DA")
else
printf("NE")
Ovaj kod će ispisati "DA"
while vs do while
while prvo provjeri uvjet, tek onda izvrši nešto
do while prvo izvrši nešto, a tek onda provjeri uvjet
x = 4
while(x == 3){
print("x je 3");
x++; //moze i ++x, isto je na ovom mjestu
}
Neće ispisati ništa, jer x nije 3
x = 4
do{
print("x je 3");
x++; //moze i ++x, isto je na ovom mjestu
} while(x == 3);
Ispisati će "x je 3" (iako sam stavio x na 4). Nakon toga će provjeriti uvjet, viditi će da x nije 3 i neće ponavljati radnju
...
zar ne bi trebao onda kod while petlje prvo provjeriti uvjet (i++ < 20) pa onda povećati i za 1, te zatim ući u petlju i ispisati i = 1
u zadnjem koraku ispisuje i = 20, ali u uvjetu provjerava 19 < 20
za do - while će prvo ispisati i = 0, pa provjerit uvjet (++i < 20) gdje će prvo povećati i
do kraja će doći sa i = 19, povećat i na 20 (20 < 20 = 0) - zaustavlja petlju.
ako sam dobro shvatio :D
jel mi može netko objasniti kako ovo funkcionira
#include <stdio.h>
int main(void){
int i;
i = 0;
while (i++ < 20)
printf("i = %d\n", i);
return 0;
}
Pošto se ovdje radi o postfiksnom inkrementu, prvo se provjerava stara vrijednost pa se zatim uveća na novu.
Odnosno prva iteracija petlje pita:
dali je 0 manje od 20, ako je, uvećaj mi "i" za jedan i ispiši novu vrijednost, i tako dalje.
Kada varijabla "i" poprimi vrijednost 19, pita se dali je 19 manje od 20, ako je, uvećaj mi "i" za 1, te ispiši novu vrijednost, ispisat će 20(uvjet je bio i dalje zadovoljen).
Sljedeća, ujedno i posljednja pita, dali je 20 veće od 20, nije, uvećaj "i" za jedan, al nemoj ući u tijelo petlje jer uvijet nije zadovoljen.
Stanje "I" varijable će biti 21 nakon završetak.
Gle, još jednom:
x++ napravi usporedbu pa onda poveća x
++x poveća x na onda napravi usporedbu
x = 0
while(x++ == 1){ //pri usporedbi je x = 0
//tu je sad x = 1
...
}
x = 0
while(++x == 1){ //pri usporedbi je x = 1
//tu ostaje x = 1
...
}
Najbolje ti je sam napisati par puta jednostavnu petlju sa nekakvim ispisom i shvatiti ces sto se dogada.
EDIT: Evo ti još detaljnije
x = 0
while(x++ < 2)
printf("%d", x);
x = 0 OK ulazimo u petlju, stavi x = 1 i izvrši petlju
x = 1 OK ulazimo u petlju, stavi x = 2 i izvrši petlju
x = 2 NIJE OK, ne ulazimo u petlju, stavi x = 3
x = 0
while(++x < 2)
printf("%d", x);
x = 0, stavi x = 1 OK ulazimo u petlju i izvrši petlju
x = 1, stavi x = 2 NIJE OK, ne ulazimo u petlju
Zna li netko sto tocno kod calloca predstavlja prvi, a sto drugi parametar funkcije.
prototip
void *calloc(size_t n, size_t vel);
Shvatio sam to kao n (velicina polja), dok je vel, velicina pojedinog elementa polja. Dakle, ako se funkcija pozove s argumentima calloc(10, 15), vratit ce zauzetu memoriju velicine 10*15 bajta, neovisno o tome na koji tip podatka je castana povratna vrijednost?
recimo, jos konkretnije
float *p;
p = (float *)calloc(10, 15);
zauzece u memoriji: 150 bajta
float *p;
p = (float *)calloc(10, sizeof(float)); //operator sizeof vraca velicinu svog operanda u bajtima
zauzece: 40 bajta
Zna li netko sto tocno kod calloca predstavlja prvi, a sto drugi parametar funkcije.
prototip
void *calloc(size_t n, size_t vel);
Shvatio sam to kao n (velicina polja), dok je vel, velicina pojedinog elementa polja. Dakle, ako se funkcija pozove s argumentima calloc(10, 15), vratit ce zauzetu memoriju velicine 10*15 bajta, neovisno o tome na koji tip podatka je castana povratna vrijednost?
recimo, jos konkretnije
float *p;
p = (float *)calloc(10, 15);
zauzece u memoriji: 150 bajta
float *p;
p = (float *)calloc(10, sizeof(float)); //operator sizeof vraca velicinu svog operanda u bajtima
zauzece: 40 bajta
tocno
http://cs.unm.edu/~fastuous/spring14/cs241/C%20Programming%20Language%20-%202nd%20Edition.pdf
Mogu li po ovoj knjizi poceti uciti C, s time da nemam skoro pa nikakvog iskustva u programiranju?
http://cs.unm.edu/~fastuous/spring14/cs241/C%20Programming%20Language%20-%202nd%20Edition.pdf
Mogu li po ovoj knjizi poceti uciti C, s time da nemam skoro pa nikakvog iskustva u programiranju?
Ta knjiga ti je enciklopedija C-jezika. Bit će ti teška jer nemaš nikakvog iskustva u programiranju. Preporučam da ju koristiš ali uz još nešto (nekakva druga knjiga za početnike ili možda nekakvi materijali sa faksa...). Ta knjiga bi ti trebala služiti da naučiš sintaksu.
Imam jedno pitanje u vezi dinamičke alokacije memorije i pointera...
Znači ovaj kod:
#include <stdio.h>
#include <stdlib.h>
main()
{
int i=0;
int *ptr;
ptr = malloc(1000000000 * sizeof(int));
if (ptr == NULL){
printf("Nemas memorije");
exit(1);
}
for(i=0;i<1000000000;i++)
ptr[i] = 1;
getchar();
free(ptr);
}
Zar ovo žuto označeno ne bi trebalo izgledati ovako?
*ptr[i] = 1;
Naravno da ne bi, jer tako ne radi, no nije mi skroz jasno.
Zar ne želim dodijeliti vrijednost 1 onoj varijabli na koju pointer pokazuje? Ovako mi izgleda kao da mijenjam adresu koju pointer sadrži na tom mjestu u memoriji, odnosno vrijednost pointera.
Može netko to malo pojasniti?
Ah, dobar stari C, latinski jezik među kompjuterskim programski jezicima. Dobra stara vremena....
Ej, nuklearni....
Ovo bi ti moglo pomoći za početak.
Pogledaj s vezu polja i pokazivača(pointera)
alocirao si memoriju, te si dobio početnu adresu pointera sa time. Npr. pointer pokazuje na adresu "2356". Nadalje, provjera da pointer ne sadrži null vrijednost.
E, sad for petlja, tu dodaješ vrijednosti 1 na adresu na koju pokazuje pointer.
Ovo ti je ključno, ptr[i] je isto što i *ptr.
A ovo kaj želiš, probaj ovako "*(ptr + 1)".
Za ovaj tvoj kôd koji uključuje ovo tvoje drugo žuto("*ptr[i]", baca VS ovu grešku.
Evo ti moj kôd koji sam koristio dok sam testirao. Samo sam uzeo malo manju veličinu za alociranje, te sam koristio još jednu for petlju radi ispisa i kontrole rezultata.
#include <stdio.h>
#include <conio.h>
int main()
{
int i = 0;
int *ptr;
ptr = malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Nemas memorije");
exit(1);
}
for (i = 0; i < 5; i++)
//ptr[i] = 1;
*(ptr + i) = 1;
for (i = 0; i < 5; i++)
printf("%d ",ptr[i]);
//getchar();
free(ptr);
getch();
printf("\n");
return 0;
}
Imam jedno pitanje u vezi dinamičke alokacije memorije i pointera...
- int *ptr;
- ptr = malloc(10 * sizeof(int));
- ptr[i] = 1;
Naravno da ne bi, jer tako ne radi, no nije mi skroz jasno.
Zar ne želim dodijeliti vrijednost 1 onoj varijabli na koju pointer pokazuje? Ovako mi izgleda kao da mijenjam adresu koju pointer sadrži na tom mjestu u memoriji, odnosno vrijednost pointera.
Može netko to malo pojasniti?
Idem ovo malo slikovitije opisati (i primjeti da sam napravio malu izmijenu u tvom kodu)
Naredbom (1) ti rezerviraš jednu lokaciju u memoriji. Tip podatka za kojeg si rezervirao memoriju je pokazivač (engl. pointer) na integer. Veličina pokazivača je uglavnom 4 ili 8 bytea (inače provjeriš s sizeof(int *)) i neovisna je o podatku na kojeg pokazivač pokazuje. (*)
Pokazivači "pokazuju" na redak u memoriji. Odnosno kao što tip int sprema neki cijeli broj (primjer 1231), tako pokazivač sprema neku adresu (uglavnom veličine 4 ili 8 B)
Kad bi imao ovakav kod: (pretpostavimo da je int velicine 4B, te pointer 4B, i s tom pretpostavkom nastavljam dalje)
int broj;
int * pointer;
broj = 1;
pointer = &broj;
ti bi zauzeo 4 bytea za cijeli broj varijable nazvane broj na lokaciju od 0x00001000 do (uključujući) 0x00001003 (mislim da ovo ipak ovisi o endianu, ali pretpostavimo ovako)
zauzeo bi 4 bytea za pokazivač na cijeli broj nazvan pointer na lokaciju od 0x00001004 do (uključujući) 0x00001007
na lokaciju variable broj spremio bi vrijednost 1
na lokaciju pokazivača spremio bi 0x00001000
Naredba malloc(x) rezervira x byteova i vraća adresu na kojoj je rezervirao x byteova
Što znači da naredbom (3) u ptr spremiš adresu na kojoj je zauzeto 10 * sizeof(int) byteova. (10 * 4B po pretpostavci)
Kad bi napisao ptr = 1; ti bi zapravo zadao da ptr pokazuje na adresu 0x00000001 (iako mislim da jezik to ne dozvoljava)
naredba *(ptr) znači "skoči na adresu zapisanu u ptr i izvadi vrijednost na koju pokazuje pokazivač"
Sad u igru dolazi ono što sam označio s (*) i zašto pokazivači pokazuju na nešto (pa kažemo da imaju "tip"). Pokazivači imaju tip iz dva razloga: 1. da bi mogao obaviti aritmetiku nad pointerima, 2. da bi se znalo na koliko byteova pokazuje kad se čita vrijednost s adrese koja je zapisana u njemu. Započet ću s drugim razlogom:
2. Čitanje vrijednosti
Pretpostavimo da je u ptr zapisano 0x00001000 i znamo da je na toj adresi zapisano 10 intova. Kako bi pri čitanju s te adrese računalo znalo koliki podatak treba preuzeti? 1, 5 ili 123 Byteova? Bez oznake int nikako. Dakle oznaka int kaže da se s te adrese čita 4B (ili općenito sizeof(int)).
U mom primjeru, *(pointer) će pročtati vrijednost 1
1. Aritmetika nad pointerima
tvoj ptr pokazuje na adresu u kojoj je spremljeno 10 intova. Što bi ti htio da znači ptr + 1 u jeziku C?
Znaš da ptr pokazuje na tip int. Najzgodnije bi bilo kad bi ptr + 1 zapravo pokazivao na slijedeći int u nizu. Dakle ptr + 1 će biti 0x000010004, a ptr + 4 će biti 0x00001010
Sad dolazimo do značenja ptr[x]
Kako smo zauzeli 10 mjesta počevši od adrese ptr, prvom elementu možemo pristupiti s *(ptr)
Kako znamo aritmetiku nad pointerima, sljedeći element čitamo s *(ptr + 1), onaj iza toga *(ptr + 2). Shvatili smo kako je to nezgrapno pa smo odlučili to poistovijetiti s ptr[0], ptr[1] i ptr[2]
dakle:
*(ptr + i) := ptr[i]
POZOR:
Meni su jasne neke gluposti u tekstu (kao kad sam napisao da "računalo ne zna koliki podatak treba uzeti"), ali sam morao "poglupiti" odgovor jer inače bi skočili na još milijun stvari. Od kompajlera do OSa
P.S.
Je li sad jasno zašto računarci broje od 0? :P
Edit:
Dok sam ja ovo natipkao, kolega pzkpfw je već otkrio sve u puno kraćem postu
Nisam refreshao stranicu, ostala otvorena od sinoć
Đabe sam potrošio tipkovnicu
Ne slažem se sa tvojom posljednjom napisanom rečenicom.
Zašto?
Zbog toga, jer učim od onih koji više znaju.
Tvoj odogovor sam arhivirao, te će svima doći dobro i buduće, kada se budi pitaj što je to dinamičko alociranje memorije, te pointeri. Iako, po netu toga u obliku objašnjena ima bezbroj, uvijek nečiji odgovor nekome iz nekoga razloga ostane upečatljiv.
Sviđa mi se tvoj odgovor, te ga lajkam. I meni je koristio.
Živio!
RIJEŠENO
U signal.h primjetio sam liniju 3:
#include <bits/sigset.h>
Potražio sam taj header file i nije ga bilo u /usr/include/bits
Zapravo mapa bits unutar mape include nije postojala
Potražio sam postoji li uopće sigset.h naredbom
find /usr/include -name sigset.h
I rezultat je bio:
/usr/include/x86_64-linux-gnu/bits/sigset.h
Mislim da je sad očito, samo sam premjestio mapu bits u /usr/include/ i to je ot :)
PROBLEM:
Kad probam kompajlirat program, izbaci mi upozorenje: "warning: implicit declaration of function ‘sigset’ [-Wimplicit-function-declaration]"
signal.h datoteka se nalazi u /usr/include/signal.h
Kad pokrenem cat /usr/include/signal.h | grep "sigset" dobijem sljedeći ispis (slika)
u signal.h nije deklarirana sigset funkcija?
Probao sam svašta s googla, nema pomoći
Ubuntu 17.04
Geany sa sljedećim Build postavkama: gcc -Wall -o "%e" "%f" -lm
GCC 6.3.0 20170406
sigemptyset, sigaddset i ostale rade uredno, ali bih baš zbog jednostavnosti htio sigset
Hvala unaprijed!
PROBLEM:
Kad probam kompajlirat program, izbaci mi upozorenje: "warning: implicit declaration of function ‘sigset’ [-Wimplicit-function-declaration]"
signal.h datoteka se nalazi u /usr/include/signal.h
Kad pokrenem cat /usr/include/signal.h | grep "sigset" dobijem sljedeći ispis (slika)
u signal.h nije deklarirana sigset funkcija?
Link koji si postavio i pripadajuća man stranica su sasvim jasni:
"These functions are obsolete: do not use them in new programs. POSIX.1-2008 marks sighold(), sigignore(), sigpause(3), sigrelse(), and sigset() as obsolete, recommending the use of sigaction(2), sigprocmask(2), pthread_sigmask(3), and sigsuspend(2) instead."
Pozdrav.
Da li mi netko moze rijesiti ovaj zadatak ili barem malo nekako pomoci ? Radi se u C-u . Zadnje sto smo radili su petlje while, do while, for pa pretpostavljam da se to na taj nacin rjesava.
Prijatelji su vas zamolili da napišete program koji će im moći reći dan u tjednu kad su se rodili ako unesu svoj datum rođenja.
Nakon malo googlanja, pronašli ste sljedeći algoritam:
- Prvo se uzme dan u mjesecu
- na taj broj, zbroji se broj koji označava "mjesec" prema sljedećoj tablici:
siječanj: 6, veljača: 2, ožujak: 2, travanj: 5, svibanj: 0, lipanj: 3, srpanj: 5, kolovoz: 1, rujan: 4, listopad: 6, studeni: 2, prosinac: 4 - Nakon toga gleda se desetljeće i zbraja se pripadajući broj prema ovoj tablici:
1900: 1; 1910: 6; 1920: 5; 1930: 3; 1940: 2; 1950: 0; 1960: 6; 1970: 4; 1980: 3; 1990: 1; 2000: 0; 2010: 5; - Zatim se doda se zadnja znamenka godine rođenja
- U idućem koraku (zbog prijestupnih godina), treba gledati znamenku desetljeća i zadnju znamenku - prvo je potrebno provjeriti je li znamenka desetljeća bila parna ili neparna i ovisno o tome prema zadnjoj znamenki godine odabrati i pribrojiti broj iz jedne od ovih tablica:
Ako je parna znamenka:
0: 0 1: 0 2: 0 3: 0 4: 1 5: 1 6: 1 7: 1 8: 2 9: 2
Ako je neparna znamenka:
0: 0 1: 0 2: 1 3: 1 4: 1 5: 1 6: 2 7: 2 8: 2 9: 2
Primjer: za godinu 1997, znamenka desetljeća (9) je neparna, znači, odabire se broj pored znamenke 7 u drugoj tablici, tj. broj 2. - U ovom koraku traži se ostatak dijeljena dobivenog zbroja s brojem 7.
- Posljednji uvjet je da ako je datum rođenja bio siječanj ili veljača prijestupne godine (to su godine s parnim desetljećem koje završavaju na 0, 4 ili 8), treba oduzeti broj 1 od rezultata
- Dobiveni broj je redni broj dana u tjednu (ponedjeljak je prvi dan).
@old05snake12
Si ti ferovac? Ovo je tipični zadatak sa njihovih lab.vježbi.
Pretpostavljam da je ona već negdje na bespućima Interneta morao bit riješen.
Brijem da se to riješavalo sa if-else naredbama, ni petlji nisu loše....
Well, deklariraš tri int vrijednosti.
Inicijaliziraš iste.
Postaviš onda set if-else naredbi, gdje ovisno o unesenom int za varijablu mjesec, u neko dijelu koda isti podijeliš sa odgovarajućim brojem....i tako dalje....
Puno je tu štrikanja kôda.
Zabavno za vježbu i učenje. Bar je meni svojedobno bilo.
Nego, frende evo ti na slici rješenje tvojeg problema...samo prepravi ovo za I/O podatke(cout/cin u printf/scanf, te pazi na ono %d i slično). Da nije C++, nego C po pravilima struke.
Inače, imaš rješenje sigurno na netu.
Al' nije poanta učenja samo imati rješenje zadataka, nego da naučimo nešto....
Nego, ako briješ na C/C++ kao svoju strast i glavnu životnu okupaciju, toplo preporučam Demistificirani C++ uzeti kao svojeg najboljeg prijatelja, te počni programirati svaki dan. Svaki dan. Rješenje sa slike nalazi se u toj kultnoj knjizi na strani 112(4.izdanje knjige).
Volim C. Kao i C++.
EDIT: ako ćeš ići prepravljati zadatak uključi i drugo zaglavlje.
Što se tiče literature specifično vezane za C naletio sam prije nekog vremena na posve besplatnu (!) knjigu nazvanu Modern C koja opisuje cjelokupni C99, ali i C11 standard te moderniji pristup (hence the name ) razvoju software-a uspomoć C-a.
Knjiga je otprije nekih pola godine više-manje dovršena prema autorovim riječima. Još uvijek sam u procesu čitanja (nije to baš proza ;), ali ju svakako mogu već sada preporučiti.
Tko je čitao ovu knjigu (klasik u svijetu programiranja) i/ili ima već iskustva sa C-om (poput mene) bit će mu pomalo čudan pristup u Modern C-u no to je za očekivati.
Hvala svima na pomoći.
Navedena knjiga Demistificirani c++ je i za c programski jezik takoder ili?
Na tvz-u sam na računarstvu 👍🏾.
Oduvijek sam u računalima i u svijetu informatike sto se hardvarske strane tice,a nisam bas previse prije programirao.
Sad ne znam, malo me demotivira kada dobijemo tako neke zadatke za vjezbu , a ja ih me znam rijesiti. Da li je stvar u tome sto nisam lumen u matematici ili slicno nisam siguran. Ako netko ima nekakav prijedlog kako da se saberem jako bih mu bio zahvalan.
Hvala svima na pomoći.
Navedena knjiga Demistificirani c++ je i za c programski jezik takoder ili?
Na tvz-u sam na računarstvu 👍🏾.
Oduvijek sam u računalima i u svijetu informatike sto se hardvarske strane tice,a nisam bas previse prije programirao.
Sad ne znam, malo me demotivira kada dobijemo tako neke zadatke za vjezbu , a ja ih me znam rijesiti. Da li je stvar u tome sto nisam lumen u matematici ili slicno nisam siguran. Ako netko ima nekakav prijedlog kako da se saberem jako bih mu bio zahvalan.
Pošto sam prošle godine to završio, mogu ti dati par savjeta. Vrlo ti je važno sada skupljati bodove na labosima dok ne dođeš do pokazivača. Vježbaj nekoliko sati tjedno dok ti ne sjedne, poslje pointera duplo više. Za literaturu koristi lekcije sa predavanja koje su prilično dobre, The C Programming language od Dennis M.ritchia za referencu i jednu koja je meni bila bas ono dummy knjiga koja objasni na dosta jednostavan način -> C in 21 days. Demistificiranog se ostavi jer je preopširna za ono što tebi treba.