C26-Esercizio 3

Avatar Paolo Godino

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

Tagged in :

Avatar Paolo Godino

Lascia un commento