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.
Petla for i opeator %(mod) + ew. jakies 30 sek na google.
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..
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;
}
_msize(Array) / sizeof(double) czy w tym miejscu może być policzona długość ciągu?! strlen(Array)?
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;
}
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.