NGI.Home > Forum
  EOLO HOME  OFFERTE INTERNET WIRELESS EOLO  FORMULA ADSL
   
   
WEBMAIL
   
 
  > Register  
  > FAQ  
  > Members List  
 
  > Calendar  
  > Today's Posts  
   
 

Go Back   NGI Forum > Tech & Tech > Developer's Zone

Reply
 
Thread Tools Rate Thread
Old 14th December 2010, 15:53   #1
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
[Impariamo il C] Lezione 8

Buongiorno.

Nelle puntate precedenti del corso collaborativo di programmazione:
  1. installazione dell'IDE, cenni di architettura degli elaboratori
  2. sintassi del C, programmazione strutturata
  3. ancora sulla sintassi, i tipi di dato, le variabili
  4. variabili parte seconda: gli array
  5. introduzione delle funzioni
  6. operatori aritmetici e logici
  7. costrutti di selezione
In questo capitolo:
  • costrutti di iterazione

Costrutti di iterazione

Nel primo capitolo abbiamo visto come in informatica esiste un teorema che assicura che qualsiasi programma puņ essere implementato con tre semplici strutture: sequenza, selezione e iterazione. Le prime due abbiamo imparato a conoscerle, č tempo di vedere la terza, che finalmente ci darą la capacitą di programmare qualsiasi cosa.


Il ciclo pił classico č quello chiamato FOR: si inizializza una variabile, che viene incrementata ad ogni iterazione, e si smette quando la variabile supera un certo valore di controllo. All'atto pratico, il "ciclo for" ripete N di volte lo stesso blocco di istruzioni. Ecco la sintassi:

Code:
for ( inizializzazione; controllo; incremento ) {
    // blocco di codice da ripetere
}
Ricapitolando:
  • nella inizializzazione dico il valore di partenza del mio contatore
  • nel controllo verifico che il contatore non abbia raggiunto il limite
  • nell'incremento modifico il valore del contatore

Ad esempio, se volessi stampare i primi 10 numeri naturali farei

Code:
int i;
for (i=1; i<11; i++) {
    printf("%d\n", i);
}
Osservazione 1: la variabile contatore va dichiarata PRIMA di utilizzarla nel ciclo.

Osservazione 2: il nostro controllo č che il contatore dev'essere inferiore a 11. Questo perché vogliamo che, anche quando vale 10, il blocco di istruzioni venga eseguito!

Osservazione 3: i campi di inizializzazione, controllo e incremento sono tutti facoltativi. Ad esempio, possiamo fare un loop infinito scrivendo

Code:
for ( ;; ) {
   // codice da eseguire all'infinito
}
Se eseguite questo codice, potete interrompere l'esecuzione con CTRL+C.

Osservazione 4: tutti e tre i campi sono multipli; possiamo mettere pił inizializzazioni, o pił condizioni, o pił incrementi separandoli da virgola. Inoltre, gli operatori logici non devono essere necessariamente numerici e non dobbiamo per forza incrementare di uno le variabili. Un esempio:

Code:
int i, j, k;
for ( i=1, j=3, k=5; i<10, j<30, k>0; i++, j+=2, k-- ) {
   printf("%d\n", i);
}
quale numero sarą stampato per ultimo (esercizio 1)?

Osservazione 5: l'incremento avviene DOPO l'esecuzione del blocco.


Il for č il costrutto principe per le iterazioni, ma ne esiste un altro chiamato CICLO WHILE che funziona cosģ: finché č verificata una condizione, esegui un certo blocco di istruzioni:

Code:
while ( condizione ) {
   // blocco di istruzioni da ripetere
}
Ad esempio, potremmo ripensare il codice del ciclo for visto prima:

Code:
int i=0;
while ( i++<10 ) {
    printf( "%d\n" , i);
}
Osservazione 1: il ciclo viene eseguito finché la variabile i non arriva a 10 (che non č minore di 10) e a quel punto esce.

Osservazione 2: la variabile viene incrementata subito dopo il controllo (operatore posposto), quindi il conteggio parte da 1.

Osservazione 3: possiamo fare un loop infinito mettendo una condizione sempre vera nel while. Ricordiamoci che il concetto di "vero" in C č solitamente il numero 1, quindi possiamo fare

Code:
while (1) {
   // codice da ripetere all'infinito
}
Non č inusuale trovare codici del genere; spesso i programmi molto interattivi hanno un loop principale nel main con un ciclo infinito che si occupa di visualizzare l'interfaccia, gestire l'input/output con l'utente, fare dei calcoli in background (ad esempio, l'intelligenza artificiale o la fisica di un videogioco), eccetera, il tutto ripetuto all'infinito finché l'utente non vuole uscire (ovvero, ormai lo sappiamo, chiama una return).


Il ciclo while ha un "problema". Alle volte potremmo volere un comportamento leggermente diverso, ovvero eseguire un blocco di codice, ed eventualmente ripeterlo finché non succede un qualcosa. E' la situazione duale rispetto al CICLO WHILE, e viene chiamata DO..WHILE (o repeat/until in altri dialetti). Sintassi, poi ci ragioniamo:

Code:
do {
   // codice da ripetere, eseguendolo ALMENO una volta
} while ( condizione );
Un esempio di come sia utile il repeat/until č l'inserimento della password. Ovviamente, ALMENO UNA VOLTA la leggeremo questa password, e ne richiederemo l'inserimento finché non sarą corretta (pseudocodice):

Code:
do {
  password = leggi_password();
} while ( password != password_giusta );
Ci fermiamo quģ per ora con i costrutti iterativi.


Esercizio 2: programmare l'inserimento della password (in pseudocodice) con il ciclo WHILE.

Esercizio 2b (falcoltativo): si potrebbe fare con un ciclo for? se sģ, come? se no, perché?
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arėsius; 14th December 2010 at 16:28.
Arėsius is offline   Reply With Quote
Old 14th December 2010, 16:24   #2
[NiGhTmArE]
Zappel
 
[NiGhTmArE]'s Avatar
 
Join Date: Jan 2000
Location: Tivoli / Campobasso
Posts: 52,313
__________________
instantempo
Giochi Flash | Userbars Maker Musinvi: Video Musicali Fattori Arcani
M. ♕ Queen of Agorą ♕ G.
† Frappr is dead †
[NiGhTmArE] is online now   Reply With Quote
Old 14th December 2010, 17:30   #3
uizz
Registered User
 
uizz's Avatar
 
Join Date: Jan 2010
Posts: 513
po.ten.te...allora

primo es:
Spoiler:
l'ultimo numero č 5, dato che, se ho capito bene, tutte le condizioni devono essere vere altrimenti il ciclo for si blocca.
La prima condizione a diventare falsa č k>0, nel giro di 5 cicli, ecco perché stampa fino a 5.


secondo es (pseudocodice) :
Spoiler:
Code:
while (true){

    password = leggi_password();

    if (password == password_giusta)
    return false;

    return true;

}
uizz is offline   Reply With Quote
Old 14th December 2010, 17:31   #4
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Arėsius View Post
Code:
int i, j, k;
for ( i=1, j=3, k=5; i<10, j<30, k>0; i++, j+=2, k-- ) {
   printf("%d\n", i);
}
quale numero sarą stampato per ultimo (esercizio 1)?
Spoiler:
i=5 (?)


Quote:
Originally Posted by Arėsius View Post
Esercizio 2: programmare l'inserimento della password (in pseudocodice) con il ciclo WHILE.
lo pseudocodice non so usarlo proprio bene
Spoiler:

Code:
---leggi la password---
while (password != password_giusta){
    password=leggi_password();
}


Quote:
Originally Posted by Arėsius View Post
Esercizio 2b (falcoltativo): si potrebbe fare con un ciclo for? se sģ, come? se no, perché?
la butto lģ:
Spoiler:

Code:
---leggi la password---
for(;password!=password_giusta;){
    password=leggipassword();
}


vabbč sono una capra
__________________
•• |||||||||| SoundCloud
La mia č una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016

Last edited by spkbri; 14th December 2010 at 17:47.
spkbri is offline   Reply With Quote
Old 14th December 2010, 18:24   #5
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
Quote:
Originally Posted by Arėsius View Post
Code:
int i, j, k;
for ( i=1, j=3, k=5; i<10, j<30, k>0; i++, j+=2, k-- ) {
   printf("%d\n", i);
}
quale numero sarą stampato per ultimo (esercizio 1)?
Spoiler:
5


Quote:
Originally Posted by Arėsius View Post
Esercizio 2: programmare l'inserimento della password (in pseudocodice) con il ciclo WHILE.
Spoiler:

Code:
while (password != password_giusta){
    password=leggi_password();
}




Quote:
Originally Posted by Arėsius View Post
Esercizio 2b (falcoltativo): si potrebbe fare con un ciclo for? se sģ, come? se no, perché?
Spoiler:

Code:
for (password_ok = 0 , password_letta=leggi_password;password_giusta==password_letta,password_ok==0; password_ok = 1 {
    Accesso;
}
Cece is offline   Reply With Quote
Old 14th December 2010, 18:38   #6
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
il secondo esercizio l' ho sbagliato , l' ho provato a coddare ma non funzia , ho gią in mente una soluzione e ora provo ..
Cece is offline   Reply With Quote
Old 14th December 2010, 19:09   #7
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
con l' if nel ciclo for riesco a farlo , ma sto provando a vedere se esistono soluzioni usando solo cicili for
Cece is offline   Reply With Quote
Old 14th December 2010, 19:22   #8
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
Quote:
Originally Posted by uizz View Post
po.ten.te...allora

primo es:
Spoiler:
l'ultimo numero č 5, dato che, se ho capito bene, tutte le condizioni devono essere vere altrimenti il ciclo for si blocca.
La prima condizione a diventare falsa č k>0, nel giro di 5 cicli, ecco perché stampa fino a 5.


bravissimo!

secondo es (pseudocodice) :
Spoiler:
Code:
while (true){

    password = leggi_password();

    if (password == password_giusta)
    return false;

    return true;

}
no, questo non va bene: il programma deve continuare a chiederti la password se quella letta č diversa da quella giusta (mentre quģ eseguirebbe return true).
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 14th December 2010, 19:30   #9
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
Quote:
Originally Posted by CCCComboFapper! View Post
Spoiler:
i=5 (?)


Quote:
lo pseudocodice non so usarlo proprio bene
Spoiler:

Code:
---leggi la password---
while (password != password_giusta){
    password=leggi_password();
}


la butto lģ:
Spoiler:

Code:
---leggi la password---
for(;password!=password_giusta;){
    password=leggipassword();
}


vabbč sono una capra
cosa intendi con la sintassi "---leggi la password---"?
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 14th December 2010, 19:33   #10
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
Quote:
Originally Posted by Cece View Post
Spoiler:
5
good!

Quote:
Spoiler:

Code:
while (password != password_giusta){
    password=leggi_password();
}
va bene, ma come sai che password != password_giusta al primo giro?


Quote:
Spoiler:

Code:
for (password_ok = 0 , password_letta=leggi_password;password_giusta==password_letta,password_ok==0; password_ok = 1 {
    Accesso;
}
mm... mi sa che manca una parentesi tonda. interessante il modo in cui hai utilizzato l'inizializzazione e l'incremento, per discriminare il primo giro dai successivi. accesso() che cosa fa?
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 14th December 2010, 19:44   #11
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Arėsius View Post
cosa intendi con la sintassi "---leggi la password---"?
che scanf una stringa e la mette in un array. abbiamo fatto la cosa ieri e naturalmente non ricordo tutti i passaggi, antipigro andare a vedere sulla dispensa.
praticamente faccio inserire la pass prima poi controllo e richiedo finchč non č giusta.
(penso... )
__________________
•• |||||||||| SoundCloud
La mia č una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 14th December 2010, 19:50   #12
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
non č quello che intendevi per leggi_password()?

ti riposto il codice, del secondo esercizio, dimmi se č come lo pensavi:

Spoiler:

Code:
password = leggi_password();

while (password != password_giusta){
    password=leggi_password();
}


intendevi una roba cosģ?
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arėsius; 14th December 2010 at 19:53.
Arėsius is offline   Reply With Quote
Old 14th December 2010, 20:07   #13
Barbaria
La vipera rossa
 
Barbaria's Avatar
 
Join Date: May 2007
Location: Above Po River
Posts: 2,447
il "for" č il "while" + comodo

partite da questa considerazione
Barbaria is offline   Reply With Quote
Old 14th December 2010, 20:08   #14
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
Quote:
Originally Posted by Arėsius View Post
good!
va bene, ma come sai che password != password_giusta al primo giro?
a cazzo č vero .. in quel caso basta mettere un leggi psw davanti al main


Quote:
Originally Posted by Arėsius View Post
mm... mi sa che manca una parentesi tonda. interessante il modo in cui hai utilizzato l'inizializzazione e l'incremento, per discriminare il primo giro dai successivi. accesso() che cosa fa?
no niente e sbagliato quel affare ...

ora min son perso senza speranza in un codice del genere e non riesco a saltarne fuori
Spoiler:
Code:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int password_ok;
char password_letta[10];
char password_giusta[10]={"cece"};
for (password_ok = 0 ;password_giusta!=password_letta;) {
   printf("Inserire password: \n");
   scanf("%s",&password_letta);
   printf("Password giusta e %s\n",&password_giusta);
   printf("Password letta e %s\n",&password_letta);   
                               
                                   if (password_letta==password_giusta){
                                   printf("*******\n");                                     
                                   }                                   
}
   printf("Accesso effettuato con password %s\n", password_letta);
   system("pause");
}


quel if non mi parte .. pensavo fosse il terminatore , o provato svariati sistemi e sono ancora senza soluzione ..

edit: potrei provare con l' include string.h .. ma vorrei trovare una soluzione senza string.h

Last edited by Cece; 14th December 2010 at 20:20.
Cece is offline   Reply With Quote
Old 14th December 2010, 20:15   #15
Barbaria
La vipera rossa
 
Barbaria's Avatar
 
Join Date: May 2007
Location: Above Po River
Posts: 2,447
Quote:
Originally Posted by Cece View Post
ora min son perso senza speranza in un codice del genere e non riesco a saltarne fuori
Spoiler:
Code:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int password_ok;
char password_letta[10];
char password_giusta[10]={"cece"};
for (password_ok = 0 ;password_giusta!=password_letta;) {
   printf("Inserire password: \n");
   scanf("%s",&password_letta);
   printf("Password giusta e %s\n",&password_giusta);
   printf("Password letta e %s\n",&password_letta);   
                               
                                   if (password_letta==password_giusta){
                                   printf("dio cane\n");                                     
                                   }                                   
}
   printf("Accesso effettuato con password %s\n", password_letta);
   system("pause");
}


quel if non mi parte .. pensavo fosse il terminatore , o provato svariati sistemi e sono ancora senza soluzione ..

edit: potrei provare con l' include string.h .. ma vorrei trovare una soluzione senza string.h
Ricorda che hai un array in mano., non una variabile...
L'array č appunto un insieme di variabili, le devi quindi controllare una per una nel tuo IF...
Guarda caso con un ciclo FOR che itera l'array e ti permette di confrontare tutte le variabili (utilizzate) dell'array

EDIT= "password_letta==password_giusta" probabilmente fa un'altra cosa...ma lasciamo la parola ad ARESIO in una futura lezione :-P

EDIT2 = "password_letta[0] = password_giusta[0]" č invece corretto e ti permette di confrontare la prima variabile dell'array...ma non basterą

Last edited by Barbaria; 14th December 2010 at 20:18.
Barbaria is offline   Reply With Quote
Reply

Bookmarks

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 21:30.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright 1998-2014 by NGI SpA