Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi3

Wikibooks, manuali e libri di testo liberi.
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;
}