PDA

Visualizza la versione completa : [C] Scrivere un insieme di numeri casuali su una stringa


Gnugnu
20-02-2012, 13:10
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):

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..

oregon
20-02-2012, 13:12
Se devi scrivere il risultato in un file, fallo mentre generi i valori random, numero per numero.

Gnugnu
20-02-2012, 13:22
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!

oregon
20-02-2012, 13:52
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?

Gnugnu
20-02-2012, 14:31
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?

ESSE-EFFE
20-02-2012, 14:35
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...

oregon
20-02-2012, 14:37
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" ...

Gnugnu
20-02-2012, 16:05
Allora, io senza l'uso della stringa l'ho svolto così, spero si capisca:


/* 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!

oregon
20-02-2012, 16:24
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



int i;
char line[61];

for(i=0; i<12; i++)
sprintf(line+i*5, " %2d ", i);
line[60]=0;

printf("%s\n", line);

Gnugnu
21-02-2012, 14:55
Grazie.. ora ci provo! Mi hai dato un buono spunto!

Loading