Program, który dla tablicy liczy maksimum, minimum, średnią i sumę

0

Witam mam problem z zadaniem "Napisz funkcję (zwracającą wskaźnik), która przyjmie jako argument liczbę całkowitą N, dynamicznie zaalokuje tablicę N liczb zmiennoprzecinkowych i wczyta je wszystkie od użytkownika. Przetestuj napisaną funkcję w main: wyświetl zawartość tablicy i usuń pamięć przydzieloną na tablicę." i kluczowa druga część z którą nie mogę sobie poradzić "Napisz program, który dla tablicy z poprzedniego zadania liczy: maksimum, minimum, średnią i sumę. Każda z tych operacji powinna być zapisana jako funkcja przyjmująca jako argument wskaźnik-nazwę tablicy". Proszę o jakieś wskazówki. Pierwsza część wygląda tak:

#include <stdio.h>
#include <stdlib.h>
int N=4;

float *funkcja1(int N)
{
    float *tablica= malloc(sizeof(float)*N);
    for(int i=0; i<N; i++)
    {
        tablica[i]=0.0;
    }
    printf("\n");
    return tablica;
}
float *funkcja2(int N)
{
    float *tablica= malloc(sizeof(float)*N);
    for(int i=0; i<N; i++)
    {
        float a;
        scanf("%f", &a);
        tablica[i]=a;
    }
    printf("\n");
    return tablica;
}

int main()
{
   int N=4;
   float *a;
   a=funkcja2(N);
    for(int j = 0; j < N; j++)
    {
        printf("%f\t ", a[j]);
    }

   free(a);
   return 0;
}
3

Aby napisać max tworzysz sobie zmienna no. max i przypisujesz do niej pierwszy elementist tablicy. Iterujesz po wszystkich elementach i sprawdzasz czy kolejny element jest większy od max, jeśli tak to przypisz do max. Dla min tak samo tylko warunek inny.

Suma - Iterujesz po elementach tablicy i dodajesz je do jakiejś zmiennej zadeklarowanej na 0 poza pętla.

Średnia - dzielisz sumę przez ilość elementów tablicy

0
  1. Jak się wydziela funkcje, to daje im się ZNACZĄCĄ NAZWĘ - funkcja1, funkcja2 nie znaczą nic
  2. Igrasz z identyfikatorem N jak z ogniem. To na razie chodzi, ale przy jakiejś zmianie może obciąć palce
    Po drugie "zwykłe" zmienne tradycyjnie pisze się małymi liczbami
  3. printf w funkcji zakładającej tablicę jest do niczego. A co, jak z jakiś powodów będzie zakładał 1000 talic - wydrukujesz 1000 pustych linii ?
  4. calloc to siostrzane do malloc alokowanie, ale zeruje bufor.

Te linie bym zmienił

#include <stdio.h>
#include <stdlib.h>
int N=4;

float * zaloz_tablice(int n)
{
float *tablica= malloc(sizeof(float)*n); /// calloc(n, sizeof(float))
for(int i=0; i<n; i++) // staje się zbedne
{
tablica[i]=0.0;
}
~~ printf("\n"); ~~
return tablica;
}

int main()
{
~~ int N=4; ~~

}

2

mały porządek z twoim kodem, posłuchaj co ci Dregorio napisał.
https://godbolt.org/z/jzfh7cW8K

1
#include <iostream>
#include <iomanip>
#include <limits>
#include <map>
using namespace std;

class strategy
{
	protected:
	static float NAN() { return numeric_limits<float>::quiet_NaN(); }
	mutable float acc;
	mutable size_t count;
	virtual void init()const=0;
	virtual void proceed(float v)const=0;
	virtual float result()const=0;
	public:
	double calc(float *tb,size_t count)
	{
		init();
		for(int i=0;i<count;++i) proceed(tb[i]);
		return result();
	}
};

class sMax:public strategy
{
	protected:
	virtual void init()const { acc=count=0; }
	virtual void proceed(float value)const { acc=(count && acc>value)?acc:value; ++count; }
	virtual float result()const { return count?acc:NAN(); }
};

class sMin:public strategy
{
	protected:
	virtual void init()const { acc=count=0; }
	virtual void proceed(float value)const { acc=(count && acc<value)?acc:value; ++count; }
	virtual float result()const { return count?acc:NAN(); }
};

class sSum:public strategy
{
	protected:
	virtual void init()const { acc=count=0; }
	virtual void proceed(float value)const { ++count; acc+=value; }
	virtual float result()const { return acc; }
};

class sAvg:public strategy
{
	protected:
	virtual void init()const { acc=count=0; }
	virtual void proceed(float value)const { ++count; acc+=value; }
	virtual float result()const { return count?acc/count:NAN(); }
};

int main()
{
	float tb[]={1,2,3,4,5,6,7,8,9,0};
	cout<<sMin().calc(tb,10)<<endl;
	cout<<sMax().calc(tb,10)<<endl;
	cout<<sSum().calc(tb,10)<<endl;
	cout<<sAvg().calc(tb,10)<<endl;
	return 0;
}

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