Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    4

    [C] problema su dimensione?

    ho un programma che dice:
    Si scriva un programma che ricevuto in input un numero composto al massimo
    di 9 cifre (da 0 a 9) produca una sequenza "descrittiva" ( utilizzare un
    ciclo con 10 iterazioni). Ogni numero descrive quello che lo precede
    contando ordinatamente "tutte" le cifre che lo compongono ( usare una
    funzione per calcorare la "descrizione" ).


    Ora: io ho provato a risolverlo così:
    codice:
    # include <stdio.h>
    # define SIZE_base 10
    # define SIZE_colonne 10
    # define SIZE_righe 2
    # define SIZE_max 1024
    
    int main()
    {
       int num;
       int i = 0;
       int j = 0;
       int k, x, e;
       long vet[i];
       int vett[SIZE_righe][SIZE_colonne]; //matrice bidimensionale
       int cr;                             //contatore righe
       int cc;                             //contatore colonne
       long sol[SIZE_max];                  //vettore che verrà stampato
       int m=0;
       int z=0;
       int hold;
       int p, q, w;                        //contatore necessari a popolare la
                                           //matrice bidimensionale
    
       printf ("\n Inserisci una stringa (al massimo di 9 cifre):  ");
       scanf ("%d", &num );
       
       while ( num > 0 ) 
          {                                 //ho popolato un vettore con i singoli 
          vet[ i++ ] = (num % 10);          //numeri della stringa numerica 
          j++;                              //inserita dall'utente. Non ha importanza
          num = num / 10;                   //il fatto che sia popolata al contrario.
          }	                             
          
       for (x = 0; x < SIZE_base; x++)
       { 
          for ( cr = 0 ; cr < 2 ; cr ++ )   //Popolo la parte superiore della matrice 
             {                              //con numeri, la parte inferiore con 0
             for ( cc = 0 ; cc < SIZE_base ; cc++ )
                {
                vett[0][cc] = cc;
                vett[1][cc] = 0;      
                }   
             }
                 
          q = 0;
        
          for ( p = 0 ; p < SIZE_base; p++ )//una volta creata la matrice
             {                              //multidimensionale, con questo metodo
             for( w = 0 ; w < j ; w++ )     //ripopolo la matrice con gli indici
                {                           //corretti del numero (ad ogni numero
                if ( vet[w] == p )          //corrisponderà l'indice con le volte
                q++;                        //che quel numero è presente nella
                }                           //stringa
             vett[1][p] = q;    
             q = 0;
             }
             
          z = 0 ;                           //fondamentale! Ad ogni giro parto 
                                            //sempre da 0.
                                                
          for ( cc = 0 ; cc < SIZE_base ; cc++ )
             {
             if ( vett[1][cc] != 0 )        //"cuore" del programma
                {                           //Popolo il vettore sol (sol sta per
                hold = vett[1][cc];         //soluzione). In questa maniera ce l'ho
                sol[z] = hold;              //pronto per una successiva stampa
                sol[z+1] = vett[0][cc];     
                z = z + 2 ;
                }   
             }   
             
          printf("(GIRO %d)\t", x + 1 );
           
          for( m = 0 ; m < z ; m++ )        //stampa del vettore sol 
             printf( "%d" , sol[m] );
    
          printf("\n");
       
          for ( e = 0 ; e < m ; e++ )       //alla fine del primo giro, il vettore
             {                              //sol deve divenire il vettore su cui     
             vet[e] = sol[e];               //ricominciare il secondo giro. Ecco
             }                              //spiegato il "ritorno" a vet per mezzo
                                            //di un assegnamento.          
              
          j = e +1  ;                           //la nuova lunghezza del vettore non 
                                            //sarà più j ma chiaramente e.
       }     
       system ("pause");
       return 0;  
          
    }
    Se metto numeri piccoli funziona, se metto numeri "grandi" tipo 7889 dopo qualche ciclo si stoppa.
    per me c'è qualche error nella dimension del vettore int.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma cosa vuole esattamente l'esercizio ... non è molto chiaro ...

    Cosa dovrebbe fornire in output se l'input è 7889 ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    4
    allora:
    se scrivo 7889 mi deve dare come risultato 172819 (in italiano un 7, due 8, un 9)
    poi ciclo 172819 e mi scrive 2112171819 (due 1, un 2, un 7, un 8, un 9),
    poi ciclo 2112171819 e mi scrive 5122171819, e così via...

    Spero sia un poco più chiaro...

  4. #4
    codice:
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    string intToString(int i)
    {
    	ostringstream ss;
    	ss << i;
    	return ss.str();
    }
    
    int main()
    {
    	int num = 2112171819;
    	string str_n = intToString(num);
    	string str_new = "";
    
    	char c = '\0';
    	int n = 0;
    	for(int i = 0; i < str_n.size(); i++)
    	{
    		//stato iniziale
    		if(c=='\0')
    		{
    			c = str_n.at(i);
    			n = 1;
    		}
    		else
    		{
    			if(c != str_n.at(i))
    			{
    				str_new += intToString(n);
    				str_new.push_back(c);
    				n=1;
    			}
    			else
    			{
    				n++;
    			}			
    			
    			c = str_n.at(i);
    		}
    		
    		if(i == str_n.size()-1)
    		{
    			str_new += intToString(n);
    			str_new.push_back(c);
    		}
    	}
    	
    	
    	cout << str_new << endl;
    }
    Con 2112171819 ottengo:

    codice:
    122112111711181119
    che mi pare giusto. Ho fatto qualche altra pure e pare andare.
    L'ho scritta in C++ per fare prima ma non dovresti avere problemi a portarla in C.
    Poi controlla, forse il corpo del for può essere scritto un pò meglio...

    Come si chiama questo giochino? Ne avevo letto da qualche parte tempo fa.
    Tra l'altro ha molti aspetti curiosi e alcune proprietà carine, ricordo


  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    4
    Scusami Antotan,
    non conosco molto il C++, anzi devo dire che non lo conosco proprio...

    In ogni caso, se inserisco 2112171819, dovrebbe ritornare 5122171819.
    Cioè: contare gli 1, e ne appaiono 5 (le prime due cifre della stringa sono 51, infatti, come dire cinque cifre 1), poi conto i 2 e stampo 22 (cioè ci sono due 2), un solo 7, un 8 ed un nove.

    l'esercizio è carino e concettualmente funziona, ma ci sono appunto queste due cosette che mi piacerebbe risolvere.

  6. #6
    Scusami tanto, avevo capito tutt'altro!

    Credevo stessi cercando di implementare un giochino matematico piuttosto conosciuto che data in input una stringa tipo questa

    771819

    ti restituisce

    2711181119

    cioè "due 7, un 1, un 8, un 1, un 9" cioè la descrizione della stringa.

    Invece tu vuoi contare solo le occorenze in pratica.

    Prova ad utilizzare un array di 10 elementi. array[0] contiene il numero di 0 che trovi, array[1] il numero di 1 ecc...

    fai due ciclo, i = 0 to 9 e j = 0 to lunghezza_input, il secondo dentro al primo, e fai i controlli per vedere se il carattere corrente (la i) è uguale al valore della stringa (str.at(j)). Se si, incrementi array[i] (array[i]++).

    Dato un intero, questa funzione te lo trasforma in stringa:

    Codice PHP:
    string toString(int val)
    {
        
    ostringstream ss;
        
    ss << val;
        return 
    ss.str();

    usala cosi, tipo

    Codice PHP:
    int x 1245
    string str 
    toString(x); 
    Dopo aver ottenuto la stringa, esegui l'algoritmo che ti ho descritto.
    Fammi sapere



  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    4
    Ti dirò che mi sembra più o meno lo stesso concetto.
    quello che sicuramente va bene è il trasformare l'intero in una stringa, in questo modo posso (credo) posso considerare anche un numero che inizia con zero.

    Ora ci proverò un poco.

    Anche se.. mi sa che dovrò giocare un poco con il C++...

    Grazie!

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