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 #53895 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Fateci sapere cosa ha dato, a me tocca giovedì...

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 #53912 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
david.ino il tuo programma ha qualche cosa che non va, se provi ad esempio a dare in input i valori 7 e 50 ottieni solo 4 studenti :?

Io ho fatto così l'esercizio:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

typedef struct studente{
	char cognome[21];
	int eta;
	float media;
} studente;

studente *MiglioriEnneStudenti(char *filename, int numscelti, int etamax){
	studente *ret = (studente *)malloc(sizeof(studente)*numscelti);
	int fd = open(filename, O_RDONLY); 
	int N, i, j;
	if(fd < 0)
		printf("Errore nell'apertura del file\n");
	//trovo il numero di record nel file
	N = lseek(fd, 0, SEEK_END);
	N = N / sizeof(studente);
	//leggo il file
	lseek(fd, 0, SEEK_SET);
	studente *st = (studente *)malloc(sizeof(studente)*N);
	for(i = 0; i < N; i++){
		read(fd, &st[i], sizeof(studente));
	}
	for(i = 0; i < N; i++){
		printf("%s %d %f\n", st[i].cognome, st[i].eta, st[i].media);
	}
	
	//prendo studenti con la medià più alta ed eta < etamax
	float media_max;
	for(i = 0; i < numscelti; i++){
		media_max = 0.0;
		for(j = 0; j < N; j++){
			if(((st[j].media) > media_max)  && (st[j].eta < etamax)) {
				media_max = st[j].media;
			}
		}
		for(j = 0; j < N; j++){
			if(st[j].media == media_max){
				ret[i] = st[j];
				st[j].media = 0.0;
				printf("%s %d %f\n", ret[i].cognome, ret[i].eta, ret[i].media);
			}
		}
	}
	return ret;
}
	
int main(int argc, char **argv){
	
	int fd, i;
	//costruisco file coi record
	studente st[8] = { {"Rossi", 24, 24.56}, 
				{"Bianchi", 23, 18.2},
				{"Verdi", 30, 29.65},
				{"Blu", 22, 28.30},
    				{"Rosa", 19, 27.3},
				{"Gialli", 25, 27.3},
				{"Neri", 24, 25.56},
				{"Viola", 21, 30.0}};
				
	fd = open("studenti", O_CREAT|O_WRONLY);
	if(fd < 0)
		printf("Errore nella creazione/apertura del file\n");
	for(i = 0; i < 8; i++)
		write(fd, &st[i], sizeof(studente));
	printf("Scrittura completata con successo!\n");
	
	studente *res = (studente *)malloc(sizeof(studente)*atoi(argv[1]));
	res = MiglioriEnneStudenti("studenti", atoi(argv[1]), atoi(argv[2]));
	
	printf("Stampo risultato della ricerca:\n");
	for(i = 0; i < atoi(argv[1]); i++)
		printf("Studente %s    Età %d    Media %f\n", res[i].cognome, res[i].eta, res[i].media);
				
	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 #53921 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Ecco l'esercizio di oggi:
Il programma riceve dalla linea di comando il nome di un file ed un intero N. La lunghezza del file e' un multiplo di N. Il programma costruisce avvalendosi della funzione rand() una pemutazione di N e la salva in una opportuna struttura di dati. Successivamente, il programma crea un file "<nome file>_crypt" i cui blocchi di N byte sono permutati in accordo con la permutazione generata.
Esempio: N=4, nome file="temp", permutazione=3012, contenuto dei primi 8 byte di "temp" =abcdefgh.
==> contenuto dei primi 8 byte di "temp_crypt"=dabchefg

Il programma usa la stessa permutazione agendo questa volta sul file "temp_crypt" per costruire il file "temp_decrypt": se tutto funziona nel modo giusto, i file "temp" e "temp_decrypt" devono risultare identici.

Per testare il programma, si suggerisce di registrare nel file "temp" soltanto caratteri ASCII. Ad esempio: "abcdefghabcdefgh..." senza fare uso di caratteri di controllo quali "\n".

Questo e' quanto... a me e' sembrato abb complicato...

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 #53923 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
:shock: :shock:

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 #53924 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Ad una prima lettura sembrava complicato, ma forse non lo è poi tantissimo.

Qui intendi permutazione di N bytes?

"Il programma costruisce avvalendosi della funzione rand() una pemutazione di N e la salva in una opportuna struttura di dati."

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 #53931 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007

Ad una prima lettura sembrava complicato, ma forse non lo è poi tantissimo.

Qui intendi permutazione di N bytes?

"Il programma costruisce avvalendosi della funzione rand() una pemutazione di N e la salva in una opportuna struttura di dati."


Permutazione di N = permutazione degli N numeri tra 0 e N-1.
No, il testo, su questo, non era chiaro...

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