Další úkol - Jak provedu výpočet? – Visual Basic – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Další úkol - Jak provedu výpočet? – Visual Basic – Fórum – Programujte.comDalší úkol - Jak provedu výpočet? – Visual Basic – Fórum – Programujte.com

 

Dumbo0
Newbie
21. 5. 2018   #1
-
0
-

Zdravím, zasekl jsem se při tomhle. Mám za úkol : Vygenerujte 20 celých náhodných celých čísel v rozsahu 10..50. Zjistěte, o kolik se jejich střední hodnota (průměr) liší od středu intervalu, tedy od 30.

 Mám pouze tohle, tedy umím vygenerovat čísla od 10 do 50 : 

Sub main()
Dim b As Byte
Dim nahoda As Double
Dim ret As String
Dim ret2 As String

For b = 1 To 50 Step 1
    nahoda = Round(Rnd() * 40) + 10
        ret = ret + Chr(10) + Str(nahoda)
Next b
MsgBox ret
End Sub

Co mi na tom nejde je to, že nechápu, jak s těmi vygenerovanými náhodnými čísli pracovat dál. Jediné co umím, je vypsat je v msgboxu. Jak ty náhodná čísla třeba donutím, aby se všechny dohromady sečetly a zobrazily mi výsledek? Nebo ještě lépe jak tomu říct, aby mi vypsal například třetí vygenerované číslo z těch 20 vygenerovaných samostatně, abych s ním mohl potom dále pracovat? Děkuji.

Nahlásit jako SPAM
IP: 78.102.119.–
peter
~ Anonymní uživatel
3981 příspěvků
21. 5. 2018   #2
-
0
-

'Vygenerujte 20 celých náhodných celých čísel'
'For b = 1 To 50 Step 1'
Ten cyklus mas nastaveny od 1 do 50 po 1, proc?

nahoda = Round(Rnd() * 40) + 10
Mas ulozene cislo do promenne nahoda.

'o kolik se jejich střední hodnota (průměr) liší od středu intervalu, tedy od 30.'
To je jakasi nesrozumitelna veta, asi spanelstina :)
Bud je treba vsechna cisla secist, podelit 20 a odecist 30. Nebo od kazdeho odecist 30 a kazdy rozdil vypsat. 

soucet = 0
cyklus ...
  nahoda = ...
  soucet = soucet + nahoda
konec cyklu... (Next b)
rozdil = soucet / 20 - 30 
... 20 je 20 cisel, 30 je hodnota, co mas odecist
Nahlásit jako SPAM
IP: 2001:718:2601:258:1502:55...–
Dumbo0
Newbie
21. 5. 2018   #3
-
0
-

#2 peter
děkuji, vaše řešení opravdu funguje a i mi dává smysl. Co mi nedává smysl je KAM do toho všechno zakomponovat to moje 

ret = ret + Chr(10) + Str(nahoda)
MsgBox ret

protože zároveň chci, aby mi ty čísla vypsal, ať si na jejich základě můžu ověřit správnost těch výpočtů podtím.

Nahlásit jako SPAM
IP: 78.102.119.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 5. 2018   #4
-
0
-

Copak něco brání tomu abys to v tom cyklu dělal obojí?

Nahlásit jako SPAM
IP: 213.211.51.–
Dumbo0
Newbie
21. 5. 2018   #5
-
0
-

#4 gna
no tuším že ano, když mi to nefunguje. Pravděpodobně mám špatně pořadí nebo co. Píše mi to Mismatch. Já se omlouvám že tyhle základy nevím, jsem čtvrtý den v kurzu a o programování nevím nic, konzultace mám až příští týden, ale rád bych některé věcí pochopil do nich.

 Celé mi to funguje dokud nepřidám ten řádek, který by mi měl vypsat ty čísla : 

vypis = vypis + Chr(10) + Str(nahoda)

potom mi to hned napíše Mismatch. 

Sub main()
Dim b As Byte
Dim vsechno As Double
Dim nahoda As Double
Dim soucet As Long
Dim rozdil As Long
Dim vypis As Long

soucet = 0
For b = 1 To 20 Step 1
    nahoda = Round(Rnd() * 40) + 10
        soucet = soucet + nahoda
            vsechno = Str(soucet) / 20
                vypis = vypis + Chr(10) + Str(nahoda)
Next b
rozdil = soucet / 20 - 30

MsgBox "Součet všech čísel :" + Str(soucet)
MsgBox "Rozdíl od průměru :" + Str(rozdil)
MsgBox "Kolik je aktuální průměr?" + Str(vsechno)
MsgBox vypis


End Sub
Nahlásit jako SPAM
IP: 78.102.119.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 5. 2018   #6
-
0
-

Protože vypis máš Long a pokoušíš se k němu přičítat string.

Mimochodem pokud je step 1, tak ho nemusíš psát a neco = neco + necojineho se dá napsat jako neco += necojineho. A to Chr(10) nahraď něčím srozumitelnějším. Myslím, že ještě pořád existuje předdefinovaná konstanta vbNewLine.

Dim i As Integer
Dim nahoda, soucet, prumer, rozdil As Double
Dim vypis As String

soucet = 0
For i = 1 To 20
    nahoda = Round(Rnd() * 40) + 10
    soucet += nahoda
    vypis += Str(nahoda) + vbNewLine
Next i
prumer = soucet / 20
rozdil = 30 - prumer

vypis += "prumer " + Str(prumer) + vbNewLine
vypis += "rozdil " + Str(rozdil) + vbNewLine

MsgBox vypis
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 5. 2018   #7
-
0
-

Jinak teda pokud ten MsgBox používáš, protože je to konzolová aplikace a nevíš, jak jinak něco vypsat, tak je to 

Console.WriteLine("Ahoj")
Nahlásit jako SPAM
IP: 213.211.51.–
Dumbo0
Newbie
21. 5. 2018   #8
-
0
-

Díky za info, teď už to funguje. Ten MsgBox používám, protože nám zadali jako naprostým začátečníkům používat VB, který je v Excelu. Výsledek mi pak jen vyskočí v okně. Prý je to tak pro začátečníky lepší a za nějaký čas máme stejně přecházet na VB do Visual Studia.

Nahlásit jako SPAM
IP: 78.102.119.–
peter
~ Anonymní uživatel
3981 příspěvků
21. 5. 2018   #9
-
0
-

Dim vsechno As Double
vsechno = Str(soucet) / 20
double = string / double - kdyz kombinujes ruzne typy, ti to vypise type mismatch

Nehlede na to, ze ten radek tam nema, co delat. Logicky to tam nepatri.
Pr.
nahoda = 1
soucet = 0
cyklus 20x: soucet = (soucet+nahoda) / 20
Tak preci vysledek cyklu pocita takto:
soucet = (0 + 1) / 20
soucet = (((0 + 1) / 20) + 1) / 20
Ale, ty potrebujes, aby to pocitalo
soucet = 0 + 1
soucet = 1 + 1
soucet = 2 + 1
A za cyklem to teprve delis 20. Tak jsem ti to i napsal. Nevim, co te vedlo k tomu davat to dovnitr cyklu.

Hele, tak zapomen na cykly. Predstav si, ze je v zadani opakovani 3x. Napis to bez cyklu. A spocitej si matematicky, zda ti vyjde stejne cislo na papire jako v programu. Pokud ti vyjde jine cislo, pak to mas spatne.
Tez se muze stat, ze i ten vypocet na papire je spatne :)
Nechapu, jak chces resit slozitejsi ukoly, jako je serazeni neznamych cisel. Ukol, co jsme resili na stredni skole 25 let zpet. Stale ziju v predpokladu, ze jsou lide chytrejsi nez driv.

Nahlásit jako SPAM
IP: 193.84.204.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 5. 2018   #10
-
0
-

Já jsem předpokládal, že jde o VB.NET. To asi budete dělat v tom Visual Studiu.

To v Excelu je VBA (Visual Basic for Applications) a je úplně na ho.no.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
21. 5. 2018   #11
-
0
-

#10 gna
V excelovském VBA jsem kdysi napsal firemní appku. Sice jsem u toho dost nadával, protože to mělo běžet na třech nekompatibilních verzích Excelu, ale nakonec jsem to dal i s přenositelností.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:c9d1:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
gna
~ Anonymní uživatel
1849 příspěvků
21. 5. 2018   #12
-
+1
-
Zajímavé
Kit +

#11 Kit
Já jsem poslední velkou věc ve VBA dělal před 20 lety pro jeden okresní úřad a není na světě dost peněz, abych to podstoupil znova.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3981 příspěvků
22. 5. 2018   #13
-
0
-

Tak za tech 20 let se vba vubec nezmenil :) Stale se v tom dela na houby. Ale uz se da semtam neco i vygooglovat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:41dd:65...–
Dumbo0
Newbie
22. 5. 2018   #14
-
0
-

Petre, taky netusim, ja na stredni matiku uz nemel. Na druhou stranu mam chut se tim prokousat a nektere veci se i z matiky doucit. Nez jsem se do kurzu programatora hlasil tak jsem si u tvurce kurzu 3x overoval, jestli nejsou nejake matematicke dovednosti potreba. Bylo mi receno ze ne, ze se vse zaklada jen na logice tj pokud napisu A program udela B nebo C. No asi jsem si to predstavoval moc jednoduse. Samozrejmne hned po prvnich 4 hodinach sem dostal seznam 50 domacich ukolu a vsechny z nich jsou napsane stylem " Zjistěte, o kolik se jejich střední hodnota (průměr) liší od středu intervalu, tedy od 30" , "Zjistěte, kolik z nich je v určitém intervalu (např. od 10 do 50)" atd atd. Takže moje tempo je asi tak 1 úloha za den protoze mi to matematicky nemysli a bud si to nedokazu vubec predstavit nebo ani netusim o cem je rec.

Nahlásit jako SPAM
IP: 78.102.119.–
Dumbo0
Newbie
22. 5. 2018   #15
-
0
-

 Prosím o kontrolu.

'Program vygeneruje deset náhodných celých čísel (např. od -90 do 100). Zjistěte, kolik z nich je v určitém intervalu (např. od 10 do 50)
Option Explicit
Sub main()
Dim zaklad As Long
Dim nahoda As Double
Dim vycet As String
Dim vypocet As Long

vypocet = 0
For zaklad = 1 To 10
    nahoda = Round((Rnd() * 190) - 90)
        vycet = vycet + Chr(10) + Str(nahoda)
If nahoda > 10 And nahoda < 50 Then
    vypocet = vypocet + 1
Else
    vypocet = vypocet + 0
End If

Next zaklad

MsgBox vycet
MsgBox vypocet

End Sub
Nahlásit jako SPAM
IP: 78.102.119.–
peter
~ Anonymní uživatel
3981 příspěvků
22. 5. 2018   #16
-
0
-

Matematika je vyhodou.
Obvykle dostanes zadani, ktere musis prelozit do srozumitelneho jazyka. Specialne to tve obsahuje spoustu matematickych pojmu. Zakaznik do toho plete obvykle obchodni hantyrku, pojmy, ktere jsi v zivote neslysel :) Si nevyberes.

* Pricitat nulu nedava smysl.
* U intervalu v zadani od-do, to by mohlo znamena, ze se muzou i rovnat.
* S VB nepracuji, takze nevim, co udela round a random. Round zaokrouhluje 0.5-1.499 na 1, ne? Takze technicky je to spatne. 0 ma sanci jen 0-0.499, kdezto dvojnasobnou 0.5-1.499. Za predpokladu, ze rnd vyprodukuje cislo 0.001-0.999. Navic, v ruznych jazycich se chova rdn jinak. Nekde produkuje 0.000-1.000. Jinymi slovy, obvykle pouzivam max+1 a floor.

Nahlásit jako SPAM
IP: 193.84.204.–
Kmotr
~ Anonymní uživatel
6 příspěvků
24. 5. 2018   #17
-
0
-

Dumbo.

Programování je o myšlení. Takže programovací jazyk je až v druhé řadě … 

Nemáš asi dobrého učitele, sorry … (jen jsem četl vše shora napsané …) 

Napřed, pokud opravdu chceš, a pokud zde aktuálně mluvíme o VB (Visual Basic), pak se nauč napřed 

všechna klíčová slova VB (ver.5, 6), pak musíš zvládnout dobře i matematiku, češtinu taktéž (rodný jazyk) … 

Hm … věděl bych jak na to … věděl ...

Nahlásit jako SPAM
IP: 188.175.112.–
Kmotr
~ Anonymní uživatel
6 příspěvků
24. 5. 2018   #18
-
0
-

#15 Dumbo
… a proč nepoužít např. funkci ? 


Rem:  RND (náhodné) číslo = v rozsahu od "min" - do "max"

Public Function numRND_minMAX(Optional MinValue As Long = 10, _
                              Optional MaxValue As Long = 1000) As Long
On Error Resume Next
   Randomize Timer
    numRND_minMAX = Int((MaxValue - MinValue + 1) * Rnd) + MinValue
End Function
 

Nahlásit jako SPAM
IP: 188.175.112.–
Kmotr
~ Anonymní uživatel
6 příspěvků
24. 5. 2018   #19
-
0
-

Klíčová slova (* jen výběr)   

Abs
And
Any
As
Boolean
ByRef
ByVal
Call
Case
CBool
CCur
CDate
CDbl
CDecl
CInt
CLng
Close
Const
CSng
CStr
CurDir
Currency
CVar
CVDate
CVErr
Date
Debug
Declare
DefBool
DefCur
DefDate
DefDbl
DefInt
DefLng
DefObj
DefSng
DefStr
DefVar
Dim
Dir
Do
Double
Each
Else
ElseIf
Empty
End
EndIf
Eqv
Erase
Error
Exit
False
Fix
For
Format
FreeFile
Function
Get
Go
GoSub
GoTo
If
Imp
In
Input
InputB
Instr
InstrB
Int
Integer
Is
LBound
Len
LenB
Let
Like
Lock
Long
Loop
LSet
Mid
MidB
Mod
Name
Next
Not
Nothing
Null
Object
On
Open
Option
Optional
Or
ParamArray
Preserve
Print
Private
Property
Public
Put
ReDim
Rem
Resume
Return
RSet
Seek
Select
Set
Sgn
Shared
Single
Spc
Static
Stop
StrComp
String
Sub
Tab
Then
To
True
Type
UBound
Unlock
Until
Variant
Wend
While
Width
With
Write
Xor
 

Nahlásit jako SPAM
IP: 188.175.112.–
Kmotr
~ Anonymní uživatel
6 příspěvků
24. 5. 2018   #20
-
0
-

Ano, matematika je velmi důležitá, pokud chceš programovat ...

… jen malý příklad :    … sorry, prostě něco musíš nabiflovat, ale ostatní je už na fantazii …   

CALL … volání procedury (funkce) 

Sub Velikonoce()

MsgBox  EasterDate(2019) , 64 , "velikonoce 2019 ..."

End Sub


'Zjištění datumu velikonoc

Function EasterDate(ByVal Year As Integer) As Date 
   Dim G As Integer
   Dim C As Integer
   Dim H As Integer
   Dim i As Integer
   Dim j As Integer
   Dim L As Integer
   Dim Month As Integer
   Dim Day As Integer
   G = Year Mod 19
   C = Year \ 100
   H = ((C - (C \ 4) - ((8 * C + 13) \ 25) + (19 * G) + 15) Mod 30)
   i = H - ((H \ 28) * (1 - (H \ 28) * (29 \ (H + 1)) * ((21 - G) \ 11)))
   j = ((Year + (Year \ 4) + i + 2 - C + (C \ 4)) Mod 7)
   L = i - j
   Month = 3 + ((L + 40) \ 44)
   Day = L + 28 - (31 * (Month \ 4))
EasterDate = DateSerial(Year, Month, Day)
End Function
 

Nahlásit jako SPAM
IP: 188.175.112.–
Kmotr
~ Anonymní uživatel
6 příspěvků
24. 5. 2018   #21
-
0
-

Začal bych od nejjednodušších "věcí" … až po ty složitější … 

Deklarací mám kolem 7000 .. Problém ale spočívá v tom, že nyní MS dost funkcí "očesal", 

např. původní knihovna pro VB 5.0 byla kolem 1,3 MB, ale nyní je kolem ~600 kB ...

D e k l a r a c e  … vypadají asi takto … a bez nich to nejde ! 

Public Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
 

Hm …   

Nahlásit jako SPAM
IP: 188.175.112.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý