IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondrej Zadrapa:4.6.2020 11:49

Caute, mam tady malou prosbu. Mam utvorit program, který na vzdalenost 3 metru s mirne se chvejici se rukou ma odpalit micek do golfove jamky. Program funguje, to zadani bylo dost prime, jenomze to postrada trochu vice drama, poněvadž nahodna cisla umi rozlisit jenom cela cisla, cili pokud dam vzdalenost = rnd.Next(2.95,3­.05), jelikož jamka ma prumer 10 cm, tak napsat 3 je prakticky totez, u nahodneho rozptylu je situace jina, tam se občas, ne-li často meni cifry, cili dojde k minuti cile.

Zkusil jsem:

Sub Main()
        Dim rnd As New Random
        For i As Integer = 1 To 100
            Threading.Thread.Sleep(500)
            Dim vzdalenost As Single = rnd.Next(2.95F, 3.05F)
            Dim rozptyl As Single = rnd.Next(2.0F, 4.0F)
            Console.Write("{0}:{1}", vzdalenost, rozptyl & " ")
            If rozptyl = 3 And vzdalenost = 3 Then
                Console.WriteLine("Trefa")
            Else
                Console.WriteLine("Netrefa")
            End If
        Next
    End Sub

Chci docílit: Existuje nejaky způsob, abych vzdalenost i rozptyl byl schopen nahodna cisla vygenerovat tak, aby mi generoval i s desetinnou hodnotou, nebo si holt budu muset odmyslet metry a zapsat to ve stovkách, desitkach jako centimetry, potažmo decimetry?

 
Odpovědět
4.6.2020 11:49
Avatar
Jan Stodůlka
Tvůrce
Avatar
Jan Stodůlka:4.6.2020 11:59

Next vrací jen int, zkus toto:

Dim vzdalenost As Single = rnd.Next(295, 305) / 100.0;
Editováno 4.6.2020 11:59
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.6.2020 11:59
Nechodím do hospody, protože doma programuji.
Avatar
Milan Bydžovský:4.6.2020 12:11

nejsem programator ale napada me rand.NextDouble()*2 + 2. Pokud je to kravina, prosim o opravu, samozrejme cisla je pak mozne zadat jakakoli

Editováno 4.6.2020 12:12
 
Nahoru Odpovědět
4.6.2020 12:11
Avatar
Odpovídá na Jan Stodůlka
Ondrej Zadrapa:4.6.2020 12:52

Jakym zpusobem napisu program, který ve vystupu vytiskne vzestupne počet hvezd od 1 do 10 a pak sestupne zpet k 1? At delam, co delam, furt mi z toho vychazi na kazdem radku 10 hvezd.

Sub Main()
        For a As Integer = 1 To 20
            Console.Write("*", a + 1)
            For b As Integer = 1 To 10
                Console.Write("*", b + 1)
            Next
            Console.WriteLine()
        Next
        Console.ReadKey()
    End Sub

Jak se to da udelat? Protože ja nemam absolutne zadny napad, jak na to, ani nevim, kde bych něco takového mohl hledat.

 
Nahoru Odpovědět
4.6.2020 12:52
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:4.6.2020 13:12

Doplň řídící příkazy if-else do for cyklu. Výraz v if otestuješ na hodnotu menší nebo rovno 10. Uvnitř if pak máš for cyklus v rozsahu 1 až aktuální hodnota řídící proměnné, v else pak máš for cyklus v rozsahu 20 - aktuální hodnota řídící proměnné.

Nahoru Odpovědět
4.6.2020 13:12
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 13:47
Sub Main()
    For i As Integer = 1 To 19
        For j As Integer = 1 To If(i < 10, i, 20 - i)
            Console.Write("*")
        Next
        Console.WriteLine()
    Next
    Console.ReadKey()
End Sub

výstup:

*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*
 
Nahoru Odpovědět
4.6.2020 13:47
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 13:50

Fu, tak to by me ani ve snu nenapadlo, no nic, pravdepodobne to bude něco, co bych si intuitivne nevycucal z prstu, ani kdybych se posral, tak snad to najdu ve skriptech. Diky

 
Nahoru Odpovědět
4.6.2020 13:50
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 14:02

Není třeba v tom hledat velkou vědu, já ten kód jen hodně zeštíhlil použitím ternárního operátoru. Jinak se mu samozřejmě můžeš vyhnout a to tak, že si zavedeš pomocnou proměnnou např. pocetHvezd a pro každý prochod vnějším cyklem ten počet hvězd dopočítáš, tedy nějak takto:

Sub Main()
    For i As Integer = 1 To 19
        Dim pocetHvezd As Integer
        If (i < 10) Then
            pocetHvezd = i
        Else
            pocetHvezd = 20 - i
        End If

        For j As Integer = 1 To pocetHvezd
            Console.Write("*")
        Next

        Console.WriteLine()
    Next

    Console.ReadKey()
End Sub
Editováno 4.6.2020 14:03
 
Nahoru Odpovědět
4.6.2020 14:02
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 14:07

Aha a jak teda potom udelam, aby mi v kazdem radku geometricky vzrustal počet hvezd od poctu 2 az do Te stredni hodnoty a pak to zase sestoupilo ke dvojce?

 
Nahoru Odpovědět
4.6.2020 14:07
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:4.6.2020 14:19

Je to pořád stejné.

for (int i = 1; i < 20; i++) {
                if (i <= 10) {
                        for (int j = 1; j <= i; j++) putchar('*');
                        putchar('\n');
                }
                else {
                        for (int j = 1; j <= 20 - i; j++) putchar('*');
                        putchar('\n');
                }
}
Nahoru Odpovědět
4.6.2020 14:19
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 14:45

Nevím, jestli ti rozumím, naznač jak by měl vypadat výstup.

 
Nahoru Odpovědět
4.6.2020 14:45
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:4.6.2020 14:48
Sub Main()
        For i As Integer = 1 To 19
            If i < 10 Then
                For j As Integer = 1 To i * i
                    Console.Write("*")
                Next
            Else
                For j As Integer = 1 To 20 - i Step +1
                    Console.Write("*")
                Next
            End If
            Console.WriteLine()
        Next
        Console.ReadKey()
    End Sub

Nebudu lhat, ze vim, co delam, ale az na první radek to do pulky dela, co by mělo, ale od poloviny se to prepne zpet do rezimu 10,9...hvezd. Tak se mi z toho vyrodi něco jako mecoun z hvezd.

 
Nahoru Odpovědět
4.6.2020 14:48
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 14:53
**
****
********
****************
********************************
****************
********
****
**

třeba

On samotny program funguje, ale mam tady pravdepodobne procvicit 3 varianty, tu, s kterou jste mi uz tady zatím pichli, další, ze na prvním a druhem radku bude *, na tretim a ctvrtem **, atd., na to uz jsem prisel sam a ted zapasim s variantou, kde ma byt na prvním radku **, na druhem ****, tretim ********, atd.

Editováno 4.6.2020 14:54
 
Nahoru Odpovědět
4.6.2020 14:53
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:4.6.2020 15:00

Na tom není nic složitého. Počet hvězd na konkrétním řádku je dáno vztahem 2 na N, kde N je číslo řádku.

Nahoru Odpovědět
4.6.2020 15:00
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 15:04

V tom prvním mém příspěvku v této diskusi, místo:

For j As Integer = 1 To If(i < 10, i, 20 - i)

zadej:

For j As Integer = 1 To 2 ^ If(i < 10, i, 20 - i)
 
Nahoru Odpovědět
4.6.2020 15:04
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 15:07

No, tak ted to ma mecoun i s vlnobitím. :D Ale i tak dik, aspoň 2 reseni ze 3, na to treti třeba prijdu jindy. :D

 
Nahoru Odpovědět
4.6.2020 15:07
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 15:34

Tak jsi to buďto blbě popsal, anebo se ti, pro ten velký počet hvězdiček na řádku, již ty řádky automaticky zalamují. Však si taky uvědom, že 2 ^ 10 = 1024 hvězd na jednom řádku, to není úplně málo. ;-)

 
Nahoru Odpovědět
4.6.2020 15:34
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:4.6.2020 15:58

Zde máš řešení. Smyslem stále zůstává mít řádky rozděleny na polovinu. Pro každý řádek si pak dopočítat počet hvězd které se mají zobrazit.

int stars, rows = 11;
for (int i = 1; i <= rows; i++) {
        if (i <= rows / 2) stars = (int) pow(2, i);
        else stars = (int) pow(2, rows - i + 1);
        for (int j = 1; j <= stars; j++) putchar('*');
        putchar('\n');
}
Nahoru Odpovědět
4.6.2020 15:58
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 16:17

Ty, ale já jsem úplně v pohodě, jsem rád, že aspoň k něčemu jsem se dopracoval, učím se teprve 2 měsíce programovat, pro mě je to pokrok, to se časem vykrystalizuje.

 
Nahoru Odpovědět
4.6.2020 16:17
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na DarkCoder
Alesh:4.6.2020 16:30

On to asi potřebuje ve VB, jak jsem tak pochopil. ;-)

 
Nahoru Odpovědět
4.6.2020 16:30
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Ondrej Zadrapa
Alesh:4.6.2020 16:32

Dyť nikdo neříká, že nejsi. :-) Nicméně platí to, co jsem napsal, že se ti to asi zalamuje, tak to bude blbě zadaný, ať už tebou nebo tvým zadavatelem. Prostě je to mrtě hvězdiček.

 
Nahoru Odpovědět
4.6.2020 16:32
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alesh
DarkCoder:4.6.2020 16:49

On už si zvykl a ví že já mu vše podávám v C. Tím získá povědomí o tom jak to funguje, aniž bych mu to dodal na zlatém podnose. :-)

Nahoru Odpovědět
4.6.2020 16:49
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:4.6.2020 19:08

Uprimne, me ty programy pripadaji všechny uplne stejne, akorát se lisi nektere nazvy, semtam syntax, ale algoritmus zustava u tech vyssich programu, alespoň ted v tech začátcích v mych ocich uplne stejny. Takze jestli to dostanu v C, nebo v C#, nebo ve VB, mozna dokonce i v Jave, to vyjde na stejno.

 
Nahoru Odpovědět
4.6.2020 19:08
Avatar
Odpovídá na Alesh
Ondrej Zadrapa:4.6.2020 19:09

Ale kod funguje, uz to neni mecoun, ale raketa. :D

 
Nahoru Odpovědět
4.6.2020 19:09
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:4.6.2020 19:39

Však také spousta těchto jednoduchých programů lze řešit pomocí příkazů, které jsou pro všechny tyto jazyky společné. Pro všechny zůstává stejné dojít úspěšně k výsledku. Až se naučíš víc, zjistíš, jak který nástroj se na co hodí a jaká jsou jeho omezení. Každopádně to že Ti to připadá stejné, je dobře a může se Ti to v budoucnu hodit, až se budeš chtít orientovat ve zdrojových kódech psaných v jiných jazycích.

Nahoru Odpovědět
4.6.2020 19:39
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:5.6.2020 15:40

Cau, mohl bys mi opet nejak rozumne poradit, jak mam postupovat? Poněvadž si vůbec nevim rady. Mam vygenerovat 100 nahodnych cisel 1-5 a zjistit, zda jsou nekdy vedle sebe dve stejna, když ano, tak která a jake je jejich poradove číslo.

Sub Main()
        Dim rnd As New Random, poradi As Byte
        For i As Integer = 1 To 100
            Dim nahodne As Integer = rnd.Next(1, 5)
            If nahodne = nahodne Then
                poradi = i
            End If
        Next
    End Sub
 
Nahoru Odpovědět
5.6.2020 15:40
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:5.6.2020 15:51

To je přeci jednoduché, nehledej v tom nic složitého. Pomocí for cyklu naplníš 100 prvkové pole vygenerovanými náhodnými čísly a poté provedeš opět pomocí for v rozsahu první až předposlední na rovnost hodnoty na daném indexu a na následujícím indexu. Pokud jsou si rovny, vypíšeš hodnotu na jednom z nich a vypíšeš oba indexy. To je celé...

Nahoru Odpovědět
5.6.2020 15:51
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:5.6.2020 16:01
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 100

int main(void) {
        int nums[SIZE];

        srand((unsigned int)(time(NULL)));

        for (int i = 0; i < SIZE; i++) nums[i] = (rand() % 5) + 1;

        for (int i = 0; i < (SIZE - 1); i++) {
                if (nums[i] == nums[i + 1]) {
                        printf("%d [%d][%d]\n", nums[i], i, i+1);
                }
        }

        return 0;
}
Nahoru Odpovědět
5.6.2020 16:01
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:5.6.2020 16:43

Supr, diky, pomohlo. :D

 
Nahoru Odpovědět
5.6.2020 16:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 29 zpráv z 29.