Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    2

    [ C ] Problema con liste

    Salve a tutti!
    Questa è la consegna di un esercizio che devo fare:

    codice:
    Realizzare un programma in linguaggio C per la visualizzazione dell'andamento della temperatura di un 
    paziente su un foglio di carta utilizzando un plotter. Il plotter è costituito da un braccio meccanico
    che impugna una penna. Il plotter muove la penna su un foglio; la penna può essere alzata ( ed in tal 
    caso non tocca il foglio) o abbassata ( in tal caso tocca il foglio ).
    I comandi che il plotter è in grado di eseguire sono alzare la penna, abbassare la penna, e muovere il
    braccio in posizione (X, Y), oltre ad un comando di inizializzazione che pone il plotter nella posizione
    (0, 0) con la penna in su. Quando il braccio meccanico viene mosso in una posizione e la penna è abbassata
    traccia una linea retta dalla posizione precedente alla nuova.
    L'invio dei comandi al plotter deve essere ovviamente "simulato". Esempio di funzioni e loro effetto:
    	void Initialize ( void ) : stampa su video: Posizione (0, 0), penna su.
    	void Muovi ( int X, int Y ): stampa : Penna spostata alla posizione ( X, Y).
    	void Abbassa_penna ( void ): stampa : Abbassa la penna.
    	void Alza_penna ( void ): stampa: Alza la penna.
    
    I dati da visualizzare sono in un file di tipo testo "cc.dat" contenente le temperature rilevate in un
    mese per tutti i pazienti dell'ospedale; ogni linea contiene:
    	il giorno (del mese) della rilevazione della temperatura (int);
    	la temperatura che è stata rilevata (float);
    	il nome del paziente (stringa di 20 caratteri);
    
    I dati sul file "cc.dat" sono ordinati in ordine crescente di giorno.
    Il programma deve accettare da tastiera il nome del paziente di cui si devono visualizzare i dati, poi
    disegnare con il plotter l'andamento della temperatura del paziente, inviando al plotter (simulato) gli
    opportuni comandi. Si visualizzi solo la parte intera della temperatura. Il ciclo di richieste continua
    fino all'introduzione di EOF (S.O. Windows: Ctrl+Z; S.O. UNIX/Linux Ctrl+C).
    
    È possibile che per una certa data non esistano rilevazioni per il paziente: in tal caso il programma
    non deve tracciare la linea in quella data. Ad esempio, se il file contiene i seguenti dati:
    	1	36.5	ROSSI
    	1	36.6	BIANCHI
    	2	37.1	ROSSI
    	3	36.1	BIANCHI
    	4	37.2	ROSSI
    	5	37.1	ROSSI
    
    e viene richiesto di visualizzare la temperatura di ROSSI, allora il programma deve disegnare un segmento
    da (1, 36) a (2, 37) ed uno da (4, 37) a (5, 37). I comandi inviati al plotter (e visti dall'utente)
    devono essere:
    Posizione (0, 0), penna su.
    Penna spostata in posizione (1, 36).
    Penna giù.
    Penna spostata in posizione (2, 37).
    Penna su.
    Penna spostata in posizione (4, 37).
    Penna giù.
    Penna spostata in posizione (5, 37).
    
    NB: è richiesto che il file sia letto una sola volta e il contenuto salvato in una base dati dinamica.
    E questo è il codice sorgente del mio programma con qualche problemuccio...

    codice:
    # include <stdio.h>
    
    # include <stdlib.h>
    
    # include <string.h>
    
    # include <ctype.h>
    
    # include <math.h>
    
    # define MAX_NOME 20
    
    
    
    /********************************************************
    
    *  Strutture dati
    
    ********************************************************/
    
    
    
    typedef struct _PAZIENTE {
    
    	char nome [ 20 ];
    	struct _DATI * dati;
    	struct _PAZIENTE * next;
    
    } PAZIENTE;
    
    typedef struct _DATI {
    	int data;
    	int temp_int;
    	float temp_fraz;
    	struct _DATI * next;
    } DATI;
    
    typedef struct _LIST {
    	PAZIENTE * head;
    } LIST;
    
    
    
    /********************************************************
    
    *  Prototipi
    
    ********************************************************/
    
    
    
    void Initialize ( void );
    void Muovi ( int X, int Y );
    void Abbassa_penna ( void );
    void Alza_penna ( void );
    LIST * CreaLista ( FILE * file );
    void LeggiFile ( FILE * file, LIST * L );
    void Alloca ( int data, int t_i, int t_f, char * nome, LIST * L );
    LIST * NewList ( void );
    void GestisciPlotter ( LIST * L );
    FILE *ApriFile( int modo_di_apertura, int azione );
    void StampaLista ( LIST * L );
    
    
    
    /********************************************************
    
    *  Algoritmo
    
    ********************************************************/
    
    int main ( void )
    {
    	FILE * file;
    	LIST * ListaPazienti;
    
    	file = ApriFile ( 1, 1);
    
    	ListaPazienti = CreaLista ( file );
    
    	fclose ( file );
    
    	StampaLista( ListaPazienti );
    
    	GestisciPlotter ( ListaPazienti );
    
    	printf ( "\nFine del Programma.\n" );
    
    	return 0;
    }
    
    void Initialize ( void )
    {
    	printf ( "Posizione ( 0, 0), penna su.\n" );
    
    	return;
    }
    
    void Muovi ( int X, int Y )
    {
    	printf ( "Penna spostata alla posizione ( %2d, %2d).\n", X, Y );
    
    	return;
    }
    
    void Abbassa_penna ( void )
    {
    	printf ( "Abbassa la penna.\n" );
    
    	return;
    }
    
    void Alza_penna ( void )
    {
    	printf ( "Alza la penna.\n" );
    
    	return;
    }
    
    LIST * CreaLista ( FILE * file )
    {
    	LIST * L;
    
    	L = NewList ();
    
    	LeggiFile ( file, L );
    
    	return L;
    }
    
    void LeggiFile ( FILE * file, LIST * L )
    {
    	PAZIENTE * P;
    	DATI * D;
    	float tempF;
    	int data, tempI, i = 0;
    	char nome [ MAX_NOME ];
    
    	while ( !i ) {
    		if ( fscanf ( file, "%d", &data ) == EOF )
    			i = 1;
    		else {
    			fscanf ( file, "%d%f%s", &tempI, &tempF, nome );
    			Alloca ( data, tempI, tempF, nome, L );
    		}
    	}
    }
    
    void Alloca ( int data, int t_i, int t_f, char * nome, LIST * L )
    {
    	PAZIENTE * P, * S;
    	DATI * D, * T;
    	int i = 0;
    
    	S = L -> head;
    
    	if ( S == NULL ) {
    		if (	( P = ( PAZIENTE * ) malloc ( sizeof ( PAZIENTE ) ) ) != NULL &&
    			( D = ( DATI * ) malloc ( sizeof ( DATI ) ) ) != NULL ) {
    
    			L -> head = P;
    			strncpy ( P -> nome, nome, strlen ( nome ) + 1 );
    			P -> dati = D;
    			D -> data = data;
    			D -> temp_int = t_i;
    			D -> temp_fraz = t_f;
    			D -> next = NULL;
    		}
    		else
    			exit ( fprintf ( stderr, "Yeuch!\n" ) );
    	}
    	else {
    		while ( !i ) {
    			if ( strncmp ( S -> nome, nome, strlen ( nome ) ) == 0 )
    				i = 1;
    			else {
    				if ( S -> next != NULL )
    					S = S -> next;
    				else
    					i = 2;
    			}
    		}
    
    		if ( i = 1 ) {
    			if ( ( D = ( DATI * ) malloc ( sizeof ( DATI ) ) ) != NULL ) {
    				T = S -> dati;
    				while ( T -> next != NULL )
    					T = T -> next;
    				T -> next = D;
    				D -> data = data;
    				D -> temp_int = t_i;
    				D -> temp_fraz = t_f;
    				D -> next = NULL;
    			}
    			else
    				exit ( fprintf ( stderr, "Yeuch!\n" ) );
    		}
    		else {
    			if ( 	( P = ( PAZIENTE * ) malloc ( sizeof ( PAZIENTE ) ) ) != NULL &&
    				( D = ( DATI * ) malloc ( sizeof ( DATI ) ) ) != NULL ) {
    
    				S -> next = P;
    				P -> next = NULL;
    				strncpy ( P -> nome, nome, strlen ( nome ) + 1 );
    				P -> dati = D;
    				D -> data = data;
    				D -> temp_int = t_i;
    				D -> temp_fraz = t_f;
    				D -> next = NULL;
    			}
    			else
    				exit ( fprintf ( stderr, "Yeuch!\n" ) );
    		}
    	}
    
    	return;
    }
    
    LIST * NewList ( void )
    {
    	LIST * L;
    
    	if ( ( L = ( LIST * ) malloc ( sizeof ( LIST ) ) ) != NULL )
    		L -> head = NULL;
    	else
    		exit ( fprintf ( stderr, "Yeuch!\n" ) );
    
    	return L;
    }
    
    void GestisciPlotter ( LIST * L )
    {
    	PAZIENTE * P;
    	DATI * D;
    	char richiesta [ MAX_NOME ];
    	int i = 0;
    
    	do {
    		printf ( "Inserire nome paziente e premere <ENTER>, 1 per uscire: " );
    
    		scanf ( "%s", richiesta );
    
    		if ( richiesta [ 0 ] != '1' ) {
    
    			P = L -> head;
    
    			while ( strncmp ( P -> nome, richiesta, strlen ( richiesta ) ) != 0 && P -> next != NULL )
    				P = P -> next;
    			if ( P -> next == NULL )
    				printf ( "Nome non corretto.\n" );	
    			else {
    				Initialize ();
    				D = P -> dati;
    				Muovi ( D -> data, D -> temp_int );
    				Abbassa_penna ();
    				if ( D -> next == NULL )
    					Alza_penna ();
    				else {
    					do {
    						if ( D -> next -> data == ( D -> data + 1 ) ) {
    							D = D -> next;
    							Muovi ( D -> data, D -> temp_int );
    						}
    						else {
    							Alza_penna ();
    							D = D -> next;
    							Muovi ( D -> data, D -> temp_int );
    							Abbassa_penna ();
    						}
    					}
    					while ( D -> next == NULL );
    				}
    			}
    		}
    		else
    			i  = 1;				
    	}
    	while ( !i );
    
    	return;
    }
    
    FILE *ApriFile( int modo_di_apertura, int azione )
    {
    	/****************************************************************
    	*  MODO DI APERTURA: 1 lo apre in lettura, 2 lo apre in scrittura
    	*  AZIONE: 1 continua a chiedere, 2 esce dal programma
    	****************************************************************/
    	FILE *ingresso;
    	char nome_file[200], risposta[2];
    	int continua = 1;
    
    	while( continua ) {
    		printf( "inserisci il nome del file da elaborare: " );
    		scanf( "%s", nome_file );
    		
    		ingresso = fopen( nome_file, "r" );
    		
    		if ( ingresso == NULL ) {
    			if ( modo_di_apertura == 1 )
    				fprintf( stderr, "Attenzione! Non posso aprire il file %s.\n", nome_file );
    			else {
    				ingresso = fopen( nome_file, "w" );
    				if( ingresso == NULL )
    					fprintf( stderr, "Attenzione! Non posso creare il file %s.\n", nome_file );
    				else
    					printf( "File creato.\n" );
    			}
    		}
    		else {
    			if( modo_di_apertura == 1 )
    				printf( "File aperto in lettura.\n" );
    			else {
    				fclose( ingresso );
    				ingresso = NULL;
    				printf( "Attenzione! Esiste già un file con quel nome si vuole sovrascriverlo? [s/N] " );
    				scanf( "%s", risposta );
    				if ( ( strcmp ( risposta, "s" ) == 0 ) || ( strcmp( risposta, "S" ) == 0 )) {
    					ingresso = fopen( nome_file, "w" );
    					if( ingresso == NULL )
    						fprintf( stderr, "Attenzione! Non posso sovrascrivere il file.\n" );
    					else
    						printf( "File %s sovrascritto.\n", nome_file );
    				}
    			}
    		}
    		if( ( ingresso == NULL ) && ( azione == 1 ) ) 
    			continua = 1;
    		else 
    			continua = 0;
    	}
    	if( ingresso == NULL )
    		exit( 1 );
    	
    	return ( ingresso );
    }
    
    void StampaLista ( LIST * L )
    {
    	FILE * f;
    	PAZIENTE * P;
    	DATI * D;
    	int i = 0, j = 0;
    
    	P = L -> head;
    	D = P -> dati;
    
    	f = ApriFile ( 2, 1 );
    
    	while ( !i ) {
    		fprintf ( f, "%s\n", P -> nome );
    		while ( !j ) {
    			fprintf ( f, "%5d%5d\n", D -> data, D -> temp_int );
    			if ( ( D = D -> next ) == NULL )
    				j = 1;
    		}
    		fprintf ( f, "\n" );
    		if ( ( P = P -> next ) == NULL )
    			i = 1;
    	}
    	
    	fclose ( f );
    
    	return;
    }
    Qualcuno saprebbe darmi una mano nello scovare l'errore?

    Grazie per l'attenzione...

  2. #2
    Un errore evidente è in questa if
    codice:
    		if ( i = 1 ) { // <------<<<
    			if ( ( D = ( DATI * ) malloc ( sizeof ( DATI ) ) ) != NULL ) {
    				T = S -> dati;
    				while ( T -> next != NULL )
    					T = T -> next;
    In cui effettui un'assegnazione (=) invece che un confronto (==).
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    2
    Ok! Grazie mille!!! Nonostante l'abbia riletto parecchie volte non mi ero accorto di questo errore, ora dopo qualche correzione finalmente funziona. ! Grazie ancora...

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.