Stampa a video di numeri crescenti in un array

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

  • Lo stampa perché se i = j quell'if è sempre vero per un numero pari. Cambia logica
  • 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;
    	
    }
  • 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
  • #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?
  • 
                    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
  • 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
  • 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.
  • 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...
  • 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
  • #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.
  • È 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