Risultati da 1 a 8 di 8
Albero dei 3Post Piaciuti
  • 1 Scritto da Tool
  • 1 Scritto da St3ve
  • 1 Scritto da Tool

Correzione di questo codice

  1. #1

    Registrato da
    Jun 2012
    Messaggi
    671
    Reputazione (?)
    10
    Piaciuto (?)
    103
    Potreste indicarmi cosa c'è di sbagliato in questo codice? Dovrebbe calcolare il numero di spazi da inserire al posto del tab tramite la funzione e poi stamparli; se immetto una stringa in cui non compaia tab stampa normalmente, se invece c'è tab continua a farmi immettere testo (in rpatica non esce mai dal ciclo credo)
    Codice:
    #include <stdio.h>
    #define MAXC 1000
    int detab (char*, int);
    int main()
    {
      char s[MAXC];
      int i;
      int c;
      int m;
      for (i=0; i<MAXC-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i]=c;
      if (c=='\n')
        s[i]='\0';
      for (i=0; s[i]!='\0'; ++i)
      {
        if (s[i]=='\t')
        {
          while ((m=detab(s,i))!=0)
          {
        putchar(' ');
        --m;
          }
        }
        else
          printf("%c", s[i]);
      }
      putchar('\n');
      return 0;
    }
    int detab (char* s, int i)
    {
      int n;
      int b;
      while (i!=0 || s[i]!=' ')
      {
        ++n;
        --i;
      }
      if (n>=8)
        b=8-(n%8);
      else
        b=8-n;
      return b;
    }

  2.  

  3. #2

    Registrato da
    Jan 2012
    Messaggi
    731
    Reputazione (?)
    12
    Piaciuto (?)
    141
    Ecco il codice corretto, ti ho messo i commenti dove avevi sbagliato, l'errore principale è che hai messo una chiamata di funzione dentro la condizione del ciclo, cosa c'è di sbagliato? che ogni volta che il tuo while verifica la condizione chiama anche la funzione e tu non ne esci più

    il codice è disordinatissimo tanto che mi sono permesso di fare alcune modifiche(cose appiccicate tremila ridichiarazioni di stessi tipi...cerca di essere ordinato, se lo sei riuscirai a leggere meglio il tuo codice e quindi a correggerlo più velocemente)....
    non fare caso ai postincrementi, ho cambiato i tuoi preincrementi perchè mi stanno un po antipaici per leggere il codice
    ah!!! ho cambiato anche il ciclo while della funzione con un ciclo for...non ho verificato se il tuo è corretto, ma se fai come l'ho messo io non devi passare neanche la stringa....altre piccole accortezze te l'ho scritte nel codice.
    per il resto, ecco quà:

    Codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXC 1000
    
    int detab (int);
    
    int main()
    {
      char s[MAXC];
      int i, c, m;
        
      printf("Inserire stringa con tab:\n");
      
      for(i=0; i<MAXC-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i]=c;
      
      if(c=='\n') //questa non serve 
        s[i]='\0';
      
      for(i=0; s[i]!='\0'; ++i)
      {
         if(s[i]=='\t')
         {
            m=detab(i);
            while(m!=0)//se metti detab() nel while la richiama all'inifinito
            {
              putchar(' ');
              m--;
            }
         }
         
         printf("%c", s[i]);
      }
      printf("\n");
      
      system("PAUSE");
      return 0;
    }
    
    int detab (int i)
    {
      int n=0;//questa la devi inizializzare a 0 se stai per sommarla
      int b;
      
      for(; i>=0;i--)
            n++;
      
      if(n>=8)
        b=8-(n%8);
      else
        b=8-n;
      
      return b;
    }
    ok ho ricontrollato, il tuo ciclo while in funzione detab(), è sbagliato...perchè mettere questa condizione s[i] != ' ' ?? Tu stai cercando di contare quanto è lungo il tab non hai nessun ' ' in stringa fra una parola e l'altra

    dato che mi andava di sprecare un po del mio tempo ( invece di continuare a studiare gli alberi ) mi sono permesso di modificare ulteriormente il codice in modo da renderlo più conciso, vedi se anche a te convince di più, in ogni caso sia chiaro anche il tuo che ho rimesso apposto è corretto:
    Codice:
    #include <stdio.h>
    #define MAXC 500
    
    int detab (int);
    
    int main()
    {
      char s[MAXC];
      int i, m;
        
      printf("Inserire stringa con tab:\n");
      fgets(s, 500, stdin);
      
      
      for(i=0; s[i]!='\0'; i++)
      {
         if(s[i]=='\t')
         {
            m=detab(i);
            while(m!=0)
            {
              putchar(' ');
              m--;
            }
         }
         
         printf("%c", s[i]);
      }
      
      printf("\nFine del programma....");
      getch();
      return 0;
    }
    
    int detab (int i)
    {
      int n=0;//questa la devi inizializzare a 0 se stai per sommarla
      int b;
      
      for(; i>=0;i--)
         n++;
      
      if(n>=8)
        b=8-(n%8);
      else
        b=8-n;
      
      return b;
    }
    Ultima modifica di Tool; 14/09/12 alle 23:27

  4. #3

    Registrato da
    Jun 2012
    Messaggi
    671
    Reputazione (?)
    10
    Piaciuto (?)
    103
    Ma la lughezza dal tab dipende dalla parola precedente, quindi vorrei verificare quanto è lunga la parola prima del tab, per questo verifico se c'è uno spazio

  5. #4

    Registrato da
    Jan 2012
    Messaggi
    731
    Reputazione (?)
    12
    Piaciuto (?)
    141
    Citazione Originariamente Scritto da Bazinga Visualizza Messaggio
    Ma la lughezza dal tab dipende dalla parola precedente, quindi vorrei verificare quanto è lunga la parola prima del tab, per questo verifico se c'è uno spazio
    con questa istruzione
    for(i=0; s[i]!='\0'; i++)
    { if(s[i]=='\t')
    {........
    stai anche verificando se ci sono spazi bianchi prima del tab
    Più in particolare:
    sappiamo che '\t' è il carattere per la tabulazione, quindi ogni volta che schiaccio tab sulla tastiera e poi lo vado a leggere in una stringa, vedrò che ad ogni tab immesso corrisponde '\t'...con il programma che hai creato quindi se immetti:
    ciao"spazio""spazio""spazio""spazio""tab"trallallero
    otterrai nella stringa:
    ciao____\ttrallallero

    ergo quando il tuo programma una volta letta tutta la tua stringa entra nel primo ciclo for inizia a contare le i che sono il numero di lettere nella parola ciao (4) più i 4 spazi, quindi se la matematica non è un'opinione ciao(4)+4spazi=8=i ; adesso incontri il '\t' quindi chiami la funzione e passi i=8, da qui poi il programma prosegue, una volta letto tab continua e ricnontrolla se c'è tab etc....

    comunque il programma funziona l'ho testato, ho immesso tab spazi bianchi parole e lettere e mi ritorna esattamente il risultato dell'input.
    Se poi non è quello che volevi allora spiegati meglio.

    Citazione Originariamente Scritto da Bazinga Visualizza Messaggio
    Ma la lughezza dal tab dipende dalla parola precedente
    Non credo sia esatto quello che dici
    Ultima modifica di Tool; 15/09/12 alle 13:30
    A Ununoctio piace questo elemento.

  6. #5

    Registrato da
    Jun 2012
    Messaggi
    671
    Reputazione (?)
    10
    Piaciuto (?)
    103
    Citazione Originariamente Scritto da Tool Visualizza Messaggio
    Non credo sia esatto quello che dici
    Sì, prova tu stesso, se una parola ha 1 lettera ci sono 7 spazi, 2 lettere 6 spazi, 3 lettere 5 spazi, ecc... poi si ricomincia, 8 lettere 8 spazi, 9 lettere 7 spazi, ecc..
    Comunque ho provato con il tuo codice e non restituisce esattamente lo stesso input

    Il secondo permesso negato
    Ultima modifica di Ununoctio; 15/09/12 alle 17:05

  7. #6

    Registrato da
    Oct 2011
    Messaggi
    380
    Reputazione (?)
    14
    Piaciuto (?)
    130
    Quel codice si sballa se ci sono due o più tab di fila, non tiene conto dell'incremento delle lettere che aggiunge il tab. Inoltre il detab è inutilmente complicato.

    Codice:
    #include <stdio.h>
    #define MAXC 1000
    
    int detab (int);
    
    int main()
    {
        char s[MAXC];
        int i, c, m, count=0;
        
        for(i=0; i<MAXC-1 && (c=getchar())!=EOF && c!='\n'; ++i)
            s[i]=c;
    
        s[i]='\0';
      
        for(i=0; s[i]!='\0'; ++i)
        {
            if(s[i]=='\t')
            {
                m=detab(count);
                count+=m;
                for(; m>0; --m)
                    putchar(' ');
            }
            else
            {
                ++count;
                printf("%c", s[i]);
            }
        }
        printf("\n");
      
        return 0;
    }
    
    int detab (int i)
    {
        return 8-(i%8);
    }
    A Ununoctio piace questo elemento.

  8. #7

    Registrato da
    Jan 2012
    Messaggi
    731
    Reputazione (?)
    12
    Piaciuto (?)
    141
    Citazione Originariamente Scritto da Bazinga Visualizza Messaggio
    Sì, prova tu stesso, se una parola ha 1 lettera ci sono 7 spazi, 2 lettere 6 spazi, 3 lettere 5 spazi, ecc... poi si ricomincia, 8 lettere 8 spazi, 9 lettere 7 spazi, ecc..
    Comunque ho provato con il tuo codice e non restituisce esattamente lo stesso input

    Il secondo permesso negato
    Allora avevo provato il vecchio exe e funzionava non ho idea di cosa sia successo al mio computer in quel momento ma mi dava i tab sempre uguali, adesso riprovando ho capito bene il tuo problema e ho corretto
    non so eprchè il secondo ti aveva dato permessi negati, che IDE usi??...comunque ho corrtetto, chiedimi tutto quello che devi chiedermi adesso funziona:
    Codice:
    #include <stdio.h>
    #define MAXC 500
    
    int detab(int *);
    
    int main()
    {
      char s[MAXC];
      int i, j=0, m;
        
      printf("Inserire stringa con tab:\n");
      fgets(s, 500, stdin);
      
      
      for(i=0; s[i]!='\0'; i++)
      {
         j++;
         if(s[i]=='\t')
         {
            m=detab(&j);
            while(m > 0)
            {
              putchar(' ');
              m--;
            }
         }
         else
           printf("%c", s[i]);
      }
      
      printf("\nFine del programma....");
      getch();
      return 0;
    }
    
    int detab (int *j)
    {
      int b, n;
      
      n = *j-1;
      *j = 0;
      
      if(n>=8)
        b=8-(n%8);
      else
        b=8-n;
      
      return b;
    }
    Ultima modifica di Tool; 15/09/12 alle 18:39
    A Ununoctio piace questo elemento.

  9. #8

    Registrato da
    Jun 2012
    Messaggi
    671
    Reputazione (?)
    10
    Piaciuto (?)
    103
    Ok, domani controllo e vedo entrambi i codici, adesso devo andare
    OK, del codice di St3ve ho capito tutto, mentre del tuo no, ci sono molte cose che ancora non ho studiato
    Intanto avevo provato a correggere da solo il mio codice, e ora funziona alla perfezione
    Codice:
    #include <stdio.h>
    #define MAXC 1000
    
    int nspazi (int);
    
    int main()
    {
      char s[MAXC];
      int i, c, m, nchar=0;
      
      for (i=0; i<MAXC-1 && (c=getchar())!=EOF && c!='\n'; i++)
        s[i]=c;
      
      s[i]='\0';
      
      for (i=0; s[i]!='\0'; i++)
      {   
        if (s[i]=='\t')
        {
          m=nspazi(nchar);
          for (; m!=0; m--)
        putchar(' ');
        }
        else
        {
          nchar++;
          printf("%c", s[i]);
        }
      }
      putchar('\n');
      return 0;
    }
    int nspazi (int nchar)
    {
      return 8-(nchar%8);
    }
    Ultima modifica di Ununoctio; 16/09/12 alle 10:51

  10.  

Ti consigliamo di leggere anche...

  1. Mi controllate questo codice?
    Di Sak32009 nel forum PHP e SQL
    Risposte: 5
    Ultimo Messaggio: 27/03/12, 18:51
  2. [AIUTO]Correzione script + Correzione Launcher VB
    Di Asdoni nel forum Metin2 Hacks Domande e Problemi
    Risposte: 1
    Ultimo Messaggio: 1/07/11, 09:07

Pubblicità
Sharu Corsi GameFanShop

I visitatori sono atterrati su questa pagina cercando:

Nessuno è atterrato su questa pagina da un motore di ricerca. Almeno, non per ora...
SEO Blog

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •