4M - Appunti di INFORMATICA
Transcript
4M - Appunti di INFORMATICA
brescianet.com http://lnx.brescianet.com/ScuolaForum2009/ Classe 4M - Modulo 3° http://lnx.brescianet.com/ScuolaForum2009/viewtopic.php?f=9&t=22 Autore: Pagina 1 di 2 e01692 [ ven feb 25, 2011 12:49 pm ] Oggetto del messaggio: Classe 4M - Modulo 3° Appunti estemporanei redatti durante le lezioni in laboratorio Autore: e01692 [ ven mar 11, 2011 2:02 pm ] Oggetto del messaggio: 1173/2011 . Classe 4M - Modulo 3° VBA => programmazione ad oggetti dotati di proprietà che sulla base di eventi eseguono azioni MASCHERE => consentono un input guidato che facilita gli utenti medio bassi che non conoscono l'intima essenza di access 3/3/2011 - 4N IDE = Interfaccia per disegnare le maschere name => proprietà fondamentale di un oggetto => permette l'identificazione di un oggetto su una maschera la parola me nel codice VBA identifica l'oggetto contenitore : nel nostro caso la maschera perchè uso inserire nel nome una sigla iniziale associata al tipo ? Spiegato lbl... => etichetta txt... => textbox btn... => bottone lst... => listbox cmb... => combobox Quali vantaggi consente questa regola di naming ? spiegato METODI => azioni svolte da un oggetto (corrispondono a delle funzioni) --- 4N 4/3/2011 riprendere dagli eventi tra function - end function oppure sub e end sub posso scrivere una sequenza di istruzioni VBA che verranno eseguite assieme Private Sub btnbottone_Click() MsgBox "AVE" Me.btnbottone.ForeColor = vbYellow Me.btnprova.Enabled = False End Sub Private Sub NomeOggetto_NomeEvento(ParametriEvento) sequenza istruzioni VBA End Sub docmd => oggetto VBA equivalente al menu di access docmd.close => chiude il form corrente docmd.quit => esce da Access) Autore: e01692 [ lun mar 14, 2011 10:02 am ] Oggetto del messaggio: 14/03/2011 - Classe 4M - Modulo 3° if => replica la capacità decisionale dell'uomo all'interno di un programma (capacità selettiva) For/while => replica la capacità iterativa (ripetere un'operazione) dell'uomo all'interno di un programma (capacità iterativa) if condizione then codice VBA else .... codice VBA .... end if Variabile => contenitore di un valore che un prg riutilizza per evitare di chiederlo continuamente Esempio di uso di variabile - con dim dico che X è una variabile Dim X X = InputBox("Dammi X", "0") If (X = 0) Then MsgBox "Nullo" ElseIf (X > 0) Then MsgBox "Positivo" Else MsgBox "Negativo" End If MsgBox "Il quadrato è " & (X * X) ATTENZIONE X non è "X" msgbox X => visualizza il valore di X msgbox "X" => visualizza il carattere "X" sechi="il prof!" msgbox Sechi => visualizza il valore di Sechi => ovvero "Il prof!" msgbox "Sechi" => visualizza il carattere "Sechi" "Mario" + "Rossi" = "Mario" & "Rossi" => "MarioRossi" "Mario" * "Rossi" => Errore (l'operatore * è errato) gli operatori matematici => + * - / ^ (potenza) operatori stringhe => & operatori BOOLEANI => AND, NOT OR print 9+9 18 print 9 & 9 = Eequivale a "9" & "9" => la trasformazione del tipo è automatica 99 TEST se in una casella di testo ho qualcosa Not (IsNull(Me.TxtNominativo) Or Me.TxtNominativo = "") Me.TxtNominativo = "" => stringa vuota IsNull(Me.TxtNominativo) => casella mai valorizzata Nz(me.txtnominativo,"pippo") => se Me.txtnominativo è nullo imposta il valore a "pippo" Nz(me.txtnominativo,"")<>""=>alternativa --4N 10/3/2011 I report vengono trattati come le maschere (form) : unica differenza mancano le istruzioni relative all'input not , or , and => operatori logici If Not (IsNull(Me.TxtNominativo) Or Me.TxtNominativo = "") Then MsgBox "Saluta " + Me.TxtNominativo Else MsgBox "Digitare il nominativo da salutare", vbInformation, "Avviso" End If oppure If (IsNull(Me.TxtNominativo) Or Me.TxtNominativo = "") Then MsgBox "Digitare il nominativo da salutare", vbInformation, "Avviso" Else MsgBox "Saluta " + Me.TxtNominativo End If per costruire le condizioni devo usare gli operatori di confronto <, <= , >=, >, <>, = if x> 0 then msgbox "Positivo" end if if x> 0 then msgbox "Positivo" else msgbox "Non Positivo" end if Questa sequenza: if x> 0 then msgbox "Positivo" else if x< 0 then msgbox "Negativo" else msgbox "Zero" end if end if è equivalente a: if x> 0 then msgbox "Positivo" elseif x< 0 then msgbox "Negativo" else msgbox "Zero" end if ed anche equivalente a: If (x=0) then Msgbox “Nullo” Elseif (x>0) then Msgbox “Positivo” Else Msgbox “Negativo” End if Domanda sull'IF (determinazione del segno sul If IsNull(TxtValore) Or TxtValore = "" Then MsgBox "Digita qualcosa nella casella di testo" ElseIf IsNumeric(TxtValore) Then If (TxtValore > 0) Then MsgBox "Positivo" ElseIf (TxtValore < 0) Then MsgBox "Negativo" Else MsgBox "Nullo" End If Else MsgBox "Non hai digitato un numero" End If Studiare gli operatori logici all'interno degli appunti online xor, imp, and not, or ... (si chiamano mappe della verita) sub ... sequenza di istruzioni che non restituisce alcun valore sub OrdinaNominativi(Classe as string) algoritmo dicotomico in VBA end sub function ... sequenza di istruzioni che restituisce al termine un valore function QuantiStudentiSonoPresenti(Classe as string) as long algoritmo che effettua l'appello QuantiStudentiSonoPresenti=<numero assenti> end function La funzione restituisce il valore assegnato all'interno del corpo della funzione mediante un assegnamento del tipo: NomeFunzione=valore da restituire Autore: e01692 [ ven mar 18, 2011 1:59 pm ] Oggetto del messaggio: 18/03/2011 - Classe 4M - Modulo 3° le condizioni possono essere combinate mediante operatori logici (and, or , not) x>10 and x<20 => valuto se x appartiene all'intervallo (10,20) => le () escludono gli estremi x<10 or x>20 => valuto se x non appartiene all'intervallo [10,20] => le [] includono gli estremi tavole della verità: esempio quella dell'AND True And True = True True And False = False False And True = False False And False = False AND ha precedenza sull'OR - Il NOT ha precedenza su tutti true or false and true <> (true or false) and true true or false and true equivale a true or (false and true) not false and true => true (il not viene risolto per primo) sub EliminaTabella(NomeTabella) currentdb.execute("DROP TABLE " & nometabella) end sub EliminaTabella("Studenti") Il corpo di una maschera è la zona dove metto i controlli Dim x as date x=now(); x="Ciao" => errore spiegato le variabili -- 4N => 18/3/2011 è errato scrivere => per maggiore/uguale riprendere da DIM e TIMER 10 < x < 20 => errato => non segue la sintassi del VBA ma della notazione matematica Integer => 2 byte => 16bit =>2^16 combinazioni => tolgo un bit per il segno => +/- 2^15 Dim X => dichiaro una variabile X Option explicit => obbligatorietà della dichiarazione di qualsiasi variabile => se assegno un valore ad una variabile non dichiarata l'esecuzione del prg si ferma mostrando un errore di "RUNTIME" Il VBA consente la creazione automatica delle variabili appena ad una di esse assegno un valore L'assegnamento determina la creazione e anche il tipo di dato che quella variabile gestirà X=12 Giorno=#03/31/2011# quindi se successivamente scrivo Giorno="Ciao" => errore x=23 Queste variabili vengono create in maniera implicita Giorno = #3/31/2011# AAA = 1 UUU = "M;arco" MsgBox UUU MsgBox AAA MsgBox Giorno Giorno = Giorno + 1 MsgBox Giorno 'AAA = AAA + UUU ' Errore UUU = UUU + AAA MsgBox AAA Queste variabili vengono create in maniera esplicita Dim Giorno As date Dim AAA as long Dim UUU as string Giorno = #3/31/2011# AAA = 1 UUU = "M;arco" La definizione eplicita del tipo mette in evidenza eventuali errori di algoritmo o di input quando il valore assegnato ad una var non rientra nel range previsto una riga che inizia con ' è un commento => serve a spiegare cosa svolge la porzione di codice associata Autore: e01692 [ lun mar 21, 2011 10:02 am ] Oggetto del messaggio: 21/03/2011 - Classe 4M - Modulo 3° Dim NomeVariabile as Tipovariabile La definizione eplicita del tipo mette in evidenza eventuali errori di algoritmo o di input quando il valore assegnato ad una var non rientra nel range previsto Ricordarsi perchè: E' meglio obbligare la dichiarazione esplicita delle variabili (mediante DIM) => Mi metto al riparo da errori di digitazione (esempio pippo e pipo) E' meglio impostare il tipo di una variabile dichiarata in modo esplicito (mediante AS) => mi metto al riparo da errori di esecuzione o input che generano valori esterni al range ammesso me.timerinterval = 0 => evento timer disabilitato s="" => stringa vuota s="Ciao" => assegno alla var s la stringa "Ciao" s=s & " Marco" => concateno al contenuto della var s la parola " Marco" Sub SoluzioneEsercizio1() Dim NotOK As Boolean Dim minimo As Double NotOK = (IsNull(Me.Txt_A) Or Me.Txt_A = "") NotOK = NotOK Or (Not IsNumeric(Me.Txt_A)) NotOK = NotOK Or (IsNull(Me.Txt_B) Or Me.Txt_B = "") NotOK = NotOK Or (Not IsNumeric(Me.Txt_B)) NotOK = NotOK Or (IsNull(Me.Txt_C) Or Me.Txt_C = "") NotOK = NotOK Or (Not IsNumeric(Me.Txt_C)) NotOK = NotOK Or (IsNull(Me.Txt_D) Or Me.Txt_D = "") NotOK = NotOK Or (Not IsNumeric(Me.Txt_D)) NotOK = NotOK Or (IsNull(Me.Txt_E) Or Me.Txt_E = "") NotOK = NotOK Or (Not IsNumeric(Me.Txt_E)) If NotOK Then Me.Testo1 = "Non sono tutti valori numerici" Else minimo = Me.Txt_A If (minimo > Me.Txt_B) Then minimo = Me.Txt_B End If If (minimo > Me.Txt_C) Then minimo = Me.Txt_C End If If (minimo > Me.Txt_D) Then minimo = Me.Txt_D End If If (minimo > Me.Txt_E) Then minimo = Me.Txt_E End If Me.Testo1 = "Il minimo è : " & minimo End If End Sub 16 mod 4 = 0 => resto della divisione di 16 per 4 --spiegare rnd() rowsource => utilizzato anche per contenere un comando sql me.lstalunni.rowsource="SELECT Matricola, Nominativo FROM Alunni WHERE Classe='" & me.lstclasse & "'" listindex => -1 se nessuna riga del combo/list box risulta selezionata listindex >=0 se ho una riga del combo/list box selezionata il conteggio inizia da 0 => 0: 1° riga - 1: 2° riga ... Input/output in un vero prg occupano circa il 70/80% del codice effettivo. Si tratta di procedure standard che una volta apprese possono essere replicate con semplicità x>=asc("A") and x<=asc("Z") => maiuscolo rnd => [0,1) rnd*100 => [0,100) s=format(conta,"00000") => "00010" se conta=10 mid(s,i,1) => i-esimo digit Autore: e01692 [ lun mar 28, 2011 9:04 am ] Oggetto del messaggio: 28/3/2011 - Classe 4M - Modulo 3° sqr(Numero) => radice quadrata N=N+1 => incremento N S=S & "A" => accodo "A" a s S="A" & S => metto "A" davanti a quello che ho in s Nei moduli inserisco le variabili/routine[sub/function] che uso in tutto il mio file MDB (prg). Questo evita di riscrivere la sub/function all'interno di ogni form Una funzione/sub con davanti la scritta private è visibile solo nel modulo/maschera dove è stata definita Una funzione/sub con davanti la scritta public è visibile ovunque e può essere usata in qualsiasi maschera public nomedocente as string => variabile usabile ovunque nel prg quando nel codice scrivo il nome di un modulo e poi . vedrò tutte le variabili e le sub/function dichiarate come public il for è usato per iterare (ripetere) un'operazione currentdb => è il file MDB stesso currentdb.name => percorso completo del file mdb currentdb.TableDefs(6).Name => nome della 7 cartella currentdb.TableDefs("Studenti").fields(2).Name => nome del 3° campo della tabella "Studenti" Mid(s, i, 1) => i-esimo carattere della stringa s in VBA la sequenza For i = Len(s) To 1 Step -1 ' Mid(s, i, 1) => i-esimo carattere If Mid(s, i, 1) = "\" Then Exit For End If Next corrisponde a: beccami la posizione dell'ultimo slash esempio di funzione Public Function EstraiNomeDelFileMDB() As String Dim s As String s = CurrentDb.Name ' adesso s contiene "C:\Documents and Settings\porf sechi\Desktop\esempioOK.mdb" For i = Len(s) To 1 Step -1 ' Mid(s, i, 1) => i-esimo carattere If Mid(s, i, 1) = "\" Then Exit For End If Next EstraiNomeDelFileMDB = Mid(s, i + 1) End Function --4N 25/3/2011 saluto agli studenti in posizione pari For i = 2 To 10 Step 2 MsgBox CStr(i) & "° Saluto" Next MsgBox CStr(i) & "° Saluto" => equivale a MsgBox i & "° Saluto" per via della conversione automatica dei tipi se il contatore ha già superato il valore finale allora il ciclo for si ferma immediatamente. se non viene indicato lo step allora vale 1 - se i >valore finale allore la parte iterativa (codiceVBA) non verrà eseguita for i=10 to 1 Codice VBA next le sub e le function consentono: me => oggetto contenitore => corrisponde al form/maschera currentdb => currentdb.TableDefs("Studenti").name equivale a: currentdb.TableDefs(6).Name => nome della 7 cartella me.controls(i) => (i+1)-esimo controllo sul form db.tabledefs => insieme delle tabelle presenti nel file MDB db db.tabledefs(i)fields => insieme dei campi della (i+1)esima tabella db.querydefs => insieme delle query presenti nel file MDB db count => proprietà di un insieme che indica il nr di oggetti me.controls.count => nr oggetti sul form me.controls(i).controltype => identificativo del tipo di controllo sull'(i+1)-esimo oggetto sul form corrente Me.TxtOut = "" For i = 0 To Me.Controls.Count - 1 Me.TxtOut = Me.TxtOut + Me.Controls(i).Name & vbCrLf Next METODO TOPDOWN dato un problema complesso => scomposizione del problema in sottoproblemi + semplici => ogni sottoproblema può essere risolto in maniera indipendente e con maggior semplicità La parola const consente la definizioni di costanti => const PIGRECO 3.14 2*r*PIGRECO => circonferenza const IVA =0.2 Prezzofinale=Prezzo*(1+IVA) Dim X as object => X è un oggetto dotato di metodi, proprietà e soggetto ad eventi dim x as control => X è di tipo controllo dim x as tabledef => X è di tipo tabella sequenza che stampa il nome di tutte le tabelle dim x as tabledef for each x in currentdb.tabledefs msgbox x.name Next Autore: e01692 [ gio mar 31, 2011 9:59 am ] Oggetto del messaggio: 31/03/2011 - Classe 4M - Modulo 3° Elenca tutti i controlli e li visualizza in un textbox Me.TxtOut = "" ' Azzero il contenuto della casella For Each X In Me.Controls Me.TxtOut = Me.TxtOut + X.Name + vbCrLf Next elenco dei controlli che iniziano per una determinata lettera A For Each X In Me.Controls if left(X.name,1)="A" then msgbox(x.name) end if Next elenco delle tabelle che iniziano per A o B For Each X In currentdb.tabledefs if left(X.name,1)="A" OR left(X.name,1)="B" then msgbox(x.name) end if Next elenco delle tabelle che iniziano per A e finiscono B For Each X In currentdb.tabledefs if left(X.name,1)="A" AND right(X.name,1)="B" then msgbox(x.name) end if Next crlf => carriage return line feed => invio => 13+10 ascii Application => access stesso => da questo oggetto si diramano tutti gli oggetti disponibili nel file MDB Application.CurrentProject.AllForms => insieme di tutti i forms Application.CurrentProject.AllForms.count => nr di maschere Dim X as object => oggetto in generale Dim X as control => controllo che probabilmente risiede su un form Dim X as TextBox => controllo di tipo TextBOX che probabilmente risiede su un form Utilizzando un tipo + preciso ottengo digitando un . un elenco di metodi e proprietà + corretto Dim X => Dim X As Variant => tipo variabile => il tipo dipende dal primo assegnamento che effettuo E' meglio fornire sempre un tipo preciso alla variabile . in questo modo blindo + facilmente eventuali errori semantici (di programmazione) Attributes => proprietà che definisce il tipo di tabella le ricerche (le condizioni) su stringhe sono + lente rispetto a quelle numeriche Modalità for numerica - il campo viene identificato mediante un indice Set Db = CurrentDb Set Tbl = Db.TableDefs("TblEsempio") For i = 0 To Tbl.Fields.Count - 1 msgbox Tbl.Fields(i).name Next X=20 => assegnamento per valori standard set X=oggetto => assegnamento per gli oggetti set X=Nothing => oggetto vuoto - Una variabile di tipo oggetto è inizializzata a Nothing una variabile X di tipo variant a null Open <NOME FILE> For <METODO> As #<NUMERO> NUMERO => identifica il file dove operare METODO DI APERTURA output => per scrivere su file input => per leggere su file print #22, "Ciao" => scrive Ciao in fondo al file 22 Autore: e01692 [ ven apr 01, 2011 1:02 pm ] Oggetto del messaggio: 1/4/2011 - Classe 4M - Modulo 3° errore sintattico => scrivo ifff oppure dimentico il then => sarà access che mi avvisa dell'errore ControlType => proprietà che definisce il tipo di controllo Me.Controls(i) => (i+1)-esimo elemento me.txtstudente coincide con txtstudente applicATion.currentdb = currentdb riprendere dai files input( X = nr byte da leggere, ID del file) => legge da #ID X byte e restituisce la parte letta -- 4N 31/3/2011 Soluzione IF.11 Dim Conta As Long Private Sub Form_Load() Conta = 0 Me.TimerInterval = 100 End Sub Private Sub Form_Timer() Conta = Conta + 1 ' dim x as string ' x=Format(Conta, "00000") ' con mid(x,i,1) => estraggo l'iesimo char Me.lblConta.Caption = "Conta KM: " & Format(Conta, "00000") End Sub Domanda => sequenza di comandi per salvare il contenuto della casella di testo TXTpioppo Open "c:\pippo.txt" For Output As #1 Print #1, Me.TxtPioppo Print #1, "Ciao" ' questa parte viene accodata al file Close #1 Domanda => sequenza di comandi per caricare nella casella di testo TXTpioppo il contenuto del file c:\pippo.txt Open "c:\pippo.txt" For Input As #1 me.txtPioppo=input(LOF(1),1) Close #1 LOF(ID numero del file) => nr di byte del file aperto come #ID LOF(2) => nr byte di #2 input( X = nr byte da leggere, ID del file) => legge da #ID X byte e restituisce la parte letta l'apertura di un file (senza opportune opzioni sulla open) blocca il file e altre applicazioni potranno accedere ad esso solo in modalità lettura (LOCK DEL FILE) Il lock nei db è a livello di record e non di files (per loro natura i db devono garantire l'accesso contemporaneo di + user) (LOCK del RECORD) CurrentDb.Execute => metodo che consente di eseguire un comando sql di creazione/modifica unico comando DROP TABLE <nome tabella> Sequenza 1,2 ... N N=InputBox("Dammi N","0") For i = 1 to N msgbox i Next Sequenza 1, -1,1, -1 ... Segno=1 N=InputBox("Dammi N","0") For i = 1 to N msgbox Segno segno=-segno Next oppure N=InputBox("Dammi N","0") For i = 1 to N if (i mod 2) =0 then msgbox "-1" else msgbox "1" end if segno=-segno Next Sequenza 1, 2, 0 , 1, 2, 0 ... N=InputBox("Dammi N","0") For i = 1 to N msgbox (i mod 3) Next Sequenza A, Z, X , A, Z, X , ... N=InputBox("Dammi N","0") For i = 1 to N if (i mod 3) =0 then msgbox "X" elseif (i mod 3) = 1 then msgbox "A" else msgbox "Z" end if Next Determina il minimo di N Numeri N=InputBox("Dammi quanti valori vuoi insererire","0") Minimo=InputBox("Dammi il 1° Valore","0") For i = 2 to N X=InputBox("Dammi il " & i & "° Valore","0") if X < minimo then minimo=X endif NEXT msgbox "Il minimo è: " & minimo DOMANDA: eliminare le lettere A e B da una stringa s="Frase storica" p="" for i=1 to len(s) if Not ( mid(s,i,1)="A" or mid(s,i,1)="B") then p=p + mid(s,i,1) end if next msgbox "Frase senza A o B: " & p --- 4N 01/04/2011 Schema con i ListBox Dim N As Long, i As Long Dim s As String N = Me.Txt_N s = "" For i = 1 To N s = s & i & ";" Next Me.LstElenco.RowSource = s creare una funzione che elimina le lettere A e B da una stringa s passata come parametro Function EliminaAeB(s As String) As String p = "" For i = 1 To Len(s) If Not (Mid(s, i, 1) = "A" Or Mid(s, i, 1) = "B") Then p = p + Mid(s, i, 1) End If Next EliminaAeB = p End Function Private Sub Comando3_Click() Dim s As String s = "Frase storica" p = EliminaAeB(s) MsgBox "Frase senza A o B: " & p End Sub Autore: e01692 [ lun apr 04, 2011 9:06 am ] Oggetto del messaggio: 4/4/2011 - Classe 4M - Modulo 3° Scrittura tabella da i=1 a N scrivi riga(i-esima) ovvero da i= 1 a N da j=1 a M scrivi cella(i-esima, j-esima) Per applicare un'operazione sulla cella i, j for i=1 to N for j=1 to M operazione(i,j) next next costruire la taBELLA PITAGORICA nXM Dim s As String Const m = 10 Const N = 10 s = "" For i = 1 To N For j = 1 To m s = s & Format(i * j, "@@@") & ";" Next s = s & vbCrLf Next Me.TxtOut = s fUNZIONE CHE INCREMENTa FUNCTION iNCREMENTA(X AS LONG) iNCREMENTA=X+1 END function function CalcolaMinimo(a, b, c) as long Dim Minimo as long minimo=a if (minimo>b) then minimo=b if (minimo>c) then minimo=c CalcolaMinimo = Minimo end function function CalcolaMassimo(a, b, c) as long Dim Massimo as long massimo=a if (massimo<b) then massimo=b if (massimo<c) then massimo=c CalcolaMassimo = Massimo end function scrivere così: Call CalcolaMinimoMassimo(8, 3, 21, minimo, massimo) è equivalente a: CalcolaMinimoMassimo 8, 3, 21, minimo, massimo parametro byval => la function/sub non modifica il parametro che si dice passato a valore parametro byref (default) => la function/sub modifica il parametro che si dice per riferimento (reference) per costruire una function / sub che restituisce + di un valore è necessario impostare un numero di parametri byref pari al numero di valori restituiti Sub CalcolaMinimoMassimo(a, b, c, ByRef minimo, ByRef massimo) minimo = a If (minimo > b) Then minimo = b If (minimo > c) Then minimo = c massimo = a If (massimo < b) Then massimo = b If (massimo < c) Then massimo = c End Sub Private Sub Comando3_Click() Dim minimo, massimo Call CalcolaMinimoMassimo(8, 3, 21, minimo, massimo) MsgBox "Minimo: " & minimo MsgBox "Massimo: " & massimo End Sub Una funzione di questo tipo function F_Incrementa(x) F_Incrementa=x+1 end function è equivalente a questa sub S_Incrementa(byref x) x=x+1 end sub in generale y=f(x) s(x,y) dove y è byref Divisori di un numero Dim Divisori As String Const A = 212 For i = 2 To A - 1 If (A Mod i) = 0 Then Divisori = Divisori & i & "; " End If Next MsgBox "divisori di " & A & ": " & Divisori --- 4N 02/04/2011 Variabile locale => è una variabile dichiarata all'interno di una sub/function esiste solo durante l'esecuzione della sub/function qualsiasi assegnamento ad una var locale viene perso al termine dell'esecuzione della procedura (sub/function) una variabile dichiarata esternamente a qualsiasi sub/function è visibile in tutte le sub contenute nello stesso modulo dove viene dichiarata (ad esempio quello associato al form). Tale variabile vive per tutta la durata di utilizzo del form - viene distrutta quando il form viene chiuso (unload) una variabile dichiarata esternamente a qualsiasi sub/function all'interno di un modulo (codice definito in access nella sezione MODULI) con la parola chiave public è visibile a tutto il prg (file MDB) Autore: e01692 [ gio apr 07, 2011 12:06 pm ] Oggetto del messaggio: 07/04/2011 - Classe 4M - Modulo 3° esercitazione FOR pubblicata per 17/4 alle 24.00 verifica III MODULO 29/4/2011 Array Const N = 3 Dim y(1 To N) As Long For i = 1 To N y(i) = InputBox("Dammi il " & i & "° valore: ", "0") Next For i = N To 1 Step -1 MsgBox y(i) Next dim X(9) => dim(0 to 8) => array di 9 elementi il cui indica varia da 0 a 8 il dimensionamento dell'array deve soddisfare l'esigenza del vs problema se esco con l'indice dall'array ottengo un errore di "OUT OF RANGE" dim X(n to m) => array il cui indice varia da n a m => m-n+1 elementi DOMANDA: sequenza che legge i valori fino a che non si immette 0 x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend sia passo >0 for i=valoreiniziale to valorefinale step passo CodiceVBA next equivalenza WHILE i=valoreiniziale while (i <= valorefinale) CodiceVBA i=i+passo wend quindi qualsiasi prg con for può essere riscritto con WHILE il for è + compatto e quindi + leggibile => usato quando il nr di iterazioni è conosciuto a priori questo esempio non può essere riscritto in for x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend ricordarsi che exit for in un for consente l'uscita prima del termine nrinterrogati=0 for nrstudenti=1 to TotaleStudenti if LoStudenteIesimoDeveEssereInterrogato(i) then nrinterrogati=nrinterrogati+1 if nrinterrogati=4 then exit for next Questo ESEMPIO x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend è equivalente do x = InputBox("Dammi il valore: ", "0") loop while (x <> 0) la formulazione do loop while è utile quando almeno una volta viene eseguita la parte iterativa codiceVBAAlfa while condizione codiceVBAAlfa wend equivale a (risparmio la duplicazione delle righe) do codiceVBAAlfa loop while condizione Pagina 1 di 2 Tutti gli orari sono UTC + 1 ora [ ora legale ] Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ brescianet.com http://lnx.brescianet.com/ScuolaForum2009/ Classe 4M - Modulo 3° http://lnx.brescianet.com/ScuolaForum2009/viewtopic.php?f=9&t=22 Autore: e01692 [ ven apr 08, 2011 1:00 pm ] Oggetto del messaggio: 8/4/2001 -: Classe 4M - Modulo 3° esercitazione FOR pubblicata per 17/4 alle 24.00 Array Const N = 3 Dim y(1 To N) As Long For i = 1 To N y(i) = InputBox("Dammi il " & i & "° valore: ", "0") Next For i = N To 1 Step -1 MsgBox y(i) Next dim X(9) => dim(0 to 8) => array di 9 elementi il cui indica varia da 0 a 8 il dimensionamento dell'array deve soddisfare l'esigenza del vs problema se esco con l'indice dall'array ottengo un errore di "OUT OF RANGE" dim X(n to m) => array il cui indice varia da n a m => m-n+1 elementi DOMANDA: sequenza che legge i valori fino a che non si immette 0 x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend sia passo >0 for i=valoreiniziale to valorefinale step passo CodiceVBA next equivalenza WHILE i=valoreiniziale while (i <= valorefinale) CodiceVBA i=i+passo wend Pagina 2 di 2 quindi qualsiasi prg con for può essere riscritto con WHILE il for è + compatto e quindi + leggibile => usato quando il nr di iterazioni è conosciuto a priori questo esempio non può essere riscritto in for x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend ricordarsi che exit for in un for consente l'uscita prima del termine nrinterrogati=0 for nrstudenti=1 to TotaleStudenti if LoStudenteIesimoDeveEssereInterrogato(i) then nrinterrogati=nrinterrogati+1 if nrinterrogati=4 then exit for next Questo ESEMPIO x = InputBox("Dammi il valore: ", "0") While x <> 0 x = InputBox("Dammi il valore: ", "0") Wend è equivalente do x = InputBox("Dammi il valore: ", "0") loop while (x <> 0) la formulazione do loop while è utile quando almeno una volta viene eseguita la parte iterativa codiceVBAAlfa while condizione codiceVBAAlfa wend equivale a (risparmio la duplicazione delle righe) do codiceVBAAlfa loop while condizione 4N - 7/4 .... 4M 7/4 .... riprendere da qui Dim Classe(1 to N) as string Classe(1)="Rossi Maria" Classe(2)="Bianchi Chiara" ... Classe(N) ="Neri Bruno" DOMANDA : Funzione che dato un elenco di valori ricerca la posizione del valore X se non viene trovato restituisce 0 Function CercaInArray(Elencovalori, X) as long Posizione=-1 for i=1 to N if Elencovalori(i)=X then posizione=i end if next CercaInArray=posizione End Function spiegare lettura file con WHILE fattorizzazione con while altra soluzione + veloce Function CercaInArray(Elencovalori, X) as long CercaInArray=-1 for i=1 to N if Elencovalori(i)=X then CercaInArray=i exit function end if next CercaInArray=posizione End Function if CercaInArray(Classe,"Marco Sechi") < 0 then msgbox "Marco sechi è inesistente" else msgbox "Marco sechi è presente" end if UBOUND(array) => restituiscono la posizione dell'ultimo elemento LBOUND(array) => restituiscono la posizione del primo elemento dim x(-27 to 12) lbound(x)=-27 ubound(x)=12 EOF(numerofile) => vera se sono alla fine del file While Not EOF(1) ' fintanto che il file non risulta finito Input #1, linea ' legge una frase fino al primo invio che incontra Me.TxtTesto = "" While Not EOF(1) ' end of file Input #1, linea ' legge una frase fino al primo invio che incontra ' vbcrlf ==> ascii 13 + asci 10 ==> Carriage return line feed Me.TxtTesto = Me.TxtTesto + linea + vbCrLf Wend domanda: leggi il file pioppo.txt linea per linea open "pioppo.txt" for input as #1 While Not EOF(1) input #1, linea msgbox linea wend close #1 and or a bit 000 1 1 2^0 2 10 2^1 3 11 2^1+2^0 4 100 2^2 5 101 2^2+2^0 6 110 2^2+2^1 7 111 2^2+2^1+2^0 8 1000 2^3 9 1001 2^3+2^0 10 1010 2^3+2^1 7 and 5 => 111 and 101 111 and 101 ---101 => 5 7 or 5 => 111 or 101 111 or 101 ---111 => 7 not 5 => not 101 = 010 => 2 9 and 6 => 1001 and 0110 1001 and 0110 ---0000 =>0 1001 or 0110 ---1111 => 15 ESEMPIO 000 => non ha superato alcun modulo 010 => ha superato il 2° modulo if statostudente AND 4 then msgbox "Ha superato il 2° modulo" --- 4N 8/4/2011 openrecordset => metodo per agganciare una qry o una tabella ad una variabile di tipo recordset EOF => proprietà che diventa vera se sono in fondo ad un recordset BOF => proprietà che diventa vera se sono all'inizio di un recordset rs("NomeCampo") => valore del record corrente sul campo "NomeCampo" un recordset vuoto ha subito BOF e EOF a true SCORRIMENTO DEL RECORDSET Esempio 1 Set rs = CurrentDb.OpenRecordset("studenti") rs.MoveFirst MsgBox rs("nominativo") rs.close Esempio2 Set rs = CurrentDb.OpenRecordset("studenti") If Not rs.EOF Then rs.MoveFirst MsgBox rs("nominativo") Else MsgBox "Nessun studente" End If Autore: e01692 [ lun apr 11, 2011 9:01 am ] Oggetto del messaggio: 11/4/2001 - Classe 4M - Modulo 3° elenca tutti i valori del record corrente for i=0 to rs.fields.count-1 msgbox rs(i) next movefirst => mi sposto sul 1° record movelast => mi sposto sull'ultimo record movenext => mi sposto al record successivo rispetto a quello corrente moveprevious => mi sposto al record precedente rispetto a quello corrente NZ(Parametro1,<valore) => se parametro1 è nullo allora uso <valore> SCORRIMENTO DEL RECORDSET (CRESCENTE) ----------------------------Set rs = CurrentDb.OpenRecordset("studenti") If Not rs.EOF Then rs.MoveFirst While Not rs.EOF MsgBox rs("Nominativo") rs.MoveNext Wend End If SCORRIMENTO DEL RECORDSET (DECRESCENTE) ----------------------------Set rs = CurrentDb.OpenRecordset("SELECT Nominativo FROM studenti ORDER BY Nominativo DESC") If Not rs.EOF Then rs.MoveFirst While Not rs.EOF MsgBox rs("Nominativo") rs.MoveNext Wend End If Questo è quello richiesto Set rs = CurrentDb.OpenRecordset("studenti") If Not rs.BOF Then rs.Movelast While Not rs.BOF MsgBox rs("Nominativo") rs.MovePrevious Wend End If per il 17/4 esercizi sul for per il giorno prima della verifica scritta pubblicare quelli del WHILE far vedere top-down --- 4N 8/4 all'apertura il recordset si posiziona sul 1° record Elenca i nominativi che hanno la lettera A nel nominativo Set rs = CurrentDb.OpenRecordset("studenti") If Not rs.EOF Then rs.MoveFirst While Not rs.EOF if Instr(rs("Nominativo"),"A")>0 then MsgBox rs("Nominativo") end if rs.MoveNext Wend End If ATENZIONE: quando nel codice ho un'istruzione del tipo p=p & .... => devo inizializzare p NON RICHIESTO COME ESEMPIO Set rs = CurrentDb.OpenRecordset("studenti") s="" If Not rs.EOF Then rs.MoveFirst While Not rs.EOF if Instr(rs("Nominativo"),"A")>0 then s=s & rs("Nominativo") & "; " end if rs.MoveNext Wend End If ------------------------------------------------------OK Set rs = CurrentDb.OpenRecordset("VOTI") v=0 n=0 If Not rs.EOF Then rs.MoveFirst While Not rs.EOF if rs("Matricolainterrogato")="001" then v=v+rs("Voto") n=n+1 end if rs.MoveNext Wend End If if N=0 then msgbox "Rossi (matricola 001) non è mai stato interrogato" else msgbox "Rossi ha una media di " & v/n end if potenza X^N pow(x,N) ' INPUT Potenza positiva di X x=inputbox("Dammi la base: " , "0") N=inputbox("Dammi l'esponente: " , "0") ' ALGORITMO P=1 for I=1 to N P=P*X next ' OUTPUT msgbox "X^N=" & P Somma dei primi N numeri interi Definizione ricorsiva S(N)=S(N-1)+N S(0)=0 Definizione Iterativa S(N)=1+2+3+...+N N=inputbox("Dammi N: " , "0") ' ALGORITMO S=0 for I=1 to N S=S+i next ' OUTPUT msgbox "1+2+...+ N=" & S Provare a fare il fattoriale Definizione ricorsiva N!=N*(N-1)! 0!=1 N!=1*2*3*... *N Leggere un elenco di numeri terminato con 0 e restituire la media x = InputBox("Dammi il valore: ", "0") n=0 s=0 While x <> 0 x = InputBox("Dammi il valore: ", "0") n=n+1 s=s+x Wend if (n=0) then msgbox "Sequenza vuota" else msgbox "Media:" & S/(n-1) end if oppure x = InputBox("Dammi il valore: ", "0") n=0 s=0 While x <> 0 x = InputBox("Dammi il valore: ", "0") if (x<>0) then n=n+1 s=s+x end if Wend if (n=0) then msgbox "Sequenza vuota" else msgbox "Media:" & S/n end if Autore: e01692 [ gio apr 14, 2011 2:34 pm ] Oggetto del messaggio: 14/04/2001 - Classe 4M - Modulo 3° Sub SoluzioneEsercizio2() Dim N As Long, i As Long Dim x As Double Dim a As Double, b As Double, m As Double m = Me.Txt_M a = Me.Txt_A b = Me.Txt_B N = Me.Txt_N Me.TxtOut = "" For i = 1 To N x = InputBox("Dammi un numero : ", "richiesta valore", "0") If ((x < m * b) And (x > m * a)) Or ((x < b) And (x > a)) Then Me.TxtOut = Me.TxtOut & "SI: " & m * a & " < " & x & " < " & m * b Me.TxtOut = Me.TxtOut & " oppure a=" & a & " < " & x & " < " & b & vbCrLf Else Me.TxtOut = Me.TxtOut & "NO: m*a=" & m * a & " <= " & x & " <= " & m * b & "=m*b" Me.TxtOut = Me.TxtOut & " oppure a=" & a & " < " & x & " < " & b & vbCrLf End If Next MsgBox "Inserire qui la soluzione relativa all'esercizio 2", vbInformation, "Esercizio 2" End Sub --------------------------Sub SoluzioneEsercizio6() Dim x1 As Long, X2 As Long, X3 As Long Dim i As Long, s As String, N As Long N = Me.Txt_N x1 = Me.Txt_A X2 = Me.Txt_B s = x1 & ";" & X2 & ";" For i = 3 To N X3 = X2 + x1 s = s & X3 & ";" x1 = X2 X2 = X3 Next Me.LstElenco.RowSource = s End Sub ---------------------Sub SoluzioneEsercizio7() Dim i As Long, N As Long Dim s As String N = Me.Txt_N For i = 1 To N If (i Mod 5) = 1 Then s = s & "A;" ElseIf (i Mod 5) = 2 Then s = s & "E;" ElseIf (i Mod 5) = 3 Then s = s & "I;" ElseIf (i Mod 5) = 4 Then s = s & "O;" ElseIf (i Mod 5) = 0 Then s = s & "U;" End If Next Me.LstElenco.RowSource = s End Sub Sub SoluzioneEsercizio8() MsgBox "Inserire qui la soluzione relativa all'esercizio 8", vbInformation, "Esercizio 8" End Sub --------------------------------Sub SoluzioneEsercizio9() Dim N As Long Dim i, j, s As String Dim primo As Boolean N = Me.Txt_N s = "" For i = 2 To N primo = True ' Stabilisco se ha un divisore => non primo For j = 2 To i - 1 If (i Mod j) = 0 Then primo = False Exit For End If Next If primo Then s = s & i & ";" End If Next Me.LstElenco.RowSource = s End Sub --eser 1 while Autore: e01692 [ lun apr 18, 2011 8:37 am ] Oggetto del messaggio: 18/04/2011 - Classe 4M - Modulo 3° Sub SoluzioneEsercizio14() Const vocali = "aeiuo" Dim s As String Dim i As Integer, p As Long Dim ContaV(1 To 5) As Long ' INIZIALIZZAZIONE For i = 1 To 5 ContaV(i) = 0 Next s = Me.Txt_S Me.EleTabella.RowSource = "" ' ALGORITMO For i = 1 To Len(s) p = InStr(vocali, Mid(s, i, 1)) If p > 0 Then ContaV(p) = ContaV(p) + 1 End If Next For i = 1 To 5 Me.EleTabella.AddItem Mid(vocali, i, 1) & ";" & ContaV(i) & ";" Next Me.EleTabella.ColumnCount = 2 End Sub ---------------------- SOLUZIONE ALTERNATIVA Sub SoluzioneEsercizio14() Const vocali = "aeiuo" Dim s As String Dim i As Integer Me.EleTabella.RowSource = "" ' ALGORITMO For i = 1 To 5 s = Me.Txt_S Me.EleTabella.RowSource = Me.EleTabella.RowSource & Mid(vocali, i, 1) & ";" & (Len (s) - Len(Replace(s, Mid(vocali, i, 1), ""))) & ";" Next Me.EleTabella.ColumnCount = 2 End Sub Sub SoluzioneEsercizio15() Dim s As String Dim i As Integer Dim symb As String symb = Me.Txt_A & Me.Txt_B & Me.Txt_C Me.EleTabella.RowSource = "" ' ALGORITMO For i = 1 To Len(symb) s = Me.Txt_S Me.EleTabella.RowSource = Me.EleTabella.RowSource & Mid(symb, i, 1) & ";" & (Len (s) - Len(Replace(s, Mid(symb, i, 1), ""))) & ";" Next Me.EleTabella.ColumnCount = 2 End Sub ESER WHILE 1 Me.TxtOut = "" i = InputBox("dammi il valore", "titolardo", "0") If i <> 0 Then Me.TxtOut = Me.TxtOut & i & vbCrLf While i <> 0 i = InputBox("dammi il valore", "titolardo", "0") If i <> 0 Then Me.TxtOut = Me.TxtOut & i & vbCrLf Wend ALTERNATIVA Me.TxtOut = "" i=1 While i <> 0 i = InputBox("dammi il valore", "titolardo", "0") If i <> 0 Then Me.TxtOut = Me.TxtOut & i & vbCrLf end if Wend Autore: e01692 [ lun mag 02, 2011 9:00 am ] Oggetto del messaggio: Correzione orali 2/5/2011 - Classe 4M - Modulo 3° 0) Sequenza che ribalta una stringa s s = "Ciao" p = "" For i = Len(s) To 1 Step -1 p = p & Mid(s, i, 1) Next MsgBox p 1) Segno di X if isnull(x) or x="" then msgbox "NUllo elseif isnumeric(x) then If (x=0) then Msgbox “Nullo” Elseif (x>0) then Msgbox “Positivo” Else Msgbox “Negativo” End if end if funzione media msgbox (x+y+z)/3 function Media(a,b,c) as double Media=(a+b+c)/3 end function 2) funzione ribalta function Ribalta(s) as string p = "" For i = Len(s) To 1 Step -1 p = p & Mid(s, i, 1) Next Ribalta=p end function 7 and 3 111 011 --011 => 3 4 or 6 100 110 ---110 => 6 Autore: e01692 [ ven mag 06, 2011 5:06 pm ] Oggetto del messaggio: Verifica orale - Classe 4M - Modulo 3° [2] IF: Data una variabile X valutare se è nulla e se no se è numerica o una data o altro [2] FOR: Costruire una sequenza che dato N visualizza la sequenza A,B, 0, A, B, 0 ... [2] FUNZIONE: Funzione che accetta una stringa e restituisce la stessa priva di a e b (non è ammesso l’uso di replace) [1] Spiegare le proprietà forecolor, enabled e caption per l’oggetto etichetta [1] Cosa è la programmazione ad oggetti ? [1] Equivalente WHILE di “for i=1 to 100 msgbox “Ciao” next” [1] Controllo FORUM (indicare se non avete pubblicato l’’esercizio sul FOR) 1) if (isnull(x) or x="") then msgbox "Nullo" elseif (isnumeric(x)) then msgbox "Numerico" elseif (isdate(x)) then msgbox "Data" else msgbox "Altro" end if 2) for i=1 to N if (i mod 3)=1 then msgbox "A" elseif (i mod 3)=2 then msgbox "B" elseif (i mod 3)=0 then msgbox "0" end if next 3) function EliminaAB(s as string) as string p="" for i=1 to len(s) if Not ( mid(s,i,1)="A" or mid(s,i,1)="B" ) then p=p & mid(s,i,1) end if next EliminaAB=p End function 4) forecolor => colore del testo dell'etichetta enabled => abilita o disabilita l'etichetta caption => frase che appare nell'etichetta 5) Equivalente for i=1 to 100 msgbox "Ciao" next i=1 while i<=100 msgbox "Ciao" i=i+1 wend 6) programmazione ad oggetti: usa oggetti dotati di proprietà che sulla base di eventi eseguono azioni (metodi) -------------------------------[2] IF: Data una variabile X valutare se è un numero e se si indicare positiva negativa o zero [2] FOR: Costruire una sequenza che dato N visualizza la sequenza 1,2, 0, 1, 2, 0 ... [2] FUNZIONE: Funzione che accetta una stringa e restituisce la stessa ribaltata [1] Spiegare le proprietà rowsource, columncount e boundcolumn per l’oggetto combo [1] Considerando l’oggetto recordset indicare una proprietà e un metodo spiegandolo [1] Equivalente WHILE di “for i=100 to 1 step -1 msgbox “Ciao” next” [1] Controllo FORUM (indicare se non avete pubblicato l’’esercizio sul FOR) 1) if (isnumeric(x)) then if (x=0) then msgbox "Zero" elseif x >0 then msgbox "Positivo" else msgbox "Negativo" end if else msgbox "NON Numerico" end if 2) for i=1 to N msgbox i mod 3 Next 3) function Ribalta(s as string) as string p="" for i=len(s) to 1 step -1 p=p & mid(s,i,1) next Ribalta=p end function oppure function Ribalta(s as string) as string p="" for i=1 to len(s) p=mid(s,i,1) & p next Ribalta=p end function 4) RowSource => elenco dei valori contenuti nel combo columncount => nr colonne boundcolumn => colonna da cui viene estratto il valore da restituire 5) eof => restituisce true se sono in fondo al file movefirst => mi sposto all'inizio del recordset 6) Equivalente for i=100 to 1 step -1 msgbox "Ciao" next i=100 while i>=1 msgbox "Ciao" i=i-1 wend ------------------------- [2] IF: Dato un punto (X,Y) valutare il quadrante di appartenenza del piano cartesiano (1° Nord-Est, 2° SudEst – 3° SudOvest – 4° NordOvest [2] Scorrimento del recordset sul comando SQL SELECT Nome FROM Studenti [2] FUNZIONE: Funzione che accetta 3 argomenti numerici e restituisce il minimo [1] Spiegare mid e instr [1] Considerando l’oggetto combo spiegare listindex, listcount e column [1] Sintassi del WHILE [1] Controllo FORUM (indicare se non avete pubblicato l’’esercizio sul FOR) 1) if (X>0 and Y>0) msgbox "Quadrante 1°" elseif (X>0 and Y<0) msgbox "Quadrante 2°" elseif (X<0 and Y<0) msgbox "Quadrante 3°" elseif (X<0 and Y>0) msgbox "Quadrante 2°" else msgbox "Sugli assi" end if 2) set rs=currentdb.openrecordset("SELECT NOME FROM STUDENTI") if not rs.eof then rs.movefirst while not rs.eof msgbox rs("Nome") rs.movenext wend end if rs.close 3) function Minimo(a,b,c) as long m=a if m>b then m=b if m>c then m=c minimo=c end function 4) mid(s, n, i) => estrae dalla stringa s i caratteri partendo dalla posizione n instr(s,p) => restituisce la posizione di p in s 5) listindex =>nr riga selezionata listcount => nr colonne colum => tabella (righe colonne) contenente i valori del combo 6) while condizione IstruzioniVBA wend Pagina 2 di 2 Tutti gli orari sono UTC + 1 ora [ ora legale ] Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/
Documenti analoghi
4N - Appunti di INFORMATICA
1) quando passo alla modalità di esecuzione e carico il form ACCESS crea lo spazio per le 2 variabili dichiarate esternamente
2) al click sul bottone "BtnClicca" verrà assegnato 10 a x e Vargen
3)...
VBA XLS - Appunti di INFORMATICA
per VBA double identifica un numero con la virgola
Function NomeFunzione(elenco argomenti) as tipo valore restituito
Istruzioni in VBA necessarie per il calcolo della soluzione
' restituisco il val...
4M - Appunti di INFORMATICA
End Sub
-----------ByVal => passaggio di parametri in questa modalità ==> uso il valore ma non
modifico il valore della variabile passata (in access 97 è il comportamento