Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pozicioniranje clana niza

[es] :: C/C++ programiranje :: Pozicioniranje clana niza

[ Pregleda: 3488 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Alexandar_d
Alexandar

Član broj: 44699
Poruke: 139
*.as54.ze.bih.net.ba.



+7 Profil

icon Pozicioniranje clana niza22.03.2005. u 19:48 - pre 232 meseci
Nije mi jasna jedna stvar.
Naime, ovaj code razumijem:

Code:


#include <stdio.h>

main()
{

   int x[] = {2,5,6,4,7};
     
      printf("\n cifra 0: %d", x[0]);
}



Znaci, on mi ispise odredjenu cifru na odredjenom mjestu koje oznacim, u ovom slucaju ispisat ce mi broj 2. Ali mi nije jasno kada imam ovu situaciju:

Code:


#include <stdio.h>

main()
{

   int x[100];
   
   scanf("%d", &x)
     
      printf("\n cifra 0: %d", x[0]);
}




Sada mi treba kada ja na unosu unesem recimo 4356, treba da mi ispise cifru na recimo 2. mjestu (brojeci i nulu), to bi bila cifra 5. Kako da to izvedem?

I zanima me kako kad u nekom fajlu txt imam broj (npr. 4356) i treba mi procitati taj broj i ispisati ciftu na 2. mjestu?

Hvala puno.
AleXandar
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pozicioniranje clana niza22.03.2005. u 21:28 - pre 232 meseci
Citat:

int x[] = {2,5,6,4,7};
printf("\n cifra 0: %d", x[0]);

Znaci, on mi ispise odredjenu cifru na odredjenom mjestu koje oznacim,
u ovom slucaju ispisat ce mi broj 2. Ali mi nije jasno kada imam ovu situaciju:


Greska. X[] je *niz* celobrojnih vrednosti (a ne jedan 'int' sa pozicijama cifara),
a to sto nema nista u zagradama je olaksica u kodiranju (da ih ne bi rucno
prebrojavao).

Dakle ono gore je isto sto i:
X[0] = 2;
X[1] = 5;
X[2] = 6;
X[3] = 4;
X[4] = 7;

Dakle, ti si u prvom slucaju 'stracio' 5 bajtova da bi smestio broj 25647. To
si trebao da uradis ovako:

x[0] = 25647;
ili samo:
x = 25647;

U jednu 'int' celiju mozes da upises broj od -32768 do 32767 ili 0 do 65535
ako imas i 'unsigned' modifikator (unsigned int). Velicina 'int'-a moze biti i
veca (2147483648 do 2147483647 ili 0 do 4294967295) ako konfigurises
okruzenje drugacije. Uglavnom, funkcijom sizeof(int) mozes da dobijes koliko
je bajtova rezervisano.

Citat:

int x[100];
scanf("%d", &x)


U ovom slucaju ti su u vrednost x[0], uneo broj (kako si rekao) 4356. Dakle, opet
se radi o *nizu* celobrojnih vrednosti, a ne o pozicijama cifara. To si ti nesto
pomesao sa stringovima, gde je stvarno jedna pozicija - jedna oznaka.

Sto se tice upisa celobrojnih vrednosti u fajl, stvarno postoje (uopsteno) dva
nacina:
1) kao string (posle vadis cifre po pozicijama kao sto si u pocetku radio,
samo sto neces koristiti niz 'int'-ova nego niz 'char'-ova)
2) kao broj (da izdvojis cifre moras da koristis mat.operacije '/' i '%' )

Evo kako se upisuju/citaju brojevi u slucaju 2:

Code:

// pseudo
int ceobroj = 25647;
Write ( &ceobroj, sizeof(int) );


Code:

// pseudo
int prostor_za_ucitavanje = 0;
Read ( &prostor_za_ucitavanje, sizeof(int) );


 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
195.252.85.*



Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 01:06 - pre 232 meseci
Citat:
X Files:
Code:

int x[100];
scanf("%d", &x)

U ovom slucaju ti su u vrednost x[0], uneo broj (kako si rekao) 4356.
Ne. Naziv niza (promenljiva) je pokazivac na prvi - [0], clan niza, a kako je funkciji bilo potrebno proslediti pokazivac promenljive (elementa) a ne adresu samog pokazivaca (&x odnosno &x[0]) vrednost je upisana samo zbog toga sto je ime promenljive niza konstantan pokazivac te se nije moglo promeniti na sta pokazuje pokazivac x.
Ocigledno, ako se umesto prethodne deklaracije niza napise npr.
Code:

int *x = (int *)malloc(100 * sizeof(int));
i poziv funkcije scanf ostavi nepromenjen, u toku izvrsavanja ce najverovatnije doci do greske (SIGSEGV) jer se pokusava promeniti sama vrednost pokazivaca tako sto mu dodeljuje (da pokazuje) neka nedozvoljena adresa.
Ali nece uvek dolaziti do greske pri izvrsavanju, odnosno pri svakom unosu. Moze se npr. pre unosa saznati prethodna adresa npr. 0x344, i uneti 0x348 (ako je u ovom slucaju tip int velicine 4 bajta), sto je adresa drugog - [1], clana niza, pri cemu nece doci do greske. Ali sumnjam da je ovakav nacin unosa bio namera autora - da manipulise vrednostima pokazivaca a ne vrednostima elemenata niza.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 08:26 - pre 232 meseci
Zar nije a[0] isto sto i (*a)? U tom slucaju je ipak potrebno pisati &a[0], dok je ako se izostavi ovaj indeks moguce pisati samo scanf("%d", a). Ili mozda gresim...
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.nyc.rr.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 12:53 - pre 232 meseci
pa u sustini sa stanovista kompajlera &a == &a[0], isto tako a[0] == 0[a] (probaj...).
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 14:12 - pre 232 meseci
Citat:
caboom: pa u sustini sa stanovista kompajlera &a == &a[0], isto tako a[0] == 0[a] (probaj...).

Kako je &a==&a[0]?
&a[0] predstavlja adresu od prvog clana niza 'a',
dok &a ne predstavlja nista jer je to greska.
Jedino je moguce napisati:
Code:

a==&a[0];


 
Odgovor na temu

dragansm
Dragan Smiljanic

Član broj: 38170
Poruke: 191
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 14:30 - pre 232 meseci
copy-paste iz watch prozora:
Code:

+    x    0x0012fecc    int [3]
+    &x    0x0012fecc ""    char *
+    &x[0]    0x0012fecc    int *


Citat:

I zanima me kako kad u nekom fajlu txt imam broj (npr. 4356) i treba mi procitati taj broj i ispisati ciftu na 2. mjestu?


Code:

char buffer[2];
FILE *f = fopen( "ime_fajla", "rt" );
if ( f ) {
  fread( buffer, sizeof( char ), 2, f );
  fclose(f);
}
cout << buffer[1];


ili

Code:

char c = ' ';
FILE *f = fopen( "ime_fajla", "rt" );
if ( f ) {
  if  ( !fseek(f, 1, SEEK_SET) )
  {
     c = fgetc( f );
  }
  fclose(f);
}
cout << c;


Dodao bih jos i ovo:
Code:

  int x[5];
  int a == *(x+3); // x[3]

 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz.



+3 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 15:30 - pre 232 meseci
Citat:
Buffy: Kako je &a==&a[0]?

caboom je u pravu jer &a i a imaju istu vrednost (tip se razlikuje).

http://www.eskimo.com/~scs/C-faq/q6.12.html

Citat:
&a[0] predstavlja adresu od prvog clana niza 'a',
dok &a ne predstavlja nista jer je to greska.

Nije greska mada u pravu si da se obicno ne koristi &a i greska je u stvari sto neko to uopste tako pise. Ako pises &a umesto a to moze kasnije dovesti do posledica po tvoj program ako odlucis da niz a alociras dinamicki pomocu pokazivaca a.

Citat:
Jedino je moguce napisati:
Code:

a==&a[0];

i to je tacno ali je tacan i gornji primer.
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.montgomery.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 16:32 - pre 232 meseci
wellcome to the wonderfull world of C buffy... razlika tipova se jako lepo oslikava kod extern-ovanja pointera i nizova, tu mogu da se dobiju stvarno sjajni rezultati. iako je je &a[0] tacnije, for the sake of the readability ces najcesce nalaziti &a po kodu. poenta je sto su tipovi sustinski razliciti, ali je pointer aritmetika ispravna. takodje, isto tako ce ti raditi 0[a] i a[0], kao i verovatno &0[a], posto se sustinski prevodi u &(0 + a) == &(a +0).
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 16:44 - pre 232 meseci
jaoj...

U principu kada se malo zamislis to je sve logicno, medjutim mogu samo da zamislim kako izgleda citanje tudjeg koda koji je na taj nacin napisan.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.montgomery.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 16:50 - pre 232 meseci
fora je sto se na ovo vremenom naviknes, mnogo gore stvari su los memory management. npr. kada se neko lose igra sa alokacijom i oslobadjanjem, pa imas non-aligned probleme (SIGBUS rings a bell), ili veoma cest problem sa fragmentacijom memorije neopreznim koriscenjem standardnog malloc-a. jos ako imas relativno los kernel i userland kakav imas kod linux-a ne mozes lepo ni da resis neke probleme sa alokacijom u thread-ovima... C u neku ruku dodje kao GO, veoma malo pravila, veoma teska igra.
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 17:19 - pre 232 meseci
Stvarno zanimljivo!!!
Kada sam istampao na ekran adresu '&a' i adresu 'a' dosao sam do saznanja da su te adrese iste!!!
C je jezik koji stvarno mnogo iznenadjuje!
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.montgomery.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 17:31 - pre 232 meseci
pa i nije u sustini. stvar je upravo u veoma malom broju pravila i restrikcija koje C89/C99 standardi postavljaju pred kompajlere.
meni licno je ovo jedan od veoma zanimljivih primera:
http://www.lysator.liu.se/c/duffs-device.html
IOCCC je takodje mesto gde se mogu naci neki veoma zanimljivi efekti i varijacije na razne prljave C teme.

 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Pozicioniranje clana niza25.03.2005. u 19:04 - pre 232 meseci
Code:

#include <stdio.h>

main()
{

   int x[100];
   
   scanf("%d", &x)
     
      printf("\n cifra 0: %d", x[0]);
}



Evo mojeg rešenja:
Code:

char* getcifre(unsigned long broj) {
    char* buffer = malloc(256);
    buffer[255]='\n'; // za svaki slucaj 
    int i=0;
    while (broj>0) {
       buffer[i++]=broj%10;
       broj/=10;
    }
    buffer[i]=0;
    return buffer;
}


Mislim da ovo radi...
Sad samo trebas da iskoristis
main() {
unsigned long b;
scanf("%d",&d);
char* cifre=getcifre(b);
printf("3. cifra> %c", c[2]);
}


Dalje, pravi nacin bio bi>
main() {
int broj;
char cifre[256];
cifre=itoa(broj,cifre,10);
printf("Cifra 2. > %c", cifre[1]);
}

nadam se da sam pomogao bar malo, btw, jel ovo uopste pitanje, mislim, nisam bas najbolje razumio o cemu se radi... :( dumb
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.nyc.rr.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza26.03.2005. u 03:40 - pre 232 meseci
Citat:
toroman:
Evo mojeg rešenja:
Code:

char* getcifre(unsigned long broj) {
    char* buffer = malloc(256);
    buffer[255]='\n'; // za svaki slucaj 
.....



'\0'? da nisi mislio nesto kao memset(buffer, '\0', 256) ili naprosto calloc(1, 256)?
 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Pozicioniranje clana niza28.03.2005. u 10:31 - pre 231 meseci
Pa mislim da je calloc najbolji izbor. ma šta više, nije ništa ni potrebno :) džaba sam to dodavao, mislim, nisam imao linux(man, anjuta o_O) pri sebi tako da nisam bio siguran šta da stavim ...

Uglavnom, mislim da funkcija radi svoj posao :)
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.montgomery.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza28.03.2005. u 15:21 - pre 231 meseci
pardon... ne treba pisati postove pre prve kafe, ili u petak uvece u 1-2am. zapravo me je cudilo cemu onaj '\n'.
 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Pozicioniranje clana niza30.03.2005. u 22:39 - pre 231 meseci
Ej, pridruzujem se misljenju :)

Taj \n osigurava da ce se string zavrsiti, ali je ustvari beskoristan nakon sto se kod malo izanalizira :) najbolje je koristiti funkciju itoa, KRAJ diskusije :)

int i = 100;
char buffer[256];
itoa(i,buffer,10);


Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

Alexandar_d
Alexandar

Član broj: 44699
Poruke: 139
*.as54.ze.bih.net.ba.



+7 Profil

icon Re: Pozicioniranje clana niza02.04.2005. u 17:25 - pre 231 meseci
Rijesio sam problem, hvala.
AleXandar
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.montgomery.com.

ICQ: 60630914


+1 Profil

icon Re: Pozicioniranje clana niza07.04.2005. u 22:49 - pre 231 meseci
Citat:
toroman:
Taj \n osigurava da ce se string zavrsiti...


zaboravih ovo potpuno... elem, mislim da se nismo razumeli, '\n' ti apsolutno nista ne garantuje. zapravo i markiranje kraja stringa sa '\0' ti ne garantuje sprecavanje buffer overrun-a, ili citanje veceg bloka memorije od duzine samog "stringa" osim ako ne baratas f-jama koje proveravaju tako nesto.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pozicioniranje clana niza

[ Pregleda: 3488 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.