Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - rovesciare una stringa (Esercizio 1.19 di
Forum - C/C++ - rovesciare una stringa (Esercizio 1.19 di "Il Linguaggio C") - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Daf (Normal User)
Pro


Messaggi: 78
Iscritto: 27/06/2009

Segnala al moderatore
Postato alle 19:59
Martedì, 21/07/2009
Non sapendo bene il C ti do solo un consiglio:

void reverse(string s)
{
  string j = s;
  #copia di s per il reverse#
  int l = len(s);
  #funzione per tornare la lunghezza di una stringa (credo)#
  for(int i=1, i>l, i++)
  #ciclo for che parte da 1 perchè 0 è l'indirizzo di una stringa#
  {
    s[l-i-1] = j;
    #assegna al carattere (lunghezza - posizione - 1)#
    #il valore (posizione) della sua copia#
  }
}

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:03
Martedì, 21/07/2009
Testo quotato

Postato originariamente da Daf:

Non sapendo bene il C ti do solo un consiglio:



Scusa, ma se non conosci il C, a cosa serve dare consigli sbagliati ? :-?

La string e' solo per il C++ e non per il C ... e la len non esiste ne' in C ne' in C++ ...

PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 21:37
Martedì, 21/07/2009
Sì in effetti di quel codice non ci capivo un'h 8-| Aspetto un'altra risposta ;) Continuo a ringraziare tutto il forum per il supporto :hail:

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 22:09
Martedì, 21/07/2009
Testo quotato

Postato originariamente da Impronta Geek:
Aspetto un'altra risposta ;)



Mi descrivi le modifiche che hai apportato (e perche') rispetto al codice che ti avevo mostrato ? Cosi' se ne parla meglio ...

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 22:26
Martedì, 21/07/2009
Non e' proporio necessario per me mettere come parametro la lunghezza della stringa. La puoi calcolare già dentro la funzione reverse.

PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 22:34
Martedì, 21/07/2009
Ok... allora:

Codice sorgente - presumibilmente C++

  1. /* Include */
  2. #include <stdio.h>
  3. /* Fine Include */
  4.  
  5. /* Costanti */
  6. #define MAXLINE 1000
  7. /* Fine Costanti */
  8.  
  9. /* Dichiarazione Funzioni */
  10. void reverse(char s[], int i);
  11. /* Fine Dichiarazione Funzioni */
  12.  
  13. /* Main() */
  14. int main()
  15. {
  16.        /* Variabili e Vettori */
  17.        int i, c, e;
  18.        char line[MAXLINE];
  19.        i=0;
  20.        /* Fine Variabili e Vettori */
  21.        
  22.        /* Intestazione */
  23.        printf("\nEsercizio 1.19 da  'Il Linguaggio C' di Kernighan & Ritchie by Fabio Smeraldo\n");
  24.        printf("\nQuesto programma inverte una stinga in input tramite una funzione reverse(s)\n\n");
  25.        /* Fine Intestazione */
  26.  
  27.        /* Funzione getline */
  28.        while((c=getchar())!='\n'){
  29.                 line[i++]=c;
  30.        }
  31.        line[i]='\0';
  32.        reverse(line, i);
  33.        /* Fine Funzione getline */
  34.  
  35.        /* Stampaggio sullo schermo :D */
  36.        printf("\nEcco la stringa invertita:\n%s\n\n",line);
  37.        /* Fine Stampaggio sullo schermo :D */
  38.            
  39.        /* Main Conclusione */  
  40.        printf("Ciao e Grazie per aver usato il mio programma ;)");
  41.        scanf("%d",&e);
  42.        /* Fine Main Conclusione */
  43. }
  44.  
  45. void reverse(char s[], int i)
  46. {
  47.     /* Variabili */
  48.     int j, e;
  49.     char inv[MAXLINE];
  50.     j=0;
  51.     /* Fine Variabili */
  52.      
  53.     /* Copia Invertita in inv[] */
  54.     for(i=i; s[j]!='\0'; --i){
  55.              inv[i]=s[j];
  56.              j++;
  57.              }
  58.     inv[j]=s[0];
  59.     inv[i]='\n';
  60.     /* Fine Copia Invertita in inv[] */
  61.  
  62.     /* Copia inv[] in s[] */
  63.     for(e=0; inv[e]!='\0'; ++e){
  64.              s[e]=inv[e];
  65.              }
  66.     s[++e]='\0';
  67.     /* Fine Copia inv[] in s[] */
  68. }



Questo è tutto il codice. Intento ho messo il richiamo a getchar in main() invece che in reverse(), che è un passo avanti penso ;) Questa parte del codice non l'ho modificata tanto, eccola:
Codice sorgente - presumibilmente Plain Text

  1. /* Funzione getline */
  2.        while((c=getchar())!='\n'){
  3.                 line[i++]=c;
  4.        }
  5.        line[i]='\0';
  6.        reverse(line, i);
  7.        /* Fine Funzione getline */
  8.  
  9.        /* Stampaggio sullo schermo :D */
  10.        printf("\nEcco la stringa invertita:\n%s\n\n",line);
  11.        /* Fine Stampaggio sullo schermo :D */



Con un ciclo while memorizzo tutto nel vettore line. Poi metto il '\0' (che mi serve per lo stampaggio con %s) e richiamo reverse con line e i come argomenti. Fin qui niente di strano.

La funzione reverse, invece, l'ho cambiata totalmente. Qui il codice:
Codice sorgente - presumibilmente C#

  1. void reverse(char s[], int i)
  2. {
  3.     /* Variabili */
  4.     int j, e;
  5.     char inv[MAXLINE];
  6.     j=0;
  7.     /* Fine Variabili */
  8.      
  9.     /* Copia Invertita in inv[] */
  10.     for(i=i; s[j]!='\0'; --i){
  11.              inv[i]=s[j];
  12.              j++;
  13.              }
  14.     inv[j]=s[0];
  15.     inv[i]='\n';
  16.     /* Fine Copia Invertita in inv[] */
  17.  
  18.     /* Copia inv[] in s[] */
  19.     for(e=0; inv[e]!='\0'; ++e){
  20.              s[e]=inv[e];
  21.              }
  22.     s[++e]='\0';
  23.     /* Fine Copia inv[] in s[] */
  24. }



Allora dichiaro tutte le variabili per benino e do valore 0 a j. Dopo faccio una copia già invertita della stringa in input contenuta in s[] in un nuovo vettore, inv[].
Per fare ciò uso un ciclo for (che usa la variabile i richiamata come argomento, che ha come valore la lunghezza della parola o della frase), che continua a decrementare i fino a che s[j] (la variabile j sale ad ogni esecuzione del ciclo) non da valore '\0' (che ho inserito alla fine del vettore line[] [in realtà uguale a s[]] in main).

Ad ogni esecuzione del ciclo, in più copio: la prima lettera contenuta s[] come ultima di inv[], poi la seconda come penultima e così via...

Fatto ciò assegno a inv[j] (che si era incrementato un ultima volta provocando lo spiacevole evento di dimenticarsi di inserire l'ultimo carattere , ma non sapevo come altro fare :( ) il valore della prima lettera contenuta in s[0].

Quindi metto a inv[(i)] (i a questo punto è 0 ) un bel newline (queste due operazioni perchè il mio for ha qualcosa che non va).

Non rimane che copiare interamente inv[] in s[] (così diventano identiche con la stringa capovolta) e mettere come ultimo carattere a s[] '\0'. Il line[] che avevo inserito prima è diventato uguale a s[] e viene sstampeggiato sullo schermo :D

Probabilmente l'unico casino che ho fatto è stato col for della /* Copia invertita in inv[] */... vediamo se mi sai aiutare :rotfl:

@Lawliet
Era solo per evitare una marea di codice inutile e sperimentare più argomenti :k:

Vi ringrazio tutti per la partecipazione e l'interessamento.

Ultima modifica effettuata da Impronta Geek il 21/07/2009 alle 22:36
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 22:48
Martedì, 21/07/2009
Codice sorgente - presumibilmente Plain Text

  1. for(i=i; s[j]!='\0'; --i)


Che metti a fare i=i? i ha già assunto quel valore visto che l'hai passato come paramentro, quindi non c'è bisogno di metterlo.

Codice sorgente - presumibilmente Plain Text

  1. inv[i]='\n';


prima hai messo terminatore e poi newline o.O', se non lo sai, la stringa viene letta fino al terminatore stringa quindi newline non verrà mai letta! E poi.. a cosa ti serve newline??

Testo quotato

Postato originariamente da Impronta Geek:
@Lawliet
Era solo per evitare una marea di codice inutile e sperimentare più argomenti


Sperimentare si, ma non con argomenti inutili che non c'entrano nulla IMHO.

Se la funzione reverse deve solo capovolgere, allora perchè non fare una operazione ancora più semplice utilizzando solo la stringa cioè: Scambi la prima lettera con la ultima lettera della stringa, la seconda con la perultima e così via...

Ultima modifica effettuata da Lawliet il 21/07/2009 alle 22:50
PM Quote
Avatar
Impronta Geek (Normal User)
Rookie


Messaggi: 36
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 0:32
Mercoledì, 22/07/2009
Seguirò anche i tuoi consigli e cercherò di semplificare e non usare argomenti inutili. A oggi (la notte porta consiglio) il miglioramento.

Ultima modifica effettuata da Impronta Geek il 22/07/2009 alle 4:46
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo