Array ordinato

di il
7 risposte

Array ordinato

Buonasera a tutti.
Il testo dell'esercizio è il seguente:

Scrivere un programma in linguaggio C che riceve in ingresso una sequenza di N numeri interi. I numeri sono memorizzati in un vettore. Il valore N è inserito dall’utente, ma il vettore può contenere al massimo 30 numeri. Terminato l’inserimento della sequenza di numeri, il programma deve verificare se il vettore contiene una sequenza di numeri ordinata in modo strettamente crescente.

Il codice che ho scritto è
#include <stdio.h>
#include <stdlib.h>

int main (){
	
	int N=0, i=0, t=1;
	
	printf("Inserisci il numero di valori che vuoi inserire:\n");
	scanf("%d", &N);
	
	int A[N];
	
	printf("Inserisci la sequenza di numeri:\n");
	
	for (i=0; i<N; i++){
		scanf("%d", &A[i]);
	}
	
	for (i=0; i<N && t==1; i++){
		if (A[i]>=A[i+1]){
			t==0;
		}
		else {
			t==1;
		}
	}
	
	if (t==1){
		printf("La sequenza e' crescente");
	}
	else {
		printf("La sequenza non e' crescente");
	}
	
	return 0;
Perchè mi stampa sempre che la sequenza è crescente? Il mio ragionamento è confronto l'elemento con l'elemento [i+1] e se il primo è maggiore del secondo esco dal ciclo perchè t==0 e non soddisfa la condizione ed essendo che t==0 la sequenza non è ordinata. Dove sbaglio?

7 Risposte

  • Re: Array ordinato

    Ciao, alcune osservazioni:
    - innanzitutto sarebbe meglio non utilizzare i VLA (sigla che sta per Variable Length Arrays), ossia array la cui dimensione è una variabile. Meglio invece utilizzare un array statico di una certa dimensione costante N e considerare poi solo i primi n<=N elementi. Inoltre, dal momento che l'esercizio specifica un massimo di 30 numeri, credo proprio si riferisca ad un approccio come quello che ti ho appena illustrato;
    - domanda: per i=N-1 a quale elemento accede A[i+1]? Credo proprio che bisogna correggere il limite superiore dell'indice i nel secondo for!
    - guarda bene
    if(A[i] >= A[i + 1])
    {
        t==0;	
    }
    else 
    {
        t==1;
    }
    stai utilizzando l'operatore relazionale al posto di quello di assegnazione!
    - sempre relativamente al suddetto frammento di codice ti faccio notare che quel else è inutile;
    - infine potresti tranquillamente fare a meno della variabile t, basterebbe infatti uscire dal ciclo (con un break) e fare un semplice confronto tra i e N.
  • Re: Array ordinato

    - innanzitutto sarebbe meglio non utilizzare i VLA (sigla che sta per Variable Length Arrays), ossia array la cui dimensione è una variabile. Meglio invece utilizzare un array statico di una certa dimensione costante N e considerare poi solo i primi n<=N elementi. Inoltre, dal momento che l'esercizio specifica un massimo di 30 numeri, credo proprio si riferisca ad un approccio come quello che ti ho appena illustrato;
    Ok quindi faccio una #define N 30 e poi faccio inserire in numero di elementi e impongo la condizione che n<=30?
    - domanda: per i=N-1 a quale elemento accede A[i+1]? Credo proprio che bisogna correggere il limite superiore dell'indice i nel secondo for!
    all'ultimo valore dell'array.
    stai utilizzando l'operatore relazionale al posto di quello di assegnazione!
    me ne sono accorto
    - infine potresti tranquillamente fare a meno della variabile t, basterebbe infatti uscire dal ciclo (con un break) e fare un semplice confronto tra i e N.
    potresti spiegarmi come? non ho capito
  • Re: Array ordinato

    Ok quindi faccio una #define N 30 e poi faccio inserire in numero di elementi e impongo la condizione che n<=30?
    Esatto, anche se sarebbe meglio se traducessi il tutto in codice se vuoi una risposta definitiva!
    all'ultimo valore dell'array.
    Sbagliato!!
    Per i=N-1 ==> A[i+1]=A[N-1+1]=A[N] e quindi stai accedendo ad una zona di memoria che non compete all'array, visto che come detto nell'altro post:
    l'indice associato al primo elemento di un array è 0, va da sé quindi che quello associato all'ultimo sarà n-1, dove n è il numero di elementi (ossia la dimensione) del vettore
    potresti spiegarmi come? non ho capito
    Confrontando i e n potrai dedurre se l'array è stato percorso per intero (da cui possiamo dedurre che è strettamente crescente) o solo in parte (da cui possiamo dedurre che l'array non è ordinato).
  • Re: Array ordinato

    Esatto, anche se sarebbe meglio se traducessi il tutto in codice se vuoi una risposta definitiva!
    Tipo?

    Quindi dovrei fare così?
    A[i] <= A[i-1]
  • Re: Array ordinato

    Luke96 ha scritto:


    Esatto, anche se sarebbe meglio se traducessi il tutto in codice se vuoi una risposta definitiva!
    Tipo?
    Intendo che a parole mi sembra corretto quello che hai detto, ma l'unico modo per capire se hai capito davvero (scusate il gioco di parole ) è postare il codice aggiornato alla luce di quanto ci siamo detti.

    Luke96 ha scritto:


    Quindi dovrei fare così?
    A[i] <= A[i-1]
    In riferimento a cosa, di preciso?
  • Re: Array ordinato

    Grazie mille per la risposta, ma avevo dimenticato di postare la soluzione. Alla fine l'ho fatto così
    #include <stdio.h>
    
    #define N 30
    
    int main (){
    	
    	int n=0, i=0, t=1, c=1;
    	int A[N];
    	
    		while (c==1){
    		
    		printf("Inserisci il numero di valori che vuoi inserire (max 30 valori):\n");
    		scanf("%d", &n);
    		
    		if (n>N){
    			printf("Limite max superato!\nSe vuoi uscire premi 0, se vuoi continuare premi 1:\n");
    			scanf("%d", &c);
    		}
    		else {
    			printf("Inserisci la sequenza di numeri:\n");
    	
    			for (i=0; i<n; i++){
    				scanf("%d", &A[i]);
    			}
    	
    	
    	
    			for (i=1; i<n && t==1; i++){
    				if (A[i] >= A[i-1]){
    					t=1;
    				}
    				else {
    					t=0;
    				}
    			}
    	
    			if (t==1){
    				printf("La sequenza e' crescente\n");
    				
    			}
    			else {
    				printf("La sequenza non e' crescente\n");
    			}
    			}
    			c=0;	
    			}
    			
    			return 0;
    }
    
    
    Volevo inserire questo
    Confrontando i e n potrai dedurre se l'array è stato percorso per intero (da cui possiamo dedurre che è strettamente crescente) o solo in parte (da cui possiamo dedurre che l'array non è ordinato).
    Pensavo di aver capito come fare invece no potresti spiegarmelo?
  • Re: Array ordinato

    Allora:
    - innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di rispettare la spaziatura e l'indentazione;
    - tutta la parte sul controllo/reinserimento di n è inutilmente complicata e peraltro non funzionante. Basta semplicemente qualcosa del genere:
    do
    {
        printf("n (MAX %d) --> ", N);
        scanf("%d", &n);
    }
    while(n > N);
    - stando alla traccia dell'esercizio la sequenza non deve essere semplicemente crescente, ma STRETTAMENTE crescente. Quindi occhio all'operatore relazionale da utilizzare!
    - consideriamo il seguente frammento di codice:
    ...
    int t = 1;
    for(i=1; i<n && t==1; i++)
    {
        if(A[i] >= A[i-1])
        {
            t=1;
        }
        else
        {
            t=0;			
        }
    }
    dal momento che t viene inizializzata ad 1, quell'if è inutile;
    -

    Luke96 ha scritto:


    Pensavo di aver capito come fare invece no potresti spiegarmelo?
    La variabile t può essere evitata uscendo dal suddetto for con un semplice break.
    A questo punto ci saranno due modi per uscire dal for:
    1) la condizione del for i<n non viene rispettata perchè i ha assunto il valore n;
    2) viene eseguito il break e quindi sarà sicuramente i<n.
    A questo punto risulta ovvio come un semplice confronto tra i e n possa darci informazioni sul fatto che la sequenza sia crescente o meno.
Devi accedere o registrarti per scrivere nel forum
7 risposte