Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi3

Indice del libro

Esercizi

ricerca righe simili

modifica

Esercizio 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

modifica

Esercizio 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)

modifica

Esercizio 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

modifica

Esercizio 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

modifica

Esercizio 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

modifica

Esercizio 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;
}