Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 351.014
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
12 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Onaj stog je napisan bedasto, misli se na liste, sve je s listama u prvom. Riječ stog zamjeni s listama.

Poruka je uređivana zadnji put ned 11.6.2017 13:43 (Master11).
Moj PC  
0 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

@čevap

 

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.

 

Panzerkampfwagen.Unatoč svemu - Dinamo Zagreb.Leaving or dead, always ahead...
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
čevap kaže...

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;
}

Poruka je uređivana zadnji put uto 13.6.2017 17:15 (Floki).
7 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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:

 

http://i.imgur.com/LfhGxYQ.jpg

Poruka je uređivana zadnji put sri 21.6.2017 16:04 (marin98).
 
0 0 hvala 0
14 godina
offline
Programiranje u C-u - od svega pomalo

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.

Poruka je uređivana zadnji put sri 21.6.2017 18:07 (Alkaline).
 
0 0 hvala 1
7 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Na faksu koristimo conio.h i main inace ne deklariramo, tj. nismo nikad u ovih 15 tjedana. Hvala na prepravci :D! 

 
0 0 hvala 0
8 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Alkaline kaže...


  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);

 

11 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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:

Kreativnost se postiže repeticijom. Analogno, talent - radom.
Moj PC  
0 0 hvala 0
15 godina
offline
Programiranje u C-u - od svega pomalo

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"

 
2 0 hvala 1
15 godina
offline
Programiranje u C-u - od svega pomalo

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

Poruka je uređivana zadnji put pon 26.6.2017 23:56 (wrathchild).
 
0 0 hvala 1
11 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
wrathchild kaže...

...

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

Kreativnost se postiže repeticijom. Analogno, talent - radom.
8 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
isuckatthisgame kaže...

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.

 

 

 

15 godina
offline
Re: Programiranje u C-u - od svega pomalo
isuckatthisgame kaže...
...

 

 

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

   

Poruka je uređivana zadnji put uto 27.6.2017 10:09 (wrathchild).
11 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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

Kreativnost se postiže repeticijom. Analogno, talent - radom.
Moj PC  
0 0 hvala 0
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
isuckatthisgame kaže...

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

10 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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? 

Moj PC  
0 0 hvala 0
7 godina
protjeran
offline
Programiranje u C-u - od svega pomalo

Moj PC  
0 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
fizicar1 kaže...

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.

16 godina
offline
Programiranje u C-u - od svega pomalo

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?

Poruka je uređivana zadnji put pet 15.9.2017 23:37 (lllnuclearlll).
Moj PC  
0 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

@lllnuclearlll

 

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;
}

 

 

Panzerkampfwagen.Dinamo Zagreb.Matija.Leaving or dead, always ahead...
14 godina
offline
Re: Programiranje u C-u - od svega pomalo
lllnuclearlll kaže...

Imam jedno pitanje u vezi dinamičke alokacije memorije i pointera...

 

 

  1. int *ptr;
  2. ptr = malloc(10 * sizeof(int));
  3. 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

You have to be odd to be number one
Poruka je uređivana zadnji put sub 16.9.2017 19:24 (Top Bugovac).
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

@Top Bugovac

 

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!

 

 

 

Panzerkampfwagen.Dinamo Zagreb.Matija.Leaving or dead, always ahead...
14 godina
offline
Programiranje u C-u - od svega pomalo

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!

 

You have to be odd to be number one
Poruka je uređivana zadnji put pet 20.10.2017 18:01 (Top Bugovac).
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Top Bugovac kaže...

 

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."

9 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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).
Jedino što vam je sad još preostalo je napisati traženi program prema pronađenom algoritmu. Program mora tražiti unos datuma rođenja (tri broja, redom: dan, mjesec, godina rođenja) i ispisivati o kojem je danu riječ, sve dok korisnik programa za dan ne unese 0. 
Pretpostavljam da se trebaju koristiti petlje, ali mi je zbunjujući tekst zadatka
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

LINK

Ima tu dosta primjera.. sigurno će ti pomoći..

 

Smrt u penziji
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

@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.

Panzerkampfwagen.Dinamo Zagreb.Matija.Leaving or dead, always ahead...
Poruka je uređivana zadnji put ned 5.11.2017 22:19 (PzKpfw).
12 godina
offline
Programiranje u C-u - od svega pomalo

Š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.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
1 0 hvala 2
9 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

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.

Moj PC  
1 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
old05snake12 kaže...

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.

Poruka je uređivana zadnji put sri 8.11.2017 19:39 (el pistlero123).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice