Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Creare un ciclo for oscillante
Forum - C/C++ - Creare un ciclo for oscillante - Pagina 4

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
nello79 (Normal User)
Newbie


Messaggi: 7
Iscritto: 09/04/2020

Segnala al moderatore
Postato alle 22:40
Venerdì, 10/04/2020
Testo quotato

Postato originariamente da nessuno:
Direi che potresti scrivere

Codice sorgente - presumibilmente C/C++

  1. int a, b, s=1;
  2. for (a = b = 0; a <= 40; a++, b += s)
  3. {
  4.         printf("%d ", b);
  5.        
  6.        
  7.         if (b == 10 || b==-10) s = -s;
  8. }




Hai ragione nessuno, parte del codice l'ho preso da te ma non l'ho usato per un altro motivo, i valori di partenza, di inizio e fine e il numero di cicli da effettuare sono tutte delle variabili. A me serviva capire il concetto. Come scritto da te non c'è una diretta valutazione del numero di cicli da effettuare, ma bisogna calcolarlo. Poi ti ripeto sono all'inizio con la programmazione da autodidatta, ad esempio non ho capito perché il ciclo for ha 4 argomenti. Purtroppo è un mio limite e preferisco usare solo ciò che capisco meglio. Però si ho preso spunto proprio dal tuo codice.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 9:48
Sabato, 11/04/2020
Nello: "non ho capito perché il ciclo for ha 4 argomenti"

Un ciclo for prevede tre elementi:
- inizializzazione preliminare
- controllo condizionale prima di ogni ciclo
- operazioni da eseguire in chiusura di ogni ciclo

I tre elementi sono separati tra loro dal classico punto e virgola.

Tutti e tre gli elementi possono contenere istruzioni multiple, separate da virgola, che vengono eseguite in sequenza, nello stesso ordine in cui compaiono nel codice.

Ho provato a metter giù un esempio, sperando risultasse chiaro, invece avendo dovuto inserire un sacco di cose non lo è come credevo.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define V   "vero"
  5. #define F   "falso, interrompi il ciclo"
  6.  
  7. int main() {
  8.     int val, lim, inc, i;
  9.  
  10.     for(
  11.  
  12.         // inizializzazione, in questo caso 4 istruzioni per 4 variabili,
  13.         // piu' una istruzione printf() per vedere cosa sta succedendo
  14.         val=37, lim=50, inc=10, i=0,
  15.         printf("INIZIALIZZAZIONE\n  val = %d\n  lim = %d\n  inc = %d\n  i = %d\n\n",val,lim,inc,i);
  16.         // nota le virgole e il punto e virgola
  17.  
  18.  
  19.         // controllo condizionale prima di ogni ciclo
  20.         0<printf("CONTROLLO CONDIZIONALE prima del ciclo #%d\n  printf() riuscita\n  val<=lim: %s\n  i<5: %s\n",i+1,val<=lim?V:F,i<5?V:F) && val<=lim && i<5;
  21.         // il printf() iniziale e' chiaramente un'idiozia, pero' viene controllato
  22.         // anche il suo valore di ritorno, che e' negativo in caso di errore;
  23.         // il ciclo continua a meno che si verifichi una qualsiasi di queste condizioni...
  24.         //   1: printf() genera un errore
  25.         //   2: val risulta essere maggiore del limite preimpostato
  26.         //   3: sta per iniziare un sesto ciclo, non voluto
  27.  
  28.  
  29.         // operazioni da eseguire in chiusura di ogni ciclo
  30.         i++, printf("OPERAZIONI IN CHIUSURA DEL CICLO #%d\n  i incrementato a %d\n\n",i,i)
  31.         // qui il punto e virgola non ci va perche' e' l'ultimo dei tre elementi
  32.         // nota comunque la virgola dopo i++
  33.  
  34.     ) // fine del codice dell'istruzione for
  35.     {
  36.         // blocco con le istruzioni da eseguire se le precedenti
  37.         // istruzioni determinano condizioni valide
  38.         printf( "ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #%d\n", i+1 );
  39.         printf( "  val prima dell'operazione: %d\n", val );
  40.         val += inc;
  41.         printf( "  val dopo l'operazione val+=inc: %d\n", val );
  42.     }
  43.  
  44.     return 0;
  45. }



Probabilmente è più esplicito quel che manda in uscita che non il codice in sè:

Codice sorgente - presumibilmente Python

  1. INIZIALIZZAZIONE
  2.   val = 37
  3.   lim = 50
  4.   inc = 10
  5.   i = 0
  6.  
  7. CONTROLLO CONDIZIONALE prima del ciclo #1
  8.   printf() riuscita
  9.   val<=lim: vero
  10.   i<5: vero
  11. ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #1
  12.   val prima dell'operazione: 37
  13.  val dopo l'operazione val+=inc: 47
  14. OPERAZIONI IN CHIUSURA DEL CICLO #1
  15.   i incrementato a 1
  16.  
  17. CONTROLLO CONDIZIONALE prima del ciclo #2
  18.   printf() riuscita
  19.   val<=lim: vero
  20.   i<5: vero
  21. ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #2
  22.   val prima dell'operazione: 47
  23.  val dopo l'operazione val+=inc: 57
  24. OPERAZIONI IN CHIUSURA DEL CICLO #2
  25.   i incrementato a 2
  26.  
  27. CONTROLLO CONDIZIONALE prima del ciclo #3
  28.   printf() riuscita
  29.   val<=lim: falso, interrompi il ciclo
  30.   i<5: vero
  31.  
  32. Process returned 0 (0x0)   execution time : 0.094 s
  33. Press any key to continue.



Se invece che su 10 inc viene inizializzato con 20, si ottiene questo:

Codice sorgente - presumibilmente Python

  1. INIZIALIZZAZIONE
  2.   val = 37
  3.   lim = 50
  4.   inc = 20
  5.   i = 0
  6.  
  7. CONTROLLO CONDIZIONALE prima del ciclo #1
  8.   printf() riuscita
  9.   val<=lim: vero
  10.   i<5: vero
  11. ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #1
  12.   val prima dell'operazione: 37
  13.  val dopo l'operazione val+=inc: 57
  14. OPERAZIONI IN CHIUSURA DEL CICLO #1
  15.   i incrementato a 1
  16.  
  17. CONTROLLO CONDIZIONALE prima del ciclo #2
  18.   printf() riuscita
  19.   val<=lim: falso, interrompi il ciclo
  20.   i<5: vero
  21.  
  22. Process returned 0 (0x0)   execution time : 0.218 s
  23. Press any key to continue.



Se ti ho confuso le idee, perdonami ed ignorami. Apprezza però la buona volontà e lo "spirito di corpo"! :k:

Ultima modifica effettuata da AldoBaldo il 11/04/2020 alle 9:52


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
nello79 (Normal User)
Newbie


Messaggi: 7
Iscritto: 09/04/2020

Segnala al moderatore
Postato alle 12:12
Sabato, 11/04/2020
Apprezzato :k:

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:13
Sabato, 11/04/2020
Anche io :k:


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:52
Sabato, 11/04/2020
Grazie, gente! Poi dicono che chi programma è arido dentro.... :k:


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:23
Sabato, 11/04/2020
Bisognerebbe dire che quegli elementi non sono obbligatori

Potresti scrivere

Codice sorgente - presumibilmente Plain Text

  1. for(;;)



per ottenere ... cosa?

Ultima modifica effettuata da nessuno il 11/04/2020 alle 19:23


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 23:15
Sabato, 11/04/2020
Magari dico una cavolata o non ho compreso bene il post.

Perché non usare le belle funzioni periodiche?
Ora non sò se in C++ c'è qualcosa del genere ma credo di si.

Questo script è per un plug-in che stavo scrivendo per la mia community ma posso tranquillamente scrivervi il codice
senza problemi per cui eccolo.

Codice sorgente - presumibilmente C++

  1. float oscillatore(float time, float Frequenza = 0.3f,float  amplitude = 1,float  phase = 0, float offset = 0)
  2.     {
  3.         var t = time * Frequenza * Mathf.PI * 2;
  4.         t += phase * Mathf.PI * 2;
  5.         var v = Mathf.Sin(t);
  6.         v *= amplitude;
  7.         v += offset;
  8.         return v;
  9.     }



Ho scritto questo oscillatore su unity per muovere un oggetto su e giu in loop.
tipo per raccogliere monetine alla classica di super mario.

La gif è scattosa ma assicuro che è molto fluido
Trattandosi di oscillazione appunto, nella fase finale rallenta per poi riprendere la spinta corretta.

https://recordit.co/rbta6DYvSp


Ho dichiarato alcuni campi fissi in modo da non confondere gli utenti.
Puoi allungare la scala modificando il valore in amplitude tipo per una salita e discesa piu lunga.
ovviamente relativo anche all'offset per sposare la scala di salita e discesa.
basta sostiture il MathF.PI * 2  con il valore di offset per spostare la scala.
per il resto giocando sui parametri si può ottenere quello che si cerca.

Ultima modifica effettuata da Thejuster il 11/04/2020 alle 23:33


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 8:25
Domenica, 12/04/2020
In pratica però identifichi un solo punto lungo una ipotetica sinusoide della quale devi gestire esternamente ogni aspetto, giusto?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo