Programiranje u C-u - od svega pomalo izdvojena tema

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

Stvarno čudna pojava, evo kako to kod mene izgleda:

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
0 0 hvala 0
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
midzan21 kaže...

ček evo tebi kako glasi zadatak pa mi onda uz pomoć mojeg source-a ispravi greške (poboldano da vidim što je mijenjano)

  http://pastebin.com/EWCa36xh

midzan21 kaže...

 

Izmjeniti program da ispisuje unaprijed (od prvog slova prema zadnjem)

 

Bitno mi je da shvatim ovo poboldano kako riješiti (preko nekih primjera kao što je TracerCPP pokazao)

Samo zamijenis pocetak i kraj:

  http://pastebin.com/ydgYAbXn

 

I would love to change the world, but they won't give me the source code
13 godina
offline
Programiranje u C-u - od svega pomalo

Popravljen programčić sa pozivom funkcije rewind(f) (može i fseek(f, 0, SEEK_SET), svejedno) netom prije poziva fgets-a.

Pa ja sam putsu cijelo vrijeme predavao NULL pointer {#} Pomogla mi ekipa sa Stack Overflowa - unutar tri minute odgovor, sweet jesus.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Da li to podcjenjujes lokalnu ekipu, a? :P

 

Ma tamo su strucnjaci, kada imam neki problem/pitanje ne moram ni postavljati jer je neko to vec postavio sigurno.

13 godina
offline
Re: Programiranje u C-u - od svega pomalo
royalhero kaže...

Da li to podcjenjujes lokalnu ekipu, a? :P

 

Ma tamo su strucnjaci, kada imam neki problem/pitanje ne moram ni postavljati jer je neko to vec postavio sigurno.

Ma Bože sačuvaj da ih podcjenjujem, daleko od toga, nego svi preporučuju SO pa sam eto tamo otišao kada se nisam nikako mogao sam dosjetiti rješenja.

Sada mi samo ostaje misterij kako ovaj kod radi na borlandovom compileru (ili kojeg već koristi c++ Builder) - valjda je dovoljno pametan pa zna da treba kursor vratiti na početak filea, ne znam. Moguće je i da ignorira non-ASCII charactere u stdoutu, ma nije to sad ni toliko bitno.

Inače, vidi se da Tracer zna, tu se nema što reći. Samo što je na Stacku takvih more pa prije dobiješ odgovor.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put sub 22.12.2012 2:09 (pr0n_addict).
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Zanimljivo... Kao što sam rekao, kod mene u C++ Builderu sve radi tako da stvarno ne znam zašto kod tebe treba raditi te dodatne izmjene. No svejedno, bitno da si našao odgovor {#}.

 

I inače, slažem se. SO je odlično mjesto. Mnoštvo stručnjaka i ljudi koji se profesionalno bave programiranjem.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put sub 22.12.2012 9:19 (TracerCPP).
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
Inače, vidi se da Tracer zna, tu se nema što reći. Samo što je na Stacku takvih more pa prije dobiješ odgovor.

Tracer je stručnjak, profesor je, a čovjek je od prakse, kud ćeš bolje. :D

TracerCPP kaže...

kod mene u C++ Builderu sve radi

{#}

Takav sam problem, sličan mislim, imao sa starim MS-ovim C kompajlerom ili koji je već bio sa Visual C-om, živce mi je odnosilo, koji mi je đavo bio da nisam koristio MinGW, ne znam...

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

MS compiler ima stvarno nekih čudnih stvari u sebi. Sjećam se još prije da je točno određena kombinacija printf-a i scanf-a izazivala resetiranje računala svaki put kad se program izvrši.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Moj PC  
3 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Nego,pitanje...kako u printf stavit hrvatske znakove sa palatalima?

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

setlocale(LC_ALL, "croatian" );
printf("%s", "šđč枊ĐČĆŽ");

 

Ovako nešto se sjećam da mi je radilo pod linuxom, no sad pod windowsima neće..

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Moj PC  
0 0 hvala 1
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
TracerCPP kaže...

setlocale(LC_ALL, "croatian" );
printf("%s", "šđč枊ĐČĆŽ");

 

Ovako nešto se sjećam da mi je radilo pod linuxom, no sad pod windowsima neće..

Mislim da to ovisi o OS-u, tj. OS-ovim localeovima, mozda ima neka dodatna fora pod Winsima. Mozda wprintf?

The programmer is fighting against the two most destructive forces in the universe: entropy and human stupidity. --Damian Conway
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Da. U tome je trik {#}

 

setlocale(LC_ALL, "croatian" );
wprintf(L"šđč枊ĐČĆŽ\n");

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
g12356 kaže...

Nego,pitanje...kako u printf stavit hrvatske znakove sa palatalima?

I nemoj zaboraviti dodati <locale.h> header ako se ne varam.

The programmer is fighting against the two most destructive forces in the universe: entropy and human stupidity. --Damian Conway
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Pozdrav, zadatak glasi: Pomoću tipkovnice upiši za 5 učenika njihovu tjelesnu težinu i neka program izračuna njihov prosjek. 

Do ovdje sam došao:

 

#include<stdio.h>
#include<conio.h>
int main (void) {
int brojUcenika,i=0;
float prosjecnaTezina=0,tezina;
printf("Unesi broj ucenika:");
scanf("%d",&brojUcenika);
for (i=0;i<brojUcenika);
 
printf("Unesi tezinu prvog ucenika=");
scanf("%lf",&brojUcenika)
getch();
return 0;
}
17 godina
offline
Programiranje u C-u - od svega pomalo

Deklariraj jednu varijablu tipa float , nazovi je npr. ukupnaTezina i inicijaliziraj je na nula.

Kroz petlju u kojoj unosiš težinu za sve učenike pribroji unesene pojedinačne težine učenika toj varijabli:

ukupnaTezina += tezinaUcenika;

 

Kad izađeš iz petlje, odnosno završiš unose težine svih učenika, rezultat ti je ovdje: ukupnaTezina/brojUcenika

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

Uploadao sam vježbe iz C-a i (većinom) moja rješenja za njih. Fali par zadataka, no skoro sve je tu.

Dosta je dobra pokrivenost gradivom, ima težih i lakših zadataka - dobri su za početnike, imho.

Rješenja su u .docx-u jer .pdf ne pamti identaciju.

 

Tko želi, neka slobodno skine i pogleda.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 17.1.2013 2:37 (pr0n_addict).
Moj PC  
0 0 hvala 1
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Uploadao sam vježbe iz C-a i (većinom) moja rješenja za njih. Fali par zadataka, no skoro sve je tu.

Dosta je dobra pokrivenost gradivom, ima težih i lakših zadataka - dobri su za početnike, imho.

Rješenja su u .docx-u jer .pdf ne pamti identaciju.

 

Tko želi, neka slobodno skine i pogleda.

Lijepo, ali samo jedna opaska. Ne znam s cim si ti to exportao u PDF, ali meni s LibreOffice-ovim Writerom sasvim uredno exporta kod u PDF.

Imaj na umu da nemaju svi MSO (osobno im ne dam novce za njega, a neki si i ne mogu priustiti). Ali ajde, LO ovo lijepo otvara, nema artefakata, pa u redu onda.

 

Nemoj koristiti nase znakove kod imenovanja direktorija/datoteka, jer se onda dogodi ovo:

i ovo

Kod izgleda lijepo {#}, jedino mozda kod tezih zadataka da komentiras ideju, da ljudi lakse skuze. Osobno bih svaku vjezbu stavio u zaseban direktorij napisanu u .c i .h fajlovima, tako da se moze odmah i kompajlirati. Tako ce ti i arhiva biti par kb.

Najbolje od svega je, sto si puno naucio na ovaj nacin, samo nastavi ;)

The programmer is fighting against the two most destructive forces in the universe: entropy and human stupidity. --Damian Conway
Poruka je uređivana zadnji put čet 17.1.2013 13:09 (1domagoj1).
13 godina
offline
Programiranje u C-u - od svega pomalo

Nisam se sjetio palatala, uzeo sam zdravo za gotovo da su svi na Windozama, a što se može {#}

 

Ovo je dobar savjet za .h i .c fajlove, mada ne vidim koji je problem C/P-ati source drito u text editor IDE-a kojeg se koristi. Isto tako, u .docx-u se odmah vidi syntax highlighting što je prednost.

Od 10. vježbe nadalje je dijeljeno na fajlove tako da se vidi gdje što pripada.

 

Što se tiče izgleda, koristim se Allmanom, K & R mi je podosta teži za pročitati iako je puno kompaktniji. Stvar ukusa, valjda.

Komentare baš i nemam običaj pisati, ali ako krenem ozbiljnije s programiranjem očito ću morati.

Kod ovih zadačića uglavnom nisu ni potrebni osim nešto malo kod stringova, imho.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 17.1.2013 15:05 (pr0n_addict).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Pozdrav.

 

Možete mi pomoći oko jednog problemčeka. Naime sad sam kao programski zadatak dobio ovo:

 

 

 

Napišite program koji u unosu s tipkovnice prima početni i krajnji broj niza iz kojeg 

se ispisuju svi parni brojevi u rastućem redoslijedu (od najmanjeg prema najvećem), razdvojeni 

razmakom (SPACE).

Ispišite i početni i/ili krajnji broj ako su i oni parni. Početni i krajnji broj moraju 

biti cijeli, pozitivni i manji od 100. (neobavezno)

Unos i ispis možete prilagoditi i uljepšati prema izboru, dani primjeri samo pokazuju 

funkcionalnost programa.

 

Primjer:

unos: 12 23

ispis: 12 14 16 18 20 22

Primjer:

unos: 1 8

ispis: 2 4 6 8

 

 

Dobro sam izveo for petlju i if petlju, no problem je kako da napravim deklaraciju parnih brojeva i kako da ih ispišem (tu je najveći problem).

 

Source kod sa trenutnim stanjem:

 

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <conio.h>  

int main(){  

int i, a, b, c=0, d=0;  

printf ("Upisi dva broja odvojena razmakom: ");

scanf("%d %d", &a, &b);  

if (b>a) {

for(i=a;i<=b;i++){  

if(a%3==1 || b%2==0){

a=c;

b=d;

printf("%d %d ",c,d);

}

}

 

}

return 0;

}

 

 

Molim za pomoć. Hvala

 

Extend my EMSI License for free: http://download.emsisoft.com/EmsisoftAntiMalwareSetup_6434073 / My Web Site: http://markoidzan.from.hr || First Croatian CM9 blog: http://cm9croatia.blogspot.com
Moj PC  
0 0 hvala 0
13 godina
offline
Programiranje u C-u - od svega pomalo

Radi kako treba, čini mi se, iako se valjda može i bez pomoćnih varijabli - samo mi se nije dalo, ipak je skoro 3 ujutro {#}

Izbor izlaska iz programa riješen je sa stringovima, čisto iz zayebancije - tu ti je dosta int (ili nešto slično) pa izlazak s 0 i nastavak sa ostalim.

 

// Zadatak

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
   int prvi, drugi, min, max;
   int i;
   char buf[16];
   puts("Traze se brojevi u intervalu - [0, 100]");
   do
   {
      printf("Unesite dva broja: ");
      scanf("%d %d", &prvi, &drugi);
      if((prvi < 0 || prvi > 100) || (drugi < 0 || drugi > 100))
      {
         puts("Niste unijeli brojeve u trazenom intervalu!\n");
         continue;
      }
      if(drugi > prvi)
      {
         max = drugi;
         min = prvi;
      }
      else
      {
         max = prvi;
         min = drugi;
      }
      if(min % 2 == 1)
         min++;
      for(i = min; i <= max; i += 2)
         printf("%d ", i);
      printf("\nZelite li izaci iz programa? ");
      scanf("%s", buf);
      for(i = 0; buf[i]; ++i)
         buf[i] = tolower(buf[i]);
      if(strcmp(buf, "da") == 0)
         break;
      putchar('\n');
   }
   while(1);
   putchar('\n');
   return 0;
}

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put ned 20.1.2013 3:00 (pr0n_addict).
Moj PC  
1 0 hvala 1
17 godina
offline
Programiranje u C-u - od svega pomalo

Možemo ići i sa samo dvije varijable, da one zamjene vrijednosti ako je prva veća od druge. Inače se obično jedna pomoćna varijabla uvodi u igru kod zamjene vrijednosti dvije varijable.

A onda kroz petlju ići na ispis na gornji način.

 

#include <cstdio>


int main()
{
    int prvi, drugi;
    scanf("%d %d", &prvi, &drugi);
    if (prvi>drugi)
    {
       prvi += drugi;
       drugi = prvi - drugi;
       prvi -= drugi;
    }
    if (prvi%2)
       prvi++;
    for (int i = prvi; i <= drugi; i+=2)
       printf("%d ", i);
    return 0;
}

Poruka je uređivana zadnji put ned 20.1.2013 12:42 (Floki).
 
2 0 hvala 1
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Radi kako treba, čini mi se, iako se valjda može i bez pomoćnih varijabli - samo mi se nije dalo, ipak je skoro 3 ujutro {#}

Izbor izlaska iz programa riješen je sa stringovima, čisto iz zayebancije - tu ti je dosta int (ili nešto slično) pa izlazak s 0 i nastavak sa ostalim.

 

// Zadatak

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
   int prvi, drugi, min, max;
   int i;
   char buf[16];
   puts("Traze se brojevi u intervalu - [0, 100]");
   do
   {
      printf("Unesite dva broja: ");
      scanf("%d %d", &prvi, &drugi);
      if((prvi < 0 || prvi > 100) || (drugi < 0 || drugi > 100))
      {
         puts("Niste unijeli brojeve u trazenom intervalu!\n");
         continue;
      }
      if(drugi > prvi)
      {
         max = drugi;
         min = prvi;
      }
      else
      {
         max = prvi;
         min = drugi;
      }
      if(min % 2 == 1)
         min++;
      for(i = min; i <= max; i += 2)
         printf("%d ", i);
      printf("\nZelite li izaci iz programa? ");
      scanf("%s", buf);
      for(i = 0; buf[i]; ++i)
         buf[i] = tolower(buf[i]);
      if(strcmp(buf, "da") == 0)
         break;
      putchar('\n');
   }
   while(1);
   putchar('\n');
   return 0;
}

 

Floki kaže...

Možemo ići i sa samo dvije varijable, da one zamjene vrijednosti ako je prva veća od druge.

A onda kroz petlju ići na ispis na gornji način.

 

#include <cstdio>


int main()
{
    int prvi, drugi;
    scanf("%d %d", &prvi, &drugi);
    if (prvi>drugi)
    {
       prvi += drugi;
       drugi = prvi - drugi;
       prvi -= drugi;
    }
    if (prvi%2)
       prvi++;
    for (int i = prvi; i <= drugi; i+=2)
       printf("%d ", i);
    return 0;
}

Hvala vam obojici na pomoći :) Riješio sam ga na prvi način (da se vidi "trud" i ideja zadatka). 

Extend my EMSI License for free: http://download.emsisoft.com/EmsisoftAntiMalwareSetup_6434073 / My Web Site: http://markoidzan.from.hr || First Croatian CM9 blog: http://cm9croatia.blogspot.com
17 godina
offline
Programiranje u C-u - od svega pomalo

if(drugi > prvi)
      {
         max = drugi;
         min = prvi;
      }
      else
      {
         max = prvi;
         min = drugi;
      }

 

Ovo bode oči, nema smisla to raditi, onda radije unesi prvi i drugi i zamjeni im vrijednosti pomoćnom varijablom ukoliko je prva veća od druge.

 
1 0 hvala 1
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
Floki kaže...

if(drugi > prvi)
      {
         max = drugi;
         min = prvi;
      }
      else
      {
         max = prvi;
         min = drugi;
      }

 

Ovo bode oči, nema smisla to raditi, onda radije unesi prvi i drugi i zamjeni im vrijednosti pomoćnom varijablom ukoliko je prva veća od druge.

Ma radio sam to u pola tri ujutro, sad vidim da je glupost {#}

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
17 godina
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Ma radio sam to u pola tri ujutro, sad vidim da je glupost {#}

Ma i nije glupost, nego jedan od načina od, tu i jesmo sa stavimo više načina, pa nešto i naučimo, nekad ja od tebe i drugih, nekad ti i drugi od mene i tako u krug{#}

Konačno, pitanje je bil se i ja sjetio petlje napravljene na taj način ili bi išao sa provjerom parnih, to si super napravio.

Poruka je uređivana zadnji put ned 20.1.2013 13:49 (Floki).
16 godina
offline
Programiranje u C-u - od svega pomalo

pozdrav ..

kako da napravim funkciju koja određuje maksimalni broj u polju ,znaci u funkciju trebam "poslat" sve brojeve iz polja i kao output da dobijem maksimalni broj ,pa ak netko moze pripomoc barem sa idejom jer ja je nemam kak da to napravim  

McLaren Mercedes:1974.Emerson Fittipaldi-1976.James Hunt-1984.Niki Lauda-1985.-1986.Alain Prost-1988.Ayrton Senna-1989.Alain Prost-1990.-1991.-Ayrton Senna-1998.-1999.Mika Hakkinen-2008.Lewis Hamilton
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

kod niza kao npr: int mojNiz[MAX] pristupom na mojNiz bez uglatih zagrada dobiješ početnu adresu niza. Dakle to prosljedi funkciji koja ce izgledati otprilike ovako

 

int maxBroj(int prosljedjeniNiz[], int brojClanova)

 

Dakle imaš funkcioju koja prima dva argumenta, prosljedjeni niz i broj clanova u nizu koji ce ti trebati da odvrtis petlju kroz niz.

 

funkciju pozivas iz main()

 

int main()

{

     ...

     maxBroj(mojNiz, MAX);

     ...

 

a u funkciji sa for petljom prodji kroz niz i u svakom koraku provjeri da li je broj veci od proslog (koristi dodatnu varijablu) te ako je stavi taj za daljnju usporedbu. Na kraju kada izadjes iz petlje vrati broj koji ti je ostao.

 

Evo samo nakuckas kod :)

 

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

 

Kako zadati matricu preko jednodimenzionalnog niza u C-u ?

 

Za dvodimenzionalni niz je lako. Evo primjera:

 

 

 

 

 

# include <stdio.h>
void main()

int i,j;

int x[4][4] = {{7,9,3,4},{5,8,7,-8},{3,-1,1,2},{3,-4,5,-6}};

for (i=0;i<4;i++){

for (j=0;j<4;j++){

printf("%d \t",x[i][j]);

}

printf("\n");

}

}

 

 

 

 

To bi mi ispisalo matricu koja izgleda ovako:

 

7 9 3 4

5 8 7 -8

3 -1 1 2

3 -4 5 -6

 

E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza. 

 

Poruka je uređivana zadnji put pon 28.1.2013 20:37 (patch123).
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
patch123 kaže...

 

Kako zadati matricu preko jednodimenzionalnog niza u C-u ?


7 9 3 4

5 8 7 -8

3 -1 1 2

3 -4 5 -6

 

E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza. 

Jednostavno. Kako su podaci slozeni u memoriji? Kao matrica ili sekvencijalno? Kad se sve konacno iskompajlira i program ucita u memoriju, sve matrice su ti ovako i onako sekvencijalno slozene u memoriji, ovaj prikaz u kodu kao 2D array je tu samo da bi programeru bilo lakse. Dakle ova tvoja matrica bi u memoriji bila: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 gdje sam ti sa znakom | odvojio retke dok je u memoriji to poslozeno tako sekvencijalno. Jel vec mozda vidis rjesenje?

 

Ako ne, citaj dalje. Kolika je ukupna velicina neke n x m matrice? Upravo n puta m. Dakle, ako zelis matricu prikazati preko 1D arraya, za njega trebas alocirati upravo n puta m elemenata. U tvojem primjeru bi to bilo 4x4 = 16. To znaci da moras alocirati polje velicine 16. E sad malo jednostavne matematike za setanje po matrici. Mozes odabrati dva nacina: da seces po stupcima (znaci, odaberes prvi stupac, pa po njemu ides prema dolje, kad dodes do kraja skocis u drugi stupac itd. - to je column-major order) ili da seces po retcima (kako je i uobicajeno, koliko znam, vecina C-like jezika koriste ovakav prolazak po matrici (izuzetak su eventualno MATLAB, Octave, Fortran i sl.) - to se zove row-major order).

 

Ilustrirat cu ti row-major order zato jer se on u vecini slucajeva i upotrebljava, za vjezbu mozes probati implementirati column-major order.

Dakle, da dodemo do elementa A[i][j] koristimo jednostavnu algebarsku formulu: elementi,j = i*m + j gdje su i i j indeksi elementa kojem zelimo pristupiti, a m je broj stupaca, tj. sirina matrice. Recimo za A[1][3] u tvojoj matrici (broj -8) dobijemo 1*4 + 3 = 7, sad kad tu matricu poredamo sekvencijalno: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 vidimo da je -8 uistinu na indeksu 7 1D arraya (brojanje krece od 0).

 

Mozes si skicirati na papiru, lakse ce ti biti za shvatiti, a mozes iz te skice i sam doci do te formule.

The programmer is fighting against the two most destructive forces in the universe: entropy and human stupidity. --Damian Conway
Poruka je uređivana zadnji put pon 28.1.2013 21:07 (1domagoj1).
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
1domagoj1 kaže...
patch123 kaže...

 

Kako zadati matricu preko jednodimenzionalnog niza u C-u ?


7 9 3 4

5 8 7 -8

3 -1 1 2

3 -4 5 -6

 

E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza. 

Jednostavno. Kako su podaci slozeni u memoriji? Kao matrica ili sekvencijalno? Kad se sve konacno iskompajlira i program ucita u memoriju, sve matrice su ti ovako i onako sekvencijalno slozene u memoriji, ovaj prikaz u kodu kao 2D array je tu samo da bi programeru bilo lakse. Dakle ova tvoja matrica bi u memoriji bila: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 gdje sam ti sa znakom | odvojio retke dok je u memoriji to poslozeno tako sekvencijalno. Jel vec mozda vidis rjesenje?

 

Ako ne, citaj dalje. Kolika je ukupna velicina neke n x m matrice? Upravo n puta m. Dakle, ako zelis matricu prikazati preko 1D arraya, za njega trebas alocirati upravo n puta m elemenata. U tvojem primjeru bi to bilo 4x4 = 16. To znaci da moras alocirati polje velicine 16. E sad malo jednostavne matematike za setanje po matrici. Mozes odabrati dva nacina: da seces po stupcima (znaci, odaberes prvi stupac, pa po njemu ides prema dolje, kad dodes do kraja skocis u drugi stupac itd. - to je column-major order) ili da seces po retcima (kako je i uobicajeno, koliko znam, vecina C-like jezika koriste ovakav prolazak po matrici (izuzetak su eventualno MATLAB, Octave, Fortran i sl.) - to se zove row-major order).

 

Ilustrirat cu ti row-major order zato jer se on u vecini slucajeva i upotrebljava, za vjezbu mozes probati implementirati column-major order.

Dakle, da dodemo do elementa A[i][j] koristimo jednostavnu algebarsku formulu: elementi,j = i*m + j gdje su i i j indeksi elementa kojem zelimo pristupiti, a m je broj stupaca, tj. sirina matrice. Recimo za A[1][3] u tvojoj matrici (broj -8) dobijemo 1*4 + 3 = 7, sad kad tu matricu poredamo sekvencijalno: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 vidimo da je -8 uistinu na indeksu 7 1D arraya (brojanje krece od 0).

 

Mozes si skicirati na papiru, lakse ce ti biti za shvatiti, a mozes iz te skice i sam doci do te formule.

Hvala. Znači to bi trebalo izgledati ovako ?

 

 

#include <stdio.h>

 

void main()

int i,j;

int x[16] = {7,9,3,4,5,8,7,-8,3,-1,1,2,3,-4,5,-6};

for (i=0;i<4;i++){

for (j=0;j<4;j++){

printf("%d \t",x[(4*i)+j]);

}

printf("\n");

}

}

 

Poruka je uređivana zadnji put pon 28.1.2013 21:19 (patch123).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice