|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
[C++] Domande varie per un codice
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 Codice:
/*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;
}
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. Ultima modifica di AngeL) : 28-06-2006 alle 11:53. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
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 Codice:
int Nomefunzione(int *v, int n){
for(int i = 0; i < n; i++)
if(v[i]==0) return i;
}
invece di Codice:
int a; int b; Codice:
int a, b; Codice:
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;
}
inoltre se pos, divx, M ed m li azzeri, puoi farlo fuori dal for usando memset(); Questo Codice:
do
{
if(arr[currparr]>Mm)
{
M[currpM]=arr[currparr];
}
if(arr[currparr]<Mm)
{
m[currpm]=arr[currparr];
}
currparr++;
}while(currparr==49);
Codice:
for(int i = 0; i < n; i++){
if(arr[i]>Mm)
M[i]=arr[i];
if(arr[i]<Mm)
m[i]=arr[i];
}
Se hai una solo istruzione in un blocco if o for, puoi evitare le parentesi Inoltre quel 50 cosa sarebbe? Ultima modifica di Andlea : 28-06-2006 alle 12:06. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
ehm... quel 50 era il codice che stavo scrivendo pensando che la variabile fosse 50
correggo tutto, grazie 10³ |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
la prima domanda e come faccio a dichiarare un array se so da quante parti è composto solo a runtime?
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Ah ok, ora ho visto meglio il codice ed ho capito
Codice:
int *arr = new int[n], *pos = new int[n], *divx = new int[n]; int *M = new int[n], *m = new int[n]; |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
cosa significa int *arr= new int[n]?
e perche alla fnzione dell'array devo passare l'array per riferimento? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
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. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
lo faro, grazie
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
memset lo devo usare cosi?
Codice:
for(i=0;i<=n;i++)
{
memset(arr[i],0,0);
}
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Codice:
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];
}
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Quote:
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 |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
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 |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Codice:
#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");
}
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
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
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
acc, vero non me ne ero accorto
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:23.



















