Стани премиум член и добиј попуст на 2000+ производи и куп други бенефити!

Проблем со динамичка алокација

maximilian

user
26 март 2008
1.064
74
Значи задачата е следна:

Да се напише класа за опис на објекти лаптопи. За секој лаптоп како приватни податоци се чуваат производител (низа знаци со неограничена должина), име на моделот (низа знаци со неограничена должина), година на производство (цел број) и продажна цена (децимален број). Исто така да се напишат соодветните функции за читање и менување на приватните вредности на објектот, како и конструктори и деструктор.
Да се напише класа за опис на Продавница за лаптопи. Во класата како приватни членови се чуваат името на продавницата, вкупниот приход, како и динамички алоцирана низа од производи (лаптопи), кои се продаваат во продавницата. Исто така за секој лаптоп кој се продава, се води и евиденција за моменталната количина.
Да се напише функција Prodadi која не е член на ниедна од двете класи и прима еден аргумент, објект од типот лаптоп. Истата треба да ја намали количината на тој лаптоп од продавницата и да го зголеми приходот на продавницата за соодветната сума.
Да се напише функција Popust која исто така не е член на ниедна од двете класи и прима два аргументи, низа од објекти од типот лаптоп и децимален број (проценти) за попуст. Оваа функција треба да ја промени (намали) продажната цена, за соодветна сума според процентите, на оние лаптопи од продавницата кои се исти со лаптопите кои се примени како прв аргумент во функцијата.
За крај да се напише главна функција каде од тастатура ќе се внесуваат податоци за 5 различни лаптопи и истите ќе се додадат во една продавница. Потоа да се илустрира употребата на двете функции, Prodadi и Popust.

Е сега, ми се појавува проблем. До сега имам нешто направено, на компилирањето си поминува програмата, но кога пишам број на лаптопи за продавница, и целата програма блокира, ми се појавува најомразениот don't send прозорец. Еве го кодот, па ако знае некој нека ми каже зошто вака се понаша програмата:
Код:
#include<iostream>
#include<cstdlib>
#include<cstring>

using namespace std;

class lap_top
{
      private:
              char proizvoditel [50];
              char model [50];
              int godina;
              float cena;
      public:
             lap_top();
             lap_top(char*, char*, int, float);
             void read();
             void edit();
             void print() const;
             int get_godina()
             {
                 return godina;
             }
             float get_cena()
             {
                   return cena;
             }
             ~lap_top()
             {}
             lap_top(const lap_top& L)
             {
                 strcpy(proizvoditel, L.proizvoditel);
                 strcpy(model, L.model);
                 godina = L.godina;
                 cena = L.cena;
             }
};

lap_top::lap_top()
{
    for (int i=0; i<50; i++)
        proizvoditel[i] = '';
    for (int i=0; i<50; i++)
        model[i] = '';  
    godina = 0;
    cena = 0.0;
}

lap_top::lap_top (char* manu, char* mod, int y, float price)
{
    strcpy(proizvoditel, manu);
    strcpy(model, mod);
    godina = y;
    cena = price;
}

void lap_top::read()
{
     cout << "Ime na proizvoditelot: ";
     cin >> proizvoditel;
     cout << "Model: ";
     cin.ignore();
     cin >> model;
     cout << "Godina na proizvodstvo: ";
     cin >> godina;
     cout << "Prodazna cena: ";
     cin >> cena;
}

void lap_top::edit()
{
     cout << "Koja vrednost na objektot sakate da ja promenite? " << endl;
     cout << "1. Proizvoditel" << endl;
     cout << "2. Model   " << endl;
     cout << "3. Godina na proizvodstvo " << endl;
     cout << "4. Prodazna cena " << endl;
     int k;
     do
     {
         cin >> k;
         if (k<1 || k>4)
            cout << "[1,4]";
     }  while (k<1 || k>4);
     switch (k)
     {
            case 1: {
                        cout << "Ime na proizvoditelot: ";
                        cin.ignore();
                        cin.getline(proizvoditel, 50);   
                        break;
                    }
            case 2: {
                        cout << "Model: ";
                        cin.ignore();
                        cin.getline(model, 50);
                        break;
                    }
            case 3: {
                        cout << "Godina na proizvodstvo: ";
                        cin >> godina;
                        break;
                    }
            case 4: {
                        cout << "Prodazna cena: ";
                        cin >> cena;
                        break;
                    }
     }
}

void lap_top::print() const
{
     cout << "Ime na proizvoditel: " << proizvoditel << endl;
     cout << "Model : " << model << endl;
     cout << "Godina na proizvodstvo: " << godina << endl;
     cout << "Prodazna cena: " << cena << endl;
}

class prodavnica
{
      private:
              char* name;
              float prihod;
              int n;
              lap_top* L;
              int kolicina;
      public:
             prodavnica();
             prodavnica(char*, int);
             ~prodavnica()
             {
                delete [] L;
             }
             void print() const;
             void prodadi();
             prodavnica(const prodavnica& P)
             {
                 strcpy(name, P.name);
                 prihod = P.prihod;
                 n = P.n;
                 kolicina = P.kolicina;
                 L = P.L;
             }
};

prodavnica::prodavnica()
{
    name = '';
    prihod = 0;
    n = 0;
    kolicina = 0;
    L = new lap_top();
}

prodavnica::prodavnica(char* ime, int m)
{
    strcpy(name, ime);
    n = m;
    prihod = 0;
    kolicina = m;
    L = new lap_top [kolicina];
    for (int i=0; i<n; i++)
        L[i].read();
    prihod = 0.0;    
}

void prodavnica::print() const
{
     cout << "Ime na firmata: " << name << endl;
     cout << "Broj na laptopi: " << kolicina << endl;
     for (int i=0; i<kolicina; i++)
     {
         int j = i;
         cout << "======================================" << endl;
         cout << "Lap-top br: " << j+1 << endl;
         L[i].print();
     }
     cout << "Vkupen prihod na firmata: " << prihod << endl;
}

int main()
{
    cout << "Ime na firmata: ";
    char ime [50];
    cin >> ime;
    int m;
    cout << "Broj na lap-topi: ";
    cin >> m;   
    prodavnica P(ime, m);
    P.print();
    system("pause");
    return 0;
}

Не можам да ги доправам другите методи заради проблемов, па ако можете помагајте :)
 

TataMata

hello world
13 јуни 2008
115
1
Пробај да користиш std::string наместо стандардните C стрингови.
 

dimovz

read-only
4 февруари 2008
3
1
Alociraj memorija za name:(inline)
prodavnica::prodavnica(char* ime, int m)
{
name = (char*)malloc(strlen(ime));
strcpy(name, ime);
n = m;
prihod = 0;
kolicina = m;
L = new lap_top [kolicina];
for (int i=0; i<n; i++)
L.read();
prihod = 0.0;
}

Isto smeni gi proizvoditel i model da ti bidat dinamichki(oti taka ti se bara), i povtorno vnimavaj da ne ja pravish istata greshka.
Drug sovet, sekogash pred delete X ili free(X), proveruvaj dali X != NULL, kako i posle sekoj new X ili malloc().
 

maximilian

user
26 март 2008
1.064
74
@dimovz

Пробав со твојот совет и ми успеа. Само во кодот кај тебе наместо name = (char*)malloc(strlen(ime)); ставив name = new char [(strlen(ime)+1)]; што е една иста работа. Не го направив името на фирмата како динамичка алокација на меморијата, сакав тие работи да ги оставам за подоцна, но изгледа дека до тоа бил проблемот. Може ли да ми кажеш зошто? Навистина не сваќам зошто би можело заради ова да блокира програмата :zbunet3:
 

dimovz

read-only
4 февруари 2008
3
1
Imeto na firmata beshe dinamichki(pointer) ama ne ti beshe alociran.
strcpy() "cheka na gotovo" i pretpostavuva deka destination buffer e prethodno alociran. Vo sprotivno imash memory access violation ili kako shto ti vikash ti blokira programata ;)
 
— членови онлајн
—мислења
—теми
—членови

Последни теми

Последни огласи

IT.mk/market понуда

Бесплатна достава на 3000 производи
На врв Дно