Witam,
robiłem zadanie które sprawdza maszyna. Niestety jednym z elementów które sprawdza jest wywołanie funkcji sumującej przyjmując NULL jako argument. Muszę zablokować jakoś tę możliwość.
Treść zadania:
Napisz funkcje do obliczania sumy i wartości średniej z elementów tablicy. Prototypy funkcji powinny wyglądać następująco:
int sum(const float* tab, unsigned int size, float *result); int avg(const float* tab, unsigned int size, float *result);
Parametry:
tab - wskaźnik na tablicę typu float, dla której ma zostać wyznaczona suma / wartość średnia,
size - liczba elementów w tablicy,
result - wskaźnik na zmienną typu float, w której ma zostać zapisana obliczona suma / wartość średnia.
Wartość zwrócona:
0 - w przypadku podania błędnych danych, 1 - w przeciwnym przypadku.
Napisz program, który pobierze od użytkownika ciąg liczb rzeczywistych (maksymalnie 100, w przypadku mniejszej liczby danych wartość 0 będzie oznaczała koniec wprowadzania danych) i zapisze je do tablicy. Następnie, wykorzystując przygotowane funkcje, program ma wyznaczyć i wyświetlić, z dokładnością dwóch miejsc po przecinku, w kolejnych liniach sumę podanych wartości oraz wartość średnią. W przypadku niepodania żadnej wartości program ma wyświetlić komunikat “Error” i zakończyć działanie z kodem błędu 1, jeżeli wszystkie operacje się powiodą program powinien zwrócić wartość 0.
Przykładowe wejście:
Podaj liczby:
5.895462 -2.534116 6.274956 -9.079528 -3.419764 0.000000⏎
Przykładowe wyjście:
Suma: -2.86 Srednia: -0.57
Mój kod:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int sum(const float* tab, unsigned int size, float *result);
int avg(const float* tab, unsigned int size, float *result);
int main()
{
float a[100];
float *tab=a;
float wynik=0;
float *result=&wynik;
int i=0;
float podana=0;
unsigned int size = 0;
int r;
printf("Podaj liczby: ");
for(i=0;i<100;i++)
{
r = scanf("%f",&podana);
if(r!=1)
{
printf("Error");
return 1;
}
if(podana==0 && size==0)
{
printf("Error");
return 1;
}
if(podana==0)
{
break;
}
else
{
*(tab+i)=podana;
size++;
}
}
//Zablokować NULL
sum(tab, size, result);
avg(tab, size, result);
sum(NULL, size,result);
return 0;
}
int sum(const float* tab, unsigned int size, float *result)
{
unsigned int i=0;
float ile=0;
for(i=0;i<size;i++)
{
ile+=*(tab+i);
}
*result= ile;
printf("Suma wynosi: %.2f", *result);
return 0;
}
int avg(const float* tab, unsigned int size, float *result)
{
unsigned int i=0;
float ile=0;
for(i=0;i<size;i++)
{
ile+=*(tab+i);
}
*result= ile/size;
printf("\nSrednia wynosi: %.2f", *result);
return 0;
}
Większość chyba zrobiłem póki co dobrze, a mam problem z tym NULL'em.
Maszyna sprawdza to tak:
Widok konsoli programu -- przebieg interakcji z użytkownikiem:
float test_array[5] = { -5.797000, 2.012000, -2.104000, -4.150000, 1.449000 };⏎
TEST [1]: Obliczanie sumy elementów w tablicy test_array⏎
Wywołanie: sum(test_array, size, &s) == 1⏎
Suma wynosi: -8.59Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎
⏎
float s = -8.589999;⏎
float expected_sum = -8.586000;⏎
TEST [2]: Sprawdzanie poprawności obliczonej sumy, z dokładnością do 0.1⏎
Wywołanie: test_is_close(expected_sum, s, 0.1) == 1⏎
Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [3]: **Sprawdzanie poprawności zachowania się funkcji w przypadku przekazania do niej wskaźnika NULL⏎
Wywołanie**: sum(NULL, size, &s) == 0⏎
Program przerwany; kod błędu=139 (Sygnał SIGSEGV)
Nie mogę zmienić prototypów funkcji, bo są one podane w zadaniu. Jak ktoś wie co można zrobić to proszę o wskazówki.
c++
, ale kompiluje się wc
.