[C] eliminare un intervallo di valori da un vettore

Chiar2
Salve a tutti, ho difficoltà con questo programma, vi scrivo la traccia e poi vi metto sia il main che ho scritto, sia le definizioni delle funzioni che sono andata a creare. Se è possibile, mi piacerebbe capire il mio errore, se non è troppo disturbo, potreste spiegarmelo? Grazie. In pratica il programma funziona fino ad un certo punto, quando poi deve eliminare l'intervallo mi elimina tutti i valori maggiori di x, senza considerare la condizione che debbano anche essere minori di y.
Ecco la traccia:

Si scriva un programma in linguaggio C/C++ che dato in ingresso un vettore di interi supposto ordinato in ordine crescente e senza ripetizioni, e forniti dall'utente due numeri interi X e Y tali che x Si strutturi il programma nei seguenti sottoprogrammi:
– leggi vettore
stampavettore
check_XY
elimina_intervallo

Esempi:

vettore: 1 2 3 4 5 6 7 8 (n=8)
X= 3
Y=7
vettore risultante: 1 2 3 7 8 (n=5)

Questo è il main scritto da me:

#include <stdio.h>
#include <stdlib.h>
#include "libreria.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	int v[SIZE];
	int n;
	int trovato;
	int x;
	int y;
	printf("Inserisci la dimensione del vettore\t");
	scanf("%d", &n);
	printf("Gli elementi che andrai ad inserire devono essere in ordine crescente e senza ripetizioni\n");
	leggi_vettore(v,n);
	stampa_vettore(v,n);
	printf("Inserisci un valore intero\t");
	scanf("%d", &x);
	printf("Inserisci un valore intero più grande del precedente\t");
	scanf("%d", &y);
	trovato=check_xy(v, n, x, y);
	if(trovato==2)
	{
		printf("I due interi sono entrambi presenti nel vettore\n");
		elimina_intervallo(v,n);
	}
	else
	printf("I due interi non sono entrambi presenti nel vettore\n");
	return 0;
}


queste sono le funzioni:

#include "libreria.h"

void leggi_vettore(int v[], int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		printf("Inserire l'elemento %d del vettore\t", i);
		scanf("%d", &v[i]);
	}
}
void stampa_vettore(int v[], int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		printf("%d\t", v[i]);
	}
	printf("\n");
}
int check_xy(int v[], int n, int x, int y)
{
	int i=0;
	int trovato=0;
	while(i<n && trovato!=2)
	{
		
		if(v[i]==x || v[i]==y)
		{
			trovato++;
			i++;
		}
		else
		i++;
	}
	return trovato;
}
void elimina_intervallo(int v[], int n)
{
	int i;
	int j;
	int x;
	int y;
	for(i=0; i<n; i++)
	{
		if(v[i]>x)
		{
			j=i;
			
			while(j<n && v[j]<y) 
			{
		
					v[j]=v[j+1];
				    --n;
				
				
			}
		
			
		}
	}
	stampa_vettore(v,n);
}

grazie mille.

Risposte
apatriarca
Da un occhiata veloce direi che il problema consiste nella riga in cui decrementi il valore di n. Siccome questo valore è usato nel ciclo esterno della funzione stessa per iterare su tutto l'array, diminuendo tale valore ti fermerai prima di essere arrivato alla fine.

Chiar2
Grazie, ho anche provato a scrivere newn=n; prima del ciclo while e decrementare quello e non n, ma non funziona lo stesso...mi cancella tutti i valori da x in poi, come se non considerasse la condizione

Super Squirrel
Da uno sguardo veloce al codice un'altra cosa che salta all'occhio è il fatto che non passi i valori di x e y a elimina_intervallo in cui dichiari due variabili x e y senza inizializzarle che avranno valori casuali e quindi quasi sicuramente diversi da quelli inseriti da tastiera.

Prova a fare questa correzione e nel caso ancora non funziona se vuoi posso dare uno sguardo più attento al codice.

Ho provato anche io a fare questo programmino, te lo posto nel caso ti possa tornare utile.

#include <iostream>

using namespace std;

void inserisci_vettore_ordinato(int v[], int n)
{
    bool inserimento;
    cout << "INSERIRE ELEMENTI IN ORDINE STRETTAMENTE CRESCENTE" << endl;
    for(int i = 0; i < n; i++)
    {
        do
        {
            inserimento = 1;
            cout << "v[" << i + 1 << "] = ";
            cin >> v[i];
            if(i > 0 && v[i] <= v[i - 1])
            {
                cout << "INSERIRE UN VALORE MAGGIORE DI " << v[i - 1] << endl;
                inserimento = 0;
            }
        }
        while(inserimento == 0);
    }
}

void mostra_vettore(int v[], int n)
{
   for(int i = 0; i < n; i++)
   {
      cout << v[i] << "\t";
   }
}

void elimina_intervallo(int v[], int n, int indice_x, int indice_y)
{
    for(int k = indice_y; k < n; k++)
    {
        v[indice_x + 1 + k - indice_y] = v[k];
    }
    n = indice_x + 1 + n - indice_y;
    mostra_vettore(v, n);
}

void check_xy(int v[], int n, int x, int y)
{
    for(int i = 0; i < n; i++)
    {
        if(v[i] == x)
        {
            for(int j = i + 1; j < n; j++)
            {
                if(v[j] == y)
                {
                    elimina_intervallo(v, n, i, j);
                    break;
                }
            }
            break;
        }
    }
}

int main()
{
    int v[50], n, x, y;
    cout << "n = ";
    cin >> n;
    inserisci_vettore_ordinato(v, n);
    mostra_vettore(v, n);
    cout << endl << "x = ";
    cin >> x;
    do
    {
        cout << "INSERIRE UN VALORE y MAGGIORE DI x (= "<< x << ")" << endl << "y = ";
        cin >> y;
    }
    while(y <= x);
    check_xy(v, n, x, y);
}

Chiar2
grazie, avevo già provato ad inserire int x e int y all'interno degli argomenti della funzione (è stata la prima cosa che ho fatto) ma il programma si comportava allo stesso modo... credo che i valori arrivino giusti, perchè inizia ad eliminare elementi proprio a partire dal valore di x, solo che non si ferma alla y, continua fino alla fine...per quanto riguarda il codice scritto da te, noto che è in C++, io invece devo usare C, inoltre non posso usare variabili booleane (per questo nella ricerca di x e y ho usato 0 e 1). Guarderò lo stesso il codice, però, grazie!

Super Squirrel
Rifacendomi sempre al codice da te postato mi sembra ovvio che il problema sta nella funzione elimina_intervallo.
L'unico errore vero e proprio è che non gli passi x e y, quindi se il programma non fa quello che dovrebbe i motivi possono essere:
- non hai tradotto bene in codice l'algoritmo a cui hai pensato per la risoluzione del problema;
- l'algoritmo è sbagliato;
- entrambi.

A meno di errori grossolani, ovviamente, il malfunzionamento di un programma è sempre dovuto ad uno dei suddetti motivi. Quando però la scelta dell'algoritmo risulta per così dire forzata o il codice è chiaro e produce risultati facilmente prevedibili, allora risulta più facile dare un aiuto.
Nel tuo caso, invece, il fatto che l'eliminazione dei valori presenti in un fissato intervallo può essere fatta in più modi unitamente al fatto che il codice produce risultati per me difficilmente prevedili, rende le cose più difficili.
Magari se mi spieghi qual è l'idea su cui si basa l'algoritmo per la funzione elimina_intervallo posso esserti più d'aiuto.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.