Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
armido15
HV kasutaja

liitunud: 24.12.2010
|
02.02.2012 15:29:09
VBA koolitöö |
|
|
Tere!
Koolis on natuke tööd vaja teha.
Sub Randomize()
ReDim sadataisarvu(1 To 100) As Integer
For i = 1 To 100
sadataisarvu(i) = Int((200) * Rnd + 1)
Cells(1, i) = sadataisarvu(i)
Next i
summa = 0
For Each element In sadataisarvu
summa = summa + element
Next element
Cells(2, 1) = "Kõikide elementide summa on " & summa
algarv = 0
For Each uusarv In sadataisarvu
algarv(j) = uusarv + 1
Next uusarv
Cells(3, j) = algarv(j)
End Sub
|
Viimastes ridades on viga sees,seda ma tean aga vaat ei oska seda kirjutada, et ta õigesti seda teeks.
Mul on siin koodis 1.real 100 suvalist arvu vahemikus 1-200
2.real arvutasin summa
3.real vaja lisada esimese rea arvudele 1 ja siis 4. reale jälle summa panna
Järgmiseks
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
02.02.2012 19:46:46
|
|
|
Selline võiks välja näha su arvule ühe liitmine
For i = 1 To 100
sadataisarvu(i) = sadataisarvu(i)+1
Next i |
ja summa saad täpselt samuti nagu juba tegid
summa = 0
For Each element In sadataisarvu
summa = summa + element
Next element |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
alfreedo
HV vaatleja
liitunud: 20.06.2010
|
02.02.2012 20:35:54
|
|
|
Kas nii ei kõlba?
Option Explicit
Sub Randomize()
Dim i As Long, summa As Long, sadataisarvu
Dim muut As Long
muut = 1
summa = 0
ReDim sadataisarvu(1 To 100) As Integer
For i = 1 To 100
sadataisarvu(i) = Int((200) * Rnd + 1)
Cells(1, i) = sadataisarvu(i)
Cells(3, i) = sadataisarvu(i) + muut
summa = summa + sadataisarvu(i)
Next i
Cells(2, 1) = "Kõikide elementide summa on " & summa
Cells(4, 1) = "Kõikide uute elementide summa on " & summa + (muut * i) - 1
End Sub
|
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
02.02.2012 22:52:36
|
|
|
suurim = 0
väikseim = 500
For Each element In sadataisarvu
If suurim < element Then suurim = element
Next element
For Each element In sadataisarvu
If väikseim > element Then väikseim = element
Next element
Cells(5, 1) = "Suurim arv on" & suurim
Cells(5, 5) = "Väikseim arv on" & väikseim |
Sellise koodi oskasin mina kirjutada, et otsiks suurima ja väikseima elemendi aga ta otsib neid ainult uuesti arvuhulgas"sadataisarvu".Suurima saab tõesti nii aga väiksemat ei saa.Kuidas ma saaksin panna ta väikseimat otsima?Või siis kuidas anda uuele arvuhulgale kindle pealkiri vms, et ma paneks otsima suurimat uuest ja väiksemat vanast arvuhulgast.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
03.02.2012 00:01:55
|
|
|
Selliselt peaks toimima
min=sadataisarvu(1)
max=sadataisarvu(1)
For i = 2 To 100
If sadataisarvu(i)> max Then max = sadataisarvu(i)
If sadataisarvu(i)< min Then min = sadataisarvu(i)
Next i
|
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
03.02.2012 02:04:33
|
|
|
andrusny kirjutas: |
Selliselt peaks toimima
min=sadataisarvu(1)
max=sadataisarvu(1)
For i = 2 To 100
If sadataisarvu(i)> max Then max = sadataisarvu(i)
If sadataisarvu(i)< min Then min = sadataisarvu(i)
Next i
|
|
Ta otsib ikka viimasest "sadataisarvu" hulgast.Ma homme igaks juhuks küsin õpetajalt üle äkki peabki nii olema.
Aga töö viimane osa siis millest ma aru ei saa:
1.Kirjuta 3 juhusliku arvu väärtust koos elemendi indeksiga.
2.Loo uus massiiv ja loenda, mitu sarnast massiivide paari on.(sama element ja indeks)
Edit:Sama probleem ilmneb ka siis,kui ma otsin arve,mille väärtus on 10.Samuti otsib ta vaid 2. reast.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
03.02.2012 13:59:54
|
|
|
Loomulikult otsib viimasest, sa ju muutsid oma masiivi pesad ära liites kõigile ühe, kus tal seda esimest enam võtta on.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
03.02.2012 23:15:20
|
|
|
Kõige viimasena siis vaja nüüd loendada, mitu sarnast massiivide paari on.
For i = 1 To 3
mitmeselement = (Int(Rnd() * 100))
antudelemendivaartus = sadataisarvu(mitmeselement)
Cells(6, i) = mitmeselement
Cells(7, i) = antudelemendivaartus
Next i
|
Siin terve kood
Sellega sai leida 3 suvalise elemendi indeksi ja väärtuse aga kuidas ma leian uuest arvuhulgast "veelsada" ja vanast "sadataisarvu" ühised?
Sub armidomassiivid()
ReDim sadataisarvu(1 To 100) As Integer
For i = 1 To 100
sadataisarvu(i) = Int((199) * Rnd + 1)
Cells(1, i) = sadataisarvu(i)
Next i
summa = 0
For Each element In sadataisarvu
summa = summa + element
Next element
Cells(2, 1) = "Kõikide elementide summa on " & summa
For i = 1 To 100
sadataisarvu(i) = sadataisarvu(i) + 1
Cells(3, i) = sadataisarvu(i)
Next i
summa = 0
For Each element In sadataisarvu
summa = summa + element
Next element
Cells(4, 1) = "Kõikide elementide summa on " & summa
suurim = 0
väikseim = 500
For Each element In sadataisarvu
If suurim < element Then suurim = element
Next element
For Each element In sadataisarvu
If väikseim > element Then väikseim = element
Next element
Cells(5, 1) = "Suurim arv on " & suurim
Cells(5, 3) = "Väikseim arv on " & väikseim
kokku = 0
For Each element In sadataisarvu
If element = 10 Then kokku = 1 + kokku
Next element
Cells(8, 1) = "Arve,mille väärtus on 10 leidub siin " & kokku
For i = 1 To 3
mitmeselement = (Int(Rnd() * 100))
antudelemendivaartus = sadataisarvu(mitmeselement)
Cells(6, i) = mitmeselement
Cells(7, i) = antudelemendivaartus
Next i
ReDim veelsada(1 To 100) As Integer
For i = 1 To 100
veelsada(i) = Int((199) * Rnd + 1)
Cells(9, i) = veelsada(i)
Next i
End Sub |
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
05.02.2012 01:00:51
|
|
|
Vaatasin linki aga väga ei süvenenud seal.
Igatahes tuli endale üks mõte, mida võiks teha.
paarid=0
For i = 1 To 100
mitmeselement = (Int(Rnd() * 100))
antudelemendivaartus = sadataisarvu(mitmeselement)
mitmeselement1 = (Int(Rnd() * 100))
antudelemendivaartus1 = veelsada(mitmeselement1)
If (mitmeselement - mitmeselement1) + (antudelemendivaartus - antudelemendivaartus1) = 0 Then paarid = paarid + 1
Next i
Cells(10, 1) = "Paare kahel massiivil on " & paarid |
Äkki keegi oskab öelda, mis valesti.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
05.02.2012 13:59:24
|
|
|
Sa tahad ju leida samu numbreid masiivides?
Kui sa selliselt teed, siis sa ei saa ju kõiki elemente võrrelda, kuna sa annad suva numbri generaatoriga masiivi pesa ette
mitmeselement = (Int(Rnd() * 100)) |
see võib sul ju vabalt kolm korda 5 pesa vaadata
võrduseks piisaks ju ainult kahe väärtuse võrdsuse kontrollist
If antudelemendivaartus = antudelemendivaartus1 Then paarid = paarid + 1 |
( peaks olema antudelemendivaartus = antudelemendivaartus1 muidu teistes keeltes on kirjapilt antudelemendivaartus == antudelemendivaartus1)
proovi selliselt
paarid=0
For i = 1 To 100
For ii=1 To 100
If sadataisarvu(i) = veelsada(ii) Then paarid = paarid + 1
Next ii
Next i
Cells(10, 1) = "Paare kahel massiivil on " & paarid |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
05.02.2012 17:50:58
|
|
|
Ühtima peab nii indeks(asukoht) kui väärtus, kui ma ei eksi siis siis ühtib ainult väärtus koodis mille sa oled kirjutanud.
For i = 1 To 3
mitmeselement = (Int(Rnd() * 100))
antudelemendivaartus = sadataisarvu(mitmeselement)
Cells(6, i) = mitmeselement
Cells(7, i) = antudelemendivaartus
Next i |
Sellise koodi ütles mulle õpetaja ja mõtlesin, et selle abil annab siis ka mõlema massiivi kohta see ära teha.
OT:Sinu antud koodis oli kõigepealt tsükkel "i" ja siis "ii".Kas ta kordab 100 korda tsüklit "i" ja seal sees veel "ii" nii,ry 10k korda ? VÕI kordab mõlemat 100 korda ?
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
alfreedo
HV vaatleja
liitunud: 20.06.2010
|
05.02.2012 18:24:26
|
|
|
Algusest.
tsitaat: |
sadataisarvu(i) = Int((200) * Rnd + 1)
|
Rnd() väljastab küll suvalisi numbreid numbrivahemikust 1...200, kuid need võiks ikka olla unikaalsed.
Vastasel korral on koodi lõpus sul ka korduvaid enam.
Kas koolis määrangu "Option Explicit" , ImmediateWindowi jms kasulikkusest ei õpetata?
Option Explicit
Public sadataisarvu
Public summa As Long
Public summa2 As Long
Sub armidomassiivid()
Dim element, mitmeselement, antudelemendivaartus
Dim i As Long
Dim a As Long
Dim sadataisarvu2
Dim suurim As Long
Dim väikseim As Long
Dim kokku As Long
Dim paarid As Long
Application.ScreenUpdating = False
Range("A1").Activate
'Loeme masiivi unikaalsed numbrid
DemoUniqueRandomLongs
Range("A1").Activate
'loeme lehele unic nr-d.
ReDim sadataisarvu(1 To 100) As Integer
For i = 1 To 100
sadataisarvu(i) = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
Next i
summa = 0
For Each element In sadataisarvu
summa = summa + element
Next element
Cells(2, 1) = "Kõikide elementide summa on " & summa
ReDim sadataisarvu2(1 To 100) As Integer
For i = 1 To 100
sadataisarvu2(i) = sadataisarvu(i) + 1
Cells(3, i) = sadataisarvu2(i)
Next i
summa = 0
For Each element In sadataisarvu2
summa = summa + element
Next element
Cells(4, 1) = "Kõikide elementide summa on " & summa
suurim = 0
väikseim = 500
For Each element In sadataisarvu
If suurim < element Then suurim = element
Next element
For Each element In sadataisarvu
If väikseim > element Then väikseim = element
Next element
Cells(5, 1) = "Suurim arv on " & suurim
Cells(5, 3) = "Väikseim arv on " & väikseim
kokku = 0
For Each element In sadataisarvu
If element = 10 Then kokku = 1 + kokku
Next element
Cells(8, 1) = "Arve,mille väärtus on 10 leidub siin " & kokku
For i = 1 To 3
mitmeselement = (Int(Rnd() * 100))
antudelemendivaartus = sadataisarvu(mitmeselement)
Cells(6, i) = mitmeselement
Cells(7, i) = antudelemendivaartus
Next i
Range("A9").Activate
'Loeme masiivi uued unikaalsed numbrid
DemoUniqueRandomLongs
Cells(ActiveCell.Row, 1).Activate
ReDim veelsada(1 To 100) As Integer
For i = 1 To 100
veelsada(i) = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
Next i
paarid = 0
i = 0
For i = 1 To 100
a = 1
Do Until a = 100
If sadataisarvu(i) = veelsada(a) Then
paarid = paarid + 1
Cells(1, i).Font.ColorIndex = 3
End If
a = a + 1
Loop
Next i
Cells(10, 1) = "Paare kahel massiivil on " & paarid
Cells(10, 1).Activate
Application.ScreenUpdating = True
End Sub
|
Pane järgmine funktsioon teise moodulisse.
' http://www.cpearson.com/excel/RandomNumbers.aspx
Option Explicit
Sub DemoUniqueRandomLongs()
Dim Res As Variant
Dim Min As Long
Dim Max As Long
Dim N As Long
Min = 1
Max = 200
N = 100
Res = UniqueRandomLongs(Minimum:=Min, Maximum:=Max, Number:=N)
If IsArrayAllocated(Res) = False Then
MsgBox "Error from UniqueRandomLongs."
Else
For N = LBound(Res) To UBound(Res)
ActiveCell = Res(N)
ActiveCell.Offset(0, 1).Activate
Next N
End If
End Sub
Function IsArrayAllocated(V As Variant) As Boolean
''''''''''''''''''''''''''''''''''''''''''
' Ensure we have an allocated array.
''''''''''''''''''''''''''''''''''''''''''
On Error Resume Next
IsArrayAllocated = Not (IsError(LBound(V)) And _
IsArray(V)) And (LBound(V) <= UBound(V))
End Function
Public Function UniqueRandomLongs(Minimum As Long, Maximum As Long, _
Number As Long, Optional ArrayBase As Long = 1, _
Optional Dummy As Variant) As Variant
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' UniqueRandomLongs
' This returns an array containing elements whose values are between the Minimum and
' Maximum parameters. The number of elements in the result array is specified by the
' Number parameter. For example, you can request an array of 20 Longs between 500 and
' 1000 (inclusive).
' There will be no duplicate values in the result array.
' The ArrayBase parameter is used to specify the LBound of the ResultArray. If this
' is omitted, ResultArray is 1-based.
' The Dummy argument is to be used only when the function is called from a worksheet.
' Its purpose is to allow you to use the NOW() function as the Dummy parameter to force
' Excel to calculate this function any time a calculation is performed. E.g.,
' =UniqueRandomLongs(100,199,10,NOW())
' If you don't want to recalulate this function on every calculation, omit the Dummy
' parameter. The Dummy argument serves no other purpose and is not used anywhere
' in the code.
' The function returns an array of Longs if successful or NULL if an error occurred
' (invalid input parameter).
' Note: The procedure creates its own array of size (Maximum-Minium+1), so very large
' differences between Minimum and Maximum may cause performace issues.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim SourceArr() As Long
Dim ResultArr() As Long
Dim SourceNdx As Long
Dim ResultNdx As Long
Dim TopNdx As Long
Dim Temp As Long
''''''''''''''''''''''''''''''''''''''
' Test the input parameters to ensure
' they are valid.
''''''''''''''''''''''''''''''''''''''
If Minimum > Maximum Then
UniqueRandomLongs = Null
Exit Function
End If
If Number > (Maximum - Minimum + 1) Then
UniqueRandomLongs = Null
Exit Function
End If
If Number <= 0 Then
UniqueRandomLongs = Null
Exit Function
End If
Randomize
''''''''''''''''''''''''''''''''''''''''''''''
' Redim the arrays.
' SourceArr will be sized with an LBound of
' Minimum and a UBound of Maximum, and will
' contain the integers between Minimum and
' Maximum (inclusive). ResultArray gets
' a LBound of ArrayBase and a UBound of
' (ArrayBase+Number-1)
''''''''''''''''''''''''''''''''''''''''''''''
ReDim SourceArr(Minimum To Maximum)
ReDim ResultArr(ArrayBase To (ArrayBase + Number - 1))
''''''''''''''''''''''''''''''''''''''''''''
' Load SourceArr with the integers between
' Minimum and Maximum (inclusive).
''''''''''''''''''''''''''''''''''''''''''''
For SourceNdx = Minimum To Maximum
SourceArr(SourceNdx) = SourceNdx
Next SourceNdx
''''''''''''''''''''''''''''''''''''''''''''''
' TopNdx is the upper limit of the SourceArr
' from which the Longs will be selected. It
' is initialized to UBound(SourceArr), and
' decremented in each iteration of the loop.
' Selections from SourceArr are always in the
' region including and to the left of TopNdx.
' The region above (to the right of) TopNdx
' is where the used numbers are stored and
' no selection is made from that region of
' the array.
''''''''''''''''''''''''''''''''''''''''''''''
TopNdx = UBound(SourceArr)
For ResultNdx = LBound(ResultArr) To UBound(ResultArr)
''''''''''''''''''''''''''''''''''''''''''''''''''
' Set SourceNdx to a random number between 1 and
' TopNdx. ResultArr(ResultNdx) will get its value from
' SourceArr(SourceNdx). Only elements of SourceArr
' in the region of the array below (to the left of)
' TopNdx (inclusive) will be selected for inclusion
' in ResultArr. This ensures that the elements in
' ResultArr are not duplicated.
''''''''''''''''''''''''''''''''''''''''''''''''''
SourceNdx = Int((TopNdx - Minimum + 1) * Rnd + Minimum)
ResultArr(ResultNdx) = SourceArr(SourceNdx)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Now, swap elements SourceNdx and TopNdx of SourceArr,
' moving the value in SourceArr(SourceNdx) to the region
' of SourceArr that is above TopNdx. Since only elements
' of SourceArr in the region below TopNdx (inclusive) are
' possible candidates for inclusion in ResultArr, used
' values are placed at TopNdx to ensure no duplicates.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Temp = SourceArr(SourceNdx)
SourceArr(SourceNdx) = SourceArr(TopNdx)
SourceArr(TopNdx) = Temp
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Decrment TopNdx. This moves the effective UBound of SourceArr
' downwards (to the left), thus removing used numbers from the
' possibility of inclusion in ResultArr. This ensures we have
' no duplicates in the ResultArr.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TopNdx = TopNdx - 1
Next ResultNdx
''''''''''''''''''''''''''''''
' Return the result array.
''''''''''''''''''''''''''''''
UniqueRandomLongs = ResultArr
End Function
|
PS!
For tsyklite asemel saaks kasutatda ka teisi võimalusi: valemid: match jne
Kuna ii eksitab panin ühe loop-until tsykli näiteks.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
05.02.2012 18:44:59
|
|
|
tsitaat: |
OT:Sinu antud koodis oli kõigepealt tsükkel "i" ja siis "ii".Kas ta kordab 100 korda tsüklit "i" ja seal sees veel "ii" nii,ry 10k korda ? VÕI kordab mõlemat 100 korda ? |
jah, iga i tsükli korral teeb 100x ii tsükli läbi.
tsitaat: |
Ühtima peab nii indeks(asukoht) kui väärtus,
|
See suht kahtlane ettevõtmine, miks sa arvad, et sul üldse sama väärtus samasse pesasse satuks? Sa tegid ju alg maiivi ja teine masiiv on selle iga pesa 1 võrra suurem.
ehk siis oleks
1 2 3 4
2 3 4 5
selliselt ei saa ju kuidagi samas pesas sama number olla.
Kuigi see oleks ju veel lihtsam
paarid=0
For i = 1 To 100
If sadataisarvu(i) = veelsada(i) Then paarid = paarid + 1
Next i
Cells(10, 1) = "Paare kahel massiivil on " & paarid |
vaatad sama pesa mõlemal masiivil, kui võrdsed, siis paned paaridele numbri juurde.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
armido15
HV kasutaja

liitunud: 24.12.2010
|
05.02.2012 19:01:22
|
|
|
@andrusny Täpselt selline oli ikka ülessanne.Kood tundub üsna obvious aga ma lähenesin veidi valelt küljelt.
@alfreedo Meie õpetaja on tegelikult nagu suht random.Ta ei õpetanud mingeid põhitõdesid ega midagi.Esimesel tunnil hakkasime kohe näiteks mingit palli graafiliselt liigutama ja ega ta just väga ei seletanud, mis, kuidas ja miks kood töötab.Aga meie klassis olen ma praktiliselt ainuke kes tõesti viitsib ka kaasa mõelda,sest õpetaja jagab hindeid üldiselt suht kergelt ja keda asi ei huvita see ei viitsi ka kaasa teha.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
|