Problema elementare C++

di il
9 risposte

Problema elementare C++

Salve a tutti,
Non riesco a svolgere il seguente problema:

Scrivere un programma che legge due sequenze A e B rispettivamente di n ed m interi
(n ed m dati di input, <= 100), e ne determina e stampa l'intersezione insiemistica
(ovvero, tutti e soli gli elementi comuni alle due sequenze). Stampare un opportuno
messaggio se l'intersezione risulta vuota. N.B. Si assuma per semplicità che i numeri
immessi siano tutti diversi tra loro.

Fin ora ho scritto questo:

#include<iostream>
using namespace std;

int main ()
{
int x,y,z;

cout << "Dammi il numero di elementi della prima sequenza: ";
cin >> x;
int A[x];
for (int n=0; n<x; n++)
{
cout << "Dammi un numero: ";
cin >> A[n];
}

cout << "Dammi il numero di elementi della seconda sequenza: ";
cin >> y;
int B[y];
for (int m=0; m<y; m++)
{
cout << "Dammi un numero: ";
cin >> B[m];
}

int C[z];
for (int a=0; a<x; a++)
{
for (int b=0; b<y; b++)
{
if (A[a]==B)
{
C[a]=A[a];
}
}
}

cout << "L'intersezione tra le due sequenze date e': ";
for (int i=0; i<y; i++)
{cout << C << " ";}
return 0;
}


Non riesco proprio a farlo giusto, sapreste aiutarmi voi?
Grazie in anticipo.

9 Risposte

  • Re: Problema elementare C++

    Ciao, innanzitutto per essere aiutato meglio e far capire meglio il codice ti consiglio di utilizzare il tag [ code ].

    Parlando del tuo codice ci sono due errori principalmente:
    1)Dichiari e allochi un vettore C che giustamente conterrà la soluzione del problema, cioè gli elementi in comune dei due insiemi, di un size z che però non è specificato.

    Quindi dovresti aggiungere:
    int z = 100;
    2) Per gestire gli indici di questo vettore z ti consiglio di dichiarare e inizializzare a 0 una variabile count che porti il conteggio di tutti gli elementi in comune trovati e possa gestire bene gli inserimenti nel vettore a livello di indice e soprattutto per gestire il caso in cui non sono trovati elementi in comune e come da richiesta dell'esercizio dovrebbe segnalarti la cosa (che non avevi fatto).
    int count;
    Alla fine tutto il codice funzionante dovrebbe avere un aspetto simile:
    
    #include<iostream>
    using namespace std;
    
    int main ()
    {
        int x,y,z=100;
    
        cout << "Dammi il numero di elementi della prima sequenza: ";
        cin >> x;
        int A[x];
        for (int n=0; n<x; n++)
        {
            cout << "Dammi un numero: ";
            cin >> A[n];
        }
    
        cout << "Dammi il numero di elementi della seconda sequenza: ";
        cin >> y;
        int B[y];
        for (int m=0; m<y; m++)
        {
            cout << "Dammi un numero: ";
            cin >> B[m];
        }
    
        int C[z];
        int count=0;
    
        for (int a=0; a<x; a++)
        {
            for (int b=0; b<y; b++)
            {
                if (A[a]==B[b])
                {
                    C[count]=A[a];
                    count++;
                }
            }
        }
    
        cout << "L'intersezione tra le due sequenze date e': ";
        for (int i=0; i<count; i++)
        {
            cout << C[i] << " ";
        }
        return 0;
    }
    
    Spero d'esserti stato d'aiuto
  • Re: Problema elementare C++

    Grazie mille!
    Comunque ho provato un po' a modificare la tua corretta soluzione ed ho aggiunto il caso in cui l'intersezione sia vuota e ho aggiunto l'obbligo degli input <= 100.

    Avrei una domanda da porti, ho notato che anche se evito il passaggio dove mi consigliavi di impostare
    int z=100;
    lasciando
    int z;
    l'esercizio risulta corretto, come mai mi ha consigliato di impostarlo a 100? per un fatto di ottimizzazione dato che cosi avrebbe assunto un valore casuale? oppure per un altro motivo?

    Comunque posto la soluzione definitiva, non si sa mai che a qualcuno possa servire
    #include<iostream>
    using namespace std;
    
    int main ()
    {
     int x,y,z;
    
     cout << "Dammi il numero di elementi della prima sequenza: ";
     cin >> x;
     int A[x];
     for (int i=0; i<x; i++)
      {
       cout << "Dammi un numero: ";
       cin >> A[i];
       if (A[i]>100)
       {
        cout << "Il numero deve essere minore o uguale di 100" << endl;
        cout << "Dammi un numero: ";
        cin >> A[i];
       }
      }
    
     cout << endl;
     cout << "Dammi il numero di elementi della seconda sequenza: ";
     cin >> y;
     int B[y];
     for (int i=0; i<y; i++)
      {
       cout << "Dammi un numero: ";
       cin >> B[i];
       if (B[i]>100)
       {
        cout << "Il numero deve essere minore o uguale di 100" << endl;
        cout << "Dammi un numero: ";
        cin >> B[i];
       }
      }
    
     int C[z];
     int contatore=0;
     for (int i=0; i<x; i++)
      {
       for (int j=0; j<y; j++)
        {
         if (A[i]==B[j])
          {
           C[contatore]=A[i];
           contatore++;
          }
        }
      }
    
     if (contatore>0)
     {
      cout << "L'intersezione tra le due sequenze date e': ";
      for (int i=0; i<contatore; i++)
      cout << C[i] << " ";
     }
     else cout << "L'intersezione tra le due sequenze date e' vuota.";
    
     return 0;
    }
  • Re: Problema elementare C++

    Tu crei un vettore C di dimensione z senza che quest'ultimo abbia un valore...
    Questo vettore C che dimensione può mai avere? Visto che il tuo esercizio pone che entrambi i vettori da intersezionare sono massimo di 100 elementi è senz'ombra di dubbio vero che C può essere al massimo di dimensione 100 che assegni a z che deve avere per forza un valore altrimenti il compilatore non saprà quanto spazio allocare al vettore C e questo potrà creare non pochi problemi anche se non ti segnala niente in fase di compilazione

    PS Altra cosa molto importante è che non puoi dare una dimensione al vettore con un numero che tu prendi in input in quel modo.
    O meglio puoi farlo ma devi assolutamente allocare memoria non in quel modo che hai fatto tu, per esempio:
    int A[x]
    ma lo devi fare attraverso una calloc o una malloc (stiamo parlando di programmazione dinamica...). E' una cosa molto importante al quale dovresti rimediare.
  • Re: Problema elementare C++

    Calloc e malloc non so cosa siano perchè non le abbiamo ancora viste (per la precisione studio informatica, l'esame è fondamenti di programmazione A e B, ovviamente studiamo il C++).
    Comunque ho messo a posto tutto, tranne il fatto di calloc/malloc, grazie per i chiarimenti
  • Re: Problema elementare C++

    In C++ non è consentito l'uso dei VLA pertanto tali istruzioni:
    
    cin >> x;
    int A[x];
    
    sono illegali.
    Lo sono invece nello standard C99 (supportato solo da g++ e forse il compilatore Intel), e dovrebbero essere evitate quando si compila in C++. Pertanto attento che se tenti di compilare il codice con un compilatore diverso avrai errori di compilazione.
  • Re: Problema elementare C++

    Con Code::Blocks io uso il GCC GNU Compiler e funziona (penso che sia il nome esteso di quello nominato da te, ovvero g++).
    Ma se utilizzo sempre questo compilatore non c'è problema vero?
    In quali casi è necessario cambiare compilatore? (a grandi linee)
  • Re: Problema elementare C++

    sonostupido ha scritto:


    Con Code::Blocks io uso il GCC GNU Compiler e funziona (penso che sia il nome esteso di quello nominato da te, ovvero g++).
    Ma se utilizzo sempre questo compilatore non c'è problema vero?
    Se usi sempre quel compilatore no, ma le brutte abitudini sono dure a morire.
    Intendiamoci, se fai qualcosa in C puro e per te decidi di adottare lo standard C99 va bene;
    se devi fare qualcosa in C puro che deve essere compatibile con lo standard precedente C89, supportato dal 100% degli attuali compilatori, quel codice non compila.

    In C++ poi è lo stesso standard (ogni revisione) che vieta i VLA (e g++ sotto questo aspetto viola apertamente lo standard aggiungendo di default il flag -c99 o qualcosa del genere).
    In quali casi è necessario cambiare compilatore? (a grandi linee)
    Quando l'esaminatore ha un compilatore diverso dal tuo che non supporta il C99
    Seriamente.
    Finché il codice lo tieni per te non hai problemi, ma se qualcun altro lo deve compilare può avere problemi di compatibilità.
    In fondo basta essere coscienti che i VLA di gcc non sono supportati da altri complatori C/C++
  • Re: Problema elementare C++

    Non c'è pericolo, il linguaggio C non lo conosco, questo è il primo linguaggio che imparo nella mia vita
  • Re: Problema elementare C++

    le brutte abitudini sono dure a morire
    Sono d'accordo, visto che stai imparando qualcosa, penso sia meglio impararla bene. Da un punto di vista didattico è meglio non usare i VLA in C/C++, alloca un vettore se vuoi che abbia una dimensione scelta a run time altrimenti usa una costante.
Devi accedere o registrarti per scrivere nel forum
9 risposte