Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50

    [c] frequenza char array_1D

    salve,
    vorrei sviluppare una function , dati come parametri di input un array di char e il suo
    size, determina e restituisce come parametro di output il carattere piu frequente.

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    void frequenza(char [],int);
    int main()
    {char a[100];
    int i,n;
    printf("inserisci il size dell array:");
    scanf("%d",&n);
    printf("inserisci gli elementi dell array:");
    for(i=0;i<=n;i++)
    gets(&a[i]);
    frequenza(a,n);
    system("PAUSE");
    }
    void frequenza(char a[],int n)
    {int i;
    int frequenza=0;
    for(i=0;i<n;i++)
    if(a[i-1]==a[i])
    frequenza=frequenza+1;
    printf("frequenza:%d\t",frequenza);
    
    }
    non riesco a stampare il carattere + frequente, ma solo la frequenza di costui... cosa dovrei aggiungere..oltre alla printf??
    codice:
    code

  2. #2
    Bè ci sono un paio di problemucci nella funzione...

    Innanzitutto:

    [CODE]
    for(i=0;i<n;i++)
    if(a[i-1]==a[i])
    [CODE]

    Al primo ciclo, i = 0, e viene fatto un controllo su a[-1], cosa che può rivelarsi anche grave!
    Poi non ci sono le graffe per il blocco del for, in pratica non viene eseguita nessun'istruzione...
    E poi il calcolo della frequenza in ogni modo è sbagliato, perchè due caratteri uguali possono non essere vicini!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Laikius91
    Poi non ci sono le graffe per il blocco del for, in pratica non viene eseguita nessun'istruzione...
    ???

    Le parentesi grafe non sono obbligatore: se non vengono messe le parentesi grafe verrà presa solo la successiva linea di codice.

    codice:
    for(i = 0; i < n; i++)
       if(a[i - 1] == a[i])
          frequenza = frequenza + 1;
          printf("frequenza: %d\t", frequenza);
    Questo for è senza parentesi pertanto solo l'if farà parte del suo corpo. L'if è anch'esso senza parentesi e solo il primo assegnamento farà parte del suo corpo. La chiamata a printf invece è fuori sia dall'if che dal ciclo. In pratica è come se avesse scritto

    codice:
    for(i = 0; i < n; i++) {
       if(a[i - 1] == a[i]) {
          frequenza = frequenza + 1;
       }
    }
    printf("frequenza: %d\t", frequenza);
    che è chiaramente errato. Più probabilmente intendeva fare una cosa del genere


    codice:
    for(i = 0; i < n; i++) {
       if(a[i - 1] == a[i]) {
          frequenza = frequenza + 1;
          printf("frequenza: %d\t", frequenza);
       }
    }
    Il codice è comunque sbagliato (a partire da i - 1 per arrivare al calcolo della frequenza).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [c] frequenza char array_1D

    Originariamente inviato da asteroid
    codice:
    printf("inserisci gli elementi dell array:");
    for(i=0;i<=n;i++)
    Il ciclo corretto è
    codice:
    for (i = 0; i < n; i++) {
      ...
    }
    poiché gli indici degli array vanno da 0 a dimensione - 1. Usando <= cercheresti di accedere alla prima cella oltre la fine dell'array (con probabile segmentation fault).

    Originariamente inviato da asteroid
    codice:
    gets(&a[i]);
    gets si usa per acquisire stringhe di caratteri, tu stai caricando un carattere alla volta! scanf() o getchar() sono più che sufficienti.
    Inoltre l'utilizzo di gets() è sconsigliato in quanto non è una funzione sicura.

    Originariamente inviato da asteroid
    non riesco a stampare il carattere + frequente, ma solo la frequenza di costui... cosa dovrei aggiungere..oltre alla printf??
    Dovresti salvare da qualche parte questo carattere, man mano che avanzi con l'algoritmo.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Originariamente inviato da Alex'87
    ???

    Le parentesi grafe non sono obbligatore: se non vengono messe le parentesi grafe verrà presa solo la successiva linea di codice.

    codice:
    for(i = 0; i < n; i++)
       if(a[i - 1] == a[i])
          frequenza = frequenza + 1;
          printf("frequenza: %d\t", frequenza);
    Questo for è senza parentesi pertanto solo l'if farà parte del suo corpo. L'if è anch'esso senza parentesi e solo il primo assegnamento farà parte del suo corpo. La chiamata a printf invece è fuori sia dall'if che dal ciclo. In pratica è come se avesse scritto

    codice:
    for(i = 0; i < n; i++) {
       if(a[i - 1] == a[i]) {
          frequenza = frequenza + 1;
       }
    }
    printf("frequenza: %d\t", frequenza);
    che è chiaramente errato. Più probabilmente intendeva fare una cosa del genere


    codice:
    for(i = 0; i < n; i++) {
       if(a[i - 1] == a[i]) {
          frequenza = frequenza + 1;
          printf("frequenza: %d\t", frequenza);
       }
    }
    Il codice è comunque sbagliato (a partire da i - 1 per arrivare al calcolo della frequenza).
    Hai ragione per quanto riguarda le parentesi, avevo come sempre letto troppo di fretta e con troppa stanchezza addosso! Chiedo scusa per l'imprecisione!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    codice:
    if (a[i-1]==a[i])
    se è sbagliato così, come potrei fare a trovare più volte lo stesso carattere...
    codice:
    code

  7. #7
    Originariamente inviato da asteroid
    codice:
    if (a[i-1]==a[i])
    se è sbagliato così, come potrei fare a trovare più volte lo stesso carattere...
    Ecco in pseudo-codifica una soluzione baseline per ricercare il carattere più frequente:
    codice:
    V = ['a', 'b', 'b']; //esempio
    max_freq = 0;
    max_char = v[0];
        	
    i = 0;
    for each ( i < V.length - 1 )
     begin	
             freq = 1;
             j = i + 1;
        	 for each ( j < V.length )
              begin
                if( V[i] == v[j] )
        		freq = freq + 1;;
                j = j + 1;
        	  end
    
      if ( freq > max_freq )
      than
        max_freq = freq;
        max_char = V[i];
      i = i + 1;
     end

  8. #8
    Io in questi casi mi faccio una funzione di appoggio...
    Ad esempio:

    codice:
    int howManyChars (char* s, char t);
    che restituisca il numero di occorrenze del carattere t nella stringa s, facendo in pseudocodice:

    codice:
    int count = 0;
    
    while (*s != '\0')
    {
            se *s == t, allora incremento count;
     
            s = s + 1;
    }
    
    return count;
    A questo punto nella funzione frequenza fai tipo:

    codice:
    void frequenza (char a [], int n) /* n non serve a mio parere */
    {
           int max = 0;
           char* s = a;
           char piuFrequente;
    
           while (*s != '\0')
           {
                      se "howManyChars" (a, *s)  > max, allora questo è il nuovo max 
                      e piuFrequente = *s;
    
                     s = s + 1;
           }
    
           qui fai la stampa che desideri visto che ti sei salvato il carattere più frequente e la sua frequenza!
    
    }
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  9. #9
    Originariamente inviato da Laikius91
    Io in questi casi mi faccio una funzione di appoggio...
    E' inutile, così duplichi solo il codice.

  10. #10
    Originariamente inviato da VincenzoTheBest
    E' inutile, così duplichi solo il codice.
    Bè, alla fine fa gli stessi cicli che fa il tuo, solo che li fa in due funzioni separate in modo da allegerire il tutto, non credo si duplichi niente...
    Inoltre il codice che hai postato è pseudo-java mi sa..
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

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