Stampa a video di numeri crescenti in un array

di il
11 risposte

Stampa a video di numeri crescenti in un array

Ho dei problemi con questo esercizio:(vi posto sotto il mio codice e il problema che ho)

Scrivere un programma C che acquisisce un array di 10 interi. Il programma individua e visualizza
tutte le sotto-sequenze di lunghezza massima (cioè non contenute in una sotto-sequenza più lunga) e
maggiore di 1 costituite da soli numeri pari. Per esempio se l’utente inserisce l’array:
1 2 4 3 2 6 6 7 8 1
il programma visualizzerà:
2 4
2 6 6

#include <stdio.h>
#define DIM 10

int main(){
	int j;
	int i;
	int n[DIM];

	for(i=0;i<DIM;i++){
		
		scanf("%d", &n[i]);
		
	}
	
	for(i=0;i<DIM;i++){
		
		for(j=1;j<DIM;j++){
		
		if(n[i]<=n[j] && n[i]%2==0 && n[j]%2==0){
			
			printf("%d ", n[i]);
			i++;
				
			}
			
		}
		
		printf("\n");
		
	}
	
	return 0;
	
}
in pratica quando vado ad inserire i numeri che ci sono nell'esempio dell'esercizio: 1 2 4 3 2 6 6 7 8 1

il programma mi stampa a video;
2 4
2 6 6
8

cosa non corretta perchè dovrebbe stamparmi solo:
2 4
2 6 6


ma non capisco dove sbaglio, il mio programma controlla ogni cella dell'array con quella a fianco e l'if se non vengono rispettate le condizioni non dovrebbe permettere di stampare pure l'otto.
consigli?

11 Risposte

  • Re: Stampa a video di numeri crescenti in un array

    Lo stampa perché se i = j quell'if è sempre vero per un numero pari. Cambia logica
  • Re: Stampa a video di numeri crescenti in un array

    Weierstrass ha scritto:


    Lo stampa perché se i = j quell'if è sempre vero per un numero pari. Cambia logica
    non basta aggiungere nell'if "i!=j && ..." ecc?

    se lo faccio il programma funziona.
    #include <stdio.h>
    #define DIM 10
    
    int main(){
    	int j;
    	int i;
    	int n[DIM];
    
    	for(i=0;i<DIM;i++){
    		
    		scanf("%d", &n[i]);
    		
    	}
    	
    	for(i=0;i<DIM;i++){
    		
    		for(j=1;j<DIM;j++){
    		
    		if(i!=j && n[i]<=n[j] && n[i]%2==0 && n[j]%2==0){
    			
    			printf("%d ", n[i]);
    			i++;
    				
    			}
    			
    		}
    		
    		printf("\n");
    		
    	}
    	
    	return 0;
    	
    }
  • Re: Stampa a video di numeri crescenti in un array

    Te l'hanno già detto nell'altro thread che non devi dare il codice per valido al primo esempio che ti funziona.

    Cambia logica. Ti basta un for solo se lo scrivi bene
  • Re: Stampa a video di numeri crescenti in un array

    #include <stdio.h>
    #define DIM 10
    
    int main(){
    	
    	int i;
    	int a[DIM];
    	int b[DIM];
    
    	for(i=0;i<DIM;i++){
    		
    		scanf("%d", &a[i]);
    		
    	}
    	
    	for(i=0;i<DIM;i++){
    
    		if(a[i]%2==0){
    			b[i]=1;
    		}else{
    			b[i]=0;
    		}
    
    
    		}
    		
    		for(i=0;i<DIM;i++){
    			if(b[i]==1){
    				if(b[i-1]==0 && b[i+1]==0){
    				}else{
    				
    				printf("%d ", a[i]);
    			}
    			}else{
    				printf("\n");
    			}
    		}
    
    
    	return 0;
    	
    }
    Ok ho cambiato completamente logica utilizzando un array di controllo (b[n]). giusto?
  • Re: Stampa a video di numeri crescenti in un array

    
                    if(DIM<2)
                       return 0;
                       
    		for(i=0;i<DIM;i++){
    			if(b[i]){
    			    if(b[i-1] || b[i+1])
    				printf("%d ", a[i]);
    			}
    			else
    				printf("\n");
    		}
    
    Correggi quanto sopra per i casi i=0 e i=DIM-1, perché ovviamente non puoi uscire dai limiti degli array
  • Re: Stampa a video di numeri crescenti in un array

    E se ci fossero più di 3 numeri pari consecutivi?
    io direi di pensare direttamente a una versione che sia completamente indipendente dalla lunghezza della sequenza di pari consecutivi
    non è difficile, basta ri-pensare alla logica
  • Re: Stampa a video di numeri crescenti in un array

    Ma perché deve riscriverla? La sua versione è quasi corretta, deve solo levare dal ciclo il primo e l'ultimo elemento, che avranno un if più semplice. Io gliela ho solo riscritta in maniera più leggibile.
  • Re: Stampa a video di numeri crescenti in un array

    Vero, prima non avevo capito

    Adesso sì ho avuto un'illuminazione

    Si fa senza array di appoggio
    Una cosa diretta e semplice

    Dopo butto giù due righe...
  • Re: Stampa a video di numeri crescenti in un array

    Scritto da telefonino, accettate errori di battitura
    EDIT

    lasciate stare, scrivere e pensare dopo cena e libagioni, dal telefonino
    da solo danni
    quello che ho scritto ieri è tutto sbagliato

    chiedo scusa
    
    For (int i =0; i<DIM; i++){
       if(i && !(a[i]%2)){
          printf("%d ", a[i]);
       }
    }
    printf("\n");
    
    Tre righe fanno tutto...

    Rimane da risolvere un solo piccolo problema...
    Non è che posso dare la pappa pronta
  • Re: Stampa a video di numeri crescenti in un array

    #include <stdio.h>
    #define DIM 10
    
    int main(){
    	
    	int i;
    	int a[DIM];
    	int b[DIM];
    
    	for(i=0;i<DIM;i++){
    		
    		scanf("%d", &a[i]);
    		
    	}
    	
    	for(i=0;i<DIM;i++){
    
    		if(a[i]%2==0){
    			b[i]=1;
    		}else{
    			b[i]=0;
    		}
    
    
    		}
    		
    		if(b[0]==1 && b[1]==1){
    			printf("%d ", a[0]);
    		}
    		
    		for(i=1;i<DIM-1;i++){
    			
    			if(b[i]==1){
    			
    				if(b[i-1]==0 && b[i+1]==0){
    				}else{
    				
    				printf("%d ", a[i]);
    			}
    			}else{
    				printf("\n");
    			}
    		}
    	if(b[DIM-1]==1 && b[DIM-2]==1){
    			printf("%d", a[DIM-1]);
    		}
    
    	return 0;
    	
    }
    ho escluso DIM-1 e b[0] dal ciclo for e ho riscritto tutto così, corretto?

    nel caso sia corretto provo a fare pure la versione di standardoil senza ausilio di un array d'appoggio.
  • Re: Stampa a video di numeri crescenti in un array

    È corretto

    Aggiusta però almeno l'indentazione del codice: come hai visto puoi trarre in inganno chi legge il codice
Devi accedere o registrarti per scrivere nel forum
11 risposte