Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 26
  1. #11
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Più in generale, dati due distinti interi non segnati min, max tali che 0 < min < max, l'idioma standard per generare un numero pseudorandom compreso tra min e max[...]
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Estensione certamente possibile da un punto di vista meramente algebrico, ma sostanzialmente inutile parlando di generazione di numeri pseudorandom destinati ad indicizzare un array in linguaggio C, come appunto nel presente thread.
    Io ho puntualizzato dato che nel tuo post non si parlava di indicizzare un array, ma di generare un numero (intero) pseudorandom. E dato che il tuo post voleva generalizzare, ho solo aggiunto quel poco che può tornar utile altre volte.

    Poi, ovviamente, tutti gli altri punti della discussione sono validi e vanno tenuti in conto.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #12
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    nel tuo post non si parlava di indicizzare un array, ma di generare un numero (intero) pseudorandom. E dato che il tuo post voleva generalizzare
    Non c'è alcun problema (né tantomeno vis polemica): hai semplicemente letto in senso troppo estensivo una generalizzazione che invece era pur sempre implicitamente contestuale (indicizzazione, come da OP) ed aggiungeva semplicemente l'estremo inferiore del range.

    Certi riferimenti vanno spesso sottintesi, per amor di sintesi: altrimenti si entra facilmente in un ginepraio, come dimostra la questione (sostanzialmente aperta) degli indici possibilmente negativi, o il fatto che lo stesso operatore resto % può tranquillamente lavorare con valori segnati - ma il segno del resto è implementation-dependent, il che rende ancora più blanda la condizione necessaria in taluni ovvi casi. Aspetti troppo spesso ignorati da molti programmatori, ma che potrebbero finire per confondere un OP già in difficoltà di fronte ad idiomi elementari.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #13
    avete ragione sono stato poco chiaro io studio giurisprudenza, ma i pc sono stati sempre una mia grandissima passione... da poco ho deciso di studiare programmazione sto leggendo un libro cosi a tempo perso Deitel & Deitel, C - Corso completo di programmazione - Terza edizione, Apogeo questo. ho finito i primi capitoli fatto i vari esercizi guidati e adesso sto cercando di fare qualcosa di non guidato ma che sono sicuro di riuscire a fare grazie ad uno schema creato da me sotto consiglio dell libro.fatta questa pressa vi spiego cio che sto cercando di realizzare....un piccolo gioco dell impiccato fatto in c sono partito prima nel creare il sistema data una parola data per vedere se effettivamente ero in grado di creare il sistema e ci sono riuscito adesso voglio creare un vocabolario che prenda una parola random da esso e che parta il giochino adesso vi passo lo script
    magari adesso riuscite a capire meglio ciò che voglio realizzare
    l'errore è che v[n] non è valido anche se non riesco a capire il perchè n è un numero intero quindi non credo ci dovrebbe essere nessun tipo di problema forse è il posizionamento nel do?
    codice:
    #include <stdio.h>    #include <string.h>
        #include <stdlib.h> #include<time.h>
    
    
    
    
        int main()
        {
       char parolasegreta[]="";
       char *traccia =parolasegreta;
       char Mio_tentativo[40]="";
       char Mia_parola[40]="";
       char Lettera[2];
       int n;
      int tentativo;
      int len;
      int len_lettera=0;
      int a;
      int b;
      const char *v[3];
    v[0] = "banana";
    v[1] = "casa";
    v[2] = "cercare";
    
    
     do {
    
    
        n = rand() % 3 ;
        v[n] = parolasegreta;
        len=strlen(parolasegreta);
    
    
     }while (len<4);
    
    
           for (a=0; a<len; a++) {
                   printf ("*");
                   Mia_parola[a]='*';
                                     }
           printf ("\n\n");
    
    
           for (b=0; b<11; b++) {
               printf("------------------------------------\n");
    
    
           do   {
    
    
           printf ("immetti carattere (solo una lettera) \n");
           scanf ("%s",Lettera);
           len_lettera=strlen(Lettera);
     } while (len_lettera>1);
    
    
    
    
    
    
    
    
    
    
         while( (traccia=strstr(traccia,Lettera))!=NULL){
    
    
                Mia_parola[traccia-parolasegreta]=parolasegreta[traccia-parolasegreta];
    
    
                traccia=traccia+len_lettera;
                        }
              printf ("parziale parola : %s\n\n",Mia_parola);
    
    
    
    
    
    
              printf ("vuoi indovinare la parola ?\n");
              printf ("se sbagli perdi subito!!! (premi 1 se accetti) \n");
              scanf ("%d",&tentativo);
    
    
     if (tentativo==1) {
    
    
                         printf ("immetti parola ");
                         scanf ("%s",Mio_tentativo);
    
    
                        if  (strcmp(parolasegreta,Mio_tentativo)==0) {
                            printf ("HAI VINTO!!!\n");
                            getch();
                            return (0);}
    
    
                            else {
    
    
                                 printf ("avevi una sola possibilità:HAI PERSO!!!\n");
                                 getch();
                                 return (0);
                                            }
                                               }
    
    
            if  (strcmp(parolasegreta,Mia_parola)==0) {
                  printf ("HAI VINTO!!!!! \n");
                  getch();
                  exit(0);}
    
    
            traccia=parolasegreta;
    
    
            }
    
    
            printf ("superati i tentativi, HAI PERSO!!!\n");
            printf ("la parola era %s\n",parolasegreta);
            getch();
    
    
    
    
        return 0;
        }
    Ultima modifica di edoardol; 05-06-2014 a 10:14

  4. #14
    Quote Originariamente inviata da edoardol Visualizza il messaggio
    da poco ho deciso di studiare programmazione sto leggendo un libro cosi a tempo perso Deitel & Deitel, C - Corso completo di programmazione
    Non vorrei infierire, ma temo che il tempo speso col Deitel sia davvero "perso". Purtroppo si tratta di uno dei peggiori testi in circolazione: lacunoso, incompleto, fuorviante, eccessivamente semplificato, per giunta mal tradotto. L'organizzazione dell'esposizione è piuttosto bizzarra, e lo stile di codifica degli esempi si basa su idiomi deprecati, che ingenerano pessime abitudini di programmazione: il tutto in nome di una malintesa "semplificazione" che in un linguaggio come C è del tutto fuori luogo.
    Ho appena finito di consigliare questa bibiografia in un altro post, e non posso esimermi dal farlo nuovamente in questo thread.

    Quanto al tuo problema specifico, è noto che sono molto restio a presentare esempi di codice, poiché tale abitune può risultare diseducativa più spesso che formativa. Tuttavia qui una esposizione esaustiva dei concetti necessari per il pur semplice esercizio, e degli errori da te commessi, porterebbe via una quantità esorbitante di tempo e spazio nel thread. Ritengo dunque che la miglior terapia sia un crash course: metterti davanti alle pochissime righe di codice che realizzano correttamente la tua richiesta, ossia la selezione pseudocasuale di una stringa da un array di stringhe.

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    #define NUM_PAROLE 4
    
    int main(void)
    {
        time_t t;
        size_t idx;
        const char *Dizionario[NUM_PAROLE] = {"Pera", "Mela", "Banana", "Caffe"};
    
        srand((unsigned) time(&t));
    
        idx = rand() % NUM_PAROLE;
    
        printf("Parola scelta casualmente: (%d) %s\n", idx, Dizionario[idx]);
    
        return 0;
    }
    Il tutto, ovviamente, con l'intento di stimolare le tue riflessioni, domande e richieste di approfondimento sui concetti chiave.
    Ultima modifica di M.A.W. 1968; 05-06-2014 a 13:44
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #15
    Veramente chiarissimo ho apprezzato la segnalazione del testo "me lo sono appena procurato," ho impiegato meno di un mese per finire il deitel e sono rimasto veramente scontento di quel testo molto approssimativo, tu mi consigli di partire dal c passare c++ o diretto al c++? .Passiamo alle domande mi sorgono lettura dello script
    #define numero parole sul deitel non sono riuscito bene a capire il perché si faccia non avrei potuto creare un int ?
    La funzione srand((unsigned) time(&t)); la devo richiamare sempre prima del generatore casuale? I due parametri sono fissi?

    grazie ancora...perdonami la poca chiarezza del post sto usando il cellulare e fa ....... cacare ..... passami il termine.

  6. #16
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da edoardol Visualizza il messaggio
    tu mi consigli di partire dal c passare c++ o diretto al c++?t
    In realtà l'argomento è piuttosto complesso. Per certi versi lo studio del C può essere fuorviante, per altri utile. Va tenuto presente che C e C++ sono due linguaggi diversi e diverso è lo stesso approccio alla modellazione del problema. Se il tuo obbiettivo è studiare il C++ lo studio di C può condurti allo scrivere codice C++ che in realtà è codice C con qualche agevolazione sintattica. Tuttavia molti manuali C++ partono trattando (effettivamente) il C. Insomma, per quanto simili sono linguaggi diversi e sì, il C può aiutare, ma quando ti approcci allo studio del C++ devi dimenticare alcune cose che apprendi in C e abbracciare l'OOP.
    Come nota a margine è interessante notare come le tecniche utilizzate comunemente in C++ possano essere trasportate in C (e sempre più spesso ciò accade), tuttavia ciò comporta alcune limitazioni e non è comunemente spiegato in un manuale C.
    Insomma, passando dal C al C++ cambia in un certo senso il modo di pensare. Kuhn direbbe che si effettua un cambio di paradigma e una sorta di conversione religiosa.
    Quote Originariamente inviata da edoardol Visualizza il messaggio
    #define numero parole sul deitel non sono riuscito bene a capire il perché si faccia non avrei potuto creare un int ?
    codice:
    #define parola qualsiasi_cosa
    Questo semplice caso di define non fa altro che sostituire a parola qualsiasi_cosa prima della compilazione. E' alquanto pericoloso l'uso dei define, ma viene usato convenzionalmente per alcuni semplici casi. Poi vi sono tecniche avanzate che però tuttavia oggi sono ritenute deprecate. (N.b. ci sono casi più complessi di define, ma rimando ad un libro di testo).
    Sì, in C99 puoi usare un int, no in C++ non puoi usare un int perché non è costante. Tuttavia puoi usare un const int in entrambi. (Ritorna qui il discorso che sarebbe meglio evitare gli int).
    Il define ha il vantaggio di non occupare memoria. Va notato tuttavia che anche un const int non occuperà memoria almeno che non si usi un puntatore ad esso.
    Quote Originariamente inviata da edoardol Visualizza il messaggio
    La funzione srand((unsigned) time(&t)); la devo richiamare sempre prima del generatore casuale? I due parametri sono fissi?
    srand ha un solo parametro, un unsigned int. Devi chiamarla sempre almeno che tu non voglia che la sequenza di numeri generati sia la stessa ad ogni esecuzione. (anche in questo caso potresti volerla chiamare passando una costante). Anche time ha un solo parametro che può essere NULL o un puntatore ad una struttura time_t.
    N.b. nel caso non ti serva effettivamente il valore restituito da time puoi passarre NULL come parametro al posto di un puntatore a una struttura time_t. Rimando alla documentazione
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #17
    Quote Originariamente inviata da edoardol Visualizza il messaggio
    tu mi consigli di partire dal c passare c++ o diretto al c++?
    La domanda fondamentale è: C e/o C++ sarebbe il tuo primo linguaggio di programmazione?
    Su questo punto vi sono stati ampi dibattiti ai quali hanno partecipato non solo Bjarne Stroustrup (ideatore del secondo linguaggio) ma anche altri mostri sacri come Ed Sutter, Andrew Koenig, Scott Meyers e molti altri. L'orientamento generale è che ambedue i linguaggi siano sconsigliati come abbrivio: il punto di vista più radicale nella didattica, in realtà, sconsiglia sia C che C++ come primo approccio non solo per chi è totalmente digiuno di programmazione, ma anche per elettronici e affini che non abbiano già maturato ampie competenze in linguaggio Assembly e linguaggi di descrizione hardware (i quali hanno peculiarità tutt'altro che banali).

    Un tempo il ruolo di "primo linguaggio ideale" nella didattica era ricoperto soprattutto dal Pascal di Wirth, ma anche da vari BASIC (ritenuti assolutamente fuorvianti e deleteri da autorità assolute come Dijkstra e da miriadi di altri programmatori, ivi incluso il sottoscritto, si parva licet magnis componere): oggi in genere ci si orienta più volentieri, e più saggiamente, verso Python.

    L'argomento è comunque stato approfondito numerose volte, anche nel recente passato. Ti suggerisco, per una prima panoramica, di leggere con attenzione questo thread. C e C++ sono linguaggi fondamentalmente diversi, richiedono una diversa forma mentis (appropriata la citazione della nozione di paradigma coniata dall'epistemologo Kuhn e permeata ormai da decenni anche nella cultura collettiva) come diversi sono i domini applicativi.

    Volendo porre la questione in termini manichei, ci si può rifare a quanto a più riprese asserito dal creatore del linguaggio C++, Stroustrup: C++ nasce esplicitamente per creare applicazioni di grandi dimensioni, pur mantenendo un certo livello di retrocompatibilità con il C. Se "grandi dimensioni" erano, inizialmente, quelle proibitive per Simula (linguaggio di riferimento all'epoca dello sviluppo di C++ nei primissimi anni Ottanta del secolo scorso), Bjarne parla intenzionalmente di "applicazioni" come dominio separato da ciò che è invece programmazione system-level, sviluppo di driver e moduli kernel, e ovviamente cross-development: come mostra la lunga e significativa esperienza di Embedded C++, sono pochissime le caratteristiche di C++ che ha realmente senso prendere in considerazione nello sviluppo su piattaforme embedded, e sono ancora meno le piattaforme che offrono le risorse necessarie, ed i compilatori che supportano estensioni tipo Embedded-C++.
    D'altro canto, anche su sistemi convenzionali mainstream usare velleitariamente C++ a livello di system programming e affini è un ottimo modo per essere bersagliati da lanci di pomodori e uova marce, come testimonia un vecchio amico qui.

    Riguardo alla generazione di numeri pseudocasuali, l'argomento è vasto e probabilmente non banale al tuo livello di preparazione. Suggerirei come abbrivio la lettura di questo articolo, eventualmente ignorando i paragrafi più tecnici.

    Riguardo alla domanda sulle #define, considera il seguente codice:
    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char matrix[4][4];
        char buff[32];
        FILE *fp;
        const char FILENAME[] = "boolmat.dat";
        size_t curr_row = 0;
        size_t i, j;
    
        fp = fopen(FILENAME, "r");
        if (NULL == fp)
        {
            fprintf(stderr, "Errore durante l'apertura del file %s!\n\n", FILENAME);
            return 1;
        }
    
        while (NULL != fgets(buff, 32, fp))
        {
            size_t k;
            size_t cols = strlen(buff) -1;
            if (cols < 4)
            {
                fprintf(stderr, "Errore nel file %s: dati insufficienti alla riga %d!\n[%s]\n\n",
                        FILENAME, curr_row +1, buff);
                fclose(fp);
                return 2;
            }
    
            for (k = 0; k < cols; ++k)
            {
                if (NULL != strchr("01", buff[k]))
                {
                    matrix[curr_row][k] = buff[k] - '0';
                }
                else
                {
                    fprintf(stderr, "Errore nel file %s: carattere non consentito [%c] alla riga %d!\n[%s]\n\n",
                            FILENAME, buff[k], curr_row +1, buff);
                    fclose(fp);
                    return (3);
                }
            }
            if (MATRIX_SIZE == ++curr_row)
            {
                break;
            }
        }
    
        fclose(fp);
        printf("Sono state acquisite %d righe.\n", curr_row);
    
        for (i = 0; i < 4; ++i)
        {
            for (j = 0; j < 4; ++j)
            {
                printf("%d ", matrix[i][j]);
            }
            puts("");
        }
    
        return 0;
    }

    Ignora per il momento l'esatta semantica delle operazioni svolte e alcune assunzioni troppo frettolose fatte dallo studente che ha risolto quell'esercizio. Se il docente ti chiedesse di modificare la dimensione della matrice, ad esempio passando da 4x4 a 7x7, quali e quante modifiche dovresti attuare sul sorgente? E se si dovesse modificare la dimensione del buffer di riga? Quali rischi si corrono in operazioni del genere?

    L'uso di costanti figurative emulate tramite definizioni di preprocessore (taluni linguaggi le supportano invece esplicitamente), sebbene deprecato o fortemente limitato entro le regole di stile più diffuse, è ampiamente consentito a livello didattico (e non solo) in C, proprio al fine di aggiungere un minimo di flessibilità e mantenibilità, limitando al contempo possibili errori di refactoring. L'uso di costanti numeriche esplicite deve essere il più possibile limitato, essendo inerentemente poco robusto nei confronti del refactoring e più in generale del riuso dei sorgenti. Naturalmente esistono idiomi alternativi, anch'essi caratterizzati da pro e contro, la cui disamina sarebbe comunque fuori luogo in un thread come il presente.
    Ultima modifica di M.A.W. 1968; 06-06-2014 a 23:28
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  8. #18
    ancora faccio fatica a leggere le funzioni di uno script fatto da terzi la dimensione della matrice viene data da MATRIX_SIZE o da char matrix[4][4];?
    per quanto riguarda il discorso sul linguaggio io voglio imparare a scrivere app per android/ios e mi è stato detto che si usa prevalentemente l'object c++ quindi partire dal c++ con un testo e poi passare al object.... è giusto?
    grazie ancora per l'aiuto che mi state dando riguardo i concetti che non mi erano molto chiari!

  9. #19
    Il listato presentato è un esercizio risolto da uno studente e contiene degli errori, come esempio di pessima programmazione. Vedi da qualche parte una definizione di MATRIX_SIZE? Cerca inoltre di individuare tutte le righe nelle quali si usa l'informazione sulla dimensione della matrice.


    Riguardo a Objective/C++, si tratta solo di un brutto ibrido di nicchia, concepito per mescolare inopinatamente sintassi C++ e Objective-C, essendo quest'ultimo un dialetto del C con limitato supporto alla OOP, inizialmente basato su una virtual machine che occupava appena il 97% della memoria di un PC dell'epoca, nato (e morto...) nei primi anni di sviluppo di C++. Dopo quei primi fallimentari esperimenti, il linguaggio risulta supportato in modo pressoché unico dalla collezione di compilatori GCC.

    In tutta franchezza, alla luce della mia esperienza si tratta di strade senza sfondo, rami secchi (come diceva il grandissimo Gian Carlo Rota) nell'albero genealogico dello sviluppo dei linguaggi, insomma roba buona al più per aumentare di un paio di unità il conteggio totale dei linguaggi usati in 99 bottles o per incuriosire i fanatici di Rosetta. Non ne avresti probabilmente neppure sentito parlare, se non fossero stati recentemente scomodati dalle loro cripte - dove erano dantescamente destinati ad una sana damnatio memoriae, per la loro concezione peccaminosa - solo grazie alla pervicacia di pochi ed al parziale supporto offerto da sistemi mobile come iOS e Android.

    Per quanto vedermi scrivere un consiglio di questo tenore appaia paradossale, data la mia conclamata idiosincrasia, suggerisco di rivolgersi invece al linguaggio principe per lo sviluppo su tali sistemi mobile, ossia Java. La limitata utilità di linguaggi come Objective/C e affini sta unicamente nella possibilità di consentire (a programmatori già esperti nell'uno o nell'altro linguaggio) porting relativamente rapidi di codice C e C++ esistente sulle piattaforme mobile di interesse: per chi parte da zero, sono sicuramente più consigliabili altri percorsi.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  10. #20
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    A dire il vero Objective-C è uno dei linguaggi più utilizzati al mondo al momento, ed è l'unico che ti permette di sfruttare appieno i framework Apple (a dire il vero non è più l'unico da qualche giorno). In ogni caso non usa affatto una virtual machine, ma è compilato staticamente, è solo che il message dispatching avviene totalmente a runtime (il che permette grande dinamismo, anche se ovviamente comporta delle perdite in prestazione). Inoltre è un superset stretto del C, a differenza di C++. E non ha capacità limitate, ma solo diverse da quelle di C++, perché ha obiettivi diversi. E' errata anche l'informazione su GCC, infatti attualmente Apple usa llvm.

    Su la quasi totale inutilità di Objective-C++ e il limitatissimo supporto concordo. Sulla facilità di porting da C++ non molto. Sulla facilità di porting da C per forza in quanto il codice C è codice Objective-C.

    Java non è molto ben supportato da iOS. Per android il linguaggio migliore è ovviamente java. Da notare che esistono framework crossplatform, ad esempio quello basato su C# e offerto da Xamarin.

    Mah, a me pare che se il tuo obbiettivo è sviluppare per iOS puoi benissimo prenderti in mano il nuovo linguaggio Apple, certamente più semplice di C, C++ e Objective-C.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.