fbpx
Skip to main content

LINUX AVANZATO 2007

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53160 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007

Raga ho parlato con il prof e se non ho capito male se fai la prova al calcolatore il 13, 14 o 18 e vieni steccato te la fa rifare dopo il 20... Certo la figura di m***a non è mai piacevole però...

Prenotarsi o non prenotarsi..... questo è il dilemma!

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53170 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007

1) legge dalla riga di comando un valore m < 8.

2) costruisce un array anagrafico[] di 8 record. Ogni record include 2 campi: cognome (array di 30 byte), nome (array di 30 byte).
Ogni record presente in anagrafico[] ha una combinazione cognome-nome diversa dalle altre.

3) registra in un vettore hash[m] di puntatori a liste tutti i record di anagrafico. Usa la funzione hash_func() descritta in seguito (passando come parametri un cognome, un nome ed il valore m) per ottenere l'indice i del vettore hash[]. Nel caso di "sinonimi" (due diverse coppie cognome-nome mappate dalla funzione hash_func() nello stesso indice i), il record viene aggiunto nella lista di record puntata da hash.

4) stampa il contenuto delle m liste di hash[].


La funzione hash_func() da utilizzare è la seguente:

int hash_func(char *stringa1, char *stringa2, int m) {
int i, val = 0;

for(i = 0; i < 30; i++) {
if(*(stringa1+i) == '\0')
break;
val = val ^ *(stringa1+i);
}

for(i = 0; i < 30; i++) {
if(*(stringa2+i) == '\0')
break;
val = val ^ *(stringa2+i);
}

val = val % m;
return val;
}


Ragazzi potete per caso postare la soluzione di questo esercizio??
E' tutto il pomeriggio che ci provo sto diventando scemo!

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53171 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
#include <stdlib.h>
#include <stdio.h>

//funzione hash ausiliaria
int hash_func(char *stringa1, char *stringa2, int m) {
   int i, val = 0;
           
   for(i = 0; i < 30; i++) {
      if(*(stringa1+i) == '\0')
         break;
      val = val ^ *(stringa1+i);
   }

   for(i = 0; i < 30; i++) {
      if(*(stringa2+i) == '\0')
         break;
      val = val ^ *(stringa2+i);
   }

   val = val % m;
   return val;
}

//struttura anagrafica
typedef struct rec {
   char nome[30];
   char cognome[30];
} record;

//elemento lista
typedef struct ns {
   record rec;
   struct ns *next;
}node;

//funzione per inserimento in testa alla lista
node *list_add(node **p, record new_rec) {
   node *n = (node *)malloc(sizeof(node));
   n->next = *p;
   *p = n;
   n->rec = new_rec;
   return n;
}

int main(int argc, char **argv) {
   
   if(argv[1] == NULL || argc != 2) {
      printf("Numero parametri errato!!\n");
      exit(0);
   }

   int m = atoi(argv[1]);
   
   //allocazione dinamica voluta da bovet ma essenzialmente inutile
   node **hash = (node **)malloc(sizeof(node)*m);
   int i;
   
   if(m >= 8 || m < 1) {
      printf("Il numero inserito come parametro è errato!! Inserire un numero compreso fra 1 e 7\n");
      exit(0);
   }
   
   record anagrafico[8] = { {"mario", "rossi"}, {"paolo", "verdi"}, {"stefano", "bianchi"}, {"fabio", "neri"}, {"daniele", "azzurri"}, {"francesco", "gialli"}, {"franco", "grigi"}, {"fabrizio", "marroni"} };
   
   printf("\nStampa dell'array anagrafico\n\n");
   for(i = 0; i < 8; i++) {
      printf("%d: Nome: %s  Cognome: %s\n", i + 1, anagrafico[i].nome, anagrafico[i].cognome);
   }
   
   //inserimento dell'anagrafe nelle varie liste
   for(i = 0; i < 8; i++) {
      int j = hash_func(anagrafico[i].nome, anagrafico[i].cognome, m);
      list_add(&hash[j], anagrafico[i]);
   }
   
   printf("\n\nStampa delle %d liste di hash[]\n\n", m);
   
   for(i = 0; i < m; i++) {
      printf("Lista %d\n", i + 1);
      if(hash[i] == NULL)
         printf("Nessun elemento mappato in lista %d!\n", i + 1);
      while(hash[i] != NULL) {
         printf("Nome: %s  Cognome: %s\n", (hash[i]->rec).nome, (hash[i]->rec).cognome);
         hash[i] = hash[i]->next;
      }
      printf("\n");
   }
   
   free(hash);
   
   return 0;
} 

Stava in qualche pagina dietro del forum! La soluzione dell'esercizio con la matrice che ho postato qualche messaggio fa non ce l'ha nessuno?? Mi sarebbe proprio di aiuto!

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53172 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Il bello è che mi ero pure messo a cercarlo ...

vabbe grazie lo stesso :lol: :lol:

Per quello della matrice appena lo faccio lo posto!

Ciao ciao

Ah ma avete notato che il sito per prenotarsi non funziona :x :x

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53174 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
MATRICE TRASPOSTA (senza mmap)
/*
1-Piglia due argomenti interi R e C da riga di comando.
2-Crea una matrice RxC di unsigned int e salvali (occhio, quando non lo specifica di solito non intende in ASCII ma proprio in binario. Ho visto che questo ha creato alcuni problemi oggi) in un file.
3-Leggi il file appena salvato e salva la matrice trasposta in un altro file.
*/

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>


int main(int argc, char* argv[]) {
	
	int fd, fdt;
	int R, C;
	char *path, *patht;
	int i, j;
	unsigned int num;
	int offset;

	if (argc < 5) {
		printf("Usage: %s R C src_path dst_path\n", argv[0]);
		exit(1);
	}

	R = atoi(argv[1]);
	C = atoi(argv[2]);
	path = argv[3];
	patht = argv[4];

	fd = open(path, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	if (fd == -1) {
		printf("Errore in open %s\n", path);
		exit(1);
	}
	fdt = open(patht, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	if (fdt == -1) {
		printf("Errore in open %s\n", patht);
		exit(1);
	}

	/* crea la matrice */
	srand(time(0));
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			num = (rand() % 9) + 1;
			write(fd, &num, sizeof(num));
		}
	}

	/* stampa la matrice appena creata */
	printf("\nLa matrice appena creata e'\n");
	lseek(fd, 0, SEEK_SET);	
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			read(fd, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}

	/* inizializza la trasposta */
	num = 0;
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			write(fdt, &num, sizeof(num));
		}
	}

	/* stampa la matrice trasposta inizializzata */
	printf("\nLa matrice trasposta e' inizializzata nel seguente modo: \n");
	lseek(fdt, 0, SEEK_SET);	
	for(i = 0; i < C; i++) {
		for (j = 0; j < R; j++) {
			read(fdt, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}

	/* crea la trasposta */
	lseek(fd, 0, SEEK_SET);	
	lseek(fdt, 0, SEEK_SET);	
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			read(fd, &num, sizeof(num));
	        printf("Ho letto %u e lo metto nella posizione %d\n", num, j*R+i);
			lseek(fdt, (j*R+i)*sizeof(num), SEEK_SET);
			write(fdt, &num, sizeof(num));
			lseek(fdt, -1, SEEK_CUR);
			read(fdt, &num, sizeof(num));
	        printf("Ho appena scritto %u in posizione %d\n", num, j*R+i);
		}
	}

	/* stampa la matrice trasposta */
	printf("\nLa matrice trasposta e'\n");
	lseek(fdt, 0, SEEK_SET);	
	for(i = 0; i < C; i++) {
		for (j = 0; j < R; j++) {
			read(fdt, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}
	
	close(fd);
	close(fdt);
		
	return 0;
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 2 Mesi fa #53175 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
MATRICE TRASPOSTA (con mmap)
/*
1-Piglia due argomenti interi R e C da riga di comando.
2-Crea una matrice RxC di unsigned int e salvali (occhio, quando non lo specifica di solito non intende in ASCII ma proprio in binario. Ho visto che questo ha creato alcuni problemi oggi) in un file.
3-Leggi il file appena salvato e salva la matrice trasposta in un altro file.
*/


#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <sys/mman.h>

int main(int argc, char* argv[]) {
	
	if (argc < 5) {
		printf("Usage: %s R C src_path dst_path\n", argv[0]);
		exit(1);
	}

	int fd, fdt;
	int R, C;
	char *path, *patht;
	int i, j;
	unsigned int num;
	int offset;

	R = atoi(argv[1]);
	C = atoi(argv[2]);
	path = argv[3];
	patht = argv[4];

	fd = open(path, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	if (fd == -1) {
		printf("Errore in open %s\n", path);
		exit(1);
	}
	fdt = open(patht, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	if (fdt == -1) {
		printf("Errore in open %s\n", patht);
		exit(1);
	}

	/* crea la matrice */
	srand(time(0));
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			num = (rand() % 9) + 1;
			write(fd, &num, sizeof(num));
		}
	}

	/* stampa la matrice appena creata */
	printf("\nLa matrice appena creata e'\n");
	lseek(fd, 0, SEEK_SET);	
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			read(fd, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}

	/* inizializza la trasposta */
	num = 0;
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			write(fdt, &num, sizeof(num));
		}
	}

	/* stampa la matrice trasposta inizializzata */
	printf("\nLa matrice trasposta e' inizializzata nel seguente modo: \n");
	lseek(fdt, 0, SEEK_SET);	
	for(i = 0; i < C; i++) {
		for (j = 0; j < R; j++) {
			read(fdt, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}

	/* crea la trasposta */
	lseek(fd, 0, SEEK_SET);	
	lseek(fdt, 0, SEEK_SET);	
	unsigned int *p0, *pt;
	p0 = (unsigned int*)mmap(NULL, R*C, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	pt = (unsigned int*)mmap(NULL, R*C, PROT_READ|PROT_WRITE, MAP_SHARED, fdt, 0);
	if (*p0 == -1) {
		printf("Errore in mmap\n");
		exit(1);
	}
	for(i = 0; i < R; i++) {
		for (j = 0; j < C; j++) {
			pt[j*R+i] = *p0;
			p0++;
	        //printf("Ho appena scritto %u in posizione %d\n", pt[j*R+i], j*R+i);
		}
	}
	

	/* stampa la matrice trasposta */
	printf("\nLa matrice trasposta e'\n");
	lseek(fdt, 0, SEEK_SET);	
	for(i = 0; i < C; i++) {
		for (j = 0; j < R; j++) {
			read(fdt, &num, sizeof(num));
			printf("%u ", num);
		}
		printf("\n");
	}
	
	close(fd);
	close(fdt);
		
	return 0;
}

Si prega Accedi o Crea un account a partecipare alla conversazione.