LINUX AVANZATO 2007
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
18 Anni 2 Mesi fa #53160
da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Prenotarsi o non prenotarsi..... questo è il dilemma!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ò...
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
18 Anni 2 Mesi fa #53170
da COM_EASYSOCIAL_GUEST_NAME
Ragazzi potete per caso postare la soluzione di questo esercizio??
E' tutto il pomeriggio che ci provo sto diventando scemo!
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
-
- Visitatori
-
18 Anni 2 Mesi fa #53171
da COM_EASYSOCIAL_GUEST_NAME
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!
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
-
- 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

Per quello della matrice appena lo faccio lo posto!
Ciao ciao
Ah ma avete notato che il sito per prenotarsi non funziona
vabbe grazie lo stesso
Per quello della matrice appena lo faccio lo posto!
Ciao ciao
Ah ma avete notato che il sito per prenotarsi non funziona
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- 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
-
- 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.