|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
[C++]Allocazione Memoria
Ciao a tutti, chi mi potrebbe spiegare gentilmente come si alloca lo spazio in memoria con l'operatore new?
Per esempio devo allocare una lista dove la testa della lista (punt_lista) è il puntatore della testa della lista Thanks |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allochi una struttura o un classe in questo modo:
lista *punt_lista; punt_lista = new lista; punt_lista->next = NULL; punt_lista->info = 0; //supponendo info intero Viene istanziata e allocata una struttura/classe di tipo lista...il cui puntatore viene ritornato da new... Comunque si tratta di un solo elemento di tipo lista...in tal caso sarà l'unico elemento della lista... |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
guarda praticamente devo creare un programma che dato un elenco di articoli devo conoscere il guadagno totale, di ogni articolo si sa la quantità venduta, il prezzo di acquisto e di vendita.
Adesso io volevo usare una classe articolo e le liste. Ma come faccio a fare in modo che dentro il campo informazione ci sia la classe?? Sinceramente la prof non c'è la spiegato e non saprei come fare. La lista ha 2 campi: il campo informazione che deve contenere la classe e il campo next che punta alla lista dopo. Thanks P.S: Nel punt_lista=new lista, lista cosa sarebbe?? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
lista sarebbe il tipo di *punt_lista;
Per metterci la classe puoi fare in questo modo: Codice:
struct lista {
tuaclasse info;
lista *next;
};
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
ok ci provo
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
allora, sono arrivato al punto dove devo acquisire il dato e metterlo dentro il membro char nome_prodotto[50] della classe articolo.
E' giusto se faccio così?? cin >>ogg_art.nome_prodotto; p->info.nome_prodotto=ogg_art.nome_prodotto Se no come devo fare? Ultima modifica di Gogeta ss4 : 16-09-2004 alle 18:20. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
cin >> p->info.nome_prodotto;
Non puoi assegnare un char [50] ad una ltro char [50]... Dovresti usare strcpy per farlo... |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
ok, senti quando compilo mi da un errore nella classe
Codice:
class articolo
{
public: articolo(); //Costruttore
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno
private: char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};
#endif
In quella funzione mi serve per passare punt_lista |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Hai definito lista prima della classe ?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perchè inserisci la lista dentro alla classe ?!?!?
class articolo { public: articolo(); //Costruttore void insert(lista *); //Funzione per l'inserzione del prodotto float guadagno(lista *); //Funzione che calcola il guadagno |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
e allora come faccio a passargli il punt_lista alla funzione?
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
Ti posto tutto il codice così magari e meglio:
Codice:
#ifndef articoli_h
#define articoli_h
class articolo
{
public: articolo(); //Costruttore
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno
private: char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};
#endif
Codice:
#include <iostream.h>
#include "classi.h"
articolo::articolo() //Il costruttore inizializza a 0
{
quantita_vendute=0;
prezzo_vendita=0;
prezzo_acquisto=0;
guadagno_totale=0;
}
void articolo::insert(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
p=new lista;
cout <<"Inserisci il nome del prodotto venduto (MAX 10 LETTERE): ";
cin >>p->info.nome_prodotto;
cout <<"Descrivi Il Prodotto(MAX 200 LETTERE): ";
cin >>p->info.descrizione_prodotto;
cout <<"Quanti prodotti hai venduto?: ";
cin >>p->info.quantita_vendute;
cout <<"Inserisci il prezzo di vendita del prodotto: ";
cin >>p->info.prezzo_vendita;
cout <<"Inserisci il prezzo d'acquisto del prodotto: ";
cin >>p->info.prezzo_acquisto;
if(punt_lista==NULL) //caso lista vuota
{
p->next=NULL;
punt_lista=p;
}
else
{
p->next=punt_lista;
punt_lista=p;
}
}
float articolo::guadagno(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
int prezzo_vend,prezzo_acqu,quantita_vend,totale=0;
for(p=punt_lista;p!=NULL;p=p->next)
{
prezzo_vend=p->info.prezzo_vendita;
prezzo_acqu=p->info.prezzo_acquisto;
quantita_vend=p->info.quantita_vendute;
totale+=(prezzo_vend-prezzo_acqu)*quantita_vend;
}
return totale;
}
Codice:
#include "stdafx.h"
#include "classi.h"
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
struct lista_articoli
{
articolo info;
struct lista_articoli *next;
};
typedef struct lista_articoli lista;
int main(int argc, char* argv[])
{
articolo ogg_art;
lista *punt_lista=NULL;
int scelta,totale=0;
do
{
cout <<setw(20) <<"MENU' PRINCIPALE";
cout <<setw(15) <<"1)Inserisci Singolo Prodotto";
cout <<setw(15) <<"2)Controlla Gaudagno Totale";
cout <<setw(15) <<"0)Uscita";
cout <<setw(25) <<"Scelta: ";
cin >>scelta;
switch(scelta)
{
case 1: ogg_art.insert(punt_lista);
break;
case 2: totale+=ogg_art.guadagno(punt_lista);
cout <<"\nFinora hai guadagnato" <<totale <<"Euro";
break;
case 0: exit(EXIT_SUCCESS);
default: cout <<"\nOpzione non valida";
}
} while(scelta!=0);
return 0;
}
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se articolo è anche la classe che è all'interno di lista allora così ha poco senso...
Le cose sono due...o definisci una classe lista...o le quelle funzioni le porti fuori dalla classe articolo... Per la prima soluzione: Codice:
class lista {
articolo art;
lista *next;
public:
lista(const articolo a = articolo());
void insersci_in_coda(oggetto art);
articolo *cerca_prodotto(const char *nome_prodotto);
void collega(const lista &lst);
};
//Tanto per farti un esempio
lista::lista(const articolo a = articolo())
{
art = a; //attento che devi definire il costruttore di copia per articolo
//altrimenti devi fare la copia membro a membro dei dati
next = NULL;
}
//collega serbve per fare una specie di insrimento in testa
void lista::collega(const lista &lst)
{
next = &lst;
}
//ecco la ricerca sula lista effettuata in modo ricorsivo
void lista::insersci_in_coda(oggetto art)
{
if(next != NULL)
next->inserisci_in_coda(art);
else
next = new lista(art);
}
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
ok, allora definisco una classe lista, ma va dopo o prima la classe articolo??
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dopo...altrimenti articolo non è definito...
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
scusa e nella classe lista cosa dovrei mettere allora??
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In che senso ?
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
Allora ecco il codice:
Codice:
#include <iostream.h>
#include "stdafx.h"
#include "classi.h"
#include <iomanip.h>
#include <stdlib.h>
struct lista_articoli
{
articolo info;
struct lista_articoli *next;
};
typedef struct lista_articoli lista;
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno
int main(int argc, char* argv[])
{
lista *punt_lista=NULL;
int scelta;
float totale;
do
{
cout <<setw(10) <<"\nMENU' PRINCIPALE";
cout <<setw(15) <<"\n1)Inserisci Singolo Prodotto";
cout <<setw(15) <<"\n2)Controlla Gaudagno Totale";
cout <<setw(15) <<"\n0)Uscita";
cout <<setw(25) <<"\nScelta: ";
cin >>scelta;
switch(scelta)
{
case 1: insert(punt_lista);
break;
case 2: totale+=guadagno(punt_lista);
cout <<"\nFinora hai guadagnato" <<totale <<" Euro";
break;
case 0: exit(EXIT_SUCCESS);
default: cout <<"\nOpzione non valida";
}
} while(scelta!=0);
return 0;
}
//Funzioni
void insert(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
p=new lista;
cout <<"Inserisci il nome del prodotto venduto (MAX 10 LETTERE): ";
cin >>p->info.nome_prodotto;
cout <<"Descrivi Il Prodotto(MAX 200 LETTERE): ";
cin >>p->info.descrizione_prodotto;
cout <<"Quanti prodotti hai venduto?: ";
cin >>p->info.quantita_vendute;
cout <<"Inserisci il prezzo di vendita del prodotto: ";
cin >>p->info.prezzo_vendita;
cout <<"Inserisci il prezzo d'acquisto del prodotto: ";
cin >>p->info.prezzo_acquisto;
if(punt_lista==NULL) //caso lista vuota
{
p->next=NULL;
punt_lista=p;
}
else
{
p->next=punt_lista;
punt_lista=p;
}
}
float guadagno(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
int quantita_vend;
float prezzo_vend,prezzo_acqu,totale;
for(p=punt_lista;p!=NULL;p=p->next)
{
prezzo_vend=p->info.prezzo_vendita;
prezzo_acqu=p->info.prezzo_acquisto;
quantita_vend=p->info.quantita_vendute;
totale+=(prezzo_vend-prezzo_acqu)*quantita_vend;
}
return totale;
}
Codice:
#include <iostream.h>
#include "stdafx.h"
#include "classi.h"
#include <iomanip.h>
#include <stdlib.h>
articolo::articolo() //Il costruttore inizializza a 0
{
quantita_vendute=0;
prezzo_vendita=0;
prezzo_acquisto=0;
guadagno_totale=0;
}
Codice:
#ifndef ARTICOLO_H
#define ARTICOLO_H
class articolo
{
public: articolo(); //Costruttore
char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};
#endif
Puoi illuminarmi? Ultima modifica di Gogeta ss4 : 16-09-2004 alle 20:47. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
sono riuscito a mettere apposto, l'unica cosa che non riesco a capire e perchè non mi vede la manipolazione dello stream SETW...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:34.



















