Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
OnePlus 15 nasce per alzare l'asticella delle prestazioni e del gaming mobile. Ma non solo, visto che integra un display LTPO 1,5K a 165 Hz, OxygenOS 16 con funzioni AI integrate e un comparto foto con tre moduli da 50 MP al posteriore. La batteria da 7.300 mAh con SUPERVOOC 120 W e AIRVOOC 50 W è la ciliegina sulla torta per uno smartphone che promette di offrire un'esperienza d'uso senza alcun compromesso
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-06-2006, 11:49   #1
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
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;
}
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.

Ultima modifica di AngeL) : 28-06-2006 alle 11:53.
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 11:59   #2
Andlea
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;
}
3 - Non ho guardato tutto, ma puoi tranquillamente dichiarare più variabili in una riga
invece di
Codice:
int a;
int b;
puoi fare
Codice:
int a, b;
oppure in:
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;
	}
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
Codice:
do
	{
		if(arr[currparr]>Mm)
		{
		M[currpM]=arr[currparr];
		}
		if(arr[currparr]<Mm)
		{
		m[currpm]=arr[currparr];
		}
	currparr++;
	}while(currparr==49);
Puoi riassumerlo così:
Codice:
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?

Ultima modifica di Andlea : 28-06-2006 alle 12:06.
Andlea è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:10   #3
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
ehm... quel 50 era il codice che stavo scrivendo pensando che la variabile fosse 50 che scemo...
correggo tutto, grazie 10³
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:11   #4
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
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?
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:13   #5
Andlea
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];
Andlea è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:16   #6
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
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?
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:21   #7
Andlea
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.
Andlea è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:24   #8
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
lo faro, grazie
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 12:30   #9
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
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);
}
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 13:22   #10
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
Quote:
Originariamente inviato da Andlea
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 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:
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];
}
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 13:43   #11
Andlea
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 357
Quote:
Originariamente inviato da AngeL)
memset lo devo usare cosi?
Codice:
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 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 13:49   #12
Andlea
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
Andlea è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 13:55   #13
Andlea
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");
}
Andlea è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 14:14   #14
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Andlea
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
__________________
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2006, 15:24   #15
Andlea
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 357
acc, vero non me ne ero accorto
Andlea è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto SONY BRAVIA 8 II e BRAVIA Theatre System 6: il c...
Wi-Fi superveloce anche in giardino? FRI...
La Ford Focus va ufficialmente in pensio...
Booking.com integra Revolut Pay: nasce i...
DGX Spark a 175 fps con ray tracing su C...
Red Dead Redemption 2 Enhanced è ...
3Dfx Voodoo 2, una GPU nata con la scade...
Apple Watch: la Mela dovrà versar...
TIM e Nokia insieme per potenziare il 5G...
Musk lancia la nuova era dei DM su X con...
A Dallas Fort Worth entrano in azione se...
Black Friday HONOR: le promozioni su sma...
'È finalmente il momento': tutti ...
L'e-bike Also TM-B di Rivian ha una traz...
Scaldarsi con il mining di Bitcoin? Negl...
Valve sorprende: la nuova Steam Machine ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v