Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Ottimizzazione

    Ciao a tutti,

    ho appena risolto il seguente problema, pero vorrei condividere con voi il metodo risolutivo, perche io credo di averlo risolto proprio da Beginner

    il testo e il seguente

    si hanno queste associazioni tra numeri e lettere (quelle sulla tastiera telefonica)

    2 abc
    3 def
    3 ghi
    5 jkl
    6 mno
    7 pqrs
    8 tuv
    9 wxyz

    il programma, preso un numero di 7 cifre da tastiera, deve stampare su un file tutte le possibili parole che si possono formare con il numero dato, tenendo conto appunto che a ogni numero sono associate tre lettere. ORa vi posto il mio codice, tutte le idee di miglioramento sono accettate caldamente Ciao a tutti!

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    int main ()

    {

    int q,w,e,r,t,y,u,a,s,d,f,g,h,i;
    int z=3,x=3,c=3,v=3,b=3,n=3,m=3;
    char lettere[8][5]={"abc\0","def\0","ghi\0","jkl\0","mno\0","pqrs\0","tuv\0","wxyz\0"};
    char numero[10];
    FILE *fptr;

    fptr=fopen("c:\\parole.txt","w+");

    if(
    fptr==NULL// il file e stato aperto correttamente?
       
    {
        
    perror("");
        exit(
    0);
        } 


    printf("Inserire numero telefonico senza 0 e 1:");
    scanf("%s",numero);

    a=(int)numero[0]-48;s=(int)(numero[1])-48;d=(int)numero[2]-48;f=(int)numero[3]-48;g=(int)(numero[4])-48;
    h=(int)(numero[5])-48;i=(int)(numero[6])-48;

     if((
    a-7)==0||(a-5)==0)
      {
       
    z=4;
      }
      if((
    s-7)==0||(s-5)==0)
      {
       
    x=4;
      }
       if((
    d-7)==0||(d-5)==0)
      {
       
    c=4;
      }
       if((
    f-7)==0||(a-5)==0)
      {
       
    v=4;
      }
       if((
    g-7)==0||(a-5)==0)
      {
       
    b=4;
      }
       if((
    h-7)==0||(a-5)==0)
      {
       
    n=4;
      }
      if((
    i-7)==0||(i-5)==0)
      {
       
    m=4;
      }
    for(
    q=0;q<z;q++)  
     {
      for(
    w=0;w<x;w++)
       {
        for(
    e=0;e<c;e++)
         {
          for(
    r=0;r<v;r++)
           {
            for(
    t=0;t<b;t++)
             {
              for(
    y=0;y<n;y++)
               {
                for(
    u=0;u<m;u++)
                 {
                  
    fprintf(fptr,"%c%c%c%c%c%c%c\n",lettere[a-2][q],lettere[s-2][w],lettere[d-2][e],
                                            
    lettere[f-2][r],lettere[g-2][t],lettere[h-2][y],lettere[i-2][u]);
                 
                 }
               }
             }
           }
         }
       }
     }

    fflush(fptr);
    fclose(fptr);

    system("pause");
     


  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Io l'ho fatto così. Però occhio ... è molto tosto!
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    #define NUM_DIGITS  7
    
    char *letters_arr[10] =
    {
        "",     /* 0 */
        "",     /* 1 */
        "abc",  /* 2 */
        "def",  /* 3 */
        "ghi",  /* 4 */
        "jkl",  /* 5 */
        "mno",  /* 6 */
        "pqrs", /* 7 */
        "tuv",  /* 8 */
        "wxyz"  /* 9 */
    };
    
    char *input_str (char *buf, int buflen)
    {
        char *p;
    
        fgets (buf, buflen, stdin);
    
        if ((p = strchr (buf, '\n')) != NULL)
            *p = '\0';
    
        return buf;
    }
    
    int is_str_digits (char *s)
    {
        while (*s != '\0')
        {
            if (!isdigit (*s))
                return 0;
            s++;
        }
    
        return 1;
    }
    
    int main (int argc, char *argv[])
    {
        char input[20];
        int digits[NUM_DIGITS];
        int count_letters[NUM_DIGITS];
        int index_letters[NUM_DIGITS];
        char combination[NUM_DIGITS+1];
        int i, k, carry;
        FILE *f;
    
        do {
            printf ("Inserire un numero di 7 cifre > ");
    
            input_str (input, sizeof (input));
        } while (strlen (input) != NUM_DIGITS || !is_str_digits (input));
    
        if ((f = fopen ("parole.txt", "w")) != NULL)
        {
            for (i = 0; i < NUM_DIGITS; i++)
            {
                digits[i] = input[i] - '0';
                count_letters[i] = strlen (letters_arr[digits[i]]);
                index_letters[i] = 0;
            }
    
            do {
                /*-- Genera stringa con la combinazione corrente --*/
                for (i = 0, k = 0; i < NUM_DIGITS; i++)
                {
                    if (count_letters[i] > 0)
                        combination[k++] = letters_arr[digits[i]][index_letters[i]];
                }
    
                combination[k] = '\0';
    
                fprintf (f, "%s\n", combination);
    
                /*-- Incrementa combinazione --*/
                carry = 1;
    
                for (i = 0; i < NUM_DIGITS; i++)
                {
                    if (count_letters[i] > 0)
                    {
                        index_letters[i] += carry;
                        if (index_letters[i] >= count_letters[i])
                        {
                            index_letters[i] = 0;
                            carry = 1;
                        }
                        else
                            carry = 0;
                    }
                }
            } while (!carry);
    
            fclose (f);
        }
    
        return 0;
    }
    EDIT: ho aggiunto la scrittura su file, non l'avevo messa subito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    [QUOTE]Originariamente inviato da andbin
    Io l'ho fatto così. Però occhio ... è molto tosto!


    tostissimo, l ho capito dopo due ore che mi c sono messo! Cmq compliments! MA come hai fatto a risolverlo in mezzora????? VVoVe: VVoVe:

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da UltraBeginner
    tostissimo
    Già ... perché tratto la gestione della combinazione come se fosse un sistema di numerazione.
    Non uso direttamente le lettere ma gli indici delle lettere. Nell'array 'index_letters' ho gli indici delle lettere. All'inizio sono tutti 0, poi incremento sempre l'indice più a sinistra e il "riporto" (carry) si propaga in avanti man mano che gli indici "fanno il giro".

    Questo è un metodo molto generico, potrei avere qualunque numero di digit (basta cambiare NUM_DIGITS) e qualunque numero di lettere per ogni digit.

    Originariamente inviato da UltraBeginner
    MA come hai fatto a risolverlo in mezzora????? VVoVe: VVoVe:
    Beh, non ho iniziato a programmare l'altro ieri ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi ricordo quando utilizzavo lo stesso metodo per sviluppare le colonne delle schedine Totocalcio ...

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.