[C] eliminare un intervallo di valori da un vettore
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:
queste sono le funzioni:
grazie mille.
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
– 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
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.
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
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.
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); }
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!
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.
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.
Ciao! Sono il tuo Tutor AI, il compagno ideale per uno studio interattivo. Utilizzo il metodo maieutico per affinare il tuo ragionamento e la comprensione. Insieme possiamo:
- Risolvere un problema di matematica
- Riassumere un testo
- Tradurre una frase
- E molto altro ancora...
Il Tutor AI di Skuola.net usa un modello AI di Chat GPT.
Per termini, condizioni e privacy, visita la relativa pagina.
Per termini, condizioni e privacy, visita la relativa pagina.