[C++] Esercizio lettura/scrittura file con ordinamento: Per favore ditemi se è sbagliato o meno

Desideri ricevere supporto tecnico informatico? Hai qualche domanda di ambito informatico? Pubblicala qua!
Rispondi
Gennischiazz
Messaggi: 2
Iscritto il: 29/03/2021, 21:20

Vorrei porre una domanda, durante questa settimana la mia prof ci ha assegnato degli esercizi da fare tra cui uno un pochino complicato per il mio livello di informatica.
Questo programma un po’ complicato richiedeva di pre impostare degli elementi in maniera ordinata crescente in un File di nome Alfa.txt per poi aggiungere un valore N dall’utente, fatto ciò questa serie di numeri (compreso il numero N inserito dall’utente) deve essere trasportato in un altro file chiamato Beta.txt ri-ordinandolo una seconda volta. Pongo un esempio:

Valori pre impostati dal programmatore:

Codice: Seleziona tutto

0, 5, 10, 15, 20, 25, 30, 35, 40
Valore N inserito dall’utente:

Codice: Seleziona tutto

21
Fatto ciò potete notare che i valori pre impostati come già detto prima sono in maniera ordinata crescente.

Nel file Alfa.txt troveremo dunque:

Codice: Seleziona tutto

0, 5, 10, 15, 20, 25, 30, 35, 40, 21
Ora secondo il mio algoritmo di ordinamento il risultato dovrà essere in Beta.txt:

Codice: Seleziona tutto

0, 5, 10, 15, 20, 21, 25, 30, 35, 40
Il problema risiede nel fatto che io abbia aggiunto i valori pre impostati non dal File stesso ma dal programma che ho creato facendo un semplice array di tot elementi nel quale ci metto i miei elementi. Poi ho fatto un cout ma con il file quindi

Codice: Seleziona tutto

Alfa<<valori[ i ]<<‘\t’;
( dove qui vado a mettere i valori nel file Alfa.txt), ora la Mia domanda è:

È sbagliato che io abbia aggiunto i valori pre impostati nel File utilizzando l’array anziché aprire il file e scrivere a mano i valori ?
Specifico che il testo dell’esercizio richiede di inserirli dal File di testo e non dal programma, ma siccome quando facevo l’ordinamento avevo bisogno del mio array per ordinare i valori ho preferito inserirli appunto dal programma e non dal File stesso.

Un’altra cosa che non so se si possa fare dato che il testo dell’esercizio non lo richiedere, ossia:
Invece di far inserire il numero N dall’utente in una variabile semplice “N”, ho fatto in modo che aggiungesse l’elemento N direttamente da una delle posizioni dell’array che ho ricavato mettendo nel

Codice: Seleziona tutto

for (i=0-1 ; i<10 ; i++)
(Questo for l’ho messo subito dopo l’ordinamento, alla fine del programma).

Detto ciò, è considerato errore non seguire del tutto la traccia dell’esercizio nonostante il mio programma faccia quello che dovrebbe fare?
Avatar utente
Dragone2
Amministratore
Messaggi: 114
Iscritto il: 30/07/2014, 18:35
Località: Italia
Contatta:

Ciao,
Ok per gli elementi pre-ordinati, credo che l'esercizio servisse semplicemente a farti leggere e scrivere su un file applicando un algoritmo di ordinamento.
Quindi penso che avresti dovuto aprire il blocco note, salvare un file di testo con dentro i vari valori e caricarli nel tuo array.
È abbastanza semplice da fare questa prima parte, basta che utilizzi un qualcosa per separare i vari valori. Generalmente si sfrutta il fatto di andare a capo, quindi normalmente avresti un file così:

Codice: Seleziona tutto

0
5
10
15
20
25
30
35
40
Quindi, avresti una cosetta del genere:

Codice: Seleziona tutto

#include <iostream>
#include <fstream>
int main(int argc, char * argv[])
{
    std::fstream alpa("C:\\Alpha.txt", std::ios_base::in);

    int valoriLetti[10];
    int numero, i = 0;
    while (alpha >> numero)
    {
    	cout << "Ho letto: " << numero << endl;
        valoriLetti[i] = numero;
        i++;
    }

    getchar();

    return 0;
}
Questo programma apre il file presente in C:\Alpha.txt e legge riga per riga i numeri, inserendoli nel vettore e facendoti vedere il valore che ha letto dal file.
Partendo da qui, va poi ampliato chiedendo all'utente quale valore desidera inserire e quindi devi andare a generare il file Beta.txt riordinando il vettore.

E con questo diciamo che ho risposto alla tua prima domanda, quindi se dovessimo attenerci al testo dell'esercizio, dando per scontato che doveva essere volto a far leggere e scrivere un file, sì, è sbagliato pre-impostare i valori a programma, perché se volessi cambiarli e metterci "1, 2, 3..." ecc. ti toccherebbe ricompilare il programma.
E il concetto è sbagliato. Se cambia il dato, il programma deve rimanere invariato, perché la logica che c'è dietro non cambia.

Per la tua seconda domanda, invece, non è sbagliato logicamente, ma non è una buona pratica. Ti rigiro la domanda, per provare a farti capire: cosa succede se al posto di un numero, in fase di inserimento, ci inserisci una lettera, una frase o comunque qualcosa di inaspettato?
Ecco che si verifica un'eccezione e potenzialmente potresti andare a perdere i dati che avevi memorizzato finora.

Tendezialmente è sempre bene tenere i dati "puliti" separati dall'input dell'utente, che può essere "sporco" come nell'esempio che ti ho appena fatto.
Con una variabile separata, dovresti riuscire a gestire meglio eventuali eccezioni.

Al di là di questa premessa, non ho capito cosa volevi fare. L'esercizio alla fine si scompone in:
  • Lettura file con elenco di valori ordinati;
  • Richiesta input all'utente;
  • Salvataggio valori ordinati con l'input dell'utente su file;
Se dopo aver recuperato i valori ordinati, hai richiesto l'input all'utente e lo hai salvato direttamente in fondo al vettore, può andar bene, ma sia per le premesse che ti ho fatto, sia perché se ti venisse richiesto di leggere più righe dal file e quindi di ampliare il vettore, ecco che ogni volta dovresti ricordarti di farlo più grande di almeno 1 elemento, in più anche a occhio non è subito chiaro ciò che stai facendo.

Considera ad esempio di dover leggere il codice di un tuo compagno di classe: preferiresti riuscire a capirlo al volo, magari anche tramite l'ausilio di variabili con dei nomi che facilitino la lettura, oppure preferiresti dover stare lì a fare il debug del codice per capire cosa voleva fare il tuo compagno di classe?

Quindi sostanzialmente, se non hai fatto le cose che ti ho elencato prima, l'esercizio non può considerarsi completato, sempre che io abbia capito bene ciò che stai scrivendo :lol:
Immagine
Gennischiazz
Messaggi: 2
Iscritto il: 29/03/2021, 21:20

Ti ringrazio tantissimo di questo aiuto che mi hai dato e di aver risposto alle mie domande in maniera molto chiara e completa, una cosa che però che non capisco come si faccia è quella di andare ad inserire il valore, che ho messo nella variabile semplice N, nella variabile strutturata ( perché poi deve essere tutto unito per portare il tutto nel file Beta.txt no?)
Avatar utente
Dragone2
Amministratore
Messaggi: 114
Iscritto il: 30/07/2014, 18:35
Località: Italia
Contatta:

Ciao,
Il valore lo salvi nella variabile N, dopodiché dovresti fare un ciclo in cui provi a capire dove va posizionato. Questo lo puoi fare tranquillamente nel ciclo che crea il file 'Beta.txt', perché parti da un array di elementi già ordinati e quindi puoi inserire un semplice if che va a capire tra quali valori va inserito N o se va inserito in cima o in fondo.
Immagine
Rispondi