Witam,
Mam problem ze znalezieniem błędu w takim programie, wydaje się on banalnie prosty, ale chyba dla jakiegoś przypadku robi błąd, tylko nie potrafię go znaleźć. Mamy coś takiego jak automatyczną sprawdzarkę, która testuje program na kilku rożnych zestawach danych. Mój program ma status "Błędna odpowiedź".
Oto co program ma robić:
Na standardowym wejściu w pierwszej linii program otrzymuje liczbę N (2 ≤ N ≤ 29 999), która określa liczbę osób, których wiek będzie brany do obliczeń. W następnych N liniach wypisane są (każda w osobnej linii) całkowite długości Di (1 ≤ Di ≤ 1 000 000) życia tych osób.
Wyjście ma się składać z jedenastu linii.
W pierwszej ma być wyświetlony najmniejszy element spośród wczytanych danych.
W drugiej - dokładna wartość pierwszego kwartyla ćwiartkowego (jedno miejsce po przecinku).
W trzeciej - dokładna wartość mediany (jedno miejsce po przecinku).
W czwartej - dokładna wartość trzeciego kwartyla ćwiartkowego (jedno miejsce po przecinku).
W piątej - największy element spośród wczytanych.
W szóstej - średnia zaokrąglona do dwóch miejsc po przecinku.
W siódmej - wartość odchylenia ćwiartkowego zaokrąglona do dwóch miejsc po przecinku.
W ósmej - wartość ćwiartkowego współczynnika zmienności zaokrąglona do dwóch miejsc po przecinku z dopisanym symbolem "%".
W dziewiątej - wartość wskaźnika asymetrii zaokrąglona do dwóch miejsc po przecinku.
W przedostatniej - wartość różnicy pomiędzy średnią wszystkich elementów a średnią elementów pomiędzy kwartylami zaokrągloną do dwóch miejsc po przecinku.
A w ostatniej - wartość współczynnika skośności (o ile istnieje) lub słowo "brak".
dodatkowe info:
średnią arytmetyczną i medianę (czyli wartość środkową w niemalejącym ciągu danych);
pierwszy i trzeci kwartyl (czyli wartości ćwiartkowe - analogiczne do mediany, tylko znajdujące się odpowiednio w 1/4 i 3/4 niemalejącego ciągu danych);
odchylenie ćwiartkowe (będące połową różnicy trzeciego i pierwszego kwartyla);
ćwiartkowy współczynnik zmienności (który jest ilorazem odchylenia ćwiartkowego przez średnią arytmetyczną wyrażonym w procentach);
wskaźnik asymetrii (różnica średniej i mediany)
współczynnik skośności (czyli iloraz, w którym dzielną jest suma kwartyli ćwiartkowych pomniejszona o podwojoną medianę, zaś dzielnikiem podwojone odchylenie ćwiartkowe);
różnicę między średnią arytmetyczną wszystkich wartości a średnią arytmetyczną wartości pomiędzy kwartylami z kwartylami włącznie (w przypadku gdy kwartyle stanowią średnie arytmetyczne dwóch wartości - należy wliczyć do średniej wszystkie wartości brane do wyznaczenia kwartyli);
Mój kod:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n, i, j, podziel, ikw1, ikw3;// ikw1 ikw3 beda zawierały indeks elementu ciągu najbardziej wewnętrznego branego do obliczania kwartyla
float kw1, kw3, med, suma=0, suma2=0, temp /**tabA*/;
scanf("%d", &n);
float tabA[n];
for(i=0; i<n; i++)
scanf("%f", &tabA[i]);
for(i=n-1; i>0; i--)//sortowanie elementow tablicy w porzadku niemalejacym
for(j=0; j<i; j++)
if(tabA[j]>tabA[j+1]){
temp = tabA[j];
tabA[j] = tabA[j+1];
tabA[j+1] = temp;
}
for(j=0; (n+j)%4; j++);//sprawdzanie podzielności przez 4 dla ilości liczb ciągu
//-1---najmniejszy wyraz
printf("%.0f\n", tabA[0]);
//-2---pierwszy kwartyl
if((j==1)||(j==2))
kw1 = tabA[ikw1=((n+j)/4)-1];
else{
if(j==0)
kw1 = (tabA[(n/4)-1]+tabA[ikw1=((n+4)/4)-1])/2;
if(j==3)
kw1 = (tabA[((n-1)/4)-1]+tabA[ikw1=((n+3)/4)-1])/2;
}
printf("%.1f\n", kw1);
//-3---mediana
if(!(n%2))
med = (tabA[n/2] + tabA[(n/2)-1])/2;
else
med = tabA[(n/2)-1];
printf("%.1f\n", med);
//-4---trzeci kwartyl
if((j==1)||(j==2))
kw3 = tabA[ikw3=(((3*n)+j)/4)-1];
else{
if(j==0)
kw3 = (tabA[ikw3=((3*n)/4)-1]+tabA[(((3*n)+4)/4)-1])/2;
if(j==3)
kw3 = (tabA[ikw3=(((3*n)+1)/4)-1]+tabA[(((3*n)+5)/4)-1])/2;
}
printf("%.1f\n", kw3);
//-5---najwiekszy wyraz
printf("%.0f \n", tabA[n-1]);
//-6---srednia artmetyczna
for(i=0; i<n; i++)
suma += tabA[i];
printf("%.2f \n", suma=suma/n);
//-7---odchylenie cwiartkowe
printf("%.2f \n", (kw3-kw1)/2);
//-8---cwiartkowy wsp. zmiennosci
printf("%.2f%c", ((kw3-kw1)/2)/suma*100, 37);
//-9---wskaznik asymetrii
printf("%.2f \n", suma-med);
//-10---nie wiem jak to nazwac
for(i = ikw1+1, j=0; i<ikw3; i++, j++)
suma2 += tabA[i];
printf("%.2f \n", suma-((suma2+kw1+kw3)/(j+2)));
//-11---wsp. skosnosci
if(kw3 == kw1)
printf("brak\n");
else
printf("%.2f\n", (kw3+kw1-med-med)/(kw3-kw1));
//free(tabA);
return 0;
}
Nie wiem czy błąd jest po stronie matematycznej, chociaż tutaj wydaje mi się, że nie może być źle, może coś jeśli chodzi o mieszanie float z int, albo gdzieś brakuje miejsca w tablicy przy skrajnych wartościach, nie mam pojęcia co może być tutaj źle. Próbowałem już dynamicznie alokować tablicę ale bez skutku.