PDA

Visualizza la versione completa : [C] Stampare lettere una sola volta anche se si ripetono


AmedeoFalco
30-10-2017, 22:26
Salve ! Stavo provando a fare qst esercizio...quello che non va che il programma dovrebbe stamparmi una sola volta tutte le lettere che si ripetono... esempio


Se scrivo in input a a b b c lui mi deve stampare solo a b c ! Potreste aiutarmi a capire? Io ho un dubbio sul for che analizza il vettore vorrei avere un vostro consiglio!!







#include <iostream>
#include <stdio.h>
#include <stdlib.h>




void Pass( char *word,int n){
fflush(stdin);
for(int i=0;i<n;i++){
printf("inserisci lettera n.%d: ",i+1);
fflush(stdin);
scanf("%c",&word[i]);
}
return;

}


void stampa( char *word,int n){

int ris;
for(int i=0;i<n-1;i++){
if(word[i]!=word[i+1]){
printf("\nParola [%d]: %c",i+1,word[i]);
}
else{
ris=1;
}
}
return ;
}


int main(int argc, char **argv){
int n;

printf("Digita quante parole vuoi inserire: ");
scanf("%d",&n);
char *word=(char*)malloc(n*sizeof(char));
Pass(word,n);
stampa(word,n);
free(word);

return 0;
}

torn24
31-10-2017, 11:11
Ciao, secondo me dovresti tener traccia dei caratteri che stampi, per poi di conseguenza decidere se stamparli o meno.
Potresti usare un array per memorizzare lo stato "stampato-non stampato" dei vari caratteri.


Qualcosa del genere:



/*Array contenente lo stato
l'array composto da 127 elementi ognuno corrispondente al codice ascii "ristretto".
Per accedere a un elemento dell'array, useremo il valore ascii del carattere.
Esempio stampato['A'] equivale a stampato[65]*/


char stampato[127]={0}; //Usiamo il tipo char al posto di int, per risparmiare memoria
void stampa(char*word,int n, int stampato[]){

int i=0;
for( i=0;i<n;i++){
if(stampato[word[i]]==0){
printf("\nParola [%d]: %c",i+1,word[i]);
stampato[word[i]]=1;
}

}

}

AmedeoFalco
31-10-2017, 21:59
Ciao, secondo me dovresti tener traccia dei caratteri che stampi, per poi di conseguenza decidere se stamparli o meno.
Potresti usare un array per memorizzare lo stato "stampato-non stampato" dei vari caratteri.


Qualcosa del genere:



/*Array contenente lo stato
l'array composto da 127 elementi ognuno corrispondente al codice ascii "ristretto".
Per accedere a un elemento dell'array, useremo il valore ascii del carattere.
Esempio stampato['A'] equivale a stampato[65]*/


char stampato[127]={0}; //Usiamo il tipo char al posto di int, per risparmiare memoria
void stampa(char*word,int n, int stampato[]){

int i=0;
for( i=0;i<n;i++){
if(stampato[word[i]]==0){
printf("\nParola [%d]: %c",i+1,word[i]);
stampato[word[i]]=1;
}

}

}


Posso inserire direttamente


char stampato [127]={0};

Nel main ...ma il compilatore non mi direbbe che poi impossibile convertire char in int quando lo passo alla funzione ?? :)

torn24
01-11-2017, 09:13
Ovviamente stata una svista, dovrai usare il tipo char anche nella funzione.
Il fatto che dobbiamo salvare i valori 0 e 1, quindi diventa solo uno spreco di memoria usare un int.

AmedeoFalco
01-11-2017, 12:16
Ovviamente stata una svista, dovrai usare il tipo char anche nella funzione.
Il fatto che dobbiamo salvare i valori 0 e 1, quindi diventa solo uno spreco di memoria usare un int.
Eccolo qui @torn24!! Grazie per avermi passato questo suggerimento !




#include <iostream>
#include <stdio.h>
#include <stdlib.h>




void Pass( char *word,int n){
fflush(stdin);
for(int i=0;i<n;i++){
printf("inserisci lettera n.%d: ",i+1);
fflush(stdin);
scanf("%c",&word[i]);
}
return;

}




void stampa( char *word,int n,char stampato[]){

for(int i=0;i<n;i++){
if(stampato[word[i]]==0){ //Il carattere non' stato ancora stampato
printf("\nParola [%d]: %c",i+1,word[i]);
stampato[word[i]]=1; //Carattere stamapato gi
}
}

return ;
}




int main(int argc, char **argv){
int n;
char stampato[127]={0};//Array contenente lo stato
//l'array composto da 127 elementi ognuno corrispondente al codice ascii "ristretto".
//Per accedere a un elemento dell'array, useremo il valore ascii del carattere.
//Esempio stampato['A'] equivale a stampato[65]*/
printf("Digita quante parole vuoi inserire: ");
scanf("%d",&n);
char *word=(char*)malloc(n*sizeof(char));
Pass(word,n);
stampa(word,n,stampato);
free(word);

return 0;
}

Loading