Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Wskaźniki - pomoc


Rekomendowane odpowiedzi

Opublikowano

Witam,

 

mam problem, napisałem następujący kod:

 

 

#include <iostream>
#include <ctime>
#include<math.h>

#define DEBUG_M 1    //kolejny debug na dole jeżeli takie same wartości to pokaże
using namespace std;
int* generuj(int &n);
void wypisz(int *a,int n);
double srednia(int *a, int n);
double odchylenie(int *a, int n, double srednia);
void granice(double srednia, double odchylenie, double &l, double &p);

int* generuj(int &n)
{
srand(unsigned(time(0)));
int*a=new int[n]; //definicja dynamicznej tablicy
for(int i=0;i<n;i++)
*(a+i)=rand()%10; //operator dereferencji, *(t+i)<=>t
return a;
}

void wypisz(int *a,int n)
{
cout<<endl<<"tablica: ";
for(int i=0;i<n;i++)
cout<<*(a+i)<<", ";
cout<<endl;
}

double srednia(int *a, int n)
{
    int suma;
    double srednia_n;
    suma=0;
    int i;
    for(i=0; i<n; i++)

        suma+=*a++;

    srednia_n=(double) suma/n; //rzutowanie

#if DEBUG_M 1
    printf("suma= %d\n",  suma); //wyswietlanie dla zmiennej ilości cyfr po przecinku %f,
#endif    
    return srednia_n;
}

double odchylenie(int *a, int n, double srednia)
{
    double od,suma=0;
    int i;
    for(i=0; i<n; i++)
    {
    suma+=pow(((*a++)-srednia),2);
    }
    od=suma/n;
    od=sqrt(od);
    cout<<"odchylenie= "<<od<<endl;
    return od;
}

void granice (double srednia, double odchylenie, double &l, double &p)
{
l=srednia-odchylenie;
p=srednia+odchylenie;
}


int main()
{
int n;
int rozm=0;
int*a;
cout<<"podaj n ";
cin>>n;
a=generuj(n);
wypisz(a,n);
double sr=srednia(a,n);
printf("srednia= %.3f \n", sr); //wyswietlanie dla zmiennej ilości cyfr po przecinku %f,
double odch=odchylenie(a,n,sr);
delete[]a;
cout<<endl;
system("PAUSE");
}

 

 

 

Program wykonuje rzeczy z podpunktów a i b:

 

aa7907c631bb0640.jpg

 

obecnie próbuję wykonać podpunkt c i mam z tym problem.

 

Mam już pomysł na c i d, ale z wykonaniem gorzej:

 

- w c wymyśliłem, że trzeba zrobić funkcję, która liczy średna-odchylenie i średnia+odchylenie i w ten sposób powstaje nam przedział no i później trzeba stworzyć nową tablicę dynamiczną i wypełnić ją liczbami z tego przedziału, tylko że nie wychodzi mi to, a siedzę już nad tym nieco i próbuję różnych opcji,

- w  d sądzę, że trzeba zrobić dynamiczną tablicę dwuwymiarową i wypełnić ją odpowiednio elementami tablicy a, ale nad tym jeszcze nie siedziałem.

 

Bardzo proszę o jakieś wskazówki.

Opublikowano

ten kod nadaje się do przepisania. Już w funkcji

int* generuj()

masz wyciek pamięci.

2. Zostawiasz pusty wskaźnik

int*a

dopiero potem cokolwiek do niego przypisujesz

 

na reszte nawet nie patrze

 

Następnym razem daj kod w znaczniki [ code ] kod [/ code ]

Opublikowano

@

Ja żadnego wycieku nie widzę.

 

@@gosmedia

Zamiast tworzyć do podpunktów c i d zwykłe tablice, wykorzystaj coś z STL, na przykład listy. 

 

Rozwiązanie:

 

 

#include <iostream>
#include <ctime>
#include <math.h>
#include <list>
 
#define DEBUG_M 1    //kolejny debug na dole jeżeli takie same wartości to pokaże
using namespace std;
int* generuj(int n);
void wypisz(int *a, int n);
double srednia(int *a, int n);
double odchylenie(int *a, int n, double srednia);
void podpunkt_c(int *a, int n, list<int> &b, double srednia, double odchylenie);
void podpunkt_d(int *a, int n, list<int> &c, double srednia);
 
int* generuj(int n)
{
    srand(unsigned(time(0)));
    int*a = new int[n]; //definicja dynamicznej tablicy
    for (int i = 0; i<n; i++)
        *(a + i) = rand() % 10; //operator dereferencji, *(t+i)<=>t[i]
    return a;
}
 
void wypisz(int *a, int n)
{
    cout << endl << "tablica: ";
    for (int i = 0; i<n; i++)
        cout << *(a + i) << ", ";
    cout << endl;
}
 
double srednia(int *a, int n)
{
    int suma;
    double srednia_n;
    suma = 0;
    int i;
    for (i = 0; i<n; i++)
        suma += *a++;
    srednia_n = (double) suma / n; //rzutowanie
 
#if DEBUG_M 1
    printf("suma= %d\n", suma); //wyswietlanie dla zmiennej ilości cyfr po przecinku %f,
#endif    
    return srednia_n;
}
 
double odchylenie(int *a, int n, double srednia)
{
    double od, suma = 0;
    int i;
    for (i = 0; i<n; i++)
    {
        suma += pow(((*a++) - srednia), 2);
    }
    od = suma / n;
    od = sqrt(od);
    return od;
}
 
void podpunkt_c(int *a, int n, list<int> &b, double srednia, double odchylenie)
{
    double l = srednia - odchylenie;
    double p = srednia + odchylenie;
 
    for (int i = 0; i < n; i++)
    {
        if (*(a + i) > l && *(a + i) < p) //zakładam, że chodzi o przedział otwarty
            b.push_back(*(a + i));
    }
}
 
void podpunkt_d(int *a, int n, list<int> &c, double srednia)
{
    for (int i = 0; i < n; i++)
    {
        if ((double) *(a + i) < srednia)
            c.push_front(*(a + i));
        else if ((double) *(a + i) > srednia)
            c.push_back(*(a + i));
    }
}
 
int main()
{
    list<int> ll;
    int n;
    int rozm = 0;
    int*a;
    list<int> b, c; //deklaracja wektorów
 
    cout << "podaj n ";
    cin >> n;
    a = generuj(n);
    wypisz(a, n);
    double sr = srednia(a, n);
    printf("srednia = %.3f \n", sr); //wyswietlanie dla zmiennej ilości cyfr po przecinku %f,
    double odch = odchylenie(a, n, sr);
    printf("odchylenie = %.2f\n", odch);
    podpunkt_c(a, n, b, sr, odch);
    podpunkt_d(a, n, c, sr);
 
    cout << "przedzial = (";
    for (list<int>::iterator i = b.begin(); i != b.end(); i++)
        cout << *i << ",";
    cout << ")\npodpunkt_d = {";
    for (list<int>::iterator i = c.begin(); i != c.end(); i++)
        cout << *i << ",";
    cout << "}";
    delete[]a;
    cout << endl;
    system("PAUSE");
}

 

 

Opublikowano

no raczej rzeczywiście nie ma wycieku, bo na końcu jest delete [] a;

Lecz radziłbym i tak unikać kodów, które zwracają lokalne wskaźniki, rozważmy taką sytuację:

#include <string>
#include <iostream>

int* generuj(int size)
{
    int *a = new int[size];
    return a;
}

void ustaw(int *tablica)
{
    //cokolwiek;
}

int main()
{
    ustaw(generuj(100));
    return 0;
}

to będzie prowadziło do memory leaku, bo na stosie jest tworzony wskaźnik "a", natomiast dane są alokowane na kopcu (wielkość int * size bajtów) i nigdzie nie są usuwane, bo kopiec nie usuwa automatycznie pamięci. Warto o tym pamiętać

 

(kopiec == heap).

 

natomiast taka sytuacja:

int main()
{
    int *tab = generuj(100);
    ustaw(tab);
    delete [] tab;
    return 0;
}

już nie.

To tak jakby ktoś chciał wiedzieć czemu uważałem, że tam jest memory leak.

 

ps. wcale to nie oznacza, że kod jest dobry. Bardzo mnie boli brak nawiasów na pętlę, która wykonuje tylko jedną instrukcję ;c

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...