[C] Cancellare elemento da vettore
Ciao a tutti!
Devo risolvere questo esercizio:
Si sviluppi un programma in linguaggio C che, date le due stringhe (che si possono supporre già acquisite)
char caratteri[5];
char stringa[25];
elimini dalla seconda stringa tutti i caratteri presenti nella prima. Se una stringa occupa meno posizioni di quelle disponibili nel vettore (rispettivamente 5 e 25), si suppone che sia allineata a sinistra e che tutti i rimanenti posti liberi a destra siano occupati dal carattere zero.
Ad esempio, se caratteri=”pabab” e stringa=”pasta all’amatriciana0000” il programma deve modificare stringa in modo che risulti “st ll’mtricin000000000000”.
Ecco il codice che ho scritto io:
Quello che non capisco è perchè si ferma dopo 5 caratteri e non continua fino alla fine del secondo vettore!
Infatti quando lo lancio ottengo come output:
Grazie mille
Ciaoo
Devo risolvere questo esercizio:
Si sviluppi un programma in linguaggio C che, date le due stringhe (che si possono supporre già acquisite)
char caratteri[5];
char stringa[25];
elimini dalla seconda stringa tutti i caratteri presenti nella prima. Se una stringa occupa meno posizioni di quelle disponibili nel vettore (rispettivamente 5 e 25), si suppone che sia allineata a sinistra e che tutti i rimanenti posti liberi a destra siano occupati dal carattere zero.
Ad esempio, se caratteri=”pabab” e stringa=”pasta all’amatriciana0000” il programma deve modificare stringa in modo che risulti “st ll’mtricin000000000000”.
Ecco il codice che ho scritto io:
#include <stdio.h>
int main()
{
int i, j, s=0;
char caratteri[5]={"pabab"};
char stringa[25]={"pasta all'amatriciana0000"};
char uscita[25];
for (i=0;i<5;i++)
{
for (j=0;j<25;j++)
{
if (caratteri[i]==stringa[j])
{
for ( ; stringa[j+1]!='\0' ; j++)
{
stringa[j]=stringa[j+1];
}
}
}
}
for (i=0;i<25;i++)
uscita[s]=0;
for (j=0;stringa[j]!='\0';j++)
{
uscita[j]=stringa[j];
}
printf("%s", uscita);
return 0;
}
Quello che non capisco è perchè si ferma dopo 5 caratteri e non continua fino alla fine del secondo vettore!
Infatti quando lo lancio ottengo come output:
st all'amatriciana0000000
Grazie mille
Ciaoo
Risposte
Ciao
devo dire che sto faticando a capire dove sia il problema del tuo codice.
Peró ne ho scritto uno mio e sembra andare, dimmi se ti piace
devo dire che sto faticando a capire dove sia il problema del tuo codice.
Peró ne ho scritto uno mio e sembra andare, dimmi se ti piace
#include <stdio.h>
#define TRUE 1
#define FALSE 0
unsigned char ElementoInArray(unsigned char elemento, unsigned char* myArray, unsigned char arraySize){
unsigned char i;
for (i=0; i<arraySize; i++){
if (myArray[i] == elemento) return TRUE;
}
return FALSE;
}
int main()
{
int i, s=0;
unsigned char caratteri[5]= {"12345"};
unsigned char stringa[25]= {"p12i3ppo00000000000000000"};
unsigned char uscita[25];
for (i=0;i<25;i++){
uscita[i] = '\0';
}
for (i=0;i<25;i++){
if(ElementoInArray(stringa[i], caratteri, 5) == FALSE)
uscita[s++] = stringa[i];
}
printf("%s", uscita);
return 0;
}
Ciao!
Si devo dire che è perfetto. Nel frattempo ho riscritto di nuovo il mio codice adottando un'altra via e funziona:
Grazie mille per l'aiuto
Ciaoo!
Si devo dire che è perfetto. Nel frattempo ho riscritto di nuovo il mio codice adottando un'altra via e funziona:
#include <stdio.h>
int main ()
{
int i, j, s=0;
char caratteri[] = "pabab";
char stringa[] = "pasta all'amatriciana0000";
char uscita[26];
for (i=0;caratteri[i]!='\0';i++)
{
for (j=0;stringa[j]!='\0';j++)
{
if (stringa[j]==caratteri[i])
stringa[j]='1';
}
}
for (i=0;stringa[i]!='\0';i++)
uscita[i]='0';
for (i=0;stringa[i]!='\0';i++)
{
if (stringa[i]!='1')
uscita[s++]=stringa[i];
}
for (i=0;uscita[i]!='\0';i++)
printf("%c", uscita[i]);
return 0;
}Grazie mille per l'aiuto
Ciaoo!
@ summerwind78: Non è più necessario definire TRUE e FALSE: dal C99 è stato introdotto il tipo _Bool e delle macro apposite http://stackoverflow.com/questions/4767 ... -data-type (devi solo ricordarti di usare uno degli ultimi due standard. Comunque non era necessario usare dei bool.
--------------------------------------
Ma i caratteri che tu consideri sono necessariamente alfabetici oppure valgono anche spazi e cose così? Inoltre devi tener conto o meno della differenza tra lettere maiuscole e minuscole?
--------------------------------------
Ma i caratteri che tu consideri sono necessariamente alfabetici oppure valgono anche spazi e cose così? Inoltre devi tener conto o meno della differenza tra lettere maiuscole e minuscole?
Ciao!
Nel testo dell'esercizio non è specificato, l'unica cosa non si possono utilizzare le librerie per la gestione delle stringhe.
Comunque ho provato e gli spazio vengono eliminati, mentre le lettere se sono maiuscole non vengono eliminate. Comunque credo faccia riferimento solo a lettere minuscole.
In caso per convertire una lettera da maiuscola a minuscola devo utilizzare la codifica ascii giusto?
Ciao!
Nel testo dell'esercizio non è specificato, l'unica cosa non si possono utilizzare le librerie per la gestione delle stringhe.
Comunque ho provato e gli spazio vengono eliminati, mentre le lettere se sono maiuscole non vengono eliminate. Comunque credo faccia riferimento solo a lettere minuscole.
In caso per convertire una lettera da maiuscola a minuscola devo utilizzare la codifica ascii giusto?
Ciao!
"vict85":
@ summerwind78: Non è più necessario definire TRUE e FALSE: dal C99 è stato introdotto il tipo _Bool e delle macro apposite http://stackoverflow.com/questions/4767 ... -data-type (devi solo ricordarti di usare uno degli ultimi due standard. Comunque non era necessario usare dei bool.
I bool sono rimasti da una precedente prova che avevo fatto. Mi sono dimenticato di cancellarli
Ciao a tutti!
Torno su questo argomento perchè non mi è chiara ancora una cosa! Se io ho un vettore e voglio eliminare un elemento da quel vettore, l'unico modo per farlo è utilizzare un'altro vettore dove copiare gli elementi diversi dal valore che voglio eliminare?
Mi spiego meglio:
Ho un vettore di grandezza 5 contenente i seguenti numeri: 0,1,2,3. Ho lasciato uno spazio vuoto in quanto il vettore deve avere il carattere di fine stringa \0.
All'interno di questo vettore voglio eliminare il numero 2. Allora dichiaro una variabile: eliminami=2 e poi con un ciclo for vado ad eliminare il numero e scalare tutti gli elementi del vettore.
Quello che non riesco a capire è come mai il ciclo non funziona:
La domanda è: si può eliminare un valore da un array e far scalare tutti gli elementi di una posizione (compreso il carattere di fine stringa \0) utilizzando lo stesso vettore e non un secondo vettore per la copia?
Sul libro del professore ho trovato questo codice:
E' una funzione che cancella un dato intero x in una data sequenza di n interi disposti in ordine decrescente, mantenendo l’ordinamento e producendo la nuova lunghezza della sequenza.
In teoria dovrebbe essere la soluzione al mio problema, ma non riesco a capire come funziona!
Se riuscite a farmi luce su questo punto, ho guardato anche il manuale ma non fanno nessun esempio del genere! A me interessa capire come cancellare l'elemento voluto e spostare gli altri al suo posto
Grazie mille in anticipo!
Ciaoo
Torno su questo argomento perchè non mi è chiara ancora una cosa! Se io ho un vettore e voglio eliminare un elemento da quel vettore, l'unico modo per farlo è utilizzare un'altro vettore dove copiare gli elementi diversi dal valore che voglio eliminare?
Mi spiego meglio:
Ho un vettore di grandezza 5 contenente i seguenti numeri: 0,1,2,3. Ho lasciato uno spazio vuoto in quanto il vettore deve avere il carattere di fine stringa \0.
All'interno di questo vettore voglio eliminare il numero 2. Allora dichiaro una variabile: eliminami=2 e poi con un ciclo for vado ad eliminare il numero e scalare tutti gli elementi del vettore.
Quello che non riesco a capire è come mai il ciclo non funziona:
#include <stdio.h>
#define DIM 5
int main ()
{
int vettore[DIM]={0,1,2,3};
int elimina=2, i,j;
for (i=0;i<DIM;i++)
{
if (vettore[i]==elimina)
{
for (j=i+1;j<DIM;j++)
{
vettore[i]=vettore[j];
}
}
}
for (i=0;i<DIM;i++)
{
printf("%4d", vettore[i]);
}
return 0;
}La domanda è: si può eliminare un valore da un array e far scalare tutti gli elementi di una posizione (compreso il carattere di fine stringa \0) utilizzando lo stesso vettore e non un secondo vettore per la copia?
Sul libro del professore ho trovato questo codice:
int f(int v[], int n, int num)
{
int i, j;
for (i = 0; i < n; i++)
{
if (v[i] <= num)
{
break;
}
}
if (v[i] == num)
{
for (j = i; j < n - 1; j++)
{
v[j] = v[j + 1];
return n - 1;
}
}
else return n;
}E' una funzione che cancella un dato intero x in una data sequenza di n interi disposti in ordine decrescente, mantenendo l’ordinamento e producendo la nuova lunghezza della sequenza.
In teoria dovrebbe essere la soluzione al mio problema, ma non riesco a capire come funziona!
Se riuscite a farmi luce su questo punto, ho guardato anche il manuale ma non fanno nessun esempio del genere! A me interessa capire come cancellare l'elemento voluto e spostare gli altri al suo posto
Grazie mille in anticipo!
Ciaoo
Non è affatto necessario. Comunque se hai un vettore di int non si usa il terminatore di stringhe.
In generale si può anche fare in-place:
dove ho supposto che si azzerassero gli elementi successivi.
In generale si può anche fare in-place:
int j = 0;
for(int i=0; i<size; ++i)
{
if(condizione sull'elemento di indice i)
{
v[j] = v[i];
++j;
}
}
for(;j <size; ++j)
{
v[j] = 0;
}dove ho supposto che si azzerassero gli elementi successivi.
Ciao vict85!
Grazie mille era proprio quello che cercavo, ho dovuto solo modificare metterndo:
In questo modo elimino il numero e scalo il vettore tutto di uno!
Ecco il codice del programma:
Così funziona tutto! Inoltre ho tolto il valore di fine stringa, in effetti non andava utilizzato!
Grazie
Ciaoo!
Grazie mille era proprio quello che cercavo, ho dovuto solo modificare metterndo:
v[j]!=v[i];
In questo modo elimino il numero e scalo il vettore tutto di uno!
Ecco il codice del programma:
#include <stdio.h>
#define size 6
int main ()
{
int j=0,i;
int v[]={0,1,2,3,4,5};
int elimina=2;
for(i=0; i<size; ++i)
{
if(v[i]!=elimina)
{
v[j] = v[i];
++j;
}
}
for(;j <size; ++j)
{
v[j] = 0;
}
for (i=0;i<size;i++)
printf("%d", v[i]);
return 0;
}
Così funziona tutto! Inoltre ho tolto il valore di fine stringa, in effetti non andava utilizzato!
Grazie
Ciaoo!