Visualizzazione dei risultati da 1 a 5 su 5

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87

    [C] Programma per "ribaltare" parole

    Ciao a tutti,devo scrivere un programma che una volta acquisita una stringa intervallata da dei punti(in sostituzione degli spazi per separare le parole),mi stampi la stringa mantenendo inalterate le posizioni delle parole ma invertendo la posizione delle lettere di ogni parola.Per esempio:

    quanto.mi.piace -> otnauq.im.ecaip

    Ho provato ad abbozzare qualcosa,credevo di esserci ma c'è un while che un pò mi frega perchè mi costringe a modificare il valore del contatore dopo,altrimenti resta fermo nella posizione dove ha trovato punto e non fa più nulla. Il problema è che escono fuori lettere che non c'entrano o dei simboli,quindi che inavvertitamente l'ho mandato a pescare caratteri un pò a caso.

    L'idea alla base del mio programma era di contare il numero di punti in modo da avere automaticamente anche il numero di parole aggiungendo 1 al numero di punti. Sapendo il numero di parole so anche quante iterazioni del for principale devo fare.

    In pratica dovrebbe leggere la parola fino al '.'.
    C viene incrementato di volta in volta,senza mai venir reinizializzato,cosa che invece succede per NumL,ciò mi è utile per calcolare non solo il numero di lettere in ogni parola ma anche per porre dei limiti al do-while.

    Ah una cosa, ma se io ho una stringa di 15 elementi,quando mi viene chiesto quanto deve essere grande il vettore cosa dico? 15 o 16? perchè mi sembrava di ricordare che uno spazietto andasse lasciato per \n,da qui l'idea della seconda condizione.....Grazie.


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        int p,n,i,j,z,NumL,c,count;
        char v[20];
        char aux[20];
        
        printf("\n inserire numero di elementi,punti inclusi \n");
        do
        {
                   printf("\n\n max 20 elementi\n\n ");
                   scanf("%d",&n);
        }
        while(n<=0 || n>20);
        
        printf("\n\n inserire sequenza parole/punti\n\n");
        scanf("%s",&v);
        
        printf(" %s ",v);
        for(i=0;i<n;i++)
        {
                        aux[i]=v[i];
        }
        
        p=0;
        for(i=0;i<n;i++)
        {                    
                             if(v[i]=='.')
                             {
                                          p++;
                             }                
        }
        
        c=0;
        
        for(i=0;i<p+1;i++)
        {
                          NumL=0;
                          while(v[c]!='.' && c<n)
                          {
                                          NumL++;
                                          c++;
                                          printf(" %d-%d ",NumL,c);
                          
                          }
                          
                          count=c;
                          c=c+1;
                          j=count-NumL;
                          z=c;
                          do           
                          {
                                          aux[j]=v[z];
                                          j++;
                                          z--;
                          }
                          while(j<count && z>NumL);
        }
        
        printf(" \n\n il vettore è stato riordinato nel modo seguente \n\n ");
        printf("%s",aux);
        
        
        
        
        
        system("pause");
        return 0;
    }
    ho modificato un pò il codice man mano
    Ultima modifica di Satiro88; 04-11-2013 a 19:40

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        int p,n,i,j,z,NumL,c,count;
        char v[20];
        char aux[20];
        
        printf("\n inserire numero di elementi,punti inclusi \n");
        do
        {
                   printf("\n\n max 20 elementi\n\n ");
                   scanf("%d",&n);
        }
        while(n<=0 || n>20);
        
        printf("\n\n inserire sequenza parole/punti\n\n");
        scanf("%s",&v);
        
        printf(" %s ",v);
        for(i=0;i<n;i++)
        {
                        aux[i]=v[i];
        }
        
        p=0;
        for(i=0;i<n;i++)
        {                    
                             if(v[i]=='.')
                             {
                                          p++;
                             }               
        }
        
        c=0;
        
        for(i=0;i<p+1;i++)
        {
                          NumL=0;
                          while(v[c]!='.' && c<n)
                          {
                                          NumL++;
                                          c++;
                                          printf(" %d-%d ",NumL,c);
                          
                          }
                          
                          count=c;
                          c=c+1;
                          
                          z=count-1;
                          for(j=count-NumL ; j<count && z>=count-NumL ; j++)
                          {
                                           aux[j]=v[z];
                                           z--;
                          }
        }
        
        printf(" \n\n il vettore è stato riordinato nel modo seguente \n\n ");
        printf("%s",aux);
        
        
        
        
        
        system("pause");
        return 0;
    }
    Versione aggiornata,ora qualcosa esce,ma mi fa delle iterazioni in più............. credo siano dovute al valore di c perchè al secondo giro se per esempio considerassi quanto.mi analizzerebbe la parola "mi".
    le cui lettere occupano le posizioni 7 e 8 e va bene. Il problema è che poi mi fa comunque un incremento portando c a 9 e solo dopo si rende conto che la posizione 9 non va bene
    Ultima modifica di Satiro88; 04-11-2013 a 20:32

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    Sono riuscito a risolvere,scusate se vi ho aperto un topic per nulla, ho risolto inserendo una variabile che mi piace chiamare "di compensazione" visto che a ogni iterazione bisognava incrementare di 1 il valore del sottraendo per restare in linea con gli indici :

    codice:
    #include <stdio.h>#include <stdlib.h>
    
    
    int main()
    {
        int p,n,i,j,z,NumL,c,count,compnsx;
        char v[20];
        char aux[20];
        
        printf("\n inserire numero di elementi,punti inclusi \n");
        do
        {
                   printf("\n\n max 20 elementi\n\n ");
                   scanf("%d",&n);
        }
        while(n<=0 || n>20);
        
        printf("\n\n inserire sequenza parole/punti\n\n");
        scanf("%s",&v);
        
        printf(" %s ",v);
        for(i=0;i<n;i++)
        {
                        aux[i]=v[i];
        }
        
        p=0;
        for(i=0;i<n;i++)
        {                    
                             if(v[i]=='.')
                             {
                                          p++;
                             } 
        }
        
        c=0;
        compnsx=0;
        for(i=0;i<p+1;i++)
        {
                          NumL=0;
                          while(v[c]!='.' && c<n)
                          {
                                          NumL++;
                                          c++;
                                          printf(" %d-%d ",NumL,c);
                          
                          }
                          
                          count=c-compnsx;
                          NumL=NumL-compnsx;
                          c=c+1;
                          
                          z=count-1;
                          for(j=count-NumL ; j<count && z>=count-NumL ; j++)
                          {
                                           aux[j]=v[z];
                                           z--;
                          }
                          compnsx++;
        }
        
        printf(" \n\n il vettore è stato riordinato nel modo seguente \n\n ");
        printf("%s",aux);
        
        
        
        
        
        system("pause");
        return 0;
    }

  4. #4
    Anche se hai risolto, ti consiglio un approccio più semplice e pulito:
    • scrivi una funzione che riceve due puntatori a char e inverte i caratteri posti tra i due (normalmente si usa un intervallo semiaperto del tipo [begin, end), ovvero il primo puntatore punta al primo carattere da considerare, il secondo ad un carattere dopo l'ultimo);
    • il tuo main a questo punto deve soltanto andare alla ricerca di punti nella stringa, e ogni volta che trova un nuovo punto può richiamare la funzione sul range determinato dal punto precedente e dal punto corrente.

    codice:
    #include <stdio.h>
    #include <string.h>
    
    /* Inverte il testo contenuto nell'intervallo semiaperto [begin, end) */
    void reverse(char *begin, char *end)
    {
        /* Si sposta sul "vero" ultimo carattere */
        end--;
        /* Ripete e avvicina verso il centro della parola i due puntatori
         * finché non si "toccano" al centro della parola */
        for(;end-begin>=1; begin++, end--)
        {
            /* Scambia i due caratteri */
            char temp=*begin;
            *begin=*end;
            *end=temp;
        }
    }
    
    int main()
    {
        char buffer[256];
        /* Acquisisce la stringa da tastiera */
        if(fgets(buffer,sizeof(buffer), stdin)==NULL)
            return 1;
        /* Elimina l'eventuale newline finale */
        size_t l=strlen(buffer);
        if(buffer[l-1]=='\n')
            buffer[l-1]=0;
        /* Inizio della parola corrente */
        char *wordStart=buffer;
        /* Puntatore di lettura */
        char *readPtr=buffer;
        do
        {
            /* Se abbiamo trovato un nuovo punto o siamo alla fine della parola */
            if(*readPtr=='.' || *readPtr==0)
            {
                /* Inverti la parola */
                reverse(wordStart, readPtr);
                /* La prossima parola inizia al carattere successivo */
                wordStart=readPtr+1;
            }
            /* Continua a ciclare finché non è finita la parola */
        } while(*readPtr++);
        /* Scrive l'output */
        puts(buffer);
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    Grazie mille!! anche se purtroppo le funzioni non le abbiamo ancora fatte :| quello che sto per dire potrebbe scioccare i presenti ma il programma non funziona più,ieri andava ho provato diverse volte, oggi lo apro tanto per e non va,come è possibile che con le stesse stringhe cambi così dal giorno alla notte?
    Ultima modifica di Satiro88; 05-11-2013 a 12:02

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.