Problema di sequenza numeri in un FILE

di il
11 risposte

Problema di sequenza numeri in un FILE

Ho un problema con questo esercizio, con la parte a(il sottoprogramma) credo sia tutto ok, ma non riesco a capire bene la parte b... vi scrivo il mio problema sotto al codice:

a) Scrivere un sottoprogramma analizzanumero che riceve come parametri due numeri interi n e
val. Se il numero n contiene almeno due cifre, il sottoprogramma estrae le prime due cifre da destra e
verifica se tale nuovo numero è multiplo di val. In caso affermativo il sottoprogramma restituisce 1
altrimenti, se il numero composto dalle prime due cifre non è multiplo di val oppure il numero n è
composto da una sola cifra, ritorna 0.
b) Scrivere un programma che apre un file di testo testo.txt contenente una serie di lunghezza
indefinita (zero o più) di numeri interi. Il sottoprogramma analizza ciascun numero mediante il
sottoprogramma analizzanumero specificando la costante 15 come secondo parametro, e stampa a
video ciascuna coppia tale per cui il primo valore soddisfa le condizioni valutate da
analizzanumero mentre il secondo no. Ad esempio, se il file contiene la seguente sequenza:
845 945 460 461 7 15 15 16 0 9
Il programma stamperà a video:
460 461
15 16

#include <stdio.h>
#include <string.h>
#define DIM 16



int analizzanumero(int a, int b){

int conto=0;
int c=0;
	
	if(a<10){
		return 0;
	}
	
	if(a>=10){
		c=a&100;
	}
	
	if(c%b==0){
		conto=1;	
	}else{
		conto=0;
	}
	
	return conto;
}


int main(){
	
	FILE* fp;
	int num;

	
	fp=fopen("numeri.txt","r");
	
	if(!fp){
		printf("errore nell'apertura del file");
		return 1;
	}else{
		
		
		while(fscanf(fp,"%d", &num)!=EOF){
			
			
			if(analizzanumero(num,15)==1){
				printf("%d ", num);		
			}
			
			
		
	}
	
}
	fclose(fp);
	
	return 0;
}
Prima di fare effettivamente la parte b dell'esercizio ho provato a creare un programma che mi stampasse i numeri che fossero un multiplo di 15... soltanto che non fa nemmeno quello, se metto i numeri dell'esempio:
845 945 460 461 7 15 15 16 0 9 mi stampa solo 16, 16 non è un multiplo di 15 come è possibile?
non capisco dove trovare il mio errore...
passando invece a ciò chiede il compito come posso fare per risolverlo? dovrei salvare num in una variabile temporanea e stampare entrambi?

11 Risposte

  • Re: Problema di sequenza numeri in un FILE

    
    int analizzanumero(int a, int b){
            int c;
    	
    	if(a<10)
    		return 0;
    	
            c=a%100;
    
    	if(c%b==0)
    	        return 1;
    	
    	return 0;
    }
    
  • Re: Problema di sequenza numeri in un FILE

    Oh, avevo messo & al posto di % e non me ne ero accorto...

    Parlando ora della consegna come dovrei fare? come faccio a scorrere due numeri alla volta?
  • Re: Problema di sequenza numeri in un FILE

    Qui scorrevi una parola e la sua precedente.

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/confrontare-stringhe-parole-una-frase-t41269.html#p8639181

    Non puoi farlo con i numeri?
  • Re: Problema di sequenza numeri in un FILE

    #include <stdio.h>
    #include <string.h>
    #define DIM 16
    
    
    
    int analizzanumero(int a, int b){
    
    int conto=0;
    int c=0;
    	
    	if(a<10){
    		return 0;
    	}
    	
    	if(a>=10){
    		c=a%100;
    	}
    	
    	if(c%b==0){
    		conto=1;	
    	}else{
    		conto=0;
    	}
    	
    	return conto;
    }
    
    
    int main(){
    	
    	FILE* fp;
    	int num;
    	int temp;
    	int z=0;
    	int temp1=0;
    	int temp2=0;
    	fp=fopen("numeri.txt","r");
    	
    	if(!fp){
    		printf("errore nell'apertura del file");
    		return 1;
    	}else{
    		
    		
    		while(fscanf(fp,"%d", &num)!=EOF){
    			
    			temp1=temp2;
    			temp2=num;
    			z++;
    			if(z>1){
    			
    			if(analizzanumero(num,15)==1 && analizzanumero(temp1,15)==0){
    				printf("%d %d", temp1, num);
    					
    			}
    		}
    				printf("\n");
    			
    	}
    	
    }
    	fclose(fp);
    	
    	return 0;
    }
    ho provato a scrivere questo codice seguendo l'esempio che mi hai proposto e salvando la variabile num in un altre variabili temporanee... ma non funziona comunque, sai dove sbaglio?

    EDIT; ok, sono stupido io (come al solito)... ho invertito l'ordine dell'if...
    così credo sia giusto (nel senso che a me da i risultati giusti):
    #include <stdio.h>
    #include <string.h>
    #define DIM 16
    
    
    
    int analizzanumero(int a, int b){
    
    int conto=0;
    int c=0;
    	
    	if(a<10){
    		return 0;
    	}
    	
    	if(a>=10){
    		c=a%100;
    	}
    	
    	if(c%b==0){
    		conto=1;	
    	}else{
    		conto=0;
    	}
    	
    	return conto;
    }
    
    
    int main(){
    	
    	FILE* fp;
    	int num;
    	int temp;
    	int z=0;
    	int temp1=0;
    	int temp2=0;
    	fp=fopen("numeri.txt","r");
    	
    	if(!fp){
    		printf("errore nell'apertura del file");
    		return 1;
    	}else{
    		
    		
    		while(fscanf(fp,"%d", &num)!=EOF){
    			
    			temp1=temp2;
    			temp2=num;
    			z++;
    			if(z>1){
    			
    			if(analizzanumero(num,15)==0 && analizzanumero(temp1,15)==1){  //avevo invertito questo if
    				printf("%d %d", temp1, num);
    					
    			}
    		}
    				printf("\n");
    			
    	}
    	
    }
    	fclose(fp);
    	
    	return 0;
    }
  • Re: Problema di sequenza numeri in un FILE

    Bravo,
  • Re: Problema di sequenza numeri in un FILE

    Ma perché quell' if(a>=10)? Può mai essere a < 10 in quel punto del codice?
    Hai detto che devi fare esami, guarda che perdi punti per niente su ste cose
  • Re: Problema di sequenza numeri in un FILE

    Hai ragione è effettivamente inutile... spero che all'esame non dia peso a certi errori
  • Re: Problema di sequenza numeri in un FILE

    Non contarci

    Previeni
  • Re: Problema di sequenza numeri in un FILE

    Hai ancora molto spazio per migliorare qui
    Secondo me ti conviene sforzarti per migliorarti qui, prima di passare ad altro
  • Re: Problema di sequenza numeri in un FILE

    Non saprei come migliorarlo sinceramente, a parte togliendo quell'if di cui parlavamo non riesco a pensare ad altre soluzioni più efficenti
  • Re: Problema di sequenza numeri in un FILE

    Devi applicarti, sforzarti
    consegnare un programma "raffazzonato" non credo che dia una buona immagine
    piuttosto che continuare a fare cose nuove devi migliorarti le tue basi
    io a chi me lo chiede(va) rispondevo sempre:

    quando credete di essere arrivati alla fine
    Ri-prendete in mano il problema, riprendete in mano la soluzione, riprendete in mano il programma, e "sfrondate", tagliate tutto quello che potete, cancellate tutto quello che potete, riducete al minimo tutte le variabili, tutti i cicli, tutte i comandi
    per ogni variabile domandatevi: Mi serve per cosa? cosa ci scrivo? cosa mi indica? da dove la vado a prendere l'informazione che ci scriverò dentro? Quando la userò?
    Ricominciate da capo
    Per ogni comando che scrivete domandatevi: perchè lo sto facendo? è proprio necessario? a cosa serve fare la cosa che sto facendo? e se non lo faccio?
    Ricominciate da capo
    state tranquilli che se fate così vedrete che il programma complicato lungo e pieno di comandi, si riduce a vista d'occhio, rimangono solo pochi comandi con poche variabili

    vuoi vedere?
    
    #include <stdio.h>
    //#include <string.h> // non serve
    //#define DIM 16 e quando la usi?
    
    
    #define COSTANTE 15 // questo invece è una furbata, perchè permette di cambiare al volo il programma 
    // se per caso servisse in futuro
    #define NOMEFILE "numeri.txt" // anche questa
    
    
    int analizzanumero(int a, int b)
    {
       return ((a > 10) && !((a % 100) % b));
    }
    
    
    int main()
    {
       FILE* fp;
       int z = 0;
       int temp1 = 0;
       int temp2 = 0;
       fp = fopen(NOMEFILE, "r");
    
       if(!fp)
       {
          printf("errore nell'apertura del file");
          return 1;
       }
    
       while(fscanf(fp, "%d", &temp2) != EOF)
       {
          z++;
    
          if(z)
          {
             if(!analizzanumero(temp2, COSTANTE)  && analizzanumero(temp1, COSTANTE))  //avevo invertito questo if
                // e io te lo ho semplificato
             {
                printf("%d %d\n", temp1, temp2);
             }
    
             temp1 = temp2; // lo scambio lo faccio qui, senza usare una variabile in piu'
          }
    
          // printf("\n"); troppi ritorni a capo, stonano, basta farli solo se stampi, nella if
       }
    
       fclose(fp);
       return 0;
    }
    
    
    questo è il tuo programma, lo ho ri-preso in mano e mi sono domandato cosa non serviva a nulla, quando usavo una certa variabile, etc etc....
    fa le stesse cose oltretutto con meno righe vuote in output...
    il main è più o meno uguale a quello che avevi scritto tu, con quelche variabile in meno, ma sopratutto invertendo l'ordine tra lo scambio delle variabili e il test ho pututo eliminare una variabile, sarà poco, ma provati a scrivere per qualche "strana macchinetta" con poca RAM e anche quello conta
    quello che è molto cambiata è la funzione
    guardala e pensaci a come posso esserci arrivato
    sappi che ci sono arrivato per "sottrazione" dalla tua,
    eliminando di volta in volta le variabili e i test che "rispondevano sbagliato" alle domande che ho elencato prima

    PS
    una funzione di una sola riga usata una volta sola nella main in realtà serve a poco, basta scrivere la riga direttamente nella main
    ma siccome la funzione è espressamente richiesta dalla consegna la ho lasciata......
Devi accedere o registrarti per scrivere nel forum
11 risposte