Problema di sequenza numeri in un FILE

di Anonimizzato27573 il
11 risposte
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

  • 
    int analizzanumero(int a, int b){
            int c;
    	
    	if(a<10)
    		return 0;
    	
            c=a%100;
    
    	if(c%b==0)
    	        return 1;
    	
    	return 0;
    }
    
  • 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?
  • #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;
    }
  • Bravo,
  • 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
  • Hai ragione è effettivamente inutile... spero che all'esame non dia peso a certi errori
  • Non contarci

    Previeni
  • Hai ancora molto spazio per migliorare qui
    Secondo me ti conviene sforzarti per migliorarti qui, prima di passare ad altro
  • Non saprei come migliorarlo sinceramente, a parte togliendo quell'if di cui parlavamo non riesco a pensare ad altre soluzioni più efficenti
  • 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