Aiuto pre esame

di il
10 risposte

Aiuto pre esame

Ragazzi domani ho l'esame e mi sono accorto che la mia procedura per eliminare un elemento da un array è sbagliata;

ho un vettore di stringhe , per eliminare i doppioni FACCIO COSì:

prima lo ordino e poi confronto con l'elemento adiacente in questo modo:

void ordinaVettore (vettore v,int r){
		
	
	vettore temp;
	bool scambio=true;
	while(scambio){
		scambio=false;
		for (int i=0;i<r-1;i++)
			if(strcmp(v[i],v[i+1])>0){
				strcpy(temp[i],v[i]);
				strcpy(v[i],v[i+1]);
				strcpy(v[i+1],temp[i]);
				scambio=true;
			}
			}	
	
	cout<<endl;
	cout<<"\nOrdinato:";
	for (int i=0;i<r;i++)
		cout<<v[i]<<" ";
	
	
	cout<<"	\n\n SENZA DOPPIONI: \n";
	for (int i=0;i<r-1;i++)
		if(strcmp(v[i],v[i+1])==0){
			for(int j=i;j<r;j++)
			strcpy(v[i],v[j+1]);
			r--;
		}r++;
		
		   cout<<endl;
		   for (int i=0;i<r;i++)
		   cout<<v[i]<<" ";
}
ma mi genera degli errori in esecuzione, ecco un paio di esempi :
Riempimento :

esecuzione 1
10//inserisco il riempimento
A// inserisco le 10 stringhe
C
B
A
A
A
A
PIPPO
SARA
MONICA

A C B A A A A PIPPO SARA MONICA //stampe del vettore

Ordinato:A A A A A B C MONICA PIPPO SARA //stampa del vettore ordinato

SENZA DOPPIONI:

? SARA PIPPO MONICA A B C //stampa del vettore senza ripetizioni


esecuzione 2



Riempimento :
5
A
A
A
A
C
A A A A C

Ordinato:A A A A C

SENZA DOPPIONI:

0?_? C A A logout

10 Risposte

  • Re: Aiuto pre esame

    
    template <class ForwardIterator>
      ForwardIterator unique ( ForwardIterator first, ForwardIterator last )
    {
      ForwardIterator result=first;
      while (++first != last)
      {
        if (!(*result == *first))  
          *(++result)=*first;
      }
      return ++result;
    }
    
    questo è il codice di std::unique. Non guardarlo come un mostro ma cerca di implementarlo. Cosa fa std::unique. Scarta gli elementi doppi e alla fine ti dice dove si è fermato. praticamente prendendo il tuo primo esempio e ordinando i dati avremmo
    //vettore ordinato
    A A A A A B C MONICA PIPPO SARA //stampa del vettore ordinato

    //dopo l'applicazione di std::unique
    A B C MONICA PIPPO SARA C MONICA PIPPO SARA

    la funzione ti dice che si è fermato sulla prima SARA, quindi saprai che i dati dopo non sono validi e li puoi scartare. Come implementarlo:
       
     int unique ( vettore v, int size)
    {
     int first =0;
     int result=first;
      while (v[++first] != size)
      {
        if (!(v[result] == v[first]))  
          v[++result]=v[first];
      }
      return ++result;
    }
    
  • Re: Aiuto pre esame

    Non posso usarlo . . .
  • Re: Aiuto pre esame

    Non puoi usare cosa. non ti dico di usare quello, usa la funzione sotto.
  • Re: Aiuto pre esame

    Sky a quest'ora avendo l'esame domani non riesco proprio + a concentrarmi per capire :S , non chiamarmi rompiballe
    non riesci proprio a correggere il mio?
  • Re: Aiuto pre esame

    Com'è definito il vettore?
    1.
    
    char vettore[100][100];
    
    2.
    
    string vettore[100];
    
  • Re: Aiuto pre esame

    #include <string.h>
    using namespace std;
    typedef char stringa [256];

    typedef stringa vettore [30];
  • Re: Aiuto pre esame

    Questo è una modifica del mio per addattarlo al tuo codice. Ti ho messo anche i commenti. Dimmi cosa non capisci. Se vedi con attenzione è simile al tuo codice.
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    typedef char stringa [256];
    
    typedef stringa vettore [30];
    
    int rimozione_doppi ( vettore & v, int size);
    
    int main() 
    {
    	vettore v = {"A","A", "A", "A", "A", "B", "C", "MONICA", "PIPPO", "SARA"};
    
    	int posizioneFinale = rimozione_doppi(v,11);
    
    	for(int i = 0; i < posizioneFinale; i++)
    		cout << v[i] << " ";
    
    	return 0;
    }
    
    int rimozione_doppi ( vettore & v, int size)
    {
    	int primo = 0;
    	int posFinale = primo;
    	primo++;
    
    	while (primo != size) //finche non sono arrivato alla fine
    	{
    		//se le stringhe sono diverse
    		if (strcmp(v[posFinale],v[primo]) != 0) 
    		{
    			//sposto la fine di uno e copio nella posizione nuova
    			// la stringa diversa
    
    			posFinale++;
    			strcpy(v[posFinale],v[primo]);
    		}
    		//incremento la posizione di confronto iniziale.
    		primo++;
    	}
    
    	//ritorno la prima posizione non valida
    	return ++posFinale;
    }
    
    dimenticavo: io con sto codice non ti darei più di 20 cmq. E' un miscuglio tremendo di C col C++.
  • Re: Aiuto pre esame

    Mi credi se ti dico che ho preso 20? che però ho rifiutato , quindi probabilmente romperò ancora un pochino
  • Re: Aiuto pre esame

    Sei rimasto bloccato in qualcosa scometto.
  • Re: Aiuto pre esame

    No, è stata sfiga, e la disorganizzazione della mia università, ti spiego com'è andata:
    1 entriamo in sala informatica, alcuni computer sono accesi, pronti, altri come il mio sono accesi sulla schermata con una pass interna;

    2 entra il prof, fa l'appello e se ne esce dicendoci all'improvviso : andate su http://www.campus.unina.i e scaricatevi la traccia, la pass è :LABEFANA

    3 alcuni erano già pronti per navigare, altri (come me) dovevano aspettare che venisse il "tecnico" ad inserire la pass.

    4 questo poi è il punto che mi piace di più, insieme al successivo: il mio computer non aveva il DEV, quindi il prof provvede richiamando il "tecnico", ma prevedendo quale tipo di soluzione mi poteva dare l'ho anticipato incominciando a scaricare il programma.

    5 scrivo il programma, e alla prima compilazione (ad un quarto del programma) scopro che avevo salvato sul desktop, non avendo i permessi non mi aveva fatto salvare, interviene il prof con la geniale idea di eliminare tutto e farmi partire da capo, nell'ultimo quarto d'ora improvviso quello che posso, il programma risponde a solo uno dei quesiti richiesti, e mi becco un bel 20 .... ci vediamo la prossima volta !
Devi accedere o registrarti per scrivere nel forum
10 risposte