Esercizi sull'Informatica (istituti tecnici) - Parte Prima (superiori)
I seguenti esercizi riguardano tutti gli argomenti studiati nella Parte Prima di Informatica (istituti tecnici). Essi sono divisi per paragrafi in modo tale da favorire la scelta degli esercizi specifici.
Esercizi Vacanze
modificaVacanze
Tutti sanno che durante le vacanze ci si riposa, si prende il sole e si evitano libri e compiti , ma se ci fosse qualcuno curioso o che non sa come passare il tempo ecco alcuni esercizi risolti, di ciascuno una versione risolta senza l'uso delle funzioni e una versione risolta usando le funzioni.
Esercizi1
modificaEsercizi
media di n numeri
modificaEsercizio n.1 Calcolare la media di n numeri.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ float somma ,media,x;
int n, i;
cout<<"quanti sono i numeri di cui vuoi trovare la media?";
cin>>n;
somma=0;
for (i=0;i<n;i++)
{ cout<<"inserisci il "<< i+1 <<" elemento";
cin>>x;
somma=somma+x;
}
media=somma/n;
cout<<"la media vale "<<media<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
using namespace std;
float media( float v[], int n);
int main(int argc, char *argv[])
{ int m,i;
float risultato;
cout<<"quanti sono i numeri di cui vuoi trovare la media?";
cin>>m;
float vett[m];
for (i=0;i<m;i++)
{ cout<<"inserisci il "<< i+1 <<" elemento";
cin>>vett[i];
}
risultato=media(vett,m);
cout<<"la media vale "<<risultato<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
float media( float v[], int n)
{ float somma ,rmedia;
int i;
somma=0;
for (i=0;i<n;i++)
somma=v[i]+somma;
rmedia=somma/n;
return rmedia;
}
fattoriale
modificaEsercizio n.2
calcolare il fattoriale di un numero intero positivo
#include <cstdlib>
#include <iostream>
//Esercizio calcolare il fattoriale di un numero intero positivo
//soluzione non ricorsiva e senza uso funzioni 4!=4*3*2*1 0!=1
using namespace std;
int main(int argc, char *argv[])
{ int i,n;
float risultato;
cout<<" di che numero intero positivo vuoi calcolare il fattoriale?";
cin>>n;
risultato=1;
for( i=n;i>0;i--)
risultato=risultato*i;
cout<<"il fattoriale di "<<n<<" vale "<<risultato<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
//Esercizio 2 calcolare il fattoriale di un numero intero positivo
//soluzione ricorsiva e con uso funzioni 4!=4*3! 0!=1
using namespace std;
float fattoriale( int n);
int main(int argc, char *argv[])
{ int m;
float risultato;
cout<<" di che numero intero positivo vuoi calcolare il fattoriale?";
cin>>m;
risultato=fattoriale(m);
cout<<"il fattoriale di "<<m<<" vale "<<risultato<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
float fattoriale( int n)
{ if (n==0) return 1;
else return n*fattoriale(n-1);
}
convertitore lire/euro
modificaEsercizio n.3
Realizzare un convertitore lire/euro
#include <cstdlib>
#include <iostream>
//Esercizio Realizzare un convertitore, ad esempio lire/euro.
using namespace std;
int main(int argc, char *argv[])
{ float lire, euro;
const float fattoreconversione= 1936.21;
cout<<"inserisci l'importo in lire";
cin>>lire;
euro=lire/fattoreconversione;
cout<< lire<<" lire sono "<<euro<< " euro"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
//Esercizio 3 Realizzare un convertitore lire/euro usando una funzione.
using namespace std;
float convertilireineuro(float lire);
int main(int argc, char *argv[])
{ float slire, seuro;
cout<<"inserisci l'importo in lire";
cin>>slire;
seuro=convertilireineuro(slire);
cout<< slire<<" lire sono "<<seuro<< " euro"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
float convertilireineuro(float lire)
{float euro;
const float fattoreconversione= 1936.21;
euro=lire/fattoreconversione;
return euro;
}
Contare gli zeri in una matrice
modificaEsercizio 4
Scrivere un programma che in una matrice assegnata conti quante volte il numero 0 è presente su ciascuna riga.
#include <cstdlib>
#include <iostream>
/* Scrivere un programma che controlla la frequenza degli elementi che hanno
valore pari a 0 in una matrice assegnata.
Restituire i rispettivi valori riga per riga.
*/
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>mat[i][j];
}
for(i=0;i<m;i++)
{ conta=0;
for(j=0;j<n;j++)
if(mat[i][j]==0) conta++;
cout<<"nella riga "<<i<<" della matrice ci sono "<<conta<<" zeri"<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/* Scrivere un programma che controlla la frequenza degli elementi che hanno
valore pari a 0 in una matrice assegnata.
Restituire i rispettivi valori riga per riga.
utilizza le funzioni per risolvere il problema
*/
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void conta_zeri_per_riga( int *mt, int m, int n, int *zeri );
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
inserisci_matrice((int*)mat,m,n);
cout<<"la matrice inserita' e':"<<endl;
stampa_matrice((int*)mat,m,n);
int soluz[m];
conta_zeri_per_riga((int*)mat,m,n,soluz);
for(i=0;i<m;i++)
cout<<"nella riga "<<i<<" della matrice ci sono "<<soluz[i]<<" zeri"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>*(mt+i*n+j);
}
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j)<<"\t";
cout<<endl;
}
}
void conta_zeri_per_riga( int *mt, int m, int n, int *zeri )
{int i,j,conta;
for(i=0;i<m;i++)
{conta=0;
for(j=0;j<n;j++)
if(*(mt+i*n+j)==0) conta++;
*(zeri+i)=conta; //inserisco nel vettore delle soluzioni
}
}
ricerca esaustiva
modificaEsercizio 5
Ricerca di un elemento in vettore.
#include <cstdlib>
#include <iostream>
//Esercizio 7 Ricerca di un elemento in vettore.
using namespace std;
int main(int argc, char *argv[])
{ int i,n,elementoric;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int vett[n];
for(i=0;i<n;i++)
{cout<<"inserisci l'elemnto del vettore di posizione ["<<i<<"]";
cin>>vett[i];
}
cout<<"inserisci l'elemento da ricercare nel vettore";
cin>>elementoric;
cout<<"l'elemento "<<elementoric<<" si trova nelle righe :"<<endl;
for(i=0;i<n;i++)
if(vett[i]==elementoric) cout<<i<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
//Esercizio 7 Ricerca di un elemento in vettore soluzione con funzioni.
using namespace std;
void trovanumero(int v[],int n, int ncercato, int pos[], int *ntrovati);
int main(int argc, char *argv[])
{ int i,n,elementoric;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int vett[n];
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore di posizione ["<<i<<"]";
cin>>vett[i];
}
cout<<"inserisci l'elemento da ricercare nel vettore";
cin>>elementoric;
int posizioni[n];// meglio usare una coda ma ... sono pigro in 3^
int quantepos;
trovanumero(vett,n,elementoric,posizioni,&quantepos);
cout<<"l'elemento "<<elementoric<<" si trova nelle righe :"<<endl;
for(i=0;i<quantepos;i++)
cout<<posizioni[i]<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
void trovanumero(int v[],int n,int ncercato, int pos[], int *ntrovati)
{ int i;
*ntrovati=0;// conta quante volte il valore cercato e' presente nel vettore
for(i=0;i<n;i++)
if(v[i]==ncercato)
{ pos[*ntrovati]=i;
(*ntrovati)++;
}
}
somma di 2 vettori
modificaEsercizio 6
Fare la somma di 2 vettori e scrivere il risultato in un terzo vettore c[i]=a[i]+b[i] dimensione del vettore inserita dal'utente ( e quindi variabile)
#include <cstdlib>
#include <iostream>
/* Fare la somma di 2 vettori e scrivere il risultato in un terzo vettore
c[i]=a[i]+b[i] dimensione del vettore inserita dal'utente ( e quindi variabile)
*/
using namespace std;
int main(int argc, char *argv[])
{ int i,n;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int a[n],b[n],c[n];
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore a di posizione ["<<i<<"]";
cin>>a[i];
}
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore b di posizione ["<<i<<"]";
cin>>b[i];
}
for(i=0;i<n;i++)
c[i]=a[i]+b[i];
cout<<"il vettore c somma dei vettori a e b e' "<<endl;
for(i=0;i<n;i++)
cout<<"c["<<i<<"]="<<c[i]<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/* Fare la somma di 2 vettori e scrivere il risultato in un terzo vettore
c[i]=a[i]+b[i] dimensione del vettore inserita dal'utente (e quindi variabile)
usando le funzioni
*/
void inseriscivettore(int v[],int n);
void stampavettore(int v[],int n);
void sommavettore(int a[],int b[], int c[], int n);
using namespace std;
int main(int argc, char *argv[])
{ int i,n;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int a[n],b[n],c[n];
cout<<"inserisci il vettore a"<<endl;
inseriscivettore(a,n);
cout<<"inserisci il vettore b"<<endl;
inseriscivettore(b,n);
sommavettore(a,b,c,n);
cout<<"il vettore c somma dei vettori a e b e' "<<endl;
stampavettore(c,n);
system("PAUSE");
return EXIT_SUCCESS;
}
void inseriscivettore(int v[],int n)
{int i;
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore di posizione ["<<i<<"]";
cin>>v[i];
}
}
void sommavettore(int a[],int b[], int c[], int n)
{int i;
for(i=0;i<n;i++)
c[i]=a[i]+b[i];
}
void stampavettore(int v[],int n)
{ int i;
for(i=0;i<n;i++)
cout<<v[i]<<",";
cout<<endl;
}
copia vettore
modificaEsercizio n.7 Scrivere un programma che copia i valori di un vettore su un secondo vettore utilizzando i puntatori.
#include <cstdlib>
#include <iostream>
//Esercizio 9 Scrivere un programma che eguaglia un vettore ad un altro
// utilizzando i puntatori.
using namespace std;
int main(int argc, char *argv[])
{ int i,n;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int a[n],b[n];
int *pa,*pb;
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore a di posizione ["<<i<<"]";
cin>>a[i];
}
pa=a;
pb=b;
for(i=0;i<n;i++) *pb++=*pa++;
/* il ciclo di prima poteva essere scritto come
for(i=0;i<n;i++)
{ *pb =*pa;
pa++;
pb++;
}
*/
cout<<"il vettore b vale "<<endl;
for(i=0;i<n;i++)
cout<<"b["<<i<<"]="<<b[i]<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
//Esercizio 9 Scrivere un programma che eguaglia un vettore ad un altro
// utilizzando i puntatori e le funzioni.
using namespace std;
void inseriscivettore(int v[],int n);
void stampavettore(int v[],int n);
void uguagliavettore(int *a,int *b, int n);
int main(int argc, char *argv[])
{ int i,n;
cout<<"inserisci la dimensione del vettore";
cin>>n;
int a[n],b[n];
cout<<"inserisci il vettore a"<<endl;
inseriscivettore(a,n);
uguagliavettore(a,b,n);
cout<<"il vettore b e' "<<endl;
stampavettore(b,n);
system("PAUSE");
return EXIT_SUCCESS;
}
void inseriscivettore(int v[],int n)
{int i;
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore di posizione ["<<i<<"]";
cin>>v[i];
}
}
void uguagliavettore(int *a,int *b, int n)
{int i;
for(i=0;i<n;i++)
*b++=*a++;
}
void stampavettore(int v[],int n)
{ int i;
for(i=0;i<n;i++)
cout<<v[i]<<",";
cout<<endl;
}
Esercizi2
modificaEsercizi
scambiare 2 righe matrice
modificaEsercizio n.8 Sviluppare una procedura che scambi i valori della riga i di una matrice con i valori della riga j (con i e j parametri della procedura). Sviluppare un programma principale che chiami la procedura.
#include <cstdlib>
#include <iostream>
/*Esercizio 10 Sviluppare una procedura che scambi i valori della riga i
di una matrice con i valori della riga j
(con i e j parametri della procedura).
Sviluppare un programma principale che chiami la procedura
*/
using namespace std;
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void scambia_riga_i_con_riga_j( int *mt, int m, int n, int i, int j );
int main(int argc, char *argv[])
{ int m,n,ri,rj;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
inserisci_matrice((int*)mat,m,n);
cout<<"la matrice inserita' e':"<<endl;
stampa_matrice((int*)mat,m,n);
cout<<" seleziona una riga della matrice ?";
cin >>ri;
cout<<" seleziona una seconda riga della matrice ?";
cin >>rj;
scambia_riga_i_con_riga_j((int *)mat,m,n,ri,rj);
cout<<"la matrice con le righe scambiate e':"<<endl;
stampa_matrice((int*)mat,m,n);
system("PAUSE");
return EXIT_SUCCESS;
}
void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>*(mt+i*n+j);
}
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j)<<"\t";
cout<<endl;
}
}
void scambia_riga_i_con_riga_j( int *mt, int m, int n, int i, int j )
{int k,temp;
for(k=0;k<n;k++)
{ temp=*(mt+i*n+k);
*(mt+i*n+k)=*(mt+j*n+k);
*(mt+j*n+k)=temp;
}
}
Soluzione breve
#include <cstdlib>
#include <iostream>
using namespace std;
void scambiorighe(int *mat,int nrig, int ncol,int x, int y);
void scambiorighe(int *mat,int nrig, int ncol,int x, int y)
{ int k;int temp;
for(k=0;k<ncol;k++)
{temp=*(mat+x*ncol+k);
*(mat+x*ncol+k)=*(mat+y*ncol+k);
*(mat+y*ncol+k)=temp;
}
}
int main(int argc, char *argv[])
{
int nr,nc;
cout<<"dimensione matrice"<<endl<<"righe: ";
cin>>nr;
cout<<"colonne: ";
cin>>nc;
int matrice[nr][nc];
int i,j;
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
matrice[i][j]=rand()%10;
for(i=0;i<nr;i++)
{for(j=0;j<nc;j++)
cout<<matrice[i][j]<<" ";
cout<<endl;
}
int rigax,rigay;
cout<<"che righe vuoi scambiare?";
cin>>rigax;
cin>>rigay;
scambiorighe((int*)matrice,nr,nc,rigax,rigay);
for(i=0;i<nr;i++)
{for(j=0;j<nc;j++)
cout<<matrice[i][j]<<" ";
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
ricerca sottomatrici
modificaEsercizio n.9
Scrivere un programma atto ad identificare nell'interno di una matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.
#include <cstdlib>
#include <iostream>
/* Esercizio 11 Scrivere un programma atto ad identificare nell'interno di una
matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.
*/
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>mat[i][j];
}
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
for(i=0;i<=m-2;i++)
for(j=0;j<=n-2;j++)
if(mat[i][j]==0 &&mat[i+1][j]==0 &&mat[i][j+1]==0 &&mat[i+1][j+1]==0 )
cout<<"trovata sottomatrice 2*2 nulla con vertice il alto a sx di coord ["
<<i<<","<<j<<"]"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/* Esercizio 11 Scrivere un programma atto ad identificare nell'interno di una
matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.
*/
using namespace std;
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void posizioni_sottomatrici2x2_nulle( int *mt, int m, int n, int posizioni[][2]
, int *quante );
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
inserisci_matrice((int*)mat,m,n);
cout<<"la matrice inserita' e':"<<endl;
stampa_matrice((int*)mat,m,n);
int soluz[m*n][2];
int contaquante;
posizioni_sottomatrici2x2_nulle((int*)mat,m,n,soluz,&contaquante);
for(i=0;i<contaquante;i++)
cout<<"trovata sottomatrice 2*2 nulla con vertice il alto a sx di coord ["
<<soluz[i][0]<<","<<soluz[i][1]<<"]"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>*(mt+i*n+j);
}
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j)<<"\t";
cout<<endl;
}
}
void posizioni_sottomatrici2x2_nulle( int *mt, int m, int n, int posizioni[][2]
, int *quante )
{int i,j;
*quante=0;
for(i=0;i<=m-2;i++)
for(j=0;j<=n-2;j++)
if(*(mt+i*n+j)==0 && *(mt+(i+1)*n+j)==0 && *(mt+i*n+j+1)==0
&& *(mt+(i+1)*n+j+1)==0 )
{ posizioni[*quante][0]=i;
posizioni[*quante][1]=j;
(*quante)++;
}
}
ricerca riga matrice max e min
modificaEsercizio n.10
Per un'assegnata matrice determinare la riga con la somma di elementi massima e quella con la somma minima. Effettuare lo scambio tra le righe precedentemente determinate.
#include <cstdlib>
#include <iostream>
/* Esercizio 12 Per un'assegnata matrice determinare la riga con la somma di
elementi massima e quella con la somma minima.
Effettuare lo scambio tra le righe precedentemente determinate.
*/
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>mat[i][j];
}
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
int rigamax=0;
int somma=0;
int sommamax = 0;
for(j=0;j<n;j++)sommamax=sommamax+mat[0][j];
for(i=1;i<m;i++)
{somma=0;
for(j=0;j<n;j++) somma=somma+mat[i][j];
if(somma>sommamax)
{ sommamax=somma;
rigamax=i;
}
}
cout<<"rigamax"<<rigamax<<endl;
int rigamin=0;
int sommamin = 0;
for(j=0;j<n;j++)sommamin=sommamin+mat[0][j];
for(i=1;i<m;i++)
{somma=0;
for(j=0;j<n;j++) somma=somma+mat[i][j];
if(somma<sommamin)
{ sommamin=somma;
rigamin=i;
}
}
cout<<"rigamin"<<rigamin<<endl;
int k,temp;
for(k=0;k<n;k++)
{ temp=mat[rigamax][k];
mat[rigamax][k]=mat[rigamin][k];
mat[rigamin][k]=temp;
}
cout<<"la matrice con le righe dalla somma max e min scambiate fra loro e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/* Esercizio 12 Per un'assegnata matrice determinare la riga con la somma di
elementi massima e quella con la somma minima.
Effettuare lo scambio tra le righe precedentemente determinate.
*/
using namespace std;
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void scambia_riga_min_con_riga_max( int *mt, int m, int n);
int main(int argc, char *argv[])
{ int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
inserisci_matrice((int*)mat,m,n);
cout<<"la matrice inserita' e':"<<endl;
stampa_matrice((int*)mat,m,n);
scambia_riga_min_con_riga_max((int *)mat,m,n);
cout<<"la matrice con le righe scambiate e':"<<endl;
stampa_matrice((int*)mat,m,n);
system("PAUSE");
return EXIT_SUCCESS;
}
void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
cin>>*(mt+i*n+j);
}
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j)<<"\t";
cout<<endl;
}
}
void scambia_riga_min_con_riga_max( int *mt, int m, int n )
{int i,j;
int rigamax=0;
int somma=0;
int sommamax = 0;
for(j=0;j<n;j++)sommamax=sommamax+*(mt+0*n+j);
for(i=1;i<m;i++)
{somma=0;
for(j=0;j<n;j++) somma=somma+*(mt+i*n+j);
if(somma>sommamax)
{ sommamax=somma;
rigamax=i;
}
}
int rigamin=0;
int sommamin = 0;
for(j=0;j<n;j++)sommamin=sommamin+*(mt+0*n+j);
for(i=1;i<m;i++)
{somma=0;
for(j=0;j<n;j++) somma=somma+*(mt+i*n+j);
if(somma<sommamin)
{ sommamin=somma;
rigamin=i;
}
}
int k,temp;
for(k=0;k<n;k++)
{ temp=*(mt+rigamin*n+k);
*(mt+rigamin*n+k)=*(mt+rigamax*n+k);
*(mt+rigamax*n+k)=temp;
}
}
Incornicia la matrice
modificaEsercizio 11
Considerando una matrice bidimensionale come rappresentativa dei punti della superficie di un quadrato, scrivere un programma per porre a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso contenuto.
#include <cstdlib>
#include <iostream>
/* Esercizio 13 Considerando una matrice bidimensionale come rappresentativa
dei punti della superficie di un quadrato, scrivere un programma per porre
a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso
contenuto.
*/
using namespace std;
int main(int argc, char *argv[])
{int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
mat[i][j]=0;
int rq,cq,lq;
cout<<"inserisci le coordinate del quadrato vertice sx in alto "<<endl;
cout<<"riga?";
cin>>rq;
cout<<"colonna?";
cin>>cq;
cout<<"dimensione lato ?";
cin>>lq;
for(i=rq;i<m && i<rq+lq;i++)
{ mat[i][cq]=1;
mat[i][cq+lq-1]=1;
}
for(j=cq;j<n && j<cq+lq;j++)
{ mat[rq][j]=1;
mat[rq+lq-1][j]=1;
}
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j];
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/* Esercizio 13 Considerando una matrice bidimensionale come rappresentativa
dei punti della superficie di un quadrato, scrivere un programma per porre
a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso
contenuto.
*/
using namespace std;
void stampa_matrice( int *mt, int m, int n);
void disegnaquadrato( int *mt, int m, int n, int rq, int cq,int lq );
int main(int argc, char *argv[])
{int m,n,i,j,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
int rq,cq,lq;
cout<<"inserisci le coordinate del quadrato vertice sx in alto "<<endl;
cout<<"riga?";
cin>>rq;
cout<<"colonna?";
cin>>cq;
cout<<"dimensione lato ?";
cin>>lq;
disegnaquadrato((int *) mat,m,n,rq,cq,lq);
cout<<"la matrice inserita e'"<<endl;
stampa_matrice((int*)mat,m,n);
system("PAUSE");
return EXIT_SUCCESS;
}
void disegnaquadrato( int *mt, int m, int n, int rq, int cq,int lq )
{int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(mt+i*n+j)=0;
for(i=rq;i<m && i<rq+lq;i++)
{ *(mt+i*n+cq)=1;
*(mt+i*n+cq+lq-1)=1;
}
for(j=cq;j<n && j<cq+lq;j++)
{ *(mt+rq*n+j)=1;
*(mt+(rq+lq-1)*n+j)=1;
}
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j);
cout<<endl;
}
}
ordinare un vettore
modificaEsercizio 12
Ordinamento di un vettore in modo crescente e decrescente.
Soluzione con l'uso delle funzioni
fusione di 2 vettori
modificaEsercizio 13
Fusione di due vettori. (cioè dati due vettori ordinati creare un terzo vettore con dimensione pari alla somma dei 2 vettori precedenti e che contenga gli stessi dati dei due vettori precedenti e che siano ordinati, non usare bubblesort perché la tecnica della fusione è O(n1+n2), per fare questo devi usare due indici i e j che puntino inizialmente alla posizione 0 di entrambi i 2 vettori iniziali identificare l'elemento più piccolo e scriverlo nel terzo vettore poi devi avanzare nel vettore da cui hai letto l'elemento quindi i++ o j++ e cercare nuovamente l'elemento più piccolo dei due puntati da i e j ecc, se uno dei 2 vettori termina trascrivi la parte finale dell'altro sul terzo vettore.
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,n1;
cout<<"inserisci la dimensione del primo vettore";
cin>>n1;
int v1[n1];
cout<<"inserisci gli elementi del 1^ vettore, il vettore e'ordinato"<<endl;
for(i=0;i<n1;i++)
{cout<<"inserisci l'elemento di posizione ["<<i<<"]";
cin>>v1[i];
}
int n2;
cout<<"inserisci la dimensione del secondo vettore";
cin>>n2;
int v2[n2];
cout<<"inserisci gli elementi del 2^ vettore, il vettore e'ordinato"<<endl;
for(i=0;i<n2;i++)
{cout<<"inserisci l'elemento di posizione ["<<i<<"]";
cin>>v2[i];
}
int v3[n1+n2];
int pv1=0;
int pv2=0;
while(pv1<n1 && pv2<n2)
{ if(v1[pv1]<=v2[pv2])
{v3[pv1+pv2]=v1[pv1];
pv1++;
}
else
{v3[pv1+pv2]=v2[pv2];
pv2++;
}
}
while(pv1<n1)
{ v3[pv1+pv2]=v1[pv1];
pv1++;
}
while(pv2<n2)
{ v3[pv1+pv2]=v2[pv2];
pv2++;
}
cout<<"la fusione dei 2 vettori ha dato luogo a questo vettore"<<endl;
for(i=0;i<n1+n2;i++)
cout<<v3[i]<<",";
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/*Fusione di due vettori.( cioè dati due vettori ordinati creare un terzo
vettore con dimensione pari alla somma dei 2 vettori precedenti e che contenga
gli stessi dati dei due vettori precedenti e che siano ordinati , non usare
bubblesort perché la tecnica della fusione è O(n1+n2) , per fare questo devi
usare due indici i e j che puntino inizialmente alla posizione 0 di entrambi
i 2 vettori iniziali identificare l'elemento più piccolo e scriverlo nel terzo
vettore poi devi avanzare nel vettore da cui hai letto l'elemento quindi i++
o j++ e cercare nuovamente l'elemento più piccolo dei due puntati da i e j
etc , se uno dei 2 vettori termina trascrivi la parte finale dell'altro sul
terzo vettore.
*/
using namespace std;
void inseriscivettore(int v[],int n);
void stampavettore(int v[],int n);
void fusionevettore(int a[],int na, int b[],int nb, int c[]);
int main(int argc, char *argv[])
{
int i,n1;
cout<<"inserisci la dimensione del primo vettore";
cin>>n1;
int v1[n1];
cout<<"inserisci gli elementi del 1^ vettore, il vettore e'ordinato"<<endl;
inseriscivettore(v1,n1);
int n2;
cout<<"inserisci la dimensione del secondo vettore";
cin>>n2;
int v2[n2];
cout<<"inserisci gli elementi del 2^ vettore, il vettore e'ordinato"<<endl;
inseriscivettore(v2,n2);
int v3[n1+n2];
fusionevettore(v1,n1,v2,n2,v3);
cout<<"la fusione dei 2 vettori ha dato luogo a questo vettore"<<endl;
stampavettore(v3,n1+n2);
system("PAUSE");
return EXIT_SUCCESS;
}
void inseriscivettore(int v[],int n)
{int i;
for(i=0;i<n;i++)
{cout<<"inserisci l'elemento del vettore di posizione ["<<i<<"]";
cin>>v[i];
}
}
void fusionevettore(int a[],int na, int b[],int nb, int c[])
{int i;
int pa=0;
int pb=0;
while(pa<na && pb<nb)
{ if(a[pa]<=b[pb])
{c[pa+pb]=a[pa];
pa++;
}
else
{c[pa+pb]=b[pb];
pb++;
}
}
while(pa<na)
{ c[pa+pb]=a[pa];
pa++;
}
while(pb<nb)
{ c[pa+pb]=b[pb];
pb++;
}
}
void stampavettore(int v[],int n)
{ int i;
for(i=0;i<n;i++)
cout<<v[i]<<",";
cout<<endl;
}
occorrenze matrice
modificaEsercizio n.13 Scrivere un programma per la ricerca di un elemento in una matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare il numero di volte che si ripete ogni numero
#include <cstdlib>
#include <iostream>
/*Esercizio 17 Scrivere un programma per la ricerca di un elemento in una
matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare
il numero di volte che si ripete ogni numero.
*/
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,x,y,numero,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
mat[i][j]=rand()%10;
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
cout<<"inserisci il numero di cui vuoi calcolare la freq ";
cin>>numero;
conta=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if (mat[i][j]==numero) conta++;
cout<<"la frequenza del numero"<<numero<<" e' di "<<conta<<" volte"<<endl;
int frequenze[m*n][2];
for(i=0;i<m*n;i++) {frequenze[i][0]=0; frequenze[i][1]=0;}
int k;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ k=0;
while( frequenze[k][1]!=0 && mat[i][j]!= frequenze[k][0] ) k++;
if( frequenze[k][1] == 0) frequenze[k][0]=mat[i][j];
frequenze[k][1]++;
}
k=0;
while( frequenze[k][1] != 0)
{ cout<<"la frequenza del numero"<<frequenze[k][0]<<" e' di "
<<frequenze[k][1]<<" volte"<<endl;
k++;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
/*Esercizio 17 Scrivere un programma per la ricerca di un elemento in una
matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare
il numero di volte che si ripete ogni numero.
*/
using namespace std;
int frequenza(int *m, int nc,int nr, int numeroricercare);
void frequenza2(int *m, int nc,int nr, int soluzioni[][2]);
int main(int argc, char *argv[])
{ int m,n,i,j,x,y,numero,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
mat[i][j]=rand()%10;
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
cout<<"inserisci il numero di cui vuoi calcolare la freq ";
cin>>numero;
conta=frequenza((int *)mat,m,n,numero);
cout<<"la frequenza del numero"<<numero<<" e' di "<<conta<<" volte"<<endl;
int frequenze[m*n][2];
frequenza2((int *)mat, m, n, frequenze );
int k=0;
while( frequenze[k][1] != 0)
{ cout<<"la frequenza del numero"<<frequenze[k][0]<<" e' di "
<<frequenze[k][1]<<" volte"<<endl;
k++;
}
system("PAUSE");
return EXIT_SUCCESS;
}
int frequenza(int *m, int nc,int nr, int numeroricercare)
{int i,j,conta=0;
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
if (*(m+i*nc+j)==numeroricercare) conta++;
return conta;
}
void frequenza2(int *m, int nc,int nr, int soluzioni[][2])
{int i,j;
for(i=0;i<nc*nr;i++) {soluzioni[i][0]=0; soluzioni[i][1]=0;}
int k;
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
{ k=0;
while( soluzioni[k][1]!=0 && *(m+i*nc+j)!= soluzioni[k][0] ) k++;
if( soluzioni[k][1] == 0) soluzioni[k][0]=*(m+i*nc+j);
soluzioni[k][1]++;
}
}
Esercizi3
modificaEsercizi
ricerca righe simili
modificaEsercizio n.14 Scrivere un programma atto alla ricerca, in una matrice assegnata, delle righe aventi più elementi comuni per uno stesso indice di colonna.
#include <cstdlib>
#include <iostream>
/* Esercizio 18 Scrivere un programma atto alla ricerca, in una matrice
assegnata, delle righe aventi più elementi comuni per uno stesso indice
di colonna.
*/
using namespace std;
int main(int argc, char *argv[])
{ int m,n,i,j,k,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
mat[i][j]=rand()%10;
cout<<"la matrice inserita e'"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
for(i=0;i<m;i++) //seleziono una riga
for(j=0;j<m;j++) // confronto con una seconda riga
{ if(i==j) continue; // salto confronto se le righe scelte sono le medesime
conta=0;
for(k=0;k<n;k++)
if (mat[i][k]==mat[j][k]) conta++;
if(conta>1) cout <<"la riga"<<i<<" ha "<<conta
<<" elementi in comune con la riga"<< j<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Soluzione con funzioni
#include <cstdlib>
#include <iostream>
/* Esercizio 18 Scrivere un programma atto alla ricerca, in una matrice
assegnata, delle righe aventi più elementi comuni per uno stesso indice
di colonna.
*/
using namespace std;
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
int confronta_righe( int *mt, int m, int n,int riga1, int riga2);
int main(int argc, char *argv[])
{ int m,n,i,j,k,conta;
cout<<" di quante righe e' composta la matrice ?";
cin >>m;
cout<<" di quante colonne e' composta la matrice ?";
cin >>n;
int mat[m][n];
inserisci_matrice((int *)mat,m,n);
cout<<"la matrice inserita e'"<<endl;
stampa_matrice((int *)mat,m,n);
for(i=0;i<m;i++) //seleziono una riga
for(j=0;j<m;j++) // confronto con una seconda riga
{ conta=confronta_righe( (int *)mat, m, n,i,j);
if(conta>1) cout <<"la riga"<<i<<" ha "<<conta
<<" elementi in comune con la riga"<< j<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(mt+i*n+j)=rand()%10;
}
void stampa_matrice( int *mt, int m, int n)
{ int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<*(mt+i*n+j)<<"\t";
cout<<endl;
}
}
int confronta_righe( int *mt, int m, int n,int riga1, int riga2)
{ int k, conta=0;;
if(riga1==riga2) return 0;// salto confronto se le righe scelte sono le stesse
for(k=0;k<n;k++)
if (*(mt+riga1*n+k)==*(mt+riga2*n+k)) conta++;
return conta;
}
ricerca sottomatrici
modificaEsercizio n.15
Siano assegnati da tastiera due vettori di interi vett1 e vett2 (max 50 elementi). Si progetti una funzione ALTERNA che riceva in ingresso i due vettori e restituisca un vettore vett3 costituito alternando gli elementi di vett1 e vett2. La funzione ALTERNA deve anche restituire come valore di ritorno la somma di tutti gli elementi del vettore vett3.
#include <cstdlib>
#include <iostream>
/* 19Siano assegnati da tastiera due vettori di interi vett1 e vett2
(max 50 elementi). Si progetti una funzione ALTERNA che riceva in ingresso
i due vettori e restituisca un vettore vett3 costituito alternando
gli elementi di vett1 e vett2. La funzione ALTERNA deve anche restituire
come valore di ritorno la somma di tutti gli elementi del vettore vett3.
*/
using namespace std;
void inseriscivettore(int v[],int n);
void stampavettore(int v[],int n);
int alterna(int a[], int b[], int c[],int n);
int main(int argc, char *argv[])
{ int i,n1,somma;
cout<<"inserisci la dimensione del vettore";
cin>>n1;
int v1[n1];
inseriscivettore(v1,n1);
cout<<"vettore 1"<<endl;
stampavettore(v1,n1);
int v2[n1];
inseriscivettore(v2,n1);
cout<<"vettore 2"<<endl;
stampavettore(v2,n1);
int v3[2*n1];
somma=alterna(v1,v2,v3,n1);
cout<<"la fusione alternata dei 2 vettori ha dato luogo a questo vettore"<<endl;
stampavettore(v3,2*n1);
cout<<"la somma degli elementi del vettore e vale "<<somma<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
void inseriscivettore(int v[],int n)
{int i;
for(i=0;i<n;i++)
v[i]=rand()%10;
}
int alterna(int a[], int b[], int c[],int n)
{int i,s;
s=0;
for(i=0;i<n;i++)
{ c[2*i]=a[i];
c[2*i+1]=b[i];
s=s+a[i]+b[i];
}
return s;
}
void stampavettore(int v[],int n)
{ int i;
for(i=0;i<n;i++)
cout<<v[i]<<",";
cout<<endl;
}
variante Soluzione con l'uso delle funzioni
#include <cstdlib>
#include <iostream>
using namespace std;
void alterna(int vet1[], int vet2[],int vet3[],int num);
void alterna(int vet1[], int vet2[],int vet3[],int num)
{ int k;
for(k=0;k<num;k+2)
{vet3[k]=vet1[k];
}
for(k=1;k<num;k+2)
{vet3[k]=vet2[k];
}
}
int main(int argc, char *argv[])
{
int n; int i;
cout<<"dimensione vettore: ";
cin>>n;
int vettore1[n]; int vettore2[n]; int vettore3[n];
for(i=0;i<n;i++)
{vettore1[i]=rand()%10;
vettore2[i]=rand()%10;
}
cout<<"vettore1:"<<endl;
for(i=0;i<n;i++)
{cout<<vettore1[i];
cout<<endl;
}
cout<<"vettore2:"<<endl;
for(i=0;i<n;i++)
{cout<<vettore2[i];
cout<<endl;
}
alterna(vettore1,vettore2,vettore3,n);
cout<<"vettore3:"<<endl;
for(i=0;i<(n);i++)
{cout<<vettore3[i];
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
calcolo funzione sin(x)
modificaEsercizio n.16
Calcolo della funzione f(x)=sin(x) nell'intervallo 0 - 4pigreco con spaziatura di 0,1 pigreco
#include <cstdlib>
#include <iostream>
#include <math.h>
/* 24Calcolo della funzione f(x)=sin(x) nell'intervallo 0 - 4pigreco
con spaziatura di 0,1 pigreco
*/
using namespace std;
int main(int argc, char *argv[])
{ float tempo ,tiniziale=0;
float tfinale=4*3.14;
float passo=0.1*3.14;
float y;
tempo=tiniziale;
cout<<"tempo \t y=sin(t) "<<endl;
while (tempo<=tfinale)
{ y=sin(tempo);
cout<<tempo<<"\t"<<y<<endl;
tempo=tempo+passo;
}
system("PAUSE");
return EXIT_SUCCESS;
}
8 regine
modificaEsercizio 17
Analizza e spiega in forma scritta l'esercizio delle 8 regine.
#include <cstdlib>
#include <iostream>
using namespace std;
/* funzione ricorsiva problema 8 regine
obiettivo: calcolo ricorsivo
semplificazione combinazioni problema 8 regine
scelta modello rappresentazione disposizioni 8 regine
*/
void regina( int n, int r[8],int d1[14], int d2[14], int sol[8]);
int main(int argc, char *argv[])
{
int righe[]={1,1,1,1,1,1,1,1};
int diagipiuj[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int diagimenoj[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int soluzioni[]={-1,-1,-1,-1,-1,-1,-1,-1};
regina(0,righe,diagipiuj,diagimenoj,soluzioni);
system("PAUSE");
return 0;
}
void regina( int n, int r[8],int d1[14], int d2[14], int sol[8])
{ int i;
if (n==8)
{for(i=0;i<8;i++)
cout<<"mat["<<sol[i]<<"]["<<i<<"],";
cout<<endl;
}
else
for(i=0;i<8;i++)
if (r[i]&&d1[i+n]&&d2[i-n+7])
{ sol[n]=i;
r[i]=0;
d1[i+n]=0;
d2[i-n+7]=0;
regina(n+1,r,d1,d2,sol);
sol[n]=-1;
r[i]=1;
d1[i+n]=1;
d2[i-n+7]=1;
}
}
usare le struct
modificaEsercizio 18
Scrivi un programma che utilizzando le struct permetta di registrare su un file di record 10 città con le relative temperature e il numero di abitanti
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
struct citta
{
char nome[10];
int popolazione;
int temperatura;
};
int main(int argc, char *argv[])
{
int n=10;
citta c;
int i;
ofstream fo;
fo.open("elenco.dat",ios::binary);
for (i=0;i<n;i++)
{
cout<<"inserisci il nome: ";
cin>>c.nome;
cout<<"inserisci la popolazione: ";
cin>>c.popolazione;
cout<<"inserisci la temperatura: ";
cin>>c.temperatura;
fo.write((const char*)&c,sizeof c);
}
fo.close();
system("PAUSE");
return EXIT_SUCCESS;
}
file di records ordinati
modificaEsercizio n.19 Scrivi un programma che legga i dati dal file precedente e li carichi in un vettore( di struct) e visualizzi la città più numerosa, dopo averlo fatto stampa le città ordinate per temperatura (usa il bubblesort) e poi tramite la ricerca dicotomica ricerca una città restituendo se la città è presente il valore della sua temperatura e quello della popolazione , se la città non è presente il programma scrive "citta' non presente".
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
struct citta
{
char nome[10];
int popolazione;
int temperatura;
};
int main(int argc, char *argv[])
{
int n=10;
int i,j;
ifstream fin("elenco.dat",ios::binary);
if(!fin){cout<<"err apertura file"; return 2; }
citta elenco[10];
for(int i=0;i<10;i++)
fin.read((char *) &elenco[i], sizeof(citta));
fin.close();
cout<<"elenco città lette da file"<<endl;
for(int i=0;i<n;i++)
{cout<<elenco[i].nome<<endl;
cout<<"popolazione "<<elenco[i].popolazione<<endl;
cout<<"temperatura"<<elenco[i].temperatura<<endl<<endl;
}
cout<<endl;
int posmax=0;
int popmax=elenco[0].popolazione;
for(int i=1;i<10;i++)
if(elenco[i].popolazione>popmax)
{popmax=elenco[i].popolazione;
posmax=i;
}
cout<<"la città più popolosa e'"<<elenco[posmax].nome<<endl;
//ordino elenco per temperatura
citta temp;
for(i=1;i<n;i++)
for(j=n-1;j>=i;j--)
if(elenco[j].temperatura<elenco[j-1].temperatura)
{ temp=elenco[j];
elenco[j]=elenco[j-1];
elenco[j-1]=temp;
}
cout<<"elenco città ordinate per temperatura"<<endl;
for(int i=0;i<n;i++)
{cout<<elenco[i].nome<<endl;
cout<<"popolazione "<<elenco[i].popolazione<<endl;
cout<<"temperatura "<<elenco[i].temperatura<<endl<<endl;
}
//ordino elenco per nome citta
for(i=1;i<n;i++)
for(j=n-1;j>=i;j--)
if(strcmp(elenco[j].nome,elenco[j-1].nome)<0)
{ temp=elenco[j];
elenco[j]=elenco[j-1];
elenco[j-1]=temp;
}
char nomericercato[10];
//ricerco con algoritmo dicotomico una citta
cout<<"inserisci la citta' da ricercare ";
cin>>nomericercato;
int inf=0;
int sup=n-1;
int meta;
int posizione;
bool trovato=false;
while ( !trovato && inf <=sup)
{ meta=(inf+sup)/2;
cout<< meta<<",";
if(!strcmp(elenco[meta].nome,nomericercato))
{trovato=true;posizione=meta;}
else if (strcmp(nomericercato,elenco[meta].nome)<0)
sup=meta-1;
else
inf=meta+1;
}
if(trovato)
{ cout<<"la citta ha "<<elenco[posizione].popolazione <<"abitanti"<<endl;
cout<<"e una temperatura di "<<elenco[posizione].temperatura<<endl;
}
else
cout<<"la citta non e' presente nell'elenco "<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}