Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15

    [C] Scrivere un insieme di numeri casuali su una stringa

    Ciao a tutti, chiedo scusa per la probabile stupidità della domanda ma non riesco a venirne a capo.
    Volevo sapere se fosse possibile, una volta generati n (ad esempio, 10) numeri casuali, scriverli in una stringa..
    Vi spiego il perché voglio farlo: ho un esercizio scritto per il fortran che volevo svolgere però con linguaggio C che dice:
    "Generare 10000 numeri pseudo-random e salvare i risultati su un file formattato randat.dat con record di 60 caratteri e un file binario (randat.bin)."
    In Fortran tutto questo è molto facile, ma in C non esistendo il vero e proprio formato stringa ho dei problemi: in particolare per "file formattato con record di 60 caratteri" si intende, in C, un file testuale con righe di 60 caratteri l'una, giusto? Allora è per questo che credo di aver bisogno di scrivere i miei numeri casuali su una stringa.. in modo tale da poter specificare poi, quando scrivo sul file, il numero di caratteri richiesti ecc. utilizzando la sintassi giusta..
    Ho quindi un vettore "numeri" che come elementi contiene i vari numeri casuali, e cerco in tutti i modi di scrivere i suoi elementi sulla stringa, senza risultati..

    Nota che non vi sto chiedendo di svolgermi l'esercizio, nel caso non si fosse capito.. Non ho postato nessun codice perché è alquanto confusionario quello che ho fatto, diciamo per lo più una serie di prove in cui cerco di associare gli elementi del vettore - numeri[i] - alla stringa di caratteri con l'unico risultato di ottenere, se va bene, una stringa di un solo elemento (o il primo o l'ultimo del vettore):
    codice:
    snprintf(stringa,n*sizeof(int),"%d",numeri[i]
    (all'interno del ciclo for che genera il vettore numeri)
    Capisco che mi appare di un solo elemento perché ovviamente ad ogni incremento di i alla stringa viene associato l'elemento i-esimo del vettore numeri, sostituendo quello precedente... il problema è che non riesco a trovare un metodo per riuscire ad avere tutti gli elementi del vettore all'interno della stringa.. o anche per scrivere direttamente i numeri casuali sulla stringa, senza passare per il vettore!
    Di certo non posso scrivere stringa[i]=numeri[i] !!

    Scusate se è banale, ma proprio mi sfugge..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Se devi scrivere il risultato in un file, fallo mentre generi i valori random, numero per numero.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    In quel caso però come faccio a specificare record di 60 caratteri? Può capitare poi che mi tronchi un numero?
    (ma quindi non si può scrivere un insieme di numeri casuali su una stringa? :-( )

    In ogni caso grazie per la risposta!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Puoi fare tutto quello che vuoi, ma è necessario che sia chiaro ...

    Che vuol dire che devi utilizzare 60 caratteri? Quanto deve essere lungo un numero?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Il problema è che questo non viene specificato dal testo..
    Io ho supposto di generare numeri casuali compresi fra 0 e n-1 ... ad esempio, fra 0 e 99 (quindi di una o due "cifre")
    Credo che per righe di 60 caratteri si intenda che il file abbia su ogni riga 60 "cifre" (quindi se ogni numero è di due cifre, supponendo di scrivere tutti i numeri attaccati -per assurdo :P- su ogni riga dovrei scrivere 30 numeri)
    Diciamo che con un ciclo for sto sistemando la stampa su file, stampando direttamente
    i numeri che genero e senza usare stringhe.. (anche se sto avendo dei problemi ma appena ho risolto magari posto il codice)

    Quello che mi rimane da risolvere è: se io avessi un generico vettore i cui elementi sono numeri interi, come potrei trascrivere tutti i suoi elementi su una stringa?

  6. #6
    Originariamente inviato da Gnugnu
    In quel caso però come faccio a specificare record di 60 caratteri? Può capitare poi che mi tronchi un numero?
    Scrivere su una stringa (char *) o su file cambia poco. Per essere sicuro di utilizzare 60 caratteri puoi utilizzare qualcosa tipo sprintf(str, "%60d", num) . Ti può troncare un numero nel caso servano più di 60 cifre, il che mi sembra improbabile...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Guarda, se lo vuoi fare proprio su una stringa, va bene ... ma per questo compito non c'è bisogno di lavorare con le stringhe. I numeri li salvi direttamente nel file!

    E' importante sapere però che se vuoi rispettare i 60 caratteri, devi sapere *esattamente* di quante cifre deve essere ogni valore (ad esempio, se al massimo sono due cifre, le visualizzi con uno 0 o uno spazio per quelle ad una cifra) e se devono stare attaccati o con uno spazio tra loro ...

    Nel primo caso ce ne staranno 30, altrimenti 20.

    Quando salverai, utilizzerai una

    fprintf("%.02d" ...

    oppure una

    fprintf(" %.02d" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Allora, io senza l'uso della stringa l'ho svolto così, spero si capisca:

    codice:
    /* Generare 10000 numeri pseudo-random e salvare i risultati su un file
    formattato randat.dat (cioè fine TESTUALE) con record (cioè righe) di 60 caratteri e un file binario (cioè non formattato)
    (randat.bin). */
    
    #include <math.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
    
    int main(void)
    {
      int i, numeri[100], n=100;
      srand((unsigned) time(NULL));
      
      FILE *fileid;
      fileid=fopen("randat.dat","w");  
      
      /* stampo i numeri casuali generati sullo schermo e contemporaneamente sul file randat.dat */
      printf("\n\nNumeri casuali:\n");
      for (i=0;i<n;i++)
      {
        numeri[i]=rand()%n;
        if ((i+1)%12==0)
        {
          printf(" %2d  \n",numeri[i]);	/* ogni numero occupa così 5 caratteri */
      /* poiché devo avere righe di 60 caratteri e ogni numero occupa 5 caratteri, posso avere fino a 60/5=12 numeri per riga: per questo uso il costrutto if */
          fprintf(fileid," %2d  \n",numeri[i]);
        } else {
          printf(" %2d  ",numeri[i]);
          fprintf(fileid," %2d  ",numeri[i]);
        }
      }
    
    int fclose(FILE *fileid);
    printf("\n\n");
    return 0;
    }
    Ma ormai mi è rimasto il pallino di come scrivere su stringa gli elementi di un vettore, che non riesco a risolvere e che magari potrebbe essermi utile per qualche altro esercizio!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ma ormai mi è rimasto il pallino di come scrivere su stringa gli elementi di un vettore, che non riesco a risolvere e che magari potrebbe essermi utile per qualche altro esercizio! [/QUOTE]

    Prendi spunto da

    codice:
    	int i;
    	char line[61];
    
    	for(i=0; i<12; i++)
    		sprintf(line+i*5, " %2d  ", i);
    	line[60]=0;
    
    	printf("%s\n", line);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Grazie.. ora ci provo! Mi hai dato un buono spunto!

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.