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 #53176 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Esercizio su hashmap...
/*
Il programma esegue le seguenti azioni:

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[i].

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


La funzione hash_func() da utilizzare è la seguente:

*/

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

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;
}

struct record {
	char cognome[30];
	char nome[30];
};

struct elem {
	struct record rec;
	struct elem* next;
};

int main(int argc, char* argv[]) {
	if (argc < 2) {
		printf("Usage: %s m\n", argv[0]);
		exit(0);
	}

	int m = atoi(argv[1]);
	int i = 0;
	int index = 0;
	struct record anagrafico[8];

	sprintf(anagrafico[0].cognome, "Iovine");
	sprintf(anagrafico[0].nome, "Francesco");
	sprintf(anagrafico[1].cognome, "Esposto");
	sprintf(anagrafico[1].nome, "Luca");
	sprintf(anagrafico[2].cognome, "Trisolini");
	sprintf(anagrafico[2].nome, "Marco");
	sprintf(anagrafico[3].cognome, "Sguera");
	sprintf(anagrafico[3].nome, "Savino");
	sprintf(anagrafico[4].cognome, "Dellolio");
	sprintf(anagrafico[4].nome, "Marco");
	sprintf(anagrafico[5].cognome, "Giuseppetti");
	sprintf(anagrafico[5].nome, "Marco");
	sprintf(anagrafico[6].cognome, "Benedetti");
	sprintf(anagrafico[6].nome, "Andrea");
	sprintf(anagrafico[7].cognome, "Nori");
	sprintf(anagrafico[7].nome, "Marco");

	struct elem* hash[m];
	struct elem* e = NULL;
	for (i = 0; i < m; i++) {
		hash[i] = NULL;
	}
	for (i = 0; i < 8; i++) {
		index = hash_func(anagrafico[i].cognome, anagrafico[i].nome, m);
		if (hash[index] == NULL) {
			hash[index] = (struct elem*)malloc(sizeof(struct elem));
			memcpy(&((hash[index])->rec), &(anagrafico[i]), sizeof(struct record));
			(hash[index])->next = NULL;
		}
		else {
			e = hash[index];
			while (e->next != NULL) {
				e = e->next;
			}
			e->next = (struct elem*)malloc(sizeof(struct elem));
			e = e->next;
			memcpy(&(e->rec), &(anagrafico[i]), sizeof(struct record));
			e->next = NULL;
		}
	}

	/* stampa liste di collisione */
	for (i = 0; i < m; i++) {
		printf("\n[%d] ", i);
		e = hash[i];
		if (e == NULL) continue;
		do {
			printf("%s %s -> ", (e->rec).cognome, (e->rec).nome);
			e = e->next;
		} while (e != NULL);
	}
	printf("\n\n");

	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 #53182 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Ci mancava solo che il sito crollasse :(

Io qualche oretta fa ho mandato una mail a bovet e a betti, nessuna risposta finora....

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 #53183 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Scusa franciov ma nella tua soluzione della matrice in realtà scrivi di fila i vari unsigned int.... non è che il prof voleva che andava scritta direttamente la matrice (es: write(fd,&matrice[R][C],sizeof(matrice)) o qualcosa di simile)?

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 #53185 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Grazie franciov!

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 #53207 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Ragazzi fateci sapere come è andata la prova al calcolatore!! (E magari anche il testo della prova...)

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

Di più
18 Anni 2 Mesi fa #53231 da martina inn
Risposta da martina inn al topic LINUX AVANZATO 2007
Prova di programmazione del 13/09/2007

Il programma legge dalla riga di comando una permutazione delle prime 8 cifre '0','1', ...,'7'. Tale permutazione descrive la collocazione su una scacchiera 8x8 di 8 regine. Ad esempio, '7', '3', '5', '0', '2', '4', '1', '6' descrive la seguente collocazione: (riga 0, colonna 7), (riga 0, colonna 3), (riga 2, colonna 5), (riga 3, colonna 0), (riga 4, colonna 2), (riga 5, colonna 4), (riga 6, colonna 1), (riga 7, colonna 6).
Il programma stampa 1 se la collocazione delle regine e' "valida", 0 altrimenti.
Una collocazione di 8 regine e' valida se nessuna regina si trova sulle righe colonne o diagonali associate alle rimanenti regine.
Ad esempio la collocazione descritta da '3', '6', '2', '7', '1', '4', '0', '5' e' valida mentre quella descritta da '3', '2', '6', '7', '1', '4', '5', '0' non lo e'. Il problema posto da Gauss ammette 92 soluzioni diverse.

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