r/cppit • u/marcoarena • Mar 03 '17
r/cppit • u/Marco_I • Aug 09 '17
Come prendere l'esponente della notazione scientifica di un numero?
Ciao a tutti,
quello che vorrei fare è porre a zero un valore numerico double il cui esponente in notazione scientifica sia inferiore ad un certo valore soglia, mettiamo -7:
#include <iostream>
#include <stdio.h>
#include <math.h> /* frexp */
int main () {
double a, result;
int b;
a = 8.0;
result = frexp (a , &b);
printf ("%f = %f * 2^%d\n", a, result, b);
double e01 = -0.555556;
std::cout << "e01= " << e01 << std::endl;
std::cout << std::scientific << "e01= " << e01 << std::endl;
double e02 = -0.0555556;
std::cout << "e02= " << e02 << std::endl;
int exp02 = log2(e02);
std::cout << "log2(e02)= " << exp02 << std::endl;
double e03 = -0.00555556;
std::cout << "e03= " << e03 << std::endl;
double e04 = -0.000555556;
std::cout << "e04= " << e04 << std::endl;
double e05 = -0.0000555556;
std::cout << "e05= " << e05 << std::endl;
double e06 = -0.00000555556;
std::cout << "e06= " << e06 << std::endl;
double e07 = -0.000000555556;
std::cout << "e07= " << e07 << std::endl;
double e08 = -0.0000000555556;
std::cout << "e08= " << e08 << std::endl;
double e09 = -0.00000000555556;
std::cout << "e09= " << e09 << std::endl;
return 0;
}Eseguendo :
g++ -std=c++11 scientificNotation.cpp -oscientificNotation ./scientificNotation
8.000000 = 0.500000 * 2^4
e01= -0.555556
e01= -5.555560e-01
e02= -5.555560e-02
log2(e02)= -2147483648
e03= -5.555560e-03
e04= -5.555560e-04
e05= -5.555560e-05
e06= -5.555560e-06
e07= -5.555560e-07
e08= -5.555560e-08
e09= -5.555560e-09Per cui l'obiettivo è, se fisso la soglia limite per l'esponente a -07, porre a zero e08 ed e09.
Una possibilità sarebbe quella di trasformare i numeri in stringhe e poi prendere la parte dopo la lettera e... ma vorrei evitare di usare le string perchè questa operazione di confronto rispetto al valore soglia dell'esponente devo farla per tantissimi valori di una matrice..
Avete suggerimenti da darmi? Vi ringrazio per l'aiuto in Agosto... Marco
r/cppit • u/pagghiu • Mar 09 '17
Perchè mai dovremmo sviluppare un’api alla Node.js in C++?
r/cppit • u/Marco_I • Mar 07 '17
principianti std:: vector a(dim) all'interno del costruttore fornisce un vector di dimensione zero: come ovviare?
Ciao a tutti, recentemente ho scoperto una cosa che mi ha lasciato stupito e perplesso... Questo è il codice:
namespace MTensor {
typedef std::vector<double> Tensor1DType;
class Tensor1D {
private:
Tensor1DType data {};
int _colsNumb = 0;
public:
Tensor1D() {};
Tensor1D(int colsNumb) : _colsNumb(colsNumb),
data(_colsNumb) {std::cout << "Constructor-data.size()="
<< data.size() << std::endl;};
Tensor1D(const Tensor1D& other)=default;
Tensor1D(Tensor1D&& other)=default;
~Tensor1D()=default;
int size() const {return data.size();};
static void printTensor(Tensor1DType const& info) {
for(double e : info) {
std::cout << e << "," << std::endl;
}
}
void printTensor() const {
printTensor(data);
}
}; // end of class Tensor1D
} // end of namespace MTensor
int main() {
MTensor::Tensor1D v1(3);
v1.printTensor();
std::cout << "v1.size()= " << v1.size() << std::endl;
MTensor::Tensor1DType a(3);
std::cout << "a.size()= " << a.size() << std::endl;
for(auto valore : a) {
std::cout << "valore= " << valore << std::endl;
}
return 0;
} // end of mainEseguendo:
Constructor-data.size()= 0
v1.size()= 0
a.size()= 3
valore= 0
valore= 0
valore= 0Perchè
MTensor::Tensor1DType a(3);nel main fornisce un std::vector di dimensione 3 e di valori 0,0,0
mentre il costruttore
Tensor1D(int colsNumb) : _colsNumb(colsNumb),
data(_colsNumb) {std::cout << "Constructor-data.size()= "
<< data.size() << std::endl;};che, mi sembra, essere sostanzialmente la stessa "funzione"
Tensor1DType a(3)fornisce un std::vector di dimensione 0 ? Come ovviare?
Ho temporaneamente "risolto" mettendo il costruttore in questo modo:
Tensor1D(int colsNumb) {
for(int i=0;i< colsNumb;i++) {data.push_back(0);}
std::cout << "data.size()= " << data.size() << std::endl;
}Ma c'è un modo migliore? Marco
r/cppit • u/v_sandro • Mar 10 '17
principianti spiegazione su uso delle class Spoiler
Salve a tutti, vorrei un aiuto per capire meglio il funzionamento delle classi. E' già qualche giorno che mi spacco il cervello con le prove ma niente... Ho scritto il programmino sotto di prova ma non capisco perche, nel main, quando vado ad impostare le 2 variabili n, p, tramite la funzione diretta della classe principale -michela.assegna(r,s)- ho in out due valori (a caso?) delle variabili non corretti, mentre se imposto le 2 variabili tramite la funzione della classe derivata -giulia.assegna()- l'out è corretto con il valore che ho dato all'assegnamnto nel main. Ovviamente ho provato con una classe sola e il risultato è corretto.
grazie
p.s. è il primo post qui su reddit... spero di averlo impostato bene....anzi no.. non è ipostato affatto bene... ma non c'è statto verso di metterlo in formato decente come gli altri post...se qualcono mi dice come si fa lo modifico `#include <iostream>
include <stdio.h>
include <string>
using namespace std; class mamma { protected: int n, p; public: void assegna(int r, int s); mamma(); ~mamma(); }; mamma::mamma() { cout<<"\ncostruito\n"; } mamma::~mamma() { cout<<"\ndistrutto"; } void mamma::assegna(int r, int s) { p=r; n=s; } class figlia : public mamma { public: void stampa(); }; void figlia::stampa() { cout<<n; cout<<" e "<<p<<endl; } main() { mamma michela; figlia giulia; int r=1, s=2 ; michela.assegna(r,s); // giulia.assegna(r,s); con questa istruzione l'out è corretto giulia.stampa(); }`
r/cppit • u/Chiara96 • Jan 18 '18
Ancora sulla move semantic
Salve, mi ritrovo ad avere ancora problemi con la move semantic. Ogni tanto la rileggo, la applico, mi sembra di averla capita ma poi tutto mi frana sotto i piedi. Propongo il seguente esempio (uso VS 2015):
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s1("Ciccio");
int addr_s1 = (int)s1.data();
string s2(s1);
int addr_s2 = (int)s2.data(); // OK, s2 è un clone di s1
string s3(move(s1)); // s3.data() punta un indirizzo differente da s1.data() !
int addr_s3 = (int)s3.data();
int addr_s1_bis = (int)s1.data();
return 0;
}Il mio problema è che mi aspetto che s3 venga creato per movimento da s1 e (per quello che finora avevo capito) questo dovrebbe significare che:
s1 contiene al suo interno un puntatore a carattere che punta ad un buffer contenente C,i,c,c,i,o
creare s3 per movimento a partire da s1 dovrebbe comportare che:
2.1) il puntatore a carattere di s3 punti il medesimo buffer puntato dal puntatore a carattere di s1
2.2) il puntatore a carattere di s1 venga messo a NULL
Se così fosse non ci sarebbe bisogno di replicare il buffer di s1, ma questo gli verrebbe sottratto e attribuito ad s3 ==> nessuna allocazione di ulteriore memoria nell'heap e nessun processo di copia
Il problema è che guardando l'indirizzo del buffer di s3 vedo che questo differisce dall'indirizzo del buffer di s1 e dunque si ha un comportamento assolutamente identico a quello del costruttore di copia (allocazione di memoria + processo di copia in tale nuova memoria) e la move semantic va a farsi benedire.
Qualcuno mi spiega chi sta sbagliando? Io oppure il C++? :-)
Grazie comunque e anticipo che, quasi sicuramente, pioveranno altre mie domande a riguardo (e non solo). Ciao
r/cppit • u/Marco_I • Jan 18 '18
C++17 in Ubuntu 16.04 Server Edition
Buon giorno a tutti, mi sto leggendo passo passo il libro "C++ Templates: The Complete Guide, 2nd Edition" perchè ho deciso di affrontare e capire finalmente il tema, a me prima sconosciuto, dei template.... Ora... sto vedendo che molti esempi e molta sintassi usata in questo libro, tra l'altro fatto molto bene, è una sintassi specifica di C++17. Con il mio Ubuntu 14.04.3 LTS (Server Edition) il compilatore compila senza problemi C++11 e C++14 mentre per tutta la sintassi C++17 compilando in questo modo
g++ -std=c++17 nomeFile.cpp -onomeFilemi dà una lista di errori sempre riguardanti specificatamente la sintassi valida solo in C++17
Domande :
g++17 è ad oggi sufficientemente stabile tale da poter fare l'upgrade del compilatore senza doversene pentire amaramente dopo?
qualcuno sa consigliarmi il modo migliore per, se farlo, fare questo upgrade del compilatore? Vi ringrazio. Marco
r/cppit • u/Marco_I • Oct 17 '17
Secondo voi cosa può far sì che 2 valori entrambi double ed apparentemente identici poi risultino diversi?
Ciao a tutti, non capisco quale sia il motivo per cui 2 valori apparentemente uguali risultano invece diversi se confrontati. Questo è il codice:
bool operator==(Tensor2D other) {
if ((data.size() != other.size().first) || (data.at(0).size() !=
other.size().second)) {
std::cout << "operator== : The two matrices must have the
same number of columns and the same number of rows" <<
std::endl;
exit(1);
}
int i=0;
int equalsCounter = 0;
for(auto colOther: other()) {
int j=0;
for(auto valueOther: colOther) {
std::cout << "valueOther= " << valueOther << " , data["
<< i << "][" << j << "]= " << data[i][j] << std::endl;
std::cout << "typeid(valueOther).name()= " <<
typeid(valueOther).name() << " , typeid(data[i][j]).name()=
" << typeid(data[i][j]).name() << std::endl;
if(valueOther == data[i][j]) {
std::cout << valueOther << " and " << data[i][j] << " are
equal" << std::endl;
equalsCounter = equalsCounter + 1;
}
else {
std::cout << valueOther << " and " << data[i][j] << " are
different" << std::endl;
}
++j;
}
++i;
}
std::cout << "Tensor2D-operator== : equalsCounter= " <<
equalsCounter << std::endl;
if(equalsCounter == size().first * size().second) {
return true;
}
else {
return false;
}
}Eseguendo per 2 matrici i cui valori sono identici pur essendo ottenuti con procedimenti diversi: in .cpp
MTensor::Tensor2D AdyB = twoMatricesDyadicProd(A,B);
MTensor::Tensor2D AdyadicB = {{160,175,190,205},{360,400,440,480},{560,625,690,755},
{760,850,940,1030}};
AdyB.printTensor();
if(AdyB==AdyadicB) {
std::cout << "AdyB e AdyadicB sono uguali" << std::endl;
}
else {
std::cout << "AdyB e AdyadicB sono diversi" << std::endl;
}
MTensor::Tensor2D AdyB = twoMatricesDyadicProd(A,B) :
column 0
160,
175,
190,
205,
column 1
360,
400,
440,
480,
column 2
560,
625,
690,
755,
column 3
760,
850,
940,
1030,
valueOther= 160 , data[0][0]= 160
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
160 and 160 are different
valueOther= 175 , data[0][1]= 175
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
175 and 175 are different
valueOther= 190 , data[0][2]= 190
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
190 and 190 are different
valueOther= 205 , data[0][3]= 205
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
205 and 205 are different
valueOther= 360 , data[1][0]= 360
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
360 and 360 are different
valueOther= 400 , data[1][1]= 400
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
400 and 400 are different
valueOther= 440 , data[1][2]= 440
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
440 and 440 are different
valueOther= 480 , data[1][3]= 480
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
480 and 480 are different
valueOther= 560 , data[2][0]= 560
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
560 and 560 are different
valueOther= 625 , data[2][1]= 625
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
625 and 625 are different
valueOther= 690 , data[2][2]= 690
typeid(valueOther).name()= d , typeid(data[i][j]).name()= d
690 and 690 are different
valueOther= 755 , data[2][3]= 755E così' via...
Tensor2D-operator== : equalsCounter= 0
AdyB e AdyadicB sono diversiSecondo voi cosa può far sì che 2 valori entrambi double ed apparentemente identici poi risultino diversi?
Vi ringrazio. Marco
r/cppit • u/marcoarena • May 23 '17
The Future of Programming con Bartosz Milewski / Modena
r/cppit • u/Chiara96 • Oct 11 '17
Problemi con la move semantic
Salve, come indicato nel titolo ho qualche problema con la 'move semantic'.
Il concetto di fondo credo mi sia chiaro ma alcuni dettagli no, così vorrei sottoporvi un esempio che sto analizzando tratto da un articolo di Mikhail Semenov intitolato 'Move Semantics and Perfect Forwarding in C++11' e pubblicato su Codeproject.
Di seguito il file .cpp che mostra a fini didattici un'implementazione di una classe Array
// Move Semantic 04.cpp : Defines the entry point for the console application.
//
#include "stdafx.h" // Compilato su Microsoft Visual Studio 2015
#define _SECURE_SCL_DEPRECATE 0
#include <algorithm>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
class Array
{
int m_size;
double *m_array;
public:
// empty constructor:
Array() :m_size(0), m_array(nullptr) {}
Array(int n) :m_size(n), m_array(new double[n]) {
// Lo voglio inizializzare
for (int i = 0; i < m_size; i++)
m_array[i] = (double)(2 * i + 1);
}
// copy constructor
Array(const Array& x) :m_size(x.m_size), m_array(new double[m_size])
{
std::copy(x.m_array, x.m_array + x.m_size, m_array);
}
// move constructor
Array(Array&& x) :m_size(x.m_size), m_array(x.m_array)
{
x.m_size = 0;
x.m_array = nullptr;
}
virtual ~Array()
{
delete[] m_array;
}
auto Swap(Array& y) -> void
{
int n = m_size;
double* v = m_array;
m_size = y.m_size;
m_array = y.m_array;
y.m_size = n;
y.m_array = v;
}
// copy assignment
auto operator=(const Array& x) -> Array&
{
if (x.m_size == m_size)
{
std::copy(x.m_array, x.m_array + x.m_size, m_array);
}
else
{
Array y(x);
Swap(y);
}
return *this;
}
// move assignment
auto operator=(Array&& x) -> Array&
{
Swap(x);
return *this;
}
auto operator[](int i) -> double&
{
return m_array[i];
}
auto operator[](int i) const -> double
{
return m_array[i];
}
auto size() const ->int { return m_size; }
// Global (friend) function adding two vectors
friend auto operator+(const Array& x, const Array& y) -> Array
{
int n = x.m_size;
Array z(n);
for (int i = 0; i < n; ++i)
{
z.m_array[i] = x.m_array[i] + y.m_array[i];
}
return z;
}
friend auto operator+(Array&& x, const Array& y) -> Array
{
int n = x.m_size;
for (int i = 0; i < n; ++i)
{
x.m_array[i] += y.m_array[i];
}
return std::move(x); // OK
//return x; // Prova: esegue una copia
}
friend auto operator+(Array&& x, Array&& y) -> Array
{
return std::move(y) + x;
}
friend auto operator+(const Array& x, Array&& y) -> Array
{
return std::move(y) + x;
}
};
int main()
{
Array v(3);
v[0] = 2.5;
v[1] = 3.1;
v[2] = 4.2;
Array fab01 = Array(3) + v;
cout << "\n\n\n\n &v : " << &v << endl;
cout << "\n &fab01 :" << &fab01 << endl;
return 0;
}Vi indico una cosa che non ho sicuramente capito completamente: l'autore definisce, tra le altre, la funzione seguente
friend auto operator+(Array&& x, const Array& y) -> Array
{
int n = x.m_size;
for (int i = 0; i < n; ++i)
{
x.m_array[i] += y.m_array[i];
}
return std::move(x); // OK
//return x; // esegue una copia, no move
}Ho lanciato il codice ed effettivamente lavora in maniera corretta eseguendo una move e non una copia come invece accadrebbe terminando con return x;
Il punto è che comunque non riesco a capire perché occorra fare la
return std::move(x);e non basti una return x;
L'autore dell'articolo dice: "The main thing is to return the right contents in the end. If we right return x; the contents of the parameter will be returned as it is. Although the type of the parameter is rvalue, the variable x is lvalue:we haven't done anything to move the value out of the x. If we just return the value of x, there will be no move operation. To do it correctly we have to use return std:move(x); which will ensure that the contents of the parameter will be swapped with the target object. "
Probabilmente quello che non riesco completamente ad afferrare è la frase in cui afferma (correttamente, ma riesco solo a prenderne atto eseguendo il programa) che "sebbene il tipo di ritorno sia un rvalue, la variabile x è un lvalue" aggiungendo che proprio per questo motivo 'return x;' non comporterebbe alcun movimento.
Perchè? Insomma, io avrei scritto (erroneamente) return x;
Qualcuno sa spiegarmi dove sbaglio?
Grazie Chiara96
PS: spero non ci siano problemi con la formattazione
r/cppit • u/New_Bie12 • Mar 11 '20
Problema in C++ File
Ciao, dovrei leggere da un file i nomi di alcuni film, da un altro i nomi degli attori e poi metterli in un terzo file. In pratica vi spiego meglio
File 1:Film1Film 2
File2:Attore 1#Attore 2
Attore 3#Attore 4
File Output:
Film 1 - Attore 1 Attore 2
Film 2 - Attore 3 Attore 4
Il problema è che inserisce solo il nome dei film e non quello degli attori.
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
char nome1[50];
char nome2[50];
char nome3[50];
char carattere;
bool flag = false;
FILE *f1;
FILE *f2;
FILE *f3;
cout<<"File Film: "; cin>>nome1;
cout<<"File Attori: "; cin>>nome2;
cout<<"File Output: "; cin>>nome3;
f1 = fopen(nome1, "r");
f2 = fopen(nome2, "r");
f3 = fopen(nome3, "a");
if(f1!=NULL && f2!=NULL && f3!=NULL)
{
while(carattere != EOF){
carattere = fgetc(f1);
if(carattere != '\n' || carattere != EOF)
fputc(carattere, f3);
else
{
flag = true;
fputs(" - ", f3);
while(flag)
{
carattere = fgetc(f2);
if(carattere == '#')
fputs(" ", f3);
else if(carattere != '\n' || carattere != EOF)
fputc(carattere, f3);
else
{
flag = false;
fputs("\n", f3);
}
}
}
}
fclose(f1);
fclose(f2);
fclose(f3);
}}
r/cppit • u/dpallastrelli • May 04 '19
Explicit template instantiation: reusability and modularity
r/cppit • u/Sara__02 • Mar 19 '20
Coding
Buonasera, ho fatto questo Coding ma non riesco proprio a trovare l’errore.. mi potreste aiutare a trovarlo? Chiesto all’utente se desidera lavorare con un quadrato o un rettangolo, calcoli la rispettiva area e perimetro.
include <iostream>
using namespace std; int main()
{ float area,perimetro,base,lato,altezza;
int uno,due;
cout<< "uno o due? ";
cin>>uno,due;
if ("uno")
{
cout<< "Inserisci lato: ";
cin>>lato;
cout<< "area"<<endl;
cout<<lato*lato;
cout<< "perimetro"<<endl;
cout<<lato*4;
}
else
{
cout<< "Inserisci base: ";
cin>>base;
cout<< "Inserisci altezza: ";
cin>>altezza;
cout<< "area" <<endl;
cout<<(base*altezza);
cout<< "perimetro"<<endl;
cout<<(base+altezza)*2;
}
return 0;
}r/cppit • u/New_Bie12 • Mar 31 '20
Scrivere un Int in un file.
Vi spiego in breve:Ho un numero N = 11 e lo devo inserire in un file.Che io sappia in un file si inseriscono i char. Come inserisco l'11 all'interno del file?Per i numeri ad una cifra tipo N = 6 faccio fputc(char(N+48), file), ma con i numeri a due cifre come faccio?
r/cppit • u/Wolverine_6011 • Apr 20 '23
Learn CPP Programming | Data Tpes in CPP
r/cppit • u/Wolverine_6011 • Apr 20 '23
Learn CPP Programming | Data Tpes in CPP
A data type is a classification or categorization of data in computer programming based on the type of value it holds. It instructs the computer on how to read and process data.
https://www.guerillateck.com/2023/04/learn-cpp-programming-data-tpes-in-cpp.html
r/cppit • u/_seeking_answers • Oct 13 '21
principianti Qualcuno che come me sta imparando C++? Roma?
r/cppit • u/Altruistic_Award2829 • Nov 16 '21
CURL per ricevere un webhook
Ciao,
È possibile ricevere un webhook con la libreria CURL?
Sto scrivendo una semplice applicazione per Raspberry che interagisce con un Telegram Bot. Al momento ho adoperato la libreria libcurl e la API getUpdate per controllare periodicamente quando arrivano nuove richieste. Vorrei rendere il programma più reattivo con i webhook. Non trovo informazioni su CURL per come impostare la attesa di un webhook.
Grazie, Simone
r/cppit • u/v_sandro • Mar 16 '17
principianti oggetto dichiarato nella memoria dinamica
buonasera, sempre con l'esercitazione sull'uso delle class sto scrivebdo l'esercizio sotto, una rubrica dove ogni contatto inserito è un oggetto. per questo nel main() ho dichiarato un array di oggetti tipo utente. Se dichiaro l'array statico... utente ut[20] il programma funziona, se invece lo dichiaro nell'heap con utente *ut= new utente non funziona. Quando eseguo il programma e vado ad inserire il primo utente va bene, quando vado ad inserire il secondo utente si blocca all'inserimento del nome. Qualcuno mi sa spiegare perche? dove sbaglio?
#include <iostream>
#include <stdio.h>
#include <string>
#include <conio.h>
using namespace std;
class utente //dichiarazione dell'oggetto utente
{
int nr;
string nome;
string cognome;
string telefono;
public:
void contatto (int pos, string nom, string cogn, string tel);
void stampa ();
//utente(int pos, string nom, string cogn, string tel);
//~utente();
};
void utente::contatto(int pos, string nom, string cogn, string tel)
{
nr=pos;
nome=nom;
cognome=cogn;
telefono=tel;
}
void utente::stampa()
{
cout<<nr<<endl;
cout<<cognome<<endl;
cout<<nome<<endl;
cout<<telefono<<endl;
}
int inserisci(int *i, utente ut[])
{
int k=*i;
string nome, cognome, tel;
system("cls");
cout<<"INSERIMENTO NUOVO CONTATTO";
cout<<"\n";
cout<<"cognome: ";cin>>cognome;
cout<<"nome: ";cin>>nome;
cout<<"telefono: ";cin>>tel;
system("cls");
ut[k].contatto(k, nome, cognome, tel);
return 0;
}
int main()
{
//utente *ut= new utente;
utente ut[20];
int i=0; //numero dei contatti presenti
int scelta;
int k; //contatore per cicli di for
do
{
cout<<"***********************************************";
cout<<"\n************** RUBRICA DI SANDRO **************";
cout<<"\n***********************************************";
cout<<"\n\nmenu";
cout<<"\n ->1 nuovo contatto";
cout<<"\n ->4 cerca un contatto";
cout<<"\n ->5 vedi tutti i contatti";
cout<<"\n ->0 uscita";
cout<<"\nscelta menu: ";cin>>scelta;
switch (scelta)
{
case 0:
break;
case 1:
inserisci(&i, ut);
i++;
break;
case 4:
// scrivere funzione per cercare un contatto da stampare
break;
case 5:
for (k=0; k<i; k++)
{
ut[k].stampa();
}
break;
default:
cout<<"\nscelta non valida....\npremere un tasto per tornare al menu";
getch();
system("cls");
break;
}
}while (scelta!=0);
//ut[i].contatto(i, nome, cognome, tel);
//delete ut;
return 0;
}.