esercizio c++

Discuti dei problemi relativi alla programmazione nel tuo linguaggio preferito!

Moderatori: cb_123, thrantir, tonertemplum

esercizio c++

Messaggiodi max10891 il 20 ott 2008, 19:43

Eccomi di nuovo...

ho dei piccoli problemi alquanto stupidi...
il programma deve semplicemente leggere da input i dati di alcuni libri...dopo di che deve dare l'opportunità di face determinate cose....
vi posto il codice...

Codice: Seleziona tutto
#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
#include "string.h"

#define MINISTERO 245
#define L_MAX 40
#define LIBRI_MAX 100

using namespace std;

typedef struct      /*definizione del tipo data*/
{
   char titolo[L_MAX];
   char autore[L_MAX];
   char casaeditrice[L_MAX];
   float prezzo;
   char isbn[L_MAX];
}data;

int menu();
int inserimento(data libri[]);
float totale(data libri[], int N);
void controllo(int somma);
void indicizzazione(data libri[], int N, int IND_AUT[], int IND_TITLE[], int IND_CASA[], int IND_ISBN[], int IND_PREZZO[]);
void menu_ord(data libri[], int N, int IND_AUT[], int IND_TITLE[], int IND_CASA[], int IND_ISBN[], int IND_PREZZO[]);
void stampa (data libri[], int N, int INDICE[]);


void main()
{
   int IND_AUT[LIBRI_MAX];         //variabili indicizzazione
   int IND_TITLE[LIBRI_MAX];
   int IND_CASA[LIBRI_MAX];
   int IND_ISBN[LIBRI_MAX];
   int IND_PREZZO[LIBRI_MAX];


   data libri[LIBRI_MAX];
   int scelta1=0;
   int scelta2=0;
   int N=0;
   float somma=0;

   while(scelta1!=4)
   {
      scelta1=0;
      scelta1=menu();
      switch (scelta1)
      {
         case 1:
            system("cls");
            N=inserimento(libri);
            indicizzazione(libri,N,IND_AUT,IND_TITLE,IND_CASA,IND_ISBN,IND_PREZZO);
            break;
         case 2:
            system("cls");
            somma=totale(libri,N);
            break;
         case 3:
         system("cls");
         menu_ord(libri,N,IND_AUT,IND_TITLE,IND_CASA,IND_ISBN,IND_PREZZO);
            
      }
      
   }
}


int menu()//finita
{
   int scelta1=0;

   while(scelta1<1 || scelta1>4)
   {
      system("cls");
      cout<<"1 - Inserisci libri\n";
      cout<<"2 - Controlla se il prezzo totale dei libri rientra nella normativa vigente\n";
      cout<<"3 - Visualizza secondo l'ordine che preferisci\n";
      cout<<"4 - Exit\n";
      cin>>scelta1;

   }
   
   return scelta1;
}

int inserimento(data libri[])
{
   int N=0;
   int i=0;
   char let;

   for (i=0;let!='n';i++)
   {
      system("cls");
      printf("--->LIBRO ");
      printf("%d",i+1);
      printf("<---\n\n");

      printf("TITOLO\n");
      gets(libri[i].titolo);

      printf("\nAUTORE\n");
      gets(libri[i].autore);

      printf("\nCASA EDITRICE\n");
      gets(libri[i].casaeditrice);

      printf("\nCODICE ISBN\n");
      gets(libri[i].isbn);

      printf("\nCOSTO\n");
      cin>>libri[i].prezzo;
      
      N++;
      system("cls");
      cout<<"Vuoi continuare? (s/n)\n";
      cin>>let;
      
   }
   return N;
}


float totale(data libri[], int N)
{
   int i=0;
   float somma=0;

   for(i=0;i<N;i++)
   {
      somma=somma+libri[i].prezzo;
   }
   return somma;
}


void controllo(int somma)
{
   if(somma>MINISTERO)
   {
      cout<<"Totale della spesa: "<<somma<<" euro\n";
      cout<<"Si e' superato il tetto massimo di spesa di :"<<somma-MINISTERO<<"\n";
      cout<<"\n\n\nPremi invio per continuare...";
      cin.get();
   }
   else
   {
      cout<<"Totale della spesa: "<<somma<<" euro\n";
      cout<<"Non si e' superato il tetto massimo di spesa ("<<MINISTERO<<" euro)\n";
      cout<<"\n\n\nPremi invio per continuare...";
      cin.get();
   }
}

void menu_ord(data libri[], int N, int IND_AUT[], int IND_TITLE[], int IND_CASA[], int IND_ISBN[], int IND_PREZZO[])
{
   int scelta2=0;

   while(scelta2<1 || scelta2>5)
   {
      system("cls");
      cout<<"Secondo quale criterio vuoi visualizzare?\n";
      cout<<"1 - Titolo\n";
      cout<<"2 - Autore\n";
      cout<<"3 - Codice ISBN\n";
      cout<<"4 - Prezzo\n";
      cout<<"5 - Torna al menu' precedente\n";

      cin>>scelta2;

   }

   switch (scelta2)
      {
         case 1:
            system("cls");
            stampa (libri, N, IND_TITLE);
            break;
         case 2:
            system("cls");
            stampa (libri, N, IND_AUT);
            break;
         case 3:
            system("cls");
            stampa (libri, N, IND_ISBN);
            break;
         case 4:
            system("cls");
            stampa (libri, N, IND_PREZZO);
         default: ;
      }

}

void indicizzazione(data libri[], int N, int IND_AUT[], int IND_TITLE[], int IND_CASA[], int IND_ISBN[], int IND_PREZZO[])
{
   int ultimo_scambio=0;
   int i;
   int temp;


   /*inizializzazione indici*/
   for(i=0;i<N;i++)
   {
      IND_AUT[i]=i;
      IND_TITLE[i]=i;
      IND_CASA[i]=i;
      IND_ISBN[i]=i;
      IND_PREZZO[i]=i;
   }
   

   /*indicizza autore*/
   do
   {
      ultimo_scambio=0;
      for(i=0;i<N-1;i++)
      {
         if(strcmp(libri[IND_AUT[i]].autore,libri[IND_AUT[i+1]].autore)>0)
         {
            ultimo_scambio=i+1;
            temp=IND_AUT[i];
            IND_AUT[i]=IND_AUT[i+1];
            IND_AUT[i+1]=IND_AUT[i];
         }
         N=ultimo_scambio;
      }
   }while (ultimo_scambio!=0);

   /*indicizza titolo*/
   do
   {
      ultimo_scambio=0;
      for(i=0;i<N-1;i++)
      {
         if(strcmp(libri[IND_TITLE[i]].titolo,libri[IND_TITLE[i+1]].titolo)>0)
         {
            ultimo_scambio=i+1;
            temp=IND_TITLE[i];
            IND_TITLE[i]=IND_TITLE[i+1];
            IND_TITLE[i+1]=IND_TITLE[i];
         }
         N=ultimo_scambio;
      }
   }while (ultimo_scambio!=0);



   /*indicizza casa editrice*/
   do
   {
      ultimo_scambio=0;
      for(i=0;i<N-1;i++)
      {
         if(strcmp(libri[IND_CASA[i]].casaeditrice,libri[IND_CASA[i+1]].casaeditrice)>0)
         {
            ultimo_scambio=i+1;
            temp=IND_CASA[i];
            IND_CASA[i]=IND_CASA[i+1];
            IND_CASA[i+1]=IND_CASA[i];
         }
         N=ultimo_scambio;
      }
   }while (ultimo_scambio!=0);


   /*indicizza ISBN*/
   do
   {
      ultimo_scambio=0;
      for(i=0;i<N-1;i++)
      {
         if(strcmp(libri[IND_ISBN[i]].isbn,libri[IND_ISBN[i+1]].isbn)>0)
         {
            ultimo_scambio=i+1;
            temp=IND_ISBN[i];
            IND_ISBN[i]=IND_ISBN[i+1];
            IND_ISBN[i+1]=IND_ISBN[i];
         }
         N=ultimo_scambio;
      }
   }while (ultimo_scambio!=0);



   /*indicizza prezzo*/
   do
   {
      ultimo_scambio=0;
      for(i=0;i<N-1;i++)
      {
         if(libri[IND_PREZZO[i]].prezzo>libri[IND_PREZZO[i+1]].prezzo)
         {
            ultimo_scambio=i+1;
            temp=IND_PREZZO[i];
            IND_PREZZO[i]=IND_PREZZO[i+1];
            IND_PREZZO[i+1]=IND_PREZZO[i];
         }
         N=ultimo_scambio;
      }
   }while (ultimo_scambio!=0);
}



void stampa(data libri[],int N, int INDICE[])
{
   int i=0;
   
   cout.width(30);
   cout<<"TITOLO";
   cout.width(30);
   cout<<"AUTORE";
   cout.width(30);
   cout<<"CASA EDITRICE";
   cout.width(30);
   cout<<"CODICE ISBN";
   cout.width(6);
   cout<<"PREZZO";
   cout<<"\n";
   cout<<"\n";
   
   for (i=0;i<N;i++)
   {
      cout.width(30);
      cout<<libri[INDICE[i]].titolo;
      cout.width(30);
      cout<<libri[INDICE[i]].autore;
      cout.width(30);
      cout<<libri[INDICE[i]].casaeditrice;
      cout.width(30);
      cout<<libri[INDICE[i]].isbn;
      cout.width(6);
      cout<<libri[INDICE[i]].prezzo;
      cout<<"\n";
      cout<<"\n";
   }
   cin.get();
}


il problema sta nel fatto che durante l'inserimento non mi fa inserire il titolo e salta subito all'autore...

seconda cosa dove ho messo cin.get() per fare una pausa forzata non me la vede ed è come se lo saltasse...

potrebbe dipendere dal fatto che il "buffer" della cin contiene gia qualcosa??se si come lo svuoto?

confido in voi...mi scuso con il codice...spero sia leggibile...nel qualcaso datemi consigli anche su quello :D

grazie!
max10891
Luce delle stelle
Luce delle stelle
 
Messaggi: 1326
Iscritto il: 22 feb 2006, 16:48
Località: Sovico (MI)

 

Re: esercizio c++

Messaggiodi thrantir il 21 ott 2008, 15:54

dopo mi leggo il codice, nel frattempo mi dici perchè usi dei char[] piuttosto che std::string?
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Re: esercizio c++

Messaggiodi max10891 il 21 ott 2008, 20:21

perchè non ho la piu pallida idea di cosa siano std::string... :mrgreen: :mrgreen:

a scuola abbiamo sempre usato un vettore di char per le stringhe...

dimenticavo di dirvi che a scuola usiamo visual c++ 6.0...che vuole la iostream.h
mentre a casa ho visual studio 2008 che vuole la iostream e poi lo using namespace...non so se può centrare..
max10891
Luce delle stelle
Luce delle stelle
 
Messaggi: 1326
Iscritto il: 22 feb 2006, 16:48
Località: Sovico (MI)

Re: esercizio c++

Messaggiodi thrantir il 22 ott 2008, 12:43

allora, intanto facciamo chiarezza

gli header standard del c++ sono quelli senza la h, quelli con la h esistono per motivi di compatibilità, ma è errato usarli senza motivo, quindi

#include <iostream>

anche mscv6 dovrebbe avere entrambi, quindi usa quello senza h

ora, i namespace... i namespace sono un contenitore per nomi: servono per evitare collisioni con funzioni già esistenti. Per esempio, nello standard esiste una funzione swap, se io mi definissi una funzione swap avrei una collisione, il compilatore potrebbe decidere di usarne una mentre io mi aspetto l'altra, oppure potrebbe dare errore non sapendo quale scegliere. Per evitare problemi, si usano i namespace, che racchiudono i nomi di funzioni, classi ecc

tutto ciò che fa parte dello standard c++ sta dentro il namespace std, nessuno se non chi fa lo standard può aggiungere funzioni o classi dentro il namespace std

per utilizzare un nome che sta dentro un namespace si usa l'operatore di risuluzione, il ::

quindi, se io voglio istanziare un oggetto appartenente alla classe string, che sta dentro lo standard, devo scrivere

std::string my_string;

che significa che istanzio un oggetto che si chiama my_string che è di tipo string e la classe string sta sentro il namespace std

siccome può essere noioso scrivere ogni volta std::, o qualsiasi altro namespace, si può usare la direttiva using namespace, che mi rende direttamente accessibili tutti i nomi dentro il namespace

quindi se avessi scritto

using namespace std;

in cima al mio file, potrei scrivere

string my_string;

perchè non ho più bisogno di dire al compilatore che string è dentro il namespace std, lui già è stato istruito per vedere tutti i nomi dentro std

questa pratica è però rischiosa, e limita molto i vantaggi dei namespace, percui è fortemente sconsigliata, eventualmente posso importare solo un nome così:

using std::string;

in questo modo posso accedere al nome string senza specificare che sta dentro l namespace std, ma se volessi accedere ad un altro nome dentro quel namespace, dovrei nuovamente specificare il namespace esplicitamente.
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Re: esercizio c++

Messaggiodi thrantir il 22 ott 2008, 12:45

primo errore, e da non sottovalutare assolutamente!

lo standard prevede che la funzione main corrisponda a uno di questi due prototipi:

int main(void)

int main(int argc, char * argv[])

void main(void) è un errore comune e molto grave!
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Re: esercizio c++

Messaggiodi thrantir il 22 ott 2008, 12:47

il tuo problema è, come avevi supposto, che lo standard input non viene svuotato e mantiene il carattere corrispondente al ritorno carrello, ti consiglio di provare ad utilizzare l'operatore >> di std::cin al posto del metodo gets
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Re: esercizio c++

Messaggiodi thrantir il 22 ott 2008, 12:51

altra cosa, per mettere una pausa, usa la funzione getchar()
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Re: esercizio c++

Messaggiodi max10891 il 22 ott 2008, 18:25

oddio quanta roba!!

ti ringrazio infinitamente!!! ora appena ho un po' di tempo provo il tutto...
il problema è che a scuola queste cose non vengono menzionate...e nemmeno sul libro di testo......e non capisco il perchè...

p.s. visual c++ 6.0 NON prenda la <iostream>...vuole per forza la "iostream.h"....almeno a scuola è così
p.p.s. mentre lo provavo a scuola ho riscontrato anche alcuni piccoli errori di logica (tipo nel buble sort dell'indicizzazione)...posterò anche il codice aggiornato....
max10891
Luce delle stelle
Luce delle stelle
 
Messaggi: 1326
Iscritto il: 22 feb 2006, 16:48
Località: Sovico (MI)

 

Torna a Programmare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron