Miejsca parzyste i nieparzyste w tablicy.

0

Witam, potrzebuję pomocy w napisaniu funkcji, która przypisze mi do zmiennej różnicę: sumy liczb znajdujących się na miejscach nieparzystych w tablicy od prawej do lewej, oraz sumę liczb znajdujących się na miejscach parzystych w tej samej tablicy, również od prawej strony do lewej.

0

Petla for i opeator %(mod) + ew. jakies 30 sek na google.

0

hm. jakbym umiał znaleźć to na google, to nie wysilałbym się, żeby zawracać wam dupę..;) największy mam problem z tym, żeby liczyło od prawej do lewej strony..

1
 
double Calculatedifference(double *Array)
{
       double sumOfPaired=0,sumOfUnpaired=0;
       
             for(int i=_msize(Array) / sizeof(double);i>=0;i--)
             {
                     if(i%2)
                     sumOfPaired=sumOfPaired+Array[i];
                     else
                     sumOfUnpaired=sumOfUnpaired+Array[i];
                     
             }
            return sumOfUnpaired-sumOfPaired;
}
0

_msize(Array) / sizeof(double) czy w tym miejscu może być policzona długość ciągu?! strlen(Array)?

1
mistiq napisał(a):

_msize(Array) / sizeof(double) czy w tym miejscu może być policzona długość ciągu?! strlen(Array)?

Nie ma takiej możliwości.
jeżeli masz double tb[10]; to owszem możesz napisać: (sizeof(tb)/sizeof(*tb))
Ale jak to przekazałeś do funkcji w postaci wskaźnika to niestety double *tb; sizeof(tb) - zwróci rozmiar wskaźnika.
Owszem można to trochę nagiąć stosując (tak jak w c-string) znak końca, czyli pewna wartość w tablice która oznacza koniec.

Powinno być coś na kształt:

double Calculatedifference(double *Array,size_t size)
  {
   static double sign[]={1,-1};
   double sum=0;
   for(size_t i=0;i<size;++i) sum+=sign[i&1]*Array[i]; // ewentualnie if(i&1) sum+=Array[i]; else sum-=Array[i];
   return sum;
  }

Lub jeżeli "od prawej strony do lewej" traktujemy że dla tablic o parzystej liczbie elementów ostatni indeks jest parzysty w związku z tym pierwszy indeks jest nieparzysty to:

double Calculatedifference(double *Array,size_t size)
  {
   static double sign[]={1,-1};
   double sum=0;
   size_t s=(size+1)&1;
   for(size_t i=0;i<size;++i) sum+=sign[(i&1)^s]*Array[i];
   return sum;
  }
1

Sądząc po wypowiedzi autora, problemem nie jest napisanie takiego programu dla tablicy o określonej parzystości liczby pól. Wydaje mi się też, że dwie funkcje nie są rozwiązaniem zadowalającym (można by napisać dwie oddzielne funkcje, dla parzystej początkowej liczby pól i dla nieparzystej), a skomplikowanie sedna problemu nie wskazuje na potrzebę sprawdzania liczby pól tablicy. Jeśli jednak się mylę, problem ten może zostać rozwiązany w funkcji głównej. Przykładowa funkcja licząca taką różnicę może wyglądać następująco:

int policz(unsigned int n, int* tab) //n - liczba pol, tab - adres tablicy;
 {
  int suma=0;
  bool parzysta = (n%2);
  while(n--)
   if((n%2)!=parzysta)
    suma+=tab[n];
   else
    suma-=tab[n];
  return suma;
 }

Jeżeli jednak funkcja ma nie zwracać, a przypisać wartość jakiejś zmiennej, do funkcji powinien zostać przekazany adres zmiennej do wpisania wyniku

void policz(unsigned int n,int* tab, int* koncowa)

i zamiast return 0;, coś takiego:

*koncowa = suma;

Edit:
Zmiana typu z int na inny nie powinna być problemem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1