PDA

View Full Version : [C++] Domande varie per un codice


AngeL)
28-06-2006, 11:49
stamattina ho scritto questo codice per fare le cose scritte nel commento a inizio codice.
le domande che vi faccio sono dopo il codicino di 101 righe :D
/*Definire l’algoritmo per leggere un numero noto(N) di numeri reali e
contare:
1) quelli maggiori/minori di numero prefissato
2) quelli positivi
3) quelli divisibili per numero prefissato
(avendo a disposizione l’operatore %)
*/
#include <iostream>
using namespace std;

int main()
{
int n;
cout << "Quanti numeri reali desidera immettere?: ";
cin >> n;
int arr[n];
int pos[n];
int divx[n];
int M[n];
int m[n];
int Mm;
int x;
int i;
int currparr=0;
int currpM=0;
int currpm=0;
int currpp=0;
int currpd=0;
for(i=0;i<=n;i++)
{
cout << "Inserisca il " << n << "esimo numero: ";
cin >> arr[i];
pos[i]=0;
divx[i]=0;
M[i]=0;
m[i]=0;
}
cout << "Inserisca il numero, del quale verranno calcolati i numeri"
<< " maggiori e minori presenti nella sequenza immessa.\n"
<< "Il numero non deve essere uguale a nessuno dei numeri"
<< " presenti nella sequenza.\n";
cin >> Mm;
cout << "Inserisca il numero del quale verranno calcolati i divisori"
<< " presenti nella sequenza immessa.\n";
cin >> x;

do
{
if(arr[currparr]>Mm)
{
M[currpM]=arr[currparr];
}
if(arr[currparr]<Mm)
{
m[currpm]=arr[currparr];
}
currparr++;
}while(currparr==49);
currparr=0;
do
{
if(arr[currparr]>0)
{
pos[currpp]=arr[currparr];
}
currparr++;
}while(currparr==49);
currparr=0;
do
{
if(arr[currparr]%x==0)
{
divx[currpd]=arr[currparr];
}
currparr++;
}while(currparr==49);
cout << "I numeri maggiori di "<< Mm << " presenti nella sequenza sono:\n";
for(i=0;i<=currpM;i++)
{
cout << M[i] << ", ";
}
cout << endl;
cout << "I numeri minori di " << Mm << " presenti nella sequenza sono:\n";
for(i=0;i<=currpm;i++)
{
cout << m[i] << ", ";
}
cout << endl;
cout << "I numeri positivi presenti nella sequenza sono:\n";
for(i=0;i<=currpp;i++)
{
cout << pos[i] << ", ";
}
cout << endl;
cout << "I numeri divisibili per " << x << " sono:\n";
for(i=0;i<=currpd;i++)
{
cout << divx[i] << ", ";
}
cout << endl;
}
1)come faccio a creare un array di n valori se non posso usare una variabile?
posso definire una costante cosi?-> const x=n; ?//dove n e la variabile che contiene la quantta di numeri che deve avere l'array

2)esiste una funzione che restituisce la prima posizione che ha valore 0 dell'array?, cosi da evitarmi curr(ent)p(os)arr, ecc ecc? (se non esiste ho pensato di crearla io, dandole il nome dell'array come argomento e facendole restituire la prima posizione che contiene 0(es. currp(divx) )

3) come posso accorciare questo codice?

4)se avete qualche consiglio che non rientra nelle 3 domande postatelo pure ;)

grazie 1000 in anticipo.

Andlea
28-06-2006, 11:59
1 - Non ho capito la domanda. Cosa devi fare esattamente? creare un vettore di n variabili conoscendo n soloa runtime? puoi farlo
Dichiarare una costante che contiene una variabile è un paradosso e non capisco a cosa serva
Usa direttamente n.

2 - Premetto che non capisco perchè usi dei do while incrementando manualmente l'iteratore dell'array quando puoi usare un normale ciclo for come fai sopra e sotto.
La funzione devi fartela, è banale

int Nomefunzione(int *v, int n){
for(int i = 0; i < n; i++)
if(v[i]==0) return i;
}

3 - Non ho guardato tutto, ma puoi tranquillamente dichiarare più variabili in una riga
invece di
int a;
int b;
puoi fare
int a, b;

oppure in:
for(i=0;i<=n;i++)
{
cout << "Inserisca il " << n << "esimo numero: ";
cin >> arr[i];
pos[i]=0;
divx[i]=0;
M[i]=0;
m[i]=0;
}
Nel primo cout ci va i, non n
inoltre se pos, divx, M ed m li azzeri, puoi farlo fuori dal for usando memset();

Questo

do
{
if(arr[currparr]>Mm)
{
M[currpM]=arr[currparr];
}
if(arr[currparr]<Mm)
{
m[currpm]=arr[currparr];
}
currparr++;
}while(currparr==49);

Puoi riassumerlo così:

for(int i = 0; i < n; i++){
if(arr[i]>Mm)
M[i]=arr[i];
if(arr[i]<Mm)
m[i]=arr[i];
}


ecc....
Se hai una solo istruzione in un blocco if o for, puoi evitare le parentesi
Inoltre quel 50 cosa sarebbe?

AngeL)
28-06-2006, 12:10
ehm... quel 50 era il codice che stavo scrivendo pensando che la variabile fosse 50 :muro: :muro: :muro: che scemo...
correggo tutto, grazie 10³ :D

AngeL)
28-06-2006, 12:11
la prima domanda e come faccio a dichiarare un array se so da quante parti è composto solo a runtime?

Andlea
28-06-2006, 12:13
Ah ok, ora ho visto meglio il codice ed ho capito

int *arr = new int[n], *pos = new int[n], *divx = new int[n];
int *M = new int[n], *m = new int[n];

AngeL)
28-06-2006, 12:16
cosa significa int *arr= new int[n]?

e perche alla fnzione dell'array devo passare l'array per riferimento?

Andlea
28-06-2006, 12:21
DAlla teoria un array è una sequenza di celle di memoria
La variabile con cui fai riferimento a quello spazio di memoria è di fatto un puntatore al primo elemento.
C++ permette di istanziare in ogni momento memoria
int *variabile; quindi dichiara un puntatore
new int[n] dice di istanziare memopria per n int
con l'operatore = si associa l'indirizzo restituito da new al puntatore.

Quindi è chiaro che per passare il vettore ad una funzione sarà necessario passare solo l'indirizzo di memoria.
Inoltre in C i vettori vengono passati solo per riferimento, mai per copia.
Tienine conto, perchè facendo modifiche sul puntatore passato come parametro, modifichi il vettore originale.

Prima di andare sul compilatore questi concetti andrebbero studiati meglio.

AngeL)
28-06-2006, 12:24
lo faro, grazie

AngeL)
28-06-2006, 12:30
memset lo devo usare cosi?
for(i=0;i<=n;i++)
{
memset(arr[i],0,0);
}

AngeL)
28-06-2006, 13:22
for(int i = 0; i < n; i++){
if(arr[i]>Mm)
M[i]=arr[i];
if(arr[i]<Mm)
m[i]=arr[i];
}


se non sbaglio li c'è un errore, perche se il primo num maggiore di Mm in arr è al numero 20, verra scritto nella cella n.20 di M, mentre dovrebbe essere nella 0. questo dovrebbe essere corretto:

for(int i = 0; i < n; i++){
if(arr[i]>Mm)
M[nextpos(&M,n)]=arr[i];
if(arr[i]<Mm)
m[nextpos(&m,n)]=arr[i];
}

Andlea
28-06-2006, 13:43
memset lo devo usare cosi?
for(i=0;i<=n;i++)
{
memset(arr[i],0,0);
}

No, così non avrebbe utilità, basterebbe fare arr[i]=0;
Va usato così
memset(arr, 0, sizeof(int*)*n);
Senza for, in questo modo scrive tutte le n celle con uno 0.
Il primo parametro è il valore, il secondo è la dimensione della zona di memoria da settare

Per la seconda porzione di codice era solo per farti vedere più o meno come fare, non ho controllato gli indici

Andlea
28-06-2006, 13:49
Ah, cosa che avrei dovuto dire subito.... se devi soltanto mostrare i valori, a che ti serve segnarteli in 4 vettori diversi??
Il programma si può riassumere così:


<codice per acquisire i dati>
printf("Numeri maggiori di Mn\n");
for(int i = 0; i < n; i++)
if(arr[i] > Mn) printf("%d ", arr[i]);

printf("\nNumeri minori di Mn\n");
for(int i = 0; i < n; i++)
if(arr[i] < Mn) printf("%d ", arr[i]);

printf("\nNumeri positivi\n");
for(int i = 0; i < n; i++)
if(arr[i] > 0) printf("%d ", arr[i]);

printf("\nNumeri divisibili per x\n");
for(int i = 0; i < n; i++)
if(arr[i]%x==0) printf("%d ", arr[i]);

fine

Andlea
28-06-2006, 13:55
#include <iostream>
using namespace std;

int main(){
int n, Mm, x;
cout << "Quanti numeri reali desidera immettere?: ";
cin >> n;
int *arr = new int[n];

for(int i=0;i<n;i++){
cout << "Inserisca il numero" << i+1;
cin >> arr[i];
}

cout << "Inserisca il numero, del quale verranno calcolati i numeri"
<< " maggiori e minori presenti nella sequenza immessa.\n"
<< "Il numero non deve essere uguale a nessuno dei numeri"
<< " presenti nella sequenza.\n";
cin >> Mm;
cout << "Inserisca il numero del quale verranno calcolati i divisori"
<< " presenti nella sequenza immessa.\n";
cin >> x;

printf("Numeri maggiori di Mn\n");
for(int i = 0; i < n; i++)
if(arr[i] > Mm) printf("%d ", arr[i]);

printf("\nNumeri minori di Mn\n");
for(int i = 0; i < n; i++)
if(arr[i] < Mm) printf("%d ", arr[i]);

printf("\nNumeri positivi\n");
for(int i = 0; i < n; i++)
if(arr[i] > 0) printf("%d ", arr[i]);

printf("\nNumeri divisibili per x\n");
for(int i = 0; i < n; i++)
if(arr[i]%x==0) printf("%d ", arr[i]);

printf("fatto");
}

trallallero
28-06-2006, 14:14
Va usato così
memset(arr, 0, sizeof(int*)*n);

ocio che hai messo sizeof(int*) ma é sizeof(int)
arr non é un array di puntatori ad int.
Tu magari hai fatto un errore di distrazione o di copia/incolla ma AngeL) non lo sa.
E gli va di culo che al 99% int e int * hanno la stessa sizeof ;)

Andlea
28-06-2006, 15:24
acc, vero non me ne ero accorto :)