PDA

Visualizza la versione completa : [C/C++] Ordine stampa e lettura


diegofio
05-11-2009, 15:17
ciao a tutti
ho questo codice che mi legge un testo qualsiasi da tastiera e conta per tutti i caratteri distinti quante occorrenze son presenti.





/**
* Programma che legge dei caratteri da tastiera
* e comunica per ciascun distinto carattere quanto volte č stato
* inserito.
*/

#include <iostream>
#include <malloc.h>
using namespace std;


int main()
{
//puntatori all'ultimo elemento degli array di caratteri e di occorrenza dei caratteri
char *stringpointer = (char *) malloc (sizeof(char));
int *occurrencepointer = (int *) malloc (sizeof(int));

//puntatori al primo elemento degli array di caratteri e di occorrenza degli stessi caratteri
char *string = stringpointer;
int *occurrence = occurrencepointer;

char c;
int numcaratteri = 0;
bool yetDigited = false;

printf("Inserire stringa, INVIO per terminare\n");

while ((c = getc(stdin)) != 10) //getc legge un carattere da tastiera. 10 = '\n'
{
yetDigited = false;

for (int i = 0; i < numcaratteri; i++) //per tutti i caratteri distinti sinora inseriti
{
if (*(string + i * sizeof(char)) == c) //il carattere appena digitato č giā stato inserito
{
yetDigited = true;
int *index = occurrence + i * sizeof(int);
(*index)++; //incremento la sua occorrenza
break;
}
} //end FOR
if (yetDigited) //al prossimo carattere
continue;

//č stato digitato un carattere nuovo
*stringpointer = c; //inserisco il carattere nella sua cella di memoria
stringpointer = stringpointer + sizeof(char); //passo alla cella di memoria successiva
*occurrencepointer = 1; //nuovo carattere, occorrenza = 1
occurrencepointer = occurrencepointer + sizeof(int); //passo alla cella di memoria successiva

numcaratteri++; //un nuovo carattere č stato inserito
//aumento lo spazio a disposizione per un eventuale futuro carattere
string = (char *) realloc (string, (numcaratteri+1) * sizeof(char));
occurrence = (int *) realloc (occurrence, (numcaratteri+1) * sizeof(int));
if ((string == 0) | (occurrence == 0))
{
printf("Memoria non disponibile");
return 1;
}
} //end WHILE


printf ("\nStringa inserita: %s\n", string);

for (int i =0; i < numcaratteri; i ++)
{
char *indexcharacter = string + i* sizeof(char);
int *indexoccurrence = occurrence + i* sizeof(int);
cout << *indexcharacter << " " << *indexoccurrence << "\n";
}
return 0;
}


il programma sostanzialmente funziona, ma ho due domande, la prima delle quale credo possiate rispondere senza nemmeno guardare troppo il codice
1 - perchč prima devo inserire il testo e poi mi esegue la printf che si trova prima del while principale scambiando l'ordine effettivo delle istruzioni?

2- a volte vaneggia inserendo un numero a caso nel conteggio. ad esempio parafrasando battiato se inserisco "vogliovedertidanzare" sul carattere i mi restituisce un contatore di 2054054260.
ecco l'output



vogliovedertidanzare
Inserire stringa, INVIO per terminare

Stringa inserita: vogliedrtanz
v 2
o 2
g 1
l 1
i 2054054260
e 3
d 2
r 2
t 1
a 2
n 1
z 1

grazie a chiunque vorrā aiutarmi, ciao!

Loading