Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-10-2007, 16:23   #1
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
[C] ho bisogno di un consiglio

salve a tutti, dovrei, dato un file di testo con tot parole (prese da un articolo di giornale, o da un libro, non importa), fare in modo da prendere tutte le parole, e poi ordinarle in ordine alfabetico..tutto questo in C.

Mi sono bloccato sulla funzione per dividete tutto il testo in parole, per poi prendere le singole parole ed ordinarle in ordine alfabetico, oppure in ordine di ehm...come si dice quando una parola compare più volte..vabbè avete capito !!!. Considero una parola separata dall'altra dallo spazio (gli altri caratteri tipo !?< . ecc non li considero per ora).

io pensavo di metterli in un array, ma ce ne vorrebbe uno per ogni parola...oppure pensavo alle liste, ma non sò bene come implementare il tutto.

Potreste darmi una mano??? Non voglio il codice scritto in C, perchè voglio farlo da solo, ma vorrei un piccolo aiuto su come poter procedere!

grazie

Ultima modifica di welfi : 06-10-2007 alle 16:26.
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 16:32   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
salve a tutti, dovrei, dato un file di testo con tot parole (prese da un articolo di giornale, o da un libro, non importa), fare in modo da prendere tutte le parole, e poi ordinarle in ordine alfabetico..tutto questo in C.
Per la lettura delle parole potresti usare fscanf, ad esempio. Per memorizzarle potresti usare un array espandibile (lo riallochi dinamicamente). Per l'ordinamento ... dipende, potresti implementare il classico bubble sort o usare la qsort().
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 16:42   #3
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
Quote:
Originariamente inviato da andbin Guarda i messaggi
Per la lettura delle parole potresti usare fscanf, ad esempio. Per memorizzarle potresti usare un array espandibile (lo riallochi dinamicamente). Per l'ordinamento ... dipende, potresti implementare il classico bubble sort o usare la qsort().
sbagliavo sempre, usando un array di char, infatti qui ogni carattere va in un indice, e non posso associare ad ogni indice dell'array una stringa...invece devo fare un array di int:

a[0]"casa"
a[1] = "mare"..

ecc...non avevo capito nulla sugli array di stringhe allora

e nel caso volessi implementarlo con lista?

Ultima modifica di welfi : 06-10-2007 alle 16:47.
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 16:49   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
sbagliavo sempre, usando un array di char, infatti qui ogni carattere va in un indice, e non posso associare ad ogni indice dell'array una stringa...invece devo fare un array di int:
No no alt.

Se intendi usare un array di stringhe (e non altre strutture dati come le liste), dovresti fare "un array di puntatori a char", in cui ogni puntatore punta ad una stringa, il cui spazio di memoria va allocato appositamente.

Bisogna vedere poi se vuoi realizzare un array di una dimensione massima prefissata (più semplice) o un array "espandibile" da (ri)allocare a runtime (meno facile).

Se fisso, si può fare:

char *stringhe[500]; /* 500 stringhe */

Se riallocabile:

char **stringhe;

ma va (ri)allocato a runtime.

stringhe = (char**) malloc (500 * sizeof (char*));

se non basta, a runtime si fa:

stringhe = (char**) realloc (stringhe, 1000 * sizeof (char*));

Tutto questo è solo per allocare lo spazio per i puntatori, non per i caratteri delle stringhe. Per ogni stringa che leggi, allocherai memoria sufficiente, ci copierai la stringa e assegnerai il puntatore ad un elemento dell'array.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 06-10-2007 alle 16:51.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:01   #5
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
allora mi metto a ripetere un po gli array di puntatori....ma per le liste anche dovrei usare gli array? tipo ogni elemento della lista dovrebbe avere una parola. ora questa parola o viene memorizzata in un array di int (come pensavo di fare) oppure in un array di puntatori..sbaglio?
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:07   #6
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
nel frattempo ti posto quello che ho fatto fin'ora, con gli array di int, che sembra più semplice (poi lo implementerò anche con gli altri casi);

Nella funzione, dove c'è l'if, mi manca un metodo per inserire caratteri di vlta in volta, esempio se c non è uno spazio, mette il carattere in a, se il succ. carattere non è uno spazio, vuol dire che la parola non è finita e lo deve aggiungere ancora ad a con lo stesso indice del carattere precedente, finchè nn trova lo spazio e la parola risulta finita.

Codice:
void dividi_in_parole(FILE *fp, int a[] ){
int *stringa;
int c, i = 0;

do{
c = getc(fp);
if (c != 32)
 {
;
}
else
{i++;}

}while (c != EOF);


}


int main(int argc, char *argv[])
{
FILE *fp;
int array_parole[500] ={'0'};

fp = fopen("/home/peppe/Desktop/file.txt", "r");

dividi_in_parole(fp, array_parole);


fclose(fp);
  return EXIT_SUCCESS;
}
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:12   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
allora mi metto a ripetere un po gli array di puntatori....ma per le liste anche dovrei usare gli array? tipo ogni elemento della lista dovrebbe avere una parola. ora questa parola o viene memorizzata in un array di int (come pensavo di fare) oppure in un array di puntatori..sbaglio?
array di int?? Non vedo a cosa ti possa servire....

Qui hai diverse soluzioni: o usi un array di puntatori a char o usi una qualche altra struttura dati come una lista linkata.

Per la lista linkata dovresti fare una piccola struttura (struct) che contiene il tuo dato (e qui puoi/devi decidere come gestire lo spazio per i caratteri) e un puntatore all'elemento successivo.

Però nota che se devi poi ordinare il tutto, una lista linkata è meno semplice da ordinare rispetto ad un array.

Un esempio basilare di gestione di una lista linkata l'ho fatto di recente in <questa> discussione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:14   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
Codice:
void dividi_in_parole(FILE *fp, int a[] ){
int *stringa;
......
No no no. Lascia perdere gli int perché sei sulla strada completamente sbagliata.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 06-10-2007 alle 17:26.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:17   #9
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
ti ringrazio molto per i consigli!!! inizio a studiarmi gli array di puntatori e inizio a implementare qualcosa...poi passo allo studio delle liste link

nel caso posto di nuovo
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 17:40   #10
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
ehm, posso fare un altra domandina??? io ho questo file di testo, ma come faccio a caricare, ad esempio in una variabile "stringa", una parola letta dal file e non un singolo carattere?(per poi metterla nell'array di puntatori)???

oppure sapendo come caricare un singolo carattere alla volta(usando getc) come li metto tutti insieme finchè non trovo lo spazio (carattere 32)??

Ultima modifica di welfi : 06-10-2007 alle 17:43.
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2007, 19:36   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
ehm, posso fare un altra domandina???
Certo, il forum è fatto per questo.

Quote:
Originariamente inviato da welfi Guarda i messaggi
io ho questo file di testo, ma come faccio a caricare, ad esempio in una variabile "stringa", una parola letta dal file e non un singolo carattere?(per poi metterla nell'array di puntatori)???
Prova questo semplice programmino:
Codice:
#include <stdio.h>

int main (void)
{
    FILE *f;
    char buf[101];

    if ((f = fopen ("un_file_di_testo.txt", "r")) != NULL)
    {
        while (fscanf (f, "%100s", buf) == 1)
            printf ("[%s]\n", buf);

        fclose (f);
    }

    return 0;
}
Legge dal file e stampa ogni singola parola mettendola tra [ ]. Le parole devono essere al massimo di 100 caratteri, la lunghezza massima è determinata dallo specificatore di formato nella fscanf.

Nota che 'buf' è uno solo e contiene di volta in volta l'ultima parola letta. Per tale motivo non si dovrebbe mettere nell'array l'indirizzo di buf. Per ogni parola, devi determinarne la lunghezza, allocare dinamicamente della memoria (e nota bene, va allocato 1 carattere in più per il nullo finale), poi copiare in questa area la stringa e a quel punto puoi assegnare nell'array l'indirizzo di questa area.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2007, 10:02   #12
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
conosco fscanf, ma credevo che leggesse dal file, come hai scritto tu, 100 CARATTERI, invece legge un massimo di 100 caratteri, ma restituisce ogni volta una stringa delimitata dallo spazio!!!! cavolo, non l'ho trovata scritta da nessuna parte questa ottima utilità di fscanf!!!
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2007, 10:48   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
non l'ho trovata scritta da nessuna parte questa ottima utilità di fscanf!!!
A dire il vero dovrebbe essere ben stampata e documentata su tutte le reference serie (che non siano il manuale delle giovani marmotte...)

La documentazione del VC++ dice:

scanf Width Specification
width is a positive decimal integer controlling the maximum number of characters to be read from stdin. No more than width characters are converted and stored at the corresponding argument. Fewer than width characters may be read if a white-space character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2007, 10:59   #14
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
nel mio in italiano non c'è..lo devo cambiare! visto che siamo in tema, mi puoi consigliare un buon libro (se proprio non c'è in italiano va bene anche inglese) di C fatto bene però

cmq credo di essere arrivato a buon punto, ho fatto in modo di dividere le parole da un testo qualunque, togliendo eventuali punteggiature dopo la parola (virgole, punti) ed ogni parola va nell'array di puntatori. tutto funziona bene, ma dopo 6 parole esce con un errore. no sò perchè, ma anche cambiando le parole dopo 6 parole lette da errore.!!!!

ti posto il codice, se potreseti dargli un'occhiata quando vuoi cosi mi aiuti a capire cosa c'è che nn va...grazie

Codice:
//elimina tutta la punteggiatura! e restituisce la lunghezza della parola
int elimina_schifezze(char temp[])
{
	int i =0;
	while(temp[i]>48)
		i++;
	temp[i] = '\0';
	return i;
}

//divide in parole il testo
void dividi_in_parole(FILE *fp, char *a[] ){
char temp[30];
int lunghezza, indice;

indice = -1;
 while (fscanf (fp, "%30s", temp) == 1){
	 indice++; //conta le parole
	 lunghezza = elimina_schifezze(temp); //lunghezza effettiva della parola
	 a[indice] = calloc(lunghezza+1,sizeof(char));
	 strcpy(a[indice], temp);
	 printf("%s\n", a[indice]);//controllo che parole ha inserito e come le ha inserite
 }
	 
}
 
int main(int argc, char *argv[])
{
FILE *fp;
char *array_parole[500];
int lunghezza;

//apro il file
fp = fopen("/home/peppe/Desktop/file2.txt", "r");
	 
//divido in parole il testo
dividi_in_parole(fp, *array_parole);

//chiudo il file
fclose(fp);

  return EXIT_SUCCESS;
}

Ultima modifica di welfi : 07-10-2007 alle 11:03.
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2007, 11:10   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da welfi Guarda i messaggi
dividi_in_parole(fp, *array_parole);
L'asterisco * non ci vuole, perché passi un tipo di dato incompatibile (e il compilatore dovrebbe pure segnalartelo).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-10-2007, 11:21   #16
welfi
Junior Member
 
Iscritto dal: Oct 2007
Messaggi: 9
ora va bene, ti ringrazio!

ps, per caso puoi consigliarmi un buon libro e completo di C, fatto bene, in italiano oppure(se proprio in italiano nn c'è) in inglese??
welfi è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2007, 19:54   #17
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
ma se si volesse realizzare il comportamento di fscanf con un altra funzione, come si dovrebbe fare?? cioè se nel codice seguente:

Codice:
 if ((f = fopen ("un_file_di_testo.txt", "r")) != NULL)
    {
        while (fscanf (f, "%100s", buf) == 1)
            printf ("[%s]\n", buf);

        fclose (f);
    }
al posto di scanf (o magari in un posto diverso, ma cmq senza usare scanf) cosa potrei mettere per leggere da un file di testo di volta in volta una stringa delimitata dallo spazio??
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2007, 19:57   #18
Imrahil
Senior Member
 
L'Avatar di Imrahil
 
Iscritto dal: Sep 2005
Città: 127.0.0.1
Messaggi: 3321
Quote:
Originariamente inviato da welfi Guarda i messaggi
ora va bene, ti ringrazio!

ps, per caso puoi consigliarmi un buon libro e completo di C, fatto bene, in italiano oppure(se proprio in italiano nn c'è) in inglese??
Deitel & Deitel, C: Corso Completo di Programmazione, edito da Apogeo.
__________________

Intel Core 2 Duo E6420 | 2x1 GB Team Group XTreem PC6400 CL4 + 2x2 GB Corsair XMS2 | Gigabyte P35C - DS3R | XFX nVidia GeForce 8800 GTS 640 MB Extreme Edition | Western Digital Raptor 74GB | Samsung HD153WI 1,5 TB | NEC ND-4551A | Seasonic S12 600W | Coolermaster Stacker STC-01 Black | Acer AL1916w. ~ Trattative positive: 30 negative: 1 (Insane_Tech)
Imrahil è offline   Rispondi citando il messaggio o parte di esso
Old 11-10-2007, 14:33   #19
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
ma se si volesse realizzare il comportamento di fscanf con un altra funzione, come si dovrebbe fare?? cioè se nel codice seguente:

Codice:
 if ((f = fopen ("un_file_di_testo.txt", "r")) != NULL)
    {
        while (fscanf (f, "%100s", buf) == 1)
            printf ("[%s]\n", buf);

        fclose (f);
    }
al posto di scanf (o magari in un posto diverso, ma cmq senza usare scanf) cosa potrei mettere per leggere da un file di testo di volta in volta una stringa delimitata dallo spazio??
grazie---e per questo invece??
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 11-10-2007, 15:21   #20
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
grazie---e per questo invece??
Un'altra soluzione potrebbe essere quella di leggere "a righe" con fgets() e poi spezzare la riga in parole tramite strtok() (specificando come delimitatori lo spazio, magari anche il tab o altro che vuoi).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
La Corea del Sud vorrebbe costruire una ...
Rilasciati i primi risultati delle anali...
Robot umanoidi low cost? Unitree ci prov...
Non solo Rocket Lab, anche Avio potrebbe...
Chips Act UE: 41,5 milioni di euro a Eph...
Ryzen Threadripper 9000 al debutto il 31...
Nuovi coupon nascosti Amazon (aggiorname...
Chatbot e salute mentale: nascono i prim...
Prezzi in ribasso su Amazon su tante com...
Eureka J15 Ultra spiazza la concorrenza ...
Stufi di tagliare il prato? Questi robot...
Anche Dyson si adegua: sconti fino a 200...
Mi sono rotto un dito, e le avventure gr...
Tutto vero: costa solo 899€ il portatile...
Lefant M330Pro da 5.000Pa a 104€ o i due...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:18.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v