Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    C++. Problema con "compressione" vettore char.

    Salve a tutti, mi sono appena iscritto al forum dopo aver letto qualche guida presente sul sito. Sto facendo il primo anno di ingegneria informatica e mi sto preparando per l'esame su c++. Oggi mi sono ritrovato avanti un problema con gli array di tipo char. In pratica la prova d'esame del prof. chiede di comprimere un vettore char contenente le iniziali dei colori: verde, bianco, nero. Quindi il nuovo array deve essere il seguente: "b7n3v7..." cioé quante volte si ripetono consecutivamente i colori. Spero di essere stato chiaro. Comunque faccio il mio programmino, e anche se la sintassi mi sembra corretta quando stampo il vettore mi escono dei simboli. Vado con il debug e mi accorgo che il vettore non memorizza i numeri, di preciso memorizza "nv/b...". In realta dovrebbe essere "n7v7b2...". Utilizzo Microsoft visual studio. Questo è il codice della procedura.
    codice:
    void comprimi_vettore(char vett[256], char compresso[256])
    {
        int ripetizione = 1;
        int j = 0;
        int i = 0;
        while ( i < 256)
        {
        
            compresso[j] = vett[i];
            
            i++;
            // fiche' i vettori sono uguali il secondo ciclo avanza
            // e aumenta il contatore per le ripetizioni
            while (compresso[j] == vett[i])
            {
                ripetizione++;
                i++;
            }
            // al vettore compresso viene aggiunto le volte che il colore si ripete
            // e avanza di una posizione pronto per la prossima lettera
            if (ripetizione != 1)
            {
                j++;
                compresso[j] = ripetizione;
                ripetizione = 1;
            }
            else
            {
                j++;
            }
        }
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,

    'ripetizione' è un intero, mentre tu cerchi di memorizzarlo come carattere. Il trucco molto semplice che si usa per la trasformazione è il seguente:

    codice:
    char carattereCorrispondente = ripetizione + '0';

    Prova a ragionarci e vedrai che sarà tutto chiaro. Per il resto non ho analizzato il codice, quindi potrebbero esserci anche altri errori. Intanto prova questo e poi facci sapere come va.

    P.S. Il codice sopra funziona solo se 'ripetizione' ha una sola cifra. Altrimenti devi estrarre separatamente le unità, le decine, le centinaia, ecc. ma è comunque molto semplice (basta fare qualche divisione!)

  3. #3
    Ahhh che pollo, non ci avevo pensato. Grazie per la risposta cosi veloce.

  4. #4
    Ho provato ad usare il tuo metodo e funziona però non ho capito cosa rappresenta
    codice:
    +'0'
    Inoltre ho recuperato del codice di un assistente del prof. che per convertire un int in char utilizza
    codice:
    char variabile = intero + 48;
    Che differenza c'è tra i due metodi?

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    48 è il codice ASCII dello zero, ma io non lo userei perché è uno dei cosiddetti "magic numbers", cioè quei numeri messi lì nel codice che non si capisce bene da dove vengano. Invece '0' significa "il carattere zero", convertito in ASCII secondo la tabella che stai usando. Infatti non è affatto detto che la codifica ASCII di un carattere sia uguale su ogni macchina!

    Quindi se tu hai il numero 5 e lo vuoi convertire in carattere, parti dal carattere '0' e fai cinque passi, ottenendo così il carattere '5'. Ed ecco la tua conversione.

  6. #6
    Grazie mille, il programma ora funziona e l'ho modificato per i numeri in doppia cifra.
    Ultima modifica di BigMoney; 09-06-2015 a 17:55

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.