Esercizio banale ma non per me

di il
57 risposte

57 Risposte - Pagina 3

  • Re: Esercizio banale ma non per me

    selfmademan ha scritto:


    Il mio libro dice che la dimensione del vettore deve essere una costante. non capendo come far scegliere la dimensione all'utente sono andato a intuito e ho visto che il codice funzionava e quindi ho pensato che era corretto. Che problema c'è se la dimensione è variabile? Cosa avrei dovuto fare?
    Ecco guarda, spero la prenderai bene, perchè è scritta con buone intenzioni.
    NON esiste "andare a intuito" in informatica.
    E' il modo giusto per i disastri bimbominkieski, subito, o peggio ancora in seguito (cioè come effetto collaterale).

    Devi, e sottolineo devi, avere la consapevolezza piena di cosa stai facendo, il perchè e il percome di cosa succede.
    Altrimenti (il classico è il copia-incolla di pezzi di codice scopiazzati da Internet) oggi il programma va, ma domani no, e magari proprio quando è andato in produzione.
    E, se sei molto sfortunato, il cliente ti farà causa per i danni che gli hai causato, essenzialmente perchè sei andato "a intuito".
  • Re: Esercizio banale ma non per me

    +m2+ ha scritto:


    selfmademan ha scritto:


    Il mio libro dice che la dimensione del vettore deve essere una costante. non capendo come far scegliere la dimensione all'utente sono andato a intuito e ho visto che il codice funzionava e quindi ho pensato che era corretto. Che problema c'è se la dimensione è variabile? Cosa avrei dovuto fare?
    Ecco guarda, spero la prenderai bene, perchè è scritta con buone intenzioni.
    NON esiste "andare a intuito" in informatica.
    E' il modo giusto per i disastri bimbominkieski, subito, o peggio ancora in seguito (cioè come effetto collaterale).

    Devi, e sottolineo devi, avere la consapevolezza piena di cosa stai facendo, il perchè e il percome di cosa succede.
    Altrimenti (il classico è il copia-incolla di pezzi di codice scopiazzati da Internet) oggi il programma va, ma domani no, e magari proprio quando è andato in produzione.
    E, se sei molto sfortunato, il cliente ti farà causa per i danni che gli hai causato, essenzialmente perchè sei andato "a intuito".
    più tipicamente succede dopo un paio di anni dall'inizio della produzione, in ogni caso dopo un tempo sufficiente al tuo cervello per aver completamente sostituito la cella di memoria dedicata a quel pezzo di codice con altre cose fatte ad intuito. Inoltre, sempre magicamente, dal giorno in cui il primo cliente ti segnala l'anomalia, per effetto farfalla succede a tutti gli altri clienti!!!
  • Re: Esercizio banale ma non per me

    LPs ha scritto:


    selfmademan ha scritto:


    Il mio libro dice che la dimensione del vettore deve essere una costante. non capendo come far scegliere la dimensione all'utente sono andato a intuito e ho visto che il codice funzionava e quindi ho pensato che era corretto. Che problema c'è se la dimensione è variabile? Cosa avrei dovuto fare?
    Quello che hai fato, sicuramente funziona, ma è sbagliato essendo codice C++.
    Quello che stai utilizzando si chiama: Variable Length Arrays, che sono proibiti in C++, ma utilizzabili in c.
    Il tuo compilatore, dovrebbe darti degli warning del tipo
    
    test.c:11:16: warning: ISO C++ forbids variable length array ‘vett1’ [-Wvla]
      int vett1[dim1];
    
    Nel caso non te li stia segnalando e tu stia utilizzando gcc, aggiungi sempre le opzioni
    
    -Wall -Wextra -pedantic 
    
    Quando compili, in modo da tenere sotto controllo tutte le cose importanti.

    I VLAs sono proibiti perché in C++ esiste inoltre un operatore specifico che ti permette di allocare dinamicamente devi vettori di dimensione calcolata runtime: l'operatore new, dovresti averlo studiato come uno dei primi argomenti di C++....
    
    int *array = new int[10];
    /..... Codice utilizzando array
    delete [] array;
    
    Ti conviene dare una bella ripassata sui libri, ma anche in rete si trovano tonnellate di informazioni.

    Esistono poi anche gli std::vector, ma è un discorso più lungo che non mi sembra il caso di affrontare visto il tuo attuale punto di conoscenza, ma anche di questo argomento puoi trovare milioni di info in rete.
    Allora è meglio che vado a studiare prima di fare altre domande. Unica cosa: come faccio ad attivare i warning che mi hai detto in netbeans, cioè come aggiungo le opzioni? Come tool uso Mingw.
  • Re: Esercizio banale ma non per me

    +m2+ ha scritto:


    selfmademan ha scritto:


    Il mio libro dice che la dimensione del vettore deve essere una costante. non capendo come far scegliere la dimensione all'utente sono andato a intuito e ho visto che il codice funzionava e quindi ho pensato che era corretto. Che problema c'è se la dimensione è variabile? Cosa avrei dovuto fare?
    Ecco guarda, spero la prenderai bene, perchè è scritta con buone intenzioni.
    NON esiste "andare a intuito" in informatica.
    E' il modo giusto per i disastri bimbominkieski, subito, o peggio ancora in seguito (cioè come effetto collaterale).

    Devi, e sottolineo devi, avere la consapevolezza piena di cosa stai facendo, il perchè e il percome di cosa succede.
    Altrimenti (il classico è il copia-incolla di pezzi di codice scopiazzati da Internet) oggi il programma va, ma domani no, e magari proprio quando è andato in produzione.
    E, se sei molto sfortunato, il cliente ti farà causa per i danni che gli hai causato, essenzialmente perchè sei andato "a intuito".
    Sicuramente hai ragione, però cerca di capirmi, io sono un aspirante ingegnere meccanico e non elettronico o informatico o informatico puro. Per un meccanico l'intuito è fondamentale, è chiaro che oggi bisogna avere delle conoscenze molto vaste in molti settori (infatti ho fatto esami di fisica, matematica, metallurgia, elettrotecnica, economia ecc ecc....), però penso anche che vale il detto "a ognuno il suo mestiere". Non credo che il mio compito sia quello di scrivere programmi. Lo scopo di questo esame penso è semplicemente avere delle conoscenze di base per SAPERE DI NON SAPERE e rivolgersi allo specialista quando ce n'è bisogno
    Volendo essere rigorosi prima di affacciarsi alla programmazione bisognerebbe padroneggiare divinamente l'architettura di un calcolatore entrando nei dettagli del funzionamento dei circuiti elettronici e non mi sembra una cosa così banale.
  • Re: Esercizio banale ma non per me

    Non sono particolarmente d'accordo sull'ultima affermazione (anzi, in certi casi vedi Java, vedi C#, vedi Mono/.NET cioè è sicuramente non vero).

    Personalmente ritengo che sia una perdita di tempo, quello che stai facendo, perchè su tante cose che ti servono, per fare l'ingegnere meccanico, di sicuro non c'è quella.
    Ma è normale: quando mia sorella studiava ingegneria civile ci siamo divertiti con le schede perforate per il fortran (no, non era 100000 anni fa, è nata nel 1964).

    Insomma è utile come fare un corso base di svedese.

    PS fortunatamente agli informatici non serve l'intuito. serve la pigrizia. più sei pigro, meglio è.
  • Re: Esercizio banale ma non per me

    selfmademan ha scritto:


    Allora è meglio che vado a studiare prima di fare altre domande. Unica cosa: come faccio ad attivare i warning che mi hai detto in netbeans, cioè come aggiungo le opzioni? Come tool uso Mingw.
    Usi:
    1) Come IDE: Netbeans
    2) Come tool di compilazione: Mingw (gcc).
    3) Come compilatore g++

    Non conosco bene netbeans, immagino che nelle proprietà del progetto ci sia una voce compiler arguments o qualcosa del genere.
  • Re: Esercizio banale ma non per me

    selfmademan ha scritto:


    Per un meccanico l'intuito è fondamentale
    Beh, in qualunque campo l'intuito è molto importante (non fondamentale), può velocizzare la strada verso una soluzione, ma avere un'intuito e non saper utilizzare strumenti o nozioni per tradurlo in qualcosa di concreto non serve a nulla.
    Quanti, a livello "intuitivo", prima di Einstein, hanno avuto percezione della relatività? Molti , milioni forse, ma solo lui è arrivato a teorizzarlo e a dimostrarlo, per esempio.

    selfmademan ha scritto:


    Lo scopo di questo esame penso è semplicemente avere delle conoscenze di base per SAPERE DI NON SAPERE e rivolgersi allo specialista quando ce n'è bisogno
    Purtroppo questo è uno dei meriti e demeriti della scuola italiana: ti insegna, rispetto ad approcci molto diretti e nozionistici (all'anglosassone), a avere una visione ampia che spazia in diversi campi, ma per contro fa buttare energie che sarebbero meglio applicate nei campi di interesse dello studente.
    Come ad esempio un esame di algebra lineare al nei corsi di ingegneria, fatta a grandi linee senza che si capisca a fondo l'utilità di tale branca della matematica/geometria analitica. Non sarebbe forse meglio avere un corso di ingegneria informatica, specifico per applicazioni di grafica, dove tutti gli argomenti di matrici/vettori/autovettori/coniche/quadriche trovino veramente una applicazione e possano essere sfruttate a fini " di mercato del lavoro"?

    Cmq alla fine, metti la testa sui libri, e un giorno finirà! (anche se ancora mi chiedo quando.....la pensione forse...naaaaah)
  • Re: Esercizio banale ma non per me

    Con grande fatica ho scritto questo codice. Accetto consigli. Manca la parte finale sullo scambio ma non ho voglia.
    
    #include <iostream>
    
    using namespace std;
    
    void ivettore(int dim,int* V)
    {
         for(int i=0;i<dim;i++)
         {
            cout<<"Inserisci l'elemento numero "<<i+1<<"\n";
            cin>>V[i];
         }
    }
    void ovettore(int dim,int* V)
    {
        for(int i=0;i<dim;i++)
        {
            cout<<" "<<V[i];
        }
    }
        //creo una funzione per azzerare un vettore
    void azzeravettore(int dim,int* V)
    {
        for(int i=0;i<dim;i++)
        {
            V[i]=0;
        }
    }
    int maxvettore(int dim,int* V)
    {
       int max=V[0];
       for(int i=1;i<dim;i++)
       {
           if(max<V[i])
           {
               max=V[i];
           }
       }
    return max; 
    }
    int posmaxvettore(int dim,int* V)
    {
       int max=V[0];
       int posmax=0;
       for(int i=1;i<dim;i++)
       {
           if(max<V[i])
           {
               posmax=i;
           }
       }
       return posmax;
    }
    
    int main()
    {
        int dim1;
        cout<<"Scegli la dimensione di V1\n";
        cin>>dim1;
        int* V1=new int[dim1];
        ivettore(dim1,V1);
        int dim2;
        cout<<"Scegli la dimensione di V2\n";
        cin>>dim2;
        int* V2=new int[dim2];
        ivettore(dim2,V2);
        cout<<"V1 =";
        ovettore(dim1,V1);
        cout<<"\nV2 =";
        ovettore(dim2,V2);
        
        //introduco i vettori indpar1 e lung1 e le altre variabili necessarie
        int j1=0; int l1=1; int uno=1; int* indpar1=new int[dim1]; int* lung1=new int[dim1];
        
        //inizializzo a zero i vettori indpar1 e lung1
        azzeravettore(dim1-1,indpar1);
        azzeravettore(dim1-1,lung1);
        
        //memorizzo nelle componenti dei vettori indpar1 e lung1 rispettivamente l'indice di partenza e la lunghezza delle sequenze crescenti trovate a ogni passo in V1
        for(int i=1;i<dim1;i++)
        {
            if (V1[i-1]<V1[i])
            {indpar1[i-1]=j1; lung1[i-1]=++l1;}
            else
            {j1=i-1;j1++;l1=uno;}
        }
        
        //introduco i vettori indpar1 e lung1 e le altre variabili necessarie
        int j2=0; int l2=1; int UNO=1; int* indpar2=new int[dim2]; int* lung2=new int[dim2];
        
        //inizializzo a zero i vettori indpar1 e lung1
        azzeravettore(dim2-1,indpar2);
        azzeravettore(dim2-1,lung2);
        
        //memorizzo nelle componenti dei vettori indpar2 e lung2 rispettivamente l'indice di partenza e la lunghezza delle sequenze crescenti trovate a ogni passo in V2
        for(int i=1;i<dim2;i++)
        {
            if (V2[i-1]<V2[i])
            {indpar2[i-1]=j2; lung2[i-1]=++l2;}
            else
            {j2=i-1;j2++;l2=UNO;}
        }
    
        //richiamo le funzioni maxvettore e posmaxvettore
        cout<<"\nLa più lunga sequenza ordinata S1 contenuta in V1 ha lunghezza "<<maxvettore(dim1-1,lung1)<<" e parte dall'elemento "<<indpar1[posmaxvettore(dim1-1,lung1)]+1;
        cout<<"\nLa più lunga sequenza ordinata S2 contenuta in V2 ha lunghezza "<<maxvettore(dim2-1,lung2)<<" e parte dall'elemento "<<indpar2[posmaxvettore(dim2-1,lung2)]+1;
        cout<<"\nS1 = ";
        for(int i=indpar1[posmaxvettore(dim1-1,lung1)];i<indpar1[posmaxvettore(dim1-1,lung1)]+maxvettore(dim1-1,lung1);i++)
        {
            cout<<" "<<V1[i]<<" ";
        }
        cout<<"\nS2 = ";
        for(int i=indpar2[posmaxvettore(dim2-1,lung2)];i<indpar2[posmaxvettore(dim2-1,lung2)]+maxvettore(dim2-1,lung2);i++)
        {
            cout<<" "<<V2[i]<<" ";
        }
            
    }
    
  • Re: Esercizio banale ma non per me

    Onestamente non è un granchè
  • Re: Esercizio banale ma non per me

    Ho corretto un errore nella funzione posmaxvettore. Il codice dovrebbe funzionare bene. Ho usato l'allocazione dinamica della memoria. Ho usato le funzioni. Cosa c'è di sbagliato?
    Grazie.
  • Re: Esercizio banale ma non per me

    Anche per definire una matrice variabile bisogna usare l'allocazione dinamica della memoria?
    Va bene?
    
    #include <iostream>
    using namespace std;
    int main()
    {
        int nrighe;
        int ncolonne;
        cin>>nrighe;
        cin>>ncolonne;
        int* matriceprova=new int[nrighe][ncolonne];
    }
    
  • Re: Esercizio banale ma non per me

    LPs ha scritto:



    Cmq alla fine, metti la testa sui libri, e un giorno finirà! (anche se ancora mi chiedo quando.....la pensione forse...naaaaah)
    DItemi che ho fatto qualche progresso sennò butto il portatile dalla finestra .
    Spendo un sacco di energie per scrivere codici già scritti in passato come il massimo ecc.......non mi sento ancora fluido e illuminato instantaneamente. Quest'esame sarà un bel grattacapo.
  • Re: Esercizio banale ma non per me

    Mah non so, cosa ti aspettavi ? Sei (grosso modo) al punto in cui ero quando avevo 12 anni, vedrai che nel giro di un 10 o 15 anni diventerai "fluido". Per l'illuminazione ce ne vorranno una 30ina.
    Non disperare quindi.
  • Re: Esercizio banale ma non per me

    Siano dati in ingresso una matrice di numeri interi M e un valore intero K. Scrivere un programma che verifichi se esistono almeno due colonne di M i cui valori siano ordinati in modo crescente. Se tale condizione risulta verificata si provveda a fondere gli elementi di tali colonne in un vettore ordinato V: nel fare questa operazione si deve garantire che il vettore V contenga solo gli elementi che sono a distanza maggiore di K tra loro. Stampare infine la matrice M, indicare gli indici delle colonne a valori crescenti eventualmente trovate e, nel caso, il vettore V ottenuto.
    
    #include <iostream>
    
    using namespace std;
    
    void imatrice(int nrig, int ncol, int** matrice)
    {
        for(int i=0;i<nrig;i++)
        {
            for(int j=0;j<ncol;j++)
            {
                cout<<"\nInserisci l'elemento posizionato sulla riga "<<i+1<<" e sulla colonna "<<j+1<<" ";
                cin>>matrice[i][j];
            }
        }
    }
    void omatrice(int nrig, int ncol, int** matrice)
    {
        for(int i=0;i<nrig;i++)
        {
            cout<<"\n";
            for(int j=0;j<ncol;j++)
            {
                cout<<"  "<<matrice[i][j]<<"  ";
            }
        }
    }
    int main()
    {
        int i;
        int j;
        int nrig;
        int ncol;
        int k;
        cout<<"Inserisci il numero di righe della matrice ";
        cin>>nrig;
        cout<<"\nInserisci il numero di colonne della matrice ";
        cin>>ncol;
        int** matrice=new int* [nrig];
        for(i=0;i<nrig;i++)
        {
            matrice[i]=new int[ncol];
        }
        imatrice(nrig, ncol, matrice);
        cout<<"\nLa matrice che hai inserito è\n";
        omatrice(nrig, ncol, matrice);
        
        //parte per l'individuazione delle colonne ordinate in modo crescente
        int cont=0; //variabile contatore per sapere se ci sono almeno due colonne crescenti e che uso per dare il messaggio di avviso
        bool varbool=true;
        for(j=0;j<ncol;j++)
        {
            for(i=1;i<nrig;i++)
            {
                if(matrice[i-1][j]<matrice[i][j])
                {
                    ;
                }
                else varbool=false;
            }
            if(varbool)
            {
                cout<<"\nLa colonna "<<j+1<<" è ordinata in modo crescente.";
                
                ++cont;
            }
            else
            {
                cout<<"\nLa colonna "<<j+1<<" non è ordinata in modo crescente.";
                //riporto varbool a true, cioè la resetto al valore di partenza
                varbool=true;
            }
        }
        if(cont>=2)
        {
            cout<<"\nEsistono almeno due colonne ordinate in modo crescente.";
        }
    }
    
    Come posso continuare?
  • Re: Esercizio banale ma non per me

    Per cominciare esci dal ciclo non appena trovi una colonna non crescente.
    poi scrivi una funzione, ovviamente, cui passi la matrice e l'indice della colonna, e che ti ritorna se è ordinata

    farai un ciclo per ogni colonna, mantenendo due indici "ausiliari" per le colonne crescenti, e via
    (ovviamente se ne trovi 2 esci di nuovo dal ciclo)

    poi fai la funzione di fusione.
    coraggio!

    PS ovviamente è un programma C privo di qualsiasi controllo nelle funzioni, ma intanto fai, poi ti indicherò
Devi accedere o registrarti per scrivere nel forum
57 risposte