» »

[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:
#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š.
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?
#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:
 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…

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 ::

joze67 je izjavil:

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

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java - DN] Naključna števila

Oddelek: Šola
121271 (800) nyler
»

Algoritmi za urejanje tabel

Oddelek: Programiranje
51149 (886) lebdim
»

C++ fibonacci

Oddelek: Programiranje
61015 (610) lebdim
»

Namig za rešitev naloge

Oddelek: Programiranje
131529 (1328) vojko20
»

kako v excelu avtomatsko obarvati celice

Oddelek: Programska oprema
103975 (3748) smetko

Več podobnih tem