Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente bannato
    Registrato dal
    Oct 2013
    Messaggi
    23

    Aiuto programma c funzioni

    Salve, il mio problema è questo:

    Si scriva una funzione in C, denominata cerca, che ricerchi la presenza di un elemento in un vettore di interi. La funzione riceve in ingresso tre parametri: 1. un vettore di interi vettore[] nel quale ricercare il valore; 2. un valore intero dimensione che indica quanti elementi contiene il vettore; 3. il valore intero elem che deve essere ricercato. La funzione deve restituire un valore intero, ed in particolare: 1. se il valore elem è presente nel vettore, allora la funzione restituisce l’indice della posizione alla quale si trova tale valore; 2. se il valore elem è presente più volte, si restituisca l’indice di tutte le occorrenze; 3. se il valore elem non è presente nel vettore, si restituisca -1. Si modifichi poi la funzione cerca definendo la funzione cerca_vettore_ordinato che faccia le stesse cose descritte in precedenza ma sul vettore ordinato.

    Sono riuscito ad implementare il mio programma in questo modo; il problema è che non mi restituisce tutte le occorrenze di un valore, ma solo la prima occorrenza; mi potete aiutare?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int cerca(int *vettore,int dimensione,int valore)
    {
          int i,indice,trovato_elem;//variabili ciclo
          for(i=0;i<dimensione;i++)//scorre il vettore
          {
             if(vettore[i]==valore)//se il valore viene trovato all'interno del vettore
             {
                return i;//restituisce l'indice in cui si trova l'elemento
             }
          }
          return -1;//se l'elemento non è presente restituisce -1
    }
    int cerca_ordinato(int *vettore,int dimensione,int valore)
    {
        int i;//variabile ciclo
        int tmp;//variabile temporanea per ordinamento
        int d=dimensione;//dimensione vettore
        int primo;//questa variabile contiene il primo nuemro dell'intervallo preso in considerazione
     int ultimo;//ultimo elemento dell'array
        primo=0;
        ultimo=dimensione-1;
     int meta;//metà intervallo
     /*CICLO PER ORDINARE IL VETTORE*/
        while(d>0)
        {
           for(i=0; i<d;i++)
           {
               if(vettore[i]>vettore[i+1])
               {
                   tmp=vettore[i];
                   vettore[i]=vettore[i+1];
                   vettore[i+1]=tmp;
               }
           }
           d--;
           }
           /*FINE ORDINAMENTO*/
        if (ultimo<0)
            return -1;
     while(primo<=ultimo)
     {
            meta=(primo+ultimo)/2;//divide il vettore il due parti
            if(vettore[meta]==valore) 
          {
           return meta;
          }
      if(vettore[meta]<valore)//se l'emento non è presente allora si restringe l'intervallo
                primo=meta+1;
          else
               ultimo=meta-1;
      }
        return -1;//se l'elemento non è presente nel vettore allora ritorna il valore -1
    }
    int main(int argc, char *argv[])
    {
      int i,valore,dimensione,*p;
      printf("Quanti numeri vuoi inserire?:" );
      scanf("%d",&dimensione);
      p=(int*)malloc(dimensione*sizeof(int));//allochiamo la memoria
      for(i=0;i<dimensione;i++)
      {
        printf("Inserire elemento del vettore: ");//chiede l'inserimento degli elementi
        scanf("%d", &p[i]);//legge i valori da tastiera
      }
      printf("Numero da cercare:");//chiede il numero da cercare nel vettore
      scanf("%d",&valore);//legge il numero da cercare
      printf("La posizione del valore inserito nel vettore e': %d\n", cerca(p++,dimensione,valore));
      printf("La posizione del valore inserito nel vettore ordinato e': %d\n", cerca_ordinato(p,dimensione,valore));
      system("pause"); 
      free(p);
      return 0;
    }
    Ultima modifica di LeleFT; 19-11-2013 a 16:49 Motivo: Aggiunta tag CODE

  2. #2
    Ciao,
    intanto conviene che per il codice utilizzi i tag appositi perchè così è illegibile.

    Poi non capisco una cosa, se la funzione ti torna l'indice dell'occorrenza se vi è una sola occorrenza, oppure il numero delle occorrenze trovate in caso di occorrenza multipla, come fai a capire se quello che ti torna è l'indice della posizone o il numero delle occorrenze?

  3. #3
    Utente bannato
    Registrato dal
    Oct 2013
    Messaggi
    23
    Mi puoi aiutare allora ? Perché ancora nn sono molto esperto..

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Con un valore di ritorno di tipo int è impossibile, deve essere almeno un int *, ma anche questo è un po' troppo generico...
    La soluzione più adatta è una struttura che abbia 2 elementi:
    1. un int che contenga il numero di risultati
    2. un array di int di dimensione fissa se sai qual'è il numero massimo degli elementi, allocato dinamicamente se non lo conosci. Considera comunque che nel primo caso hai quasi sempre un eccesso di memoria non utilizzato, mentre nel secondo caso devi sempre ricordarti di liberare la memoria.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente bannato
    Registrato dal
    Oct 2013
    Messaggi
    23
    Quindi quale riga è sbagliata e devo correggere ,mi potete specificare meglio? Cmq si devo sempre liberare la malloc con free(puntatore).

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non è "una riga" sbagliata da correggere ma devi leggere quello che ti ha suggerito Scara95 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Forse non hai capito, è impossibile fare quello che chiede il testo dell'esercizio
    Sarebbe possibile in linguaggi tipo python, ruby, lua, perl...
    Ma in C semplicemente è impossibile
    L'unico modo è cambiare approccio e ritornare una struttura dati tipo quella che ti ho esposto sopra...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2024 vBulletin Solutions, Inc. All rights reserved.