Buon giorno a tutti
ho da risolvere un tema d'esame nel quale mi è richiesto di creare un programma in C che attivato con 3 parametri da linea di comando
1. nome del file
2. numero
3. numero1
legga un file che contiene una serie di numeri interi e, selezionati quelli inclusi fra i due inseriti da linea di comando, stabilisca se siano "primi troncabili a destra" cioè numeri primi che continuano ad essere primi se troncati di una cifra fino all'ultima possibile. Esempio: 317 . lui è primo, 31 pure e 3 pure. Dopodichè stampi in un file dal nome "numeri_ filtrati" quelli trovati.
Il mio approccio è stato il seguente:
leggo un numero, se non è incluso nei due estremi immessi da linea di comando esco e leggo un'altro numero, altrimenti verifico se è primo. Se non lo è esco e ne leggo un altro. Se lo è , lo divido per 10( lavorando con gli interi è come troncare l'ultima cifra no?) e ripeto fino a che il numero non diventa 0 (nel caso di primo ,per esempio, arrivati a 3 otterrei 0.3 che con gli int è 0). Se l'opportuno flag è rimasto invariato stampo il numero.
Adesso , oltre al fatto che il programma non va per ragioni a me ignote, c'è (immagino) un altro problema che permarrebbe anche al di là del mio algoritmo: non sapendo quante righe ha il file (il testo dice espressamente di non fare alcuna assunzione arbitraria in merito) non posso dimensionare una struttura dati per contenere gli eventuali numeri trovati quindi nel codice che segue ho aperto il file di output in modalità scrittura a monte per riempirlo numero a numero, solo che , se nessun numero rispetta i parametri il file non deve essere aperto...a me piacerebbe creare un vettore nel quale accumulare i numeri e nel caso non sia vuoto aprire il file e stampare ma non so come potrei fare .
Chiaramente non sono permesse allocazioni dinamiche della memoria che non fanno parte del corso.
In ultimo la mia idea per "congelare" il numero letto qualora superi il controllo di aderenza ai parametri era assegnarlo ad una seconda variabile , dato che poi procederò a dividerlo fino a renderlo 0. Questa cosa tuttavia non mi convince del tutto.
Ecco il codice e grazie in anticipo:
codice:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{ FILE* fp;
FILE* fout;
int estr1, estr2, i, n, N, primo=0;
//controlli di correttezza input
if(argc!=4){
printf("errore: parametri insufficienti");
return -1;
}
fp=fopen(argv[1], "r");
if(fp==NULL){
printf("errore: file non aperto correttamente");
return -1;
}
fout=fopen("numeri_filtrati.txt", "w");
if(fout==NULL){
printf("errore: file non aperto correttamente");
return -1;
}
//lettura input
sscanf(argv[2], "%d", &estr1 );
sscanf(argv[3], "%d", &estr2);
//lettura file
while(fscanf(fp, "%d", &n)!=EOF){
//controllo estremi
if(n>=estr1 && n<=estr2){
N=n; //n lo andrò a modificare per vedere se è primo tronc
primo=1;
while(n!=0 && primo==1){
for(i=2;n%i!=0;i++); //controllo primo
if(i==n) //se il controllo va a buon fine, tolgo l'ultima cifra e continuo
n/=10;
else
primo=0; //esco e leggo il prossimo numero dal file
} //chiuso while
} //chiuso if
if(primo==1)
fprintf(fout, "%d\n", N); //stampa nel file nuovo;
} //chiuso while lettura
//chiusura file
fclose(fp);
fclose(fout);
system("PAUSE");
return 0;
}