Scrivi un programma che generi un numero random (compreso tra 100 e 200) di numeri interi e li salvi su un file formattato. Quindi vengano ripresi da una funzione che li ordini in due nuovi file, una volta in modo crescente e l’altra in modo decrescente.
Soluzione:
main.c
/******************************************************************************
Scrivi un programma che generi un numero random (compreso tra 100 e 200) di
numeri interi e li salvi su un file formattato. Quindi vengano ripresi da una
funzione che li ordini in due nuovi file, una volta in modo crescente e l’altra
in modo decrescente.
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "test.h"
#define MIN_NUMS 100
#define MAX_NUMS 200
int compara_creascente(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int compara_descrescente(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}
void scrittura() {
FILE* file1;
int num_to_write = MIN_NUMS + rand() % (MAX_NUMS - MIN_NUMS + 1);
int numbers[num_to_write];
for (int i=0; i < num_to_write; ++i) {
numbers[i] = rand() % 1000;
}
if ((file1 = fopen("rand_num.dat", "wb")) != NULL) {
int num_el = fwrite(numbers, sizeof(int), num_to_write, file1);
printf("Elementi scritti nel file %d\n", num_el);
fclose(file1);
} else {
printf("Problema nell'apertura del file\n");
}
}
int main() {
FILE *file1, *file_crescente, *file_decrescente;
srand(time(NULL));
// Genera i numeri e scrive il file
//scrittura();
// Lettura del file
int array_num[MAX_NUMS];
int num_el;
if ((file1 = fopen("rand_num.dat", "rb")) != NULL) {
num_el = fread(array_num, sizeof(int), MAX_NUMS, file1);
printf("Elementi letti dal file %d\n", num_el);
fclose(file1);
} else {
printf("Problema nell'apertura del file\n");
return -1;
}
qsort(array_num, num_el, sizeof(int), &compara_creascente);
if ((file_crescente = fopen("crescente.dat", "wb")) != NULL) {
fwrite(array_num, sizeof(int), num_el, file_crescente);
fclose(file_crescente);
} else {
printf("Problema nell'apertura del file crescente\n");
}
qsort(array_num, num_el, sizeof(int), &compara_descrescente);
if ((file_decrescente = fopen("decrescente.dat", "wb")) != NULL) {
fwrite(array_num, sizeof(int), num_el, file_decrescente);
fclose(file_decrescente);
} else {
printf("Problema nell'apertura del file derescente\n");
}
if (test_sort_asc("crescente.dat", num_el) == 0) printf("Test ordine crescente OK\n");
if (test_sort_asc("decrescente.dat", num_el) == 0) printf("Test ordine crescente OK\n");
return 0;
}
test.h
#ifndef _TEST_H
#define _TEST_H
int test_sort_asc(const char* filename, int dim);
#endif
test.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
int test_sort_asc(const char* filename, int dim) {
FILE *file_crescente;
int array_num[dim];
if ((file_crescente = fopen(filename, "rb")) != NULL) {
fread(array_num, sizeof(int), dim, file_crescente);
fclose(file_crescente);
for (int i=0; i<dim-1; ++i) {
if (array_num[i] > array_num[i+1]) {
printf("Elemento in posizione %d non in ordine %d %d\n", i+1, array_num[i], array_num[i+1]);
return -1;
}
}
} else {
printf("Problema nell'apertura del file crescente\n");
return -2;
}
return 0;
}




Lascia un commento
Devi essere connesso per inviare un commento.