[C] Posizione della ripetizione in un array

di il
20 risposte

[C] Posizione della ripetizione in un array

Oggi pongo un altro quesito....
Ho creato un programma che stampa un array con elementi definiti dall'utente e cerca un elemento scelto dall'utente se è ripetuto nell'array.
Dovrei però far stampare anche la posizione della prima ripetizione nell'array qualora ci fosse... Come posso fare?
Es. V={1,2,5,8,1,9,0} Numero da cercare 1, L'elemento 1 è ripetuto nel vettore. Posizione della prima ripetizione: 4
#include <stdio.h>
#include <stdlib.h>
#define max 30


void leggi_v (int v1[], int dim) {
	int i;
	
	printf ("Inserire gli elementi del vettore\n\n");
	for (i=0; i<dim; i++) {
		printf ("Elemento %d: ", i+1);
		scanf ("%d", &v1[i]);
	}
	
}


void stampa_v (int v1[], int dim) {
	int i;

	printf ("Il mio vettore sara' composto dai seguenti numeri \n");
	for (i=0; i<dim; i++) {
		printf ("Elemento n.%d: %d\n", i+1, v1[i]);
	}
}


void cerca_rip (int v1[], int dim) {
	int trovato = false;
	int i = 0;
	int a;
	
	printf ("Inserire l'elemento che si desidera controllare: ");
	scanf ("%d", &a);
		
	while ((i<dim) && !trovato) {
		if (v1[i] == a)
			trovato = true;
		else
			i++;
	}
	
	if (trovato) {
		printf ("L'elemento %d e' ripetuto nel vettore\n\n", a);
		printf ("L'elemento si trova in posizione: %d", v1[i]); //QUI SORGE IL PROBLEMA
	}
	else {
		printf ("Non ci sono ripetizioni.");
	}
}

typedef int vet1[max];

int main() {
	vet1 v1;
	int dim;
	
	printf ("Inserisci il numero di elementi dei vettori: ");
	scanf ("%d", &dim);

	leggi_v (v1, dim);
	stampa_v (v1, dim);
	cerca_rip (v1, dim);
}

20 Risposte

  • Re: [C] Posizione della ripetizione in un array

    In realtà la funzione cerca_rip() non cerca le ripetizioni, ma cerca solo la prima occorrenza del valore ricercato.
    Quindi prima di tutto devi modificare il ciclo per non uscire al primo che trovi.
    Dopodichè puoi semplicemente aggiungere una variabile, al posto di "trovato", che ti conta le occorrenze, e una variabile che contiene l'indice della seconda occorrenza (ovvero la prima ripetizione).
    Se la conta è 0 allora non c'è il valore
    Se la conta è 1 allora non ci sono ripetizioni
    Se la conta è >= 2 allora ci sono ripetizioni e stampi il valore salvato
  • Re: [C] Posizione della ripetizione in un array

    Puoi fare un esempio per favore?
  • Re: [C] Posizione della ripetizione in un array

    Procediamo per step.
    Prima di tutto non devi fermarti sul primo elemento che trovi, ovvero togli la condizione !trovato nel ciclo, e conta le occorrenze: prova ad aggiungere una variabile "conta" che parte da 0 e incrementa di 1 ogni volta che (v1 == a), conteggio che stampi (a video) fra le informazioni finali.
  • Re: [C] Posizione della ripetizione in un array

    Suppongo debba essere così giusto?
    
    
    void cerca_rip (int v1[], int dim) {
    	int contatore = 0;
    	int i = 0;
    	int a;
    	
    	printf ("Inserire l'elemento che si desidera controllare: ");
    	scanf ("%d", &a);
    	
    	for (i=0; i<dim; i++) {	
    		if (v1[i] == a) {
    			contatore++;
    		}
    	}
    	
    	if (contatore = 0) {
    		printf ("L'elemento non e' presente nel vettore.\n");
    	}
    	else {
    		if (contatore = 1) {
    			printf ("Non ci sono ripetizioni.\n");
    		}
    		else {
    			if (contatore >=2) {
    			printf ("L'elemento %d e' ripetuto nel vettore\n\n", a);
    			}
    		}
    	}
    		
    	
    		
    }
    
    Poi? Come faccio a far stampare la posizione dell'elemento ripetuto?
  • Re: [C] Posizione della ripetizione in un array

    Suppongo debba essere così giusto?
    Per sapere se è corretto basta provarlo
    Così ad occhio la logica è corretta; attento che stai confondendo l'operatore di assegnazione (=) con quello di confronto (==) infatti
    if (contatore = 0)
    assegna 0 alla variabile contatore mentre tu vuoi fare
    if (contatore == 0)
    Comunque, dopo che hai provato il corretto comportamento nelle 3 situazioni (elemento non presente, nessuna ripetizioni, ripetizioni) puoi passare allo step successivo, ovvero aggiungere una variabile, chiamiamola per esempio "indice", che inizializzi a 0 o -1 (anche se in questo caso l'inizializzazione non è importante); all'interno del ciclo, se (v1 == a) allora incrementi il contatore (come fai già) e se il contatore è uguale a 2 (ovvero siamo sulla seconda occorrenza) carichi "indice" con l'indice corrente i. Infine si tratta solo di stampare a video "indice" nella terza situazione.
  • Re: [C] Posizione della ripetizione in un array

    Si perdonami ho cambiato subito quando ho visto che il programma non funzionava.

    candaluar ha scritto:


    All'interno del ciclo, se (v1 == a) allora incrementi il contatore (come fai già) e se il contatore è uguale a 2 (ovvero siamo sulla seconda occorrenza) carichi "indice" con l'indice corrente i. Infine si tratta solo di stampare a video "indice" nella terza situazione.


    Questa parte non l'ho ben capita, in quale ciclo? Nel for dove implemento il contatore? Inserisco un if ( contatore >=2 ) come faccio a " caricare "indice" con l'indice corrente i" ?
  • Re: [C] Posizione della ripetizione in un array

    Sì ... ma io ti rispondo sull'altro forum e tu qui fai crossposting nello stesso tempo con altro codice e suggerimenti ...

    Così non si capisce nulla e personalmente non rispondo più ...
  • Re: [C] Posizione della ripetizione in un array

    Allora te lo spiego con altre parole.
    Nella ricerca hai un solo ciclo e attualmente aggiorni solo un contatore (ovvero fai contatore++).
    La prima ripetizione la puoi riconoscere quando "contatore" assume un certo valore.
    Contatore sarà 1 alla prima occorrenza, 2 alla seconda (cioè alla prima ripetizione), 3 e a crescere per tutte le ripetizioni successive: quindi per individuare la prima ripetizione devi testare (contatore == 2).
    Prova ad inserire
    printf("Elemento trovato all'indice %d conteggio %d\n",i, contatore);
    if (contatore==2) 
    	printf("Prima ripetizione all'indice %d",i);
    
    dopo aver incrementato il contatore e fai un pò di prove.

    Suggerimento:
    se vuoi velocizzare le prove, modifica la funzione leggi_v() per caricare un array fisso, senza quindi doverlo caricare ogni volta da tastiera; magari nel main() imposti anche dim fisso, senza dover inserire anche quello da tastiera...
  • Re: [C] Posizione della ripetizione in un array

    oregon ha scritto:


    Sì ... ma io ti rispondo sull'altro forum e tu qui fai crossposting nello stesso tempo con altro codice e suggerimenti ...

    Così non si capisce nulla e personalmente non rispondo più ...
    Siccome ho l'esame a breve, scusami se cerco di trovare più spiegazioni ad un problema per vedere di capire quanto più possibile in breve tempo.
  • Re: [C] Posizione della ripetizione in un array

    candaluar ha scritto:


    Prova ad inserire
    printf("Elemento trovato all'indice %d conteggio %d\n",i, contatore);
    if (contatore==2) 
    	printf("Prima ripetizione all'indice %d",i);
    
    dopo aver incrementato il contatore e fai un pò di prove.
    Ho provato inserendo il questo codice nei vari cicli e fuori dai cicli, per vedere un po come funzionava.
    In pratica mi dice quando il contatore va a 2 e trova così la prima ripetizione.
    Il problema è che "Elemento trovato all'indice..." e "Prima ripetizione all'indice..." mi da sempre l'ultimo indice.
  • Re: [C] Posizione della ripetizione in un array

    Siccome ho l'esame a breve, scusami se cerco di trovare più spiegazioni ad un problema per vedere di capire quanto più possibile in breve tempo.
    Questo thread passa ma dal prossimo ti invito ad attenerti al regolamento di questo forum prima di postare.
  • Re: [C] Posizione della ripetizione in un array

    Alla fine leggendo un po di discussioni in giro e sbattendoci la testa penso di aver risolto il problema in questo modo:
    
    void cerca_rip (int v1[], int dim) {
    	int contatore = 0;
    	int i = 0;
    	int a;
    	int posizione;
    	
    	printf ("Inserire l'elemento che si desidera controllare: ");
    	scanf ("%d", &a);
    	
    	for (i=0; i<dim; i++) {	
    		if (v1[i] == a) {
    			contatore++;
    			a = v1[i];
    			posizione = i+1;
    		}
    	}
    	
    	if (contatore == 0) {
    		printf ("L'elemento non e' presente nel vettore.\n");
    	}
    	else {
    		if (contatore == 1) {
    			printf ("Non ci sono ripetizioni.\n");
    		}
    		else {
    			if (contatore >=2) {
    			printf ("L'elemento %d e' ripetuto nel vettore.\n\n", a);
    			}
    		}
    	}
    	
    
    	if (contatore == 2) {
    	printf("Prima ripetizione all'indice %d", posizione);
    	}
    		
    }
    
    E' corretto formalmente?
  • Re: [C] Posizione della ripetizione in un array

    Un consiglio: non devi sviluppare per tentativi, devi riflettere su quello che vuoi far fare alla macchina.

    Ti segnalo comunque due cose:
    a = v1[i];
    questa istruzione non serve a niente.
    posizione = i+1;
    Questo ti terrà traccia della posizione dell'ultima ripetizione e non della prima che incontri (che è quella che hai quando contatore==2).
    E perchè fai +1? Dall'esempio che hai citato nel tuo primo post si evince che l'indice parte da 0...
  • Re: [C] Posizione della ripetizione in un array

    Eh infatti riflettendoci sono arrivato a scrivere questo codice dove con a = v1 pensavo di assegnare ad a la posizione del vettore in cui è scritta e definendo "posizione = i+1" davo il valore della posizione da stampare con il printf alla fine del codice cioè quando il contatore è == 2.
    Infatti mi funziona ora il programma, ma solo in parte. Così facendo il programma, o meglio la scrittura della posizione dell'elemento ripetuto, funziona solo quando è ripetuto solo 2 volte.
    Non so se mi sono spiegato bene. Faccio un esempio per chiarire.
    Il programma ora funziona così

    vettore {1,2,5,2}
    2 è l'elemento ripetuto, la prima ripetizione si trova in posizione 4.

    vettore {1,2,2,2}
    2 è l'elemento ripetuto. [Il programma si ferma]

    P.S. hai ragione all'inizio ho fatto pensare che l'indice partisse da 0, ho sbagliato. Parte da 1.

    P.s.s. Ho risolto il problema del contatore inserendolo nell'"if" quando contatore >=2 non ==2. Rimane il fatto che con più ripetizioni mi stampa la posizione dell'ultima ripetizione... un attimo solo e cerco di arrivare alla soluzione.
Devi accedere o registrarti per scrivere nel forum
20 risposte