View Full Version : [c++]tracce d'esame
ciao a tutti. tra una settimana ho l'esame di programmazione in c++. mi hanno dato alcune delle tracce ke usciranno. partiamo dalla prima.
Si richiede di sviluppare un programma multifile per l’eliminazione degli elementi dispari in un vettore di numeri naturali.
Si progetti una funzione “elimina_dispari” che riceva in ingresso da tastiera il vettore di numeri naturali (interi non negativi) V allocato staticamente ed il suo riempimento n, ed elimini dal vettore V tutti gli elementi dispari in esso eventualmente presenti. La funzione restituisce inoltre come valore di ritorno il numero di elementi eliminati. L’eliminazione deve essere effettuata senza l’ausilio di alcun vettore di appoggio.
Nel main bisognerà:
- leggere V ed n (mediante una opportuna funzione “leggi_vetint”);
- effettuare l’eliminazione degli elementi dispari (mediante la funzione”elimina_dispari”);
- stampare il vettore in seguito all’eliminazione di uno o più elementi (mediante una opportuna funzione
“stampa_vetint”);
Non è richiesto controllo sull’input: si supponga che l’utente inserisca correttamente vettore e riempimento. Il main deve invece consentire di rieseguire il programma a richiesta dell’utente.
Esempi di esecuzione:
Procedura di inserimento del vettore
Inserisci il riempimento: 5
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 1
Elemento di posizione 1: 3
Elemento di posizione 2: 5
Elemento di posizione 3: 7
Elemento di posizione 4: 9
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 5 elementi.
Vettore risultante:
Il vettore e' vuoto!
Un altro giro? (Y=1/N=0) 1
Procedura di inserimento del vettore
Inserisci il riempimento: 3
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 0
Elemento di posizione 1: 1
Elemento di posizione 2: 2
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 1 elementi.
Vettore risultante:
Elemento di posizione 0: 0
Elemento di posizione 1: 2
Un altro giro? (Y=1/N=0) 0
sinceramente nel livello in cui sono ora troverò un pò di difficoltà per questo vi kiedo di spiegarmi sommariamente o non come procedere nella creazione di questo proramma.
grazie ciaoooo
Fenomeno85
12-01-2006, 19:21
1 provaci poi ti do una mano
~§~ Sempre E Solo Lei ~§~
AbuJaffa
12-01-2006, 21:48
ciao a tutti. tra una settimana ho l'esame di programmazione in c++. mi hanno dato alcune delle tracce ke usciranno. partiamo dalla prima.
Si richiede di sviluppare un programma multifile per l’eliminazione degli elementi dispari in un vettore di numeri naturali.
Si progetti una funzione “elimina_dispari” che riceva in ingresso da tastiera il vettore di numeri naturali (interi non negativi) V allocato staticamente ed il suo riempimento n, ed elimini dal vettore V tutti gli elementi dispari in esso eventualmente presenti. La funzione restituisce inoltre come valore di ritorno il numero di elementi eliminati. L’eliminazione deve essere effettuata senza l’ausilio di alcun vettore di appoggio.
Nel main bisognerà:
- leggere V ed n (mediante una opportuna funzione “leggi_vetint”);
- effettuare l’eliminazione degli elementi dispari (mediante la funzione”elimina_dispari”);
- stampare il vettore in seguito all’eliminazione di uno o più elementi (mediante una opportuna funzione
“stampa_vetint”);
Non è richiesto controllo sull’input: si supponga che l’utente inserisca correttamente vettore e riempimento. Il main deve invece consentire di rieseguire il programma a richiesta dell’utente.
Esempi di esecuzione:
Procedura di inserimento del vettore
Inserisci il riempimento: 5
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 1
Elemento di posizione 1: 3
Elemento di posizione 2: 5
Elemento di posizione 3: 7
Elemento di posizione 4: 9
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 5 elementi.
Vettore risultante:
Il vettore e' vuoto!
Un altro giro? (Y=1/N=0) 1
Procedura di inserimento del vettore
Inserisci il riempimento: 3
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 0
Elemento di posizione 1: 1
Elemento di posizione 2: 2
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 1 elementi.
Vettore risultante:
Elemento di posizione 0: 0
Elemento di posizione 1: 2
Un altro giro? (Y=1/N=0) 0
sinceramente nel livello in cui sono ora troverò un pò di difficoltà per questo vi kiedo di spiegarmi sommariamente o non come procedere nella creazione di questo proramma.
grazie ciaoooo
:eek: !!!!! E questo sarebbe un tema d'esame di programmazione c++???
Un po scarso come livello.
AbuJaffa
12-01-2006, 21:53
Ho letto tracce e^100 volte più toste di queste. :O
franksisca
13-01-2006, 09:56
a parte la semplicità, bisogna ricordare a cosa serve il forum:
il forum serve per chiarire dubbi, non per fare esami........
Prova a risolverlo, e se non ne vieni a capo posta i tuoi problemi e li risolveremo. ;)
AbuJaffa
13-01-2006, 10:50
ben detto. :D
Fenomeno85
13-01-2006, 14:21
ciao a tutti. tra una settimana ho l'esame di programmazione in c++. mi hanno dato alcune delle tracce ke usciranno. partiamo dalla prima.
Si richiede di sviluppare un programma multifile per l’eliminazione degli elementi dispari in un vettore di numeri naturali.
Si progetti una funzione “elimina_dispari” che riceva in ingresso da tastiera il vettore di numeri naturali (interi non negativi) V allocato staticamente ed il suo riempimento n, ed elimini dal vettore V tutti gli elementi dispari in esso eventualmente presenti. La funzione restituisce inoltre come valore di ritorno il numero di elementi eliminati. L’eliminazione deve essere effettuata senza l’ausilio di alcun vettore di appoggio.
Nel main bisognerà:
- leggere V ed n (mediante una opportuna funzione “leggi_vetint”);
- effettuare l’eliminazione degli elementi dispari (mediante la funzione”elimina_dispari”);
- stampare il vettore in seguito all’eliminazione di uno o più elementi (mediante una opportuna funzione
“stampa_vetint”);
Non è richiesto controllo sull’input: si supponga che l’utente inserisca correttamente vettore e riempimento. Il main deve invece consentire di rieseguire il programma a richiesta dell’utente.
Esempi di esecuzione:
Procedura di inserimento del vettore
Inserisci il riempimento: 5
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 1
Elemento di posizione 1: 3
Elemento di posizione 2: 5
Elemento di posizione 3: 7
Elemento di posizione 4: 9
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 5 elementi.
Vettore risultante:
Il vettore e' vuoto!
Un altro giro? (Y=1/N=0) 1
Procedura di inserimento del vettore
Inserisci il riempimento: 3
Inserisci il vettore. Solo numeri interi positivi:
Elemento di posizione 0: 0
Elemento di posizione 1: 1
Elemento di posizione 2: 2
Inserimento terminato.
Eliminazione di tutti gli elementi dispari dal vettore.
sono stati eliminati n. 1 elementi.
Vettore risultante:
Elemento di posizione 0: 0
Elemento di posizione 1: 2
Un altro giro? (Y=1/N=0) 0
sinceramente nel livello in cui sono ora troverò un pò di difficoltà per questo vi kiedo di spiegarmi sommariamente o non come procedere nella creazione di questo proramma.
grazie ciaoooo
comunque manco all'itis mi hanno mai dato una traccia così banale :(
#include "stdafx.h"
using namespace std;
#define N 50
void leggi_vetint (int arr[], int n){
cout << "Inserisci il vettore. Solo numeri interi positivi:"<<endl;
for (int i=0;i<n;i++){
cout << "Elemento di posizione " <<i << ":\t" ;
cin >> arr[i];
}
cout << "Inserimento terminato."<<endl;
}
int elimina_dispari (int arr[], int n){
int del_element=0;
cout << "Eliminazione di tutti gli elementi dispari dal vettore."<<endl;
for (int i=0;i<n;i++){
if (arr[i]%2 != 0){
del_element ++;
for (int y=i;y<n-1;y++)
arr[y] = arr[y+1];
}
}
return del_element;
}
void stampa_vetint (int arr[], int n){
for (int i=0;i<n;i++)
cout << "Elemento di posizione " << i << ": "<<arr[i]<<endl;
}
int _tmain()
{
int arr[N],n, del_ele;
cout << "Porcedura di inserimento del vettore\nInserisci il riempimento:\t";
cin >> n; /* per correttezza n deve essere controllato che sia < N */
leggi_vetint (arr, n);
del_ele = elimina_dispari(arr, n);
cout << "sono stati eliminati n. " << del_ele << " elementi."<<endl;
cout << "Vettore risultante:"<<endl;
(n-del_ele == 0)? cout << "Il vettore e' vuoto!"<<endl : stampa_vetint (arr, n-del_ele);
system ("PAUSE");
return 0;
}
~§~ Sempre E Solo Lei ~§~
beh beati voi ke la ritenete così facile. io mica tanto...
cmq nn riesco a rpovarci perkè non sono in grado di creare un funzione ke faccia quel ke vuole la traccia.
sono capace di:
1)definire un vettore di numeri naturali
2)di creare un programma multifile
3)di verificare la posizione di un elemento nel vettore
non sono capace:
1)di creare una funzione come elimina_dispari
2)di inserire il fattore riempimento n del vettore
3)di stampare gli elementi eliminati e poi quelli restanti.
per farvi rendere un pò conto, prendendo un pezzo del codice di Fenomeno85
void leggi_vetint (int arr[], int n){
io non ho idea di perkè si metta arr[] e n nei dati iniziali di questa funzione. so ke sono i dati di ingresso ma nn so perkè si mettono proprio quei 2!
maxithron
13-01-2006, 15:52
EDIT
Fenomeno85
13-01-2006, 19:33
allora a te manca tutta la teoria che non è facile spigare in poche righe, diciamo che un libro sarebbe l'ideale.
Allora vediamo se riesco a spiegare in modo facile:
Definizione di una funzione
tipo_ret nome_funzione (parametri)
allora il tipo_ret è il tipo di variabile che vorrai far ritornare alla funzione chiamante.
Questo significa che se è esempio int, la variabile ritornata sarà un intero, char carattere, int * un puntatore a un intero, void significa che non ritorni nulla e così via.
nome_funzione la scegli te o al massimo ti viene fornita dalle richieste.
I parametri vanno scritti come se stessi dichiarando le variabili. Gli array in c si possono passare o:
int nome (int a[])
oppure in modo uguale in questo altro
int nome (int *a)
Cosa passare a un metodo.
Se sei sotto un progetto l'analista ti avrà dato delle specifiche altrimenti come devi ragionare:
devi passare tutte le variabili che ti servono per fare quello che ti serve.
In questo caso te devi lavorare sull'array sul quale analizzi solo su una porzione definita. Quindi alla funzione ti servono appunto arr e n.
Spero che un pò ti ho chiarito al massimo dimmi che cosa non ti è chiaro
Comunque con l'esperienza vedrai che capirai velocemente. Tanto usare c usare vb usare php alla fine è solo sintassi nulla di +.
~§~ Sempre E Solo Lei ~§~
crick_pitomba
13-01-2006, 22:32
c
int elimina_dispari (int arr[], int n){
int del_element=0;
cout << "Eliminazione di tutti gli elementi dispari dal vettore."<<endl;
for (int i=0;i<n;i++){
if (arr[i]%2 != 0){
del_element ++;
for (int y=i;y<n-1;y++)
arr[y] = arr[y+1];
}
}
return del_element;
}
non sono troppo d'accordo con l'implementazione di questa funzione...
nel caso peggiore (array pieno di elementi dispari) è quadratica nell'input:non pensi che sia poco efficiente?
se l'esame è di programmazione ad una facoltà di informatica, probabilmente il professore che ha assegnato la traccia valuterà proprio questo parametro.
evidentemente il programma è limitato come complessità di spazio e deve essere risolto con una complessità di tempo ragionevole.
forse utilizzando due indici, uno per scorrere l'array, l'altro per memorizzare l'ultima posizione valida si ottiene una funzione più efficiente perchè lineare in funzione dell'input.
allora a te manca tutta la teoria che non è facile spigare in poche righe, diciamo che un libro sarebbe l'ideale.
Allora vediamo se riesco a spiegare in modo facile:
Definizione di una funzione
tipo_ret nome_funzione (parametri)
allora il tipo_ret è il tipo di variabile che vorrai far ritornare alla funzione chiamante.
Questo significa che se è esempio int, la variabile ritornata sarà un intero, char carattere, int * un puntatore a un intero, void significa che non ritorni nulla e così via.
nome_funzione la scegli te o al massimo ti viene fornita dalle richieste.
I parametri vanno scritti come se stessi dichiarando le variabili. Gli array in c si possono passare o:
int nome (int a[])
oppure in modo uguale in questo altro
int nome (int *a)
Cosa passare a un metodo.
Se sei sotto un progetto l'analista ti avrà dato delle specifiche altrimenti come devi ragionare:
devi passare tutte le variabili che ti servono per fare quello che ti serve.
In questo caso te devi lavorare sull'array sul quale analizzi solo su una porzione definita. Quindi alla funzione ti servono appunto arr e n.
Spero che un pò ti ho chiarito al massimo dimmi che cosa non ti è chiaro
Comunque con l'esperienza vedrai che capirai velocemente. Tanto usare c usare vb usare php alla fine è solo sintassi nulla di +.
~§~ Sempre E Solo Lei ~§~
gia. io ho iniziato da poco col c++, ma sono esperto in php..per questo bene o male le cose le conosco(array,variabili,cicli,condizioni....),però trovo difficoltà col c++ in quanto non sono abituati alla sua sintassi. inoltre col php, ke lavora in web, non c'è da allocare e deallocare una variabile,non c'è da tener conto dello spazio ke occupi con un singolo dato,non c'è da tener conto della visibilità o non di una variabile,non bosogna defenirne il tipo,non c'è da dichiare prima un prototipo,poi come si svolge una funzione,e poi applicarla...applichi e basta.
AbuJaffa
14-01-2006, 11:28
Il linguaggio C è l'essenza della programmazione!:O
IspiCiosa
14-01-2006, 13:08
Esatto!! W il C !!! :D
Fenomeno85
14-01-2006, 13:35
non sono troppo d'accordo con l'implementazione di questa funzione...
nel caso peggiore (array pieno di elementi dispari) è quadratica nell'input:non pensi che sia poco efficiente?
se l'esame è di programmazione ad una facoltà di informatica, probabilmente il professore che ha assegnato la traccia valuterà proprio questo parametro.
evidentemente il programma è limitato come complessità di spazio e deve essere risolto con una complessità di tempo ragionevole.
forse utilizzando due indici, uno per scorrere l'array, l'altro per memorizzare l'ultima posizione valida si ottiene una funzione più efficiente perchè lineare in funzione dell'input.
posta il codice che non capisco quello che vuoi fare.
~§~ Sempre E Solo Lei ~§~
crick_pitomba
14-01-2006, 15:57
come vedo dal tuo codice, utilizzi 3 indici
del_element che continene quella che sarà la dimensione dell'array una volta eliminati tutti gli elementi
i che è l'indice che scorre l'array alla ricerca degli elementi da eliminare
y che ti serve per spostare tutti gli elementi ogni volta...
Ma è inutile spostarli tutti ogni volta. basta spostare solo l'elemento corrente
lo pseudo codice che risolve il problema dovrebbe essere così
poni indice=0;
poni numpari=0
scorri l'array un elemento alla volta
se l'elemento è pari
mettilo nella cella Array[numpari]
incrementa il valore numpari
restituisci n-numpari
in pratica sposa tutti e solo in numeri pari riempiendo le parti più basse con numeri pari
nel caso in cui l'array è pieno di numeri pari ogni elemento viene spostato su se stesso
nel caso in cui nessun elemento sua pari nessun elemento spostato
in entrambi i casi l'intero array viene scorso una sola volta e nel caso peggiore ci sono solo n spostamenti (caso in cui tutti gli elementi sono pari)
il codice c dovrebbe essere (sono un po' arruginito)
int pari =0; //conta i pari nell'array
int indice=0; //indice per scorrere l'array
for (indice=0; indice<n; indice++){
// se l'elemento è pari....
if(arr[indice]%2==0){
//copia l'elemento corrente nella prima posizione disponibile e incrementa la posizione
arr[pari++]=arr[indice];
}
}
return n-pari; (se vuoi fare all'interno della funzione il conto degli elementi eliminati
oppure
return pari; //che rappresenta la nuova dimensione del vettore e fuori stamperai n-pari come numero di elementi eliminati
cosa ne pensi?
int elimina_dispari (int arr[], int n)
{
int i = 0;
for (; i < n && (arr[i] % 2 == 0); ++i)
;
for (int y = i+1; y < n; ++y)
if (arr[y] % 2 == 0)
arr[i++] = arr[y];
return (n - i);
}
Fenomeno85
14-01-2006, 18:08
come vedo dal tuo codice, utilizzi 3 indici
del_element che continene quella che sarà la dimensione dell'array una volta eliminati tutti gli elementi
i che è l'indice che scorre l'array alla ricerca degli elementi da eliminare
y che ti serve per spostare tutti gli elementi ogni volta...
Ma è inutile spostarli tutti ogni volta. basta spostare solo l'elemento corrente
lo pseudo codice che risolve il problema dovrebbe essere così
poni indice=0;
poni numpari=0
scorri l'array un elemento alla volta
se l'elemento è pari
mettilo nella cella Array[numpari]
incrementa il valore numpari
restituisci n-numpari
in pratica sposa tutti e solo in numeri pari riempiendo le parti più basse con numeri pari
nel caso in cui l'array è pieno di numeri pari ogni elemento viene spostato su se stesso
nel caso in cui nessun elemento sua pari nessun elemento spostato
in entrambi i casi l'intero array viene scorso una sola volta e nel caso peggiore ci sono solo n spostamenti (caso in cui tutti gli elementi sono pari)
il codice c dovrebbe essere (sono un po' arruginito)
int pari =0; //conta i pari nell'array
int indice=0; //indice per scorrere l'array
for (indice=0; indice<n; indice++){
// se l'elemento è pari....
if(arr[indice]%2==0){
//copia l'elemento corrente nella prima posizione disponibile e incrementa la posizione
arr[pari++]=arr[indice];
}
}
return n-pari; (se vuoi fare all'interno della funzione il conto degli elementi eliminati
oppure
return pari; //che rappresenta la nuova dimensione del vettore e fuori stamperai n-pari come numero di elementi eliminati
cosa ne pensi?
hai perfettamente ragione ... non mi era venuta in mente questa soluzione che alla fine è solo un O(n) in confronto alla mia che è un O(n*(n-1))
~§~ Sempre E Solo Lei ~§~
crick_pitomba
14-01-2006, 19:10
l'importante è dare una mano al povero SCHYO...
;)
Va bene così??
int elimina_dispari(int V[], int & n){
int el=0;
int cont=0;
for (int i=0; i<n; i++)
if (V[i]%2) {
for ( int j=i; j<n-1; j++ )
V[j] = V[j+1];
n--;
cont++;
i--;
}
return cont;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.