Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi3
Esercizi
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 citta' 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 citta ordinate per temperatura (usa il bubblesort) e poi tramite la ricerca dicotomica ricerca una città restituendo se la citta' è 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 citta piu' 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;
}