Stránka 1 z 2

Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 02 čer 2011 22:13
od Svetýlko
Ahoj, potřebovala bych poradit jak mám udělat program ve Small Basicu. Program má načíst čísla a po dokončení zadávání vypsat nejmenší a největší zadané číslo. Vůbec nevím jak na to... :huh: Předem děkuju za pomoc :wink:

Re: Small Basic

Napsal: 03 čer 2011 05:54
od domitea
OT: Změň si název tématu aby byl jasný - co je se small basicem? vyprdunul se na tebe? stojí ti přede dveřmi? + špatná sekce

Přes cyklus projdeš všechny prvky v poli s tím, že porovnáváš jejich hodnoty a ta, která je největší a nejmenší si dáš do speciálních proměnných. Zkusím vyhrabat někde svůj kód, ale škola volá :smile:

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 03 čer 2011 07:56
od Svetýlko
To Žbeky: Děkuju za opravení, jsem tu poprvé a nevěděla jsem jak to mám dát do nové sekce, tak se omlouvám...
To domitea: Moc jsem nepochopila jak to myslíš...:( Tovíš holka z gymplu, informatika nepatří mezi mé silné stránky...takže kdybys našel kód bylo by to skvělé :)

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 03 čer 2011 16:22
od faraon
Ahoj, technická otázka: odkud máš ty čísla načíst a jak program pozná že už byla všechna? Předpokládám že neznáš předem jejich počet.
Nejjednodušší možnost je načítat čísla zadávaná přímo uživatelem na klávesnici, a je určená hodnota (mimo rozsah) která řadu čísel ukončuje, třeba když jde o počet kusů něčeho, tak čísla budou pouze celá kladná, takže ukončení může být buď nula nebo jakékoliv záporné.
Návod k Small Basicu v češtině najdeš tady: http://download.microsoft.com/download/ ... 0Czech.pdf Je v něm všechno potřebné pro tvůj úkol.
Lehký návrh bych si představoval takhle nějak: (zatím v lidštině :lol:)

Kód: Vybrat vše

cislo=načti.číslo()
min=cislo
max=cislo

dokud (cislo>LIMIT)
    když (cislo<min)
        min=cislo
    koneckdyž
    když (cislo>max)
        max=cislo
    koneckdyž
    cislo=načíst()
konecdokud

zobraz ("Nejmenší: ",min)
zobraz ("Největší: ",max)


Trochu upřesni zadání (a pokus se něco stvořit) ať můžeme pokračovat.

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 03 čer 2011 16:30
od d1amond
Jak už bylo napsáno, použiješ pole pro uložení hodnot ze vstupu. Cyklus Ti je pak jen projde a zaznamená min a max.

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 03 čer 2011 16:49
od faraon
d1amond píše:Jak už bylo napsáno, použiješ pole pro uložení hodnot ze vstupu. Cyklus Ti je pak jen projde a zaznamená min a max.


Pro vytvoření pole potřebuješ předem znát počet těch čísel, navíc ti bude zbytečně zabírat spoustu místa v paměti, když potřebuješ pracovat vždy jen s jedním právě zadaným číslem. Mimochodem, co když těch čísel bude deset miliard? :lol: A v nejhorším případě bys tam měl dva cykly místo jednoho, prvním budeš čísla načítat do pole a druhým zase znova porovnávat, takže dvojnásobná doba zpracování, nepočítaje režii systému... :wink:

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 05 čer 2011 00:25
od Svetýlko
A kdybych to chtěla udělat podle toho návodu v tý prezentaci a zadala bych třeba 4 čísla a mělo by mi to najít to největší, tak jak by byla ta podmínka? Nějak mi to necvaklo :D Zkusila sem to takhle ale nějak se mu to nelíbí tomu Basicu :D Co je na tom špatně? :(

Kód: Vybrat vše

TextWindow.Write("Zadejte první číslo: ")
cislo1 = TextWindow.ReadNumber()
TextWindow.Write("Zadejte druhé číslo: ")
cislo2 = TextWindow.ReadNumber()
TextWindow.Write("Zadej třetí číslo: ")
cislo3 = TextWindow.ReadNumber()
TextWindow.Write("Zadej čtvrté číslo: ")
cislo4 = TextWindow.ReadNumber()

NajdiMax()
TextWindow.WriteLine("Větší číslo je: " + max)
Sub NajdiMax
  If (cislo1 > cislo2, cislo3, cislo4)
    Then
    max = cis1
    If (cislo2 > cislo1, cislo3, cislo4)
      Then
      max = cislo2
      If (cislo3 > cislo1, cislo2, cislo4)
        Then
        max = cislo3
     
  Else
    max = cislo4
  EndIf
EndSub

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 05 čer 2011 09:54
od faraon
Já bych řekl že se mu nelíbí ty tvoje podmínky. Ve většině programovacích jazyků můžeš porovnávat jen dvě čísla mezi sebou, například if (a > b), počítač nepochopí že mu chceš říct "když a je větší než b a c a d...". Jsou jazyky ve kterých se to dá, ale v těch se programuje úplně jinak :wink:

Nejlepší je tvořit program po malých kouscích, které budou fungovat samostatně. Tenhle se dá rozdělit na tři základní části:
1. načtení dat,
2. zpracování dat,
3. výpis výsledků.
To načtení a zpracování se dá dělat současně, ale pro přehlednost je oddělíme a budeme plýtvat pamětí i výkonem procesoru.

Takže pokud máš jistotu že ta čísla budou vždy čtyři, můžeš to načítání udělat takhle:

Kód: Vybrat vše

For i = 1 To 4
  TextWindow.Write("Zadej " + i + ". číslo: ")
  cislo[i] = TextWindow.ReadNumber()
EndFor


cislo[ ] pak nebude obyčejná proměnná, ale pole, a i udává kolikátá buňka (kolikáté zadané číslo) v pořadí se zrovna zpracovává. Je to pracovní proměnná cyklu a ukazatel do pole, i je odvozené od slova index. Pokud potřebuješ indexů víc najednou, používají se další písmena v pořadí: j, k, l...
Druhá možnost je že uživatel zná počet čísel, který zadá jako první údaj:


Kód: Vybrat vše

TextWindow.Write("Zadej počet čísel: ")
pocet = TextWindow.ReadNumber()
For i = 1 To pocet
  TextWindow.Write("Zadej " + i + ". číslo: ")
  cislo[i] = TextWindow.ReadNumber()
EndFor


Výsledek bude tentýž, pole naplněné čísly v pořadí v jakém byla zadávána.

Myslím že na takhle jednoduchou úlohu není potřeba používat podprogramy, takže Sub je trochu nadbytečný, pokud to není přímo požadováno v zadání. Druhá část programu by mohla vypadat takhle nějak, ve tvém podání s jednotlivými proměnnými:

Kód: Vybrat vše

If (cislo1 > cislo2) Then
  max = cislo1
Else
  max = cislo2
EndIf
If (cislo3 > max) Then
  max = cislo3
EndIf
If (cislo4 > max) Then
  max = cislo4
EndIf


Při použití pole to nebude tak roztahané:

Kód: Vybrat vše

max = cislo1
For i = 2 To Pocet
  If (cislo[i] > max) Then
    max = cislo[i]
  EndIf
EndFor


Na začátku se jako počáteční hodnota do max nastaví první zadané číslo, aby bylo s čím porovnávat, proto může cyklus začít až od 2. buňky pole.

Teď by mohla následovat další část programu, skoro stejná jako ta předchozí, kde budeš to pole znovu projíždět a hledat pro změnu minimální hodnotu, a nebo tuhle činnost můžeš přidat do toho předchozího cyklu jako druhou podmínku. Nezapomeň před cyklem nastavit počáteční hodnotu do proměnné min!

A na závěr se podíváme co nám vyšlo:

Kód: Vybrat vše

TextWindow.Write("Největší číslo je: " + max)


Tak si z toho vyber, pohraj si s tím, a dej vědět jak pokračuješ.

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 06 čer 2011 21:23
od Svetýlko
Tak jsem to udělala a vypadá to takhle:

Kód: Vybrat vše

TextWindow.WriteLine("Kolik čísel chceš zadat?")
pocet = TextWindow.ReadNumber()

For i = 1 To pocet
  TextWindow.Write("Zadej " + i + ". číslo: ")
  cislo[i] = TextWindow.ReadNumber()
EndFor

max = cislo[i]
For i = 2 To Pocet
  If (cislo[i] > max) Then
    max = cislo[i]
  EndIf
EndFor

TextWindow.WriteLine("Největší číslo je: " + max)


Teď mám ale problém udělat to samý ale s min. :( Když jen přepíšu max na min. tak mi to nejde :( Poraď prosím :wink:

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 06 čer 2011 22:56
od d1amond

Kód: Vybrat vše

    TextWindow.WriteLine("Kolik čísel chceš zadat?")
    pocet = TextWindow.ReadNumber()

    For i = 1 To pocet
      TextWindow.Write("Zadej " + i + ". číslo: ")
      cislo[i] = TextWindow.ReadNumber()
    EndFor

  max = cislo[1]
  min = cislo[1]
    For i = 2 To Pocet
      If (cislo[i] > max) Then
        max = cislo[i]
      EndIf
      If (cislo[i] < min) Then
        min = cislo[i]
      EndIf
    EndFor
  TextWindow.WriteLine("Největší číslo je: " + max)
  TextWindow.WriteLine("Nejmenší číslo je: " + min)

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 07 čer 2011 00:06
od faraon
Svetýlko: Ale no tak, to už jsi zapomněla jaký je rozdíl mezi > a <? Na jednoduché programování nepotřebuješ víc než znalosti matematiky ze základní školy :D

Pro srovnání se podívej jak by se to dalo udělat bez toho pole a spousty zbytečně zabrané paměti:

Kód: Vybrat vše

TextWindow.WriteLine("Kolik čísel chceš zadat?")
pocet = TextWindow.ReadNumber()

For i = 1 To pocet
  TextWindow.Write("Zadej " + i + ". číslo: ")
  cislo = TextWindow.ReadNumber()
  If i = 1 Then
    max = cislo
    min = cislo
  Else
    If (cislo > max) Then
      max = cislo
    EndIf
    If (cislo < min) Then
      min = cislo
    EndIf
  EndIf
EndFor

TextWindow.WriteLine("Největší číslo je: " + max)
TextWindow.WriteLine("Nejmenší číslo je: " + min)

Re: Small Basic - načtení čísel a určení MIN a MAX*

Napsal: 07 čer 2011 06:50
od Svetýlko
No jooo já sem to tak zkousela, ale nešlo mi to :D Tak děkuju za radu ;)