Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Grazie a un lancio preciso, il Nancy Gra...
Centrali elettriche libere di inquinare:...
Un razzo spaziale Vega C dell'italiana A...
Mozilla: i modelli IA aperti sono solo 4...
Intel e SK hynix al tavolo per un'allean...
Osservare la Luna con la NASA, anche in ...
Wallbox per auto elettriche su Amazon: d...
Il mistero della stagione degli uragani ...
La Corte di Cassazione affida i ricorsi ...
Tutti i nuovi prodotti Apple prenotabili...
DDR5, un kit da 598 a 1.215 euro in un m...
Portatile ASUS Vivobook 14 a 837,95€: AM...
Sparita da anni, AppZapper torna nel 202...
Revolut, la truffa dei dati è partita da...
Geely E2: abbiamo visto dal vivo la regi...
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: 11:31.


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