All pastes #65417 Raw Edit

Someone

public text v1 · immutable
#65417 ·published 2006-06-14 09:02 UTC
rendered paste body
/*
Esercitazione di laboratorio numero 2 
------------------------------------

Esercizio 1 
----------
Gestione di liste complesse. Un file contiene le informazioni relative a un 
gruppo di studenti che hanno sostenuto un determinato esame. Per ciascuno 
studente il file contiene (su un'unica riga): 
* il cognome (stringa di al massimo 20 caratteri, e.g., Rossi, Bianchi, etc.) 
* il voto (valore reale compreso tra 0 e 30, e.g., 15.5, 28, etc.) 

I dati non sono ordinati in alcun modo prestabilito. Si osservi, inoltre, che 
il numero di studenti non e' noto a priori. Si scriva un programma C in grado 
di ricevere ed eseguire ripetutamente ciascuno dei seguenti 
comandi (così come riportati): 
* leggi <nomeFile> legge il file di nome <nomeFile> avente la struttura 
  precedentemente analizzata e ne memorizza il contenuto in una lista 
  concatenata. Non esiste alcuna richiesta sull'ordine di inserzione degli 
  elementi nella lista. 
* scriviN <nomeFile> memorizza la lista nel file di nome <nomeFile> con formato 
  analogo a quello definito in precedenza, ma ordinato per nome in maniera 
  lessicografica crescente. Se <nomeFile>=="stdout" visualizza il file su video. 
* scriviV <nomeFile> memorizza la lista nel file di nome <nomeFile> con formato 
  analogo a quello definito in precedenza, ma ordinato per voto in maniera 
  numerica ascendente. Se <nomeFile>=="stdout" visualizza il file su video. 
* fine termina il programma.

VINCOLI E RESTRIZIONI 
--------------------
Il programma NON deve effettuare un ri-ordinamento dei dati per ciascuna esecuzione dei 
comandi scriviN e scriviV, bensi' la struttura utilizzata DEVE permettere direttamente 
l'accesso, e quindi la memorizzazione, delle informazioni con l'ordine richiesto. Questo 
puo' essere ottenuto mediante una struttura a lista in cui gli elementi posseggono due 
puntatori. In tale struttura, ciascun elemento appartiene a due liste logicamente separate, 
ma fisicamente compenetrate: la prima lista, ordinata per nome, si ottiene seguendo il 
primo dei due puntatori; la seconda lista, ordinata per voto, si ottiene seguendo il 
secondo puntatore.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"

#define MAX_LEN 20

typedef struct nodo{
	char nome[40];
	float voto;
	struct nodo *next;
}dato;

void add_nodo(dato **head, dato *toadd) {
	dato *tmp;
	tmp=*head;
	
	if (tmp==NULL) {
		*head=toadd;
		return;
	}
	
	while (tmp->next!=NULL)
		tmp=tmp->next;
	tmp->next=toadd;
	
	return;
}

void print_lista(dato **lista){
	dato *tmp;
	tmp=*lista;

	while (tmp!=NULL){
		printf("%s\t%f\n",tmp->nome, tmp->voto);
		tmp=tmp->next;
	}
	return;
}


void leggi(char *file, dato **lista){
FILE *fp;
char buf[255],nome[40];
float voto;
dato *x;
	
	fp = m_fopen(file,"r");
	
	while (!feof(fp)){
		fgets(buf,sizeof(buf),fp);	
		sscanf(buf,"%s %f", nome, &voto);
		x=(dato *)malloc(sizeof(dato));
		
		strncpy(x->nome, nome, sizeof(nome));
		x->voto=voto;
		x->next=NULL;
		
		add_nodo (&lista,x);
		
	}
	fclose(fp);
	print_lista(&lista);
return;
}


int main (void){
char com[MAX_LEN],bus[MAX_LEN];
dato *lista=NULL, *ord_nome=NULL, *ord_voto=NULL;
	
while(1){
	printf("sh:~$ ");
	
	scanf("%s", com);
	
	if (strcmp(com, "exit")==0) exit(0);

	else scanf("%s", bus);
	//printf("%s", bus);
	//printf("%s %s", com, bus);

	if (strcmp(com, "leggi")==0) leggi(bus,&lista);		
	//if (strcmp(com, "scriviN")==0) scriviN(&lista,&ord_nome);
	//if (strncmp(com, "scriviV")==0) leggi(bus);
	else fprintf(stderr, "Command not found.\n");
}

	
//printf("com:%s\nbus:%s\nSei contento???", com, bus);
	
return 0;
}