Forum » Programiranje » [C] - Spreminjanje programa s pointerji
[C] - Spreminjanje programa s pointerji
RatedR ::
Pozdrav, zanima me kako lahko nek program spremeniš tako da uporabljaš pointerje zraven.
Imam preprost program, ki izpiše soda števila v polju:
Ta program moram naredit tako, da uporabljam pointerje, ne vidim pa smisla v tem saj vse dela kot mora.
K večjem moram ustvarit le še dodatne spremenljivke za pointerje kar naredi kodo grdo za branje.
Torej kaj je štos in kako se tega lotit?
Imam preprost program, ki izpiše soda števila v polju:
#include<stdio.h> int Soda(int arr[], int n); int main(void) { printf("Izpis sodih stevil polja\n"); int arr[] = {5, 81, -13, 62, 98, 420, 88, -16, 90}; printf("\nV polju je %d sodih stevil", Soda(arr, sizeof(arr)/4)); getch(); } int Soda(int arr[], int n) { int i, sum = 0; for(i = 0; i < n; i++) { if(arr[i] % 2 == 0) sum++; } return sum; }
Ta program moram naredit tako, da uporabljam pointerje, ne vidim pa smisla v tem saj vse dela kot mora.
K večjem moram ustvarit le še dodatne spremenljivke za pointerje kar naredi kodo grdo za branje.
Torej kaj je štos in kako se tega lotit?
- spremenilo: RatedR ()
joze67 ::
Saj si uporabil kazalce, samo da tega pač ne veš.
Torej tvoj program (ki ne izpiše sodih šptevil v polju, pač pa njih število) s kazalci:
Seveda pa je še boljša (bolj v duhu dela s kazalci) funkcija
Pa lahko bi sedaj odvrgli i in manjšali n do 0. Za nirvano pa bi moral nekaj narediti z zaključnim pogojem. Ker podatki kazalec in število elementov - v resnici še vedno delamo s poljem.
arr[i] = *(arr+i)
Torej tvoj program (ki ne izpiše sodih šptevil v polju, pač pa njih število) s kazalci:
#include<stdio.h> int Soda(int* arr, int n); int main(void) { printf("Izpis sodih stevil polja\n"); int arr[] = {5, 81, -13, 62, 98, 420, 88, -16, 90}; printf("\nV polju je %d sodih stevil", Soda(arr, sizeof(arr)/sizeof(arr[0]))); getch(); } int Soda(int *arr, int n) { int i, sum = 0; for(i = 0; i < n; i++) { if(*(arr+i) % 2 == 0) sum++; } return sum; }
Seveda pa je še boljša (bolj v duhu dela s kazalci) funkcija
int Soda(int *arr, int n) { int i, sum = 0; for(i = 0; i < n; arr++, i++) { if(*arr % 2 == 0) sum++; } return sum; }
Pa lahko bi sedaj odvrgli i in manjšali n do 0. Za nirvano pa bi moral nekaj narediti z zaključnim pogojem. Ker podatki kazalec in število elementov - v resnici še vedno delamo s poljem.
RatedR ::
Vredu, pri pointerjih sem še čisto nov in ne znam brat napak, ki mi jih vrne compiler.
Tu je napaka: 20 - [Warning] assignment makes pointer from integer without a cast
Saj sta oba enakega int tipa ne?
Tu je napaka: 20 - [Warning] assignment makes pointer from integer without a cast
Saj sta oba enakega int tipa ne?
#include<stdio.h> int main(void) { printf("Izpis najvecje in najmanjse vrednosti polja\n"); printf("Vnesite velikost polja: "); int n, i; scanf("%d", &n); int arr[n]; for(i = 0; i < n; i++) { printf("\nVnesi %d.stevilo: ", i+1); scanf("%d", &arr[i]); } int min, max; int *pmax = NULL, *pmin = NULL; pmax = pmin = arr[0]; for(i = 0; i < n; i++) { if(arr[i] < *pmin) pmin = &arr[i]; if(arr[i] > *pmax) pmax = &arr[i]; } printf("\nNajmanjse stevilo je: %d", *pmin); printf("\nNajvecje stevilo je: %d", *pmax); getch(); }
Zgodovina sprememb…
- spremenilo: RatedR ()
joze67 ::
pmax in pmin sta kazalca na int; arr[0] je pa int. arr[0]=*arr (=*(arr+0)). V splošnem to ni enako.
Pravilno:
Pravilno:
pmin= pmax = arr;
technolog ::
Tole. Pa nauč se C coding style. To ni c#, zaviti oklepaji se pišejo v isto vrsto.
#include<stdio.h> int Soda(int* arr, int n) { int* end = arr+n; int count = 0; for(; arr < end; arr++) if(*arr % 2 == 0) count++; return count; } int main(void) { printf("Izpis sodih stevil polja\n"); int arr[] = {5, 81, -13, 62, 98, 420, 88, -16, 90}; printf("\nV polju je %d sodih stevil", Soda(arr, sizeof(arr)/4)); }
Zgodovina sprememb…
- spremenil: technolog ()
galu ::
Kar se tiče funkcij, so v novi vrstici, ob ostalih bločnih konstruktih pa v isti vrstici. K&R style.
Tako to gre.
DaMachk ::
pmax in pmin sta kazalca na int; arr[0] je pa int. arr[0]=*arr (=*(arr+0)). V splošnem to ni enako.
Pravilno:
pmin= pmax = arr;
Ali pa upoiraba reference:
pmin = pmax = &arr[0];
No signiature, as you see..
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java - DN] Naključna številaOddelek: Šola | 1360 (889) | nyler |
» | Algoritmi za urejanje tabelOddelek: Programiranje | 1227 (964) | lebdim |
» | C++ fibonacciOddelek: Programiranje | 1111 (706) | lebdim |
» | Namig za rešitev nalogeOddelek: Programiranje | 1692 (1491) | vojko20 |
» | kako v excelu avtomatsko obarvati celiceOddelek: Programska oprema | 4190 (3963) | smetko |