Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-02-2011, 16:35   #1
tenbota87
Junior Member
 
Iscritto dal: Feb 2011
Messaggi: 21
[C] ordinamento lista e stampa su file

Salve a tutti!
Ho un problema..
In questo codice io devo leggere un file contenente parole delimitate da un numero variabile di spazi e devo creare un file contenente le parole e la loro relativa frequenza, in modo decrescente. La lettura da file dovrebbe avvenire in modo corretto, il problema sorge nell'ordinamento della lista e nella conseguente stampa su file.
Spero che ci sia qualche buon anima che mi possa rispondere e aiutare!
Grazie in anticipo..


Codice:
#include <stdio.h>		//Direttive al pre processore che ci permettono di includere
#include <string.h>		//gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>


// definizione della funzione ASSERT()  con stampa di un messaggio di errore 
#define ASSERT( condizionedaverificare, cosafare )	{ if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }

			

struct lista{							//Dichiarazione della lista usata dalla funzione aggiuntiva
	char parola[257];					//Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
	int frequenza;						//Dichiarazione di una varibile adibita a contenere la frequenza della parola
	struct lista *next;					//Dichiarazione di un puntatore per lo spostamento all'interno della lista 
	};


						
int main(int argc, char *argv[])
{
		char *nomeDelFile=NULL;						//puntatore al nome del file da comprimere o decomprimere
		char *centoParole=NULL;	
		
		char *pra=NULL;
		FILE *fileTesto=NULL;
		FILE *fpw=NULL ;
		int contaLettere=0;
		int numero_parole=0;
		int massimo=0;
		char bufferLettura[256];
		struct lista *nuovo=NULL;
		struct lista *testa=NULL;
		struct lista *temp=NULL;
		struct lista *prev=NULL;
		struct lista *canc=NULL;
		
		
		
		if(argc!=2)								//controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
		{							
			printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
			exit(1);
		}	
		
		nomeDelFile=argv[1];					//copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
		
		
	centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));	
	strncpy(centoParole,nomeDelFile,strlen(nomeDelFile));										
	strncat(centoParole,".world\0",7);		
	
	

	
	fileTesto=fopen(nomeDelFile,"r");							//apertura del file di testo in modalità lettura
		
	fpw=fopen(centoParole,"w");									//apertura del file di testa in cui devo andare a scrivere
	assert(fpw != NULL);	
	

	while(!feof(fileTesto))
	{
		//trovato=0;
		contaLettere=0;								//Indicizzazione a 0 della variabile i
		
		
			pra = (char*)malloc( 256 * sizeof(char));
			memset(pra,0,256 * sizeof(char));

			fscanf(fileTesto,"%s", pra);
			strcpy(bufferLettura,pra);
			//printf("\n Parola: %s",bufferLettura);
			contaLettere=strlen(bufferLettura);
			free(pra);
			if(contaLettere<256)
			{
				bufferLettura[contaLettere]='\0';
			}
			else
			{
				bufferLettura[0]='\0';
			}
			

	
		if(bufferLettura[0]!='\0')	//guardare soluzioni alternative per  parole maggiori di 256 caratteri
		 {	//printf("\n 10 \n");
			
			prev = NULL;
			temp=testa;		
			while((temp != NULL) && (strcmp(bufferLettura,temp->parola) != 0)){
					
					prev = temp;
					temp = temp->next;									//Incremento il puntatore per avanzare nella scansione della lista						
					
			}
			
			
			if (temp == NULL)
			{
				// printf("\n 17 dentro\n");
				nuovo=(struct lista*)malloc(sizeof(struct lista));	//Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
				strncpy(nuovo->parola,bufferLettura,contaLettere);
				// printf("\n 18 dentro\n");
				nuovo->frequenza=1;									//Impostazione della frequenza della parola a 1
				nuovo->next = NULL;
				if (testa != NULL)
					prev->next = nuovo;
				else testa = nuovo;
				// printf("\n 18 dentro\n");
				// printf("\nPrima Parola in lista:%s \n",nuovo->parola);
				// printf("\n 18 dentro\n");
				// printf("\nFrequenza in lista:%d \n",nuovo->frequenza);
			}
			else temp->frequenza++;
		}
	}	

	
	temp=testa;					
	
	if(testa==NULL)
	{	
		fclose(fpw);		
		exit(0);			
	}
	else
		{
			while(temp != NULL && numero_parole <= 100 )
			{
				massimo=0;									
				while(temp != NULL)	//ciclo per trovare il massimo
				{				
					if(temp->frequenza > massimo)
					{			
						massimo=temp->frequenza;
					}			
					temp=temp->next;						
				}
				
				temp=testa;									
													
				while(temp != NULL)
				{						
					if(temp->frequenza == massimo)
					{				
						fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);	
						numero_parole++;
						prev->next=temp->next;
						canc=temp;
						temp=temp->next;
						free(canc);
						
					}
					else
						{
							prev=temp;
							temp=temp->next;
						}
						
						

				}

			}
		}

fclose(fileTesto);
fclose(fpw);

		return 0;
}
tenbota87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-02-2011, 09:03   #2
IceCoder
Member
 
Iscritto dal: Dec 2007
Messaggi: 121
Stando a quello che ho capito tu non usi un debugger o non sai proprio cosa sia.. quale IDE usi? (IDE = (in maniera molto rozza) programma in cui scrivi il codice)
IceCoder è offline   Rispondi citando il messaggio o parte di esso
Old 11-02-2011, 09:38   #3
tenbota87
Junior Member
 
Iscritto dal: Feb 2011
Messaggi: 21
Il programma che uso per scrivere il codice è il Notepad++,un software che è utile per scrivere in tutti i linguaggi,visto che evidenzia tutte le parole chiave utilizzate a seconda del linguaggio che scegli, e lo vado a compilare ed eseguire con il cygwin.come debug uso il gdb ma non è facile per niente,poco intuitivo e,magari è una motivazione banale,esteticamente orrendo quindi mi aiuto utilizzando i printf per visualizzare a video dove il programma si blocca.

sei comunque in grado di aiutarmi?
tenbota87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-02-2011, 10:59   #4
IceCoder
Member
 
Iscritto dal: Dec 2007
Messaggi: 121
Ci sono molte imprecisioni, a partire dall'uso di strncpy() fino all'uso dei puntatori che fa andare il programma in un loop infinito (a quanto sembra fin ora)..

Io ti consiglierei di iniziare con Visual C++ Express che è gratuito e ti fornisce un ottimo debugger semplicissimo da usare (clicchi all'inizio della linea ed il programma si bloccherà li fornendoti tutti i dati necessari) per poi passare a qualcosa di meglio..

Una nota finale da fare è sul'impostazione del codice un po' troppo disordinata.. Ad una funzione deve corrispondere un solo scopo, cosi ti faciliti il lavoro di almeno 100 volte (in progetti piu complessi).

Vedo un po' di risolvere, dammi qualche minuto, sto facendo anche altre cose e sono un po' impegnato
IceCoder è offline   Rispondi citando il messaggio o parte di esso
Old 11-02-2011, 11:26   #5
IceCoder
Member
 
Iscritto dal: Dec 2007
Messaggi: 121
Codice:
#include <stdio.h>		//Direttive al pre processore che ci permettono di includere
#include <string.h>		//gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>


// definizione della funzione ASSERT()  con stampa di un messaggio di errore 
#define ASSERT( condizionedaverificare, cosafare )	{ if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }

			

struct lista{							//Dichiarazione della lista usata dalla funzione aggiuntiva
	char parola[257];					//Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
	int frequenza;						//Dichiarazione di una varibile adibita a contenere la frequenza della parola
	struct lista *next;					//Dichiarazione di un puntatore per lo spostamento all'interno della lista 
	};


						
int main(int argc, char *argv[])
{
		char *nomeDelFile=NULL;						//puntatore al nome del file da comprimere o decomprimere
		char *centoParole=NULL;	
		
		char *pra=NULL;
		FILE *fileTesto=NULL;
		FILE *fpw=NULL ;
		int contaLettere=0;
		int numero_parole=0;
		int massimo=0;
		char bufferLettura[256];
		struct lista *nuovo=NULL;
		struct lista *testa=NULL;
		struct lista *temp=NULL;
		struct lista *prev=NULL;
		struct lista *canc=NULL;
		
		
		
		if(argc!=2)								//controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
		{							
			printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
			exit(1);
		}	
		
		nomeDelFile=argv[1];					//copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
		
		
	centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));	
	strncpy(centoParole,nomeDelFile,sizeof(char)*(strlen(nomeDelFile)+7)); //ICE: Impostata formula corretta per il terzo parametro
	strncat(centoParole,".world",6); //ICE: Eliminato il carattere '\0' alla fine, viene aggiunto in automatico durante la compilazione
	
	

	
	fileTesto=fopen(nomeDelFile,"r");							//apertura del file di testo in modalità lettura
		
	fpw=fopen(centoParole,"w");									//apertura del file di testa in cui devo andare a scrivere
	assert(fpw != NULL);	
	

	while(!feof(fileTesto))
	{
		//trovato=0;
		contaLettere=0;								//Indicizzazione a 0 della variabile i
		
		
			pra = (char*)malloc( 256 * sizeof(char));
			memset(pra,0,256 * sizeof(char));

			fscanf(fileTesto,"%s", pra);

			//ICE: Inizio codice aggiunto
			if(pra[0] == 0) //Non è stato letto alcun carattere, il file è finito.
			{
				free(pra);
				break;
			}

			//ICE: Fine codice aggiunto

			strcpy(bufferLettura,pra);
			//printf("\n Parola: %s",bufferLettura);
			contaLettere=strlen(bufferLettura);
			free(pra);
			if(contaLettere<256)
			{
				bufferLettura[contaLettere]='\0';
			}
			else
			{
				bufferLettura[0]='\0';
			}
			

	
		if(bufferLettura[0]!='\0')	//guardare soluzioni alternative per  parole maggiori di 256 caratteri
		 {	//printf("\n 10 \n");
			
			prev = NULL;
			temp=testa;		
			while((temp != NULL) && (strcmp(bufferLettura,temp->parola) != 0)){
					
					prev = temp;
					temp = temp->next;									//Incremento il puntatore per avanzare nella scansione della lista						
					
			}
			
			
			if (temp == NULL)
			{
				// printf("\n 17 dentro\n");
				nuovo=(struct lista*)malloc(sizeof(struct lista));	//Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
				strncpy(nuovo->parola,bufferLettura,257); //ICE: il terzo argomento di strncpy() deve essere la lunghezza TOTALE della stringa IN CUI vuoi copiare il contenuto della seconda stringa
				// printf("\n 18 dentro\n");
				nuovo->frequenza=1;									//Impostazione della frequenza della parola a 1
				nuovo->next = NULL;
				if (testa != NULL)
					prev->next = nuovo;
				else testa = nuovo;
				// printf("\n 18 dentro\n");
				// printf("\nPrima Parola in lista:%s \n",nuovo->parola);
				// printf("\n 18 dentro\n");
				// printf("\nFrequenza in lista:%d \n",nuovo->frequenza);
			}
			else temp->frequenza++;
		}
	}	

	
	temp=testa;					
	
	if(testa==NULL)
	{	
		fclose(fpw);		
		exit(0);			
	}
	else
		{
			while(temp != NULL && numero_parole <= 100 )
			{
				massimo=0;									
				while(temp != NULL)	//ciclo per trovare il massimo
				{				
					if(temp->frequenza > massimo)
					{			
						massimo=temp->frequenza;
					}			
					temp=temp->next;						
				}
				
				temp=testa;									
													
				while(temp != NULL)
				{						
					if(temp->frequenza == massimo)
					{				
						fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);	
						numero_parole++;
						//prev->next=temp->next; //ICE: Commentata questa linea che causava un loop infinito (prev puntava al penultimo elemento della lista che veniva così una lista ciclicamente collegata)
						canc=temp;
						temp=temp->next;
						free(canc);
						
					}
					else
						{
							prev=temp;
							temp=temp->next;
						}
						
						

				}

			}
		}

fclose(fileTesto);
fclose(fpw);

		return 0;
}
Ecco fatto, se hai altre domande chiedi pure
IceCoder è offline   Rispondi citando il messaggio o parte di esso
Old 11-02-2011, 13:57   #6
tenbota87
Junior Member
 
Iscritto dal: Feb 2011
Messaggi: 21
Un problema grosso me l'hai risolto,grazie mille,però quello di cui ho bisogno,e non riesco proprio a fare,è la stampa delle 100 parole più frequenti,non solo la più frequente..e nel caso la 101esima parola e successive abbiano frequenza uguale alla 100esima devono essere stampate tutte,per questo facevo il ciclo:
Codice:
 
 while(temp != NULL && numero_parole <= 100 )
grazie ancora per il tuo prezioso aiuto!!!
tenbota87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2011, 10:52   #7
tenbota87
Junior Member
 
Iscritto dal: Feb 2011
Messaggi: 21
non c'è proprio nessuno che è in grado di aiutarmi per favore?!
tenbota87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Formula E svela la stagione dei record: ...
Premiate le miglior innovazioni nel supe...
Autopromotec Dialogues: a Milano abbiamo...
Google Pixel 10 Pro crolla a 699€ in off...
I primi computer quantistici utili a liv...
Washington punta il dito contro ASML: se...
Data center, IA e rinnovabili: cos&igrav...
Doppia memoria, doppia potenza: la GeFor...
Il Galaxy S26 FE sta arrivando ma non av...
Lenovo Idea Tab Plus in offerta al Prime...
Hisense: il Prime Day sorprende con un T...
Reolink apre il Prime Day 2026 con scont...
Android 17 sui Pixel con qualche intoppo...
Prime Day, le offerte per i giocatori: M...
Una Tesla Model 3 sfonda una casa e ucci...
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: 19:01.


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