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í.

Diskuze: Nalezení první rostoucí posloupnosti v poli a určení její délky

Aktivity
Avatar
Vopet
Člen
Avatar
Vopet:19.6.2018 21:36

Zdravím, mám za úkol sestavit program který načte pole zadané uživatelem a následně vypíše index na kterém začíná první rostoucí posloupnost (Ai < Ai+1) a určí její délku.

Př.:
Pole: 1, 2, 0, 1, 2, 4
První rostoucí posloupnost začíná na indexu: 1
Délka rostoucí posloupnosti: 2

Zkusil jsem: Program nyní najde a vypíše index první rostoucí posloupnosti, ale nevím jak určit její délku:

namespace One
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, index, delka;
            int[] a;
            Console.Write("Zadejte celé číslo reprezentující velikost pole: ");
            n = int.Parse(Console.ReadLine());
            a = new int[n];
            for (int i = 0; i < n; i++)
            {
                Console.Write("Zadejte {0}. prvek: ", i + 1);
                a[i] = int.Parse(Console.ReadLine());
            }
            index = 0;
            for (int i = 0; i < n - 1; i++)
            {
                if (a[i] < a[i + 1])
                {
                    index = i + 1;
                    break;
                }
            }
            if (index != 0)
            {
                Console.WriteLine("První rostoucí posloupnost začíná na indexu: " + index);
            }
            else
            {
                Console.WriteLine("Pole neobsahuje žádnou rostoucí posloupnost");
            }
            delka = 1;
            for (int i = 0; i < n - 1; i++)
            {
                if (a[i] < a[i + 1])
                {
                    delka++;
                }
            }
            if (delka==1)
            {
                Console.WriteLine("Délka první rostoucí posloupnosti je tudíž nulová");
            }
            else
            {
                Console.WriteLine("Délka rostoucí posloupnosti: " + delka);
            }
            Console.WriteLine("Pro ukončení programu stiskněte libovolnou klávesu");
            Console.ReadKey();
        }
    }
}

Chci docílit: Jak tedy zjistit délku pouze první rostoucí posloupnosti? Díky za pomoc :-) ;-)

 
Odpovědět
19.6.2018 21:36
Avatar
Odpovídá na Vopet
Neaktivní uživatel:19.6.2018 22:38

Myslím, že to nebude problém. Prostě na začátku zadej do <code>delka</code> nulu a potom při každém true <code>delka++</co­de>, při nule <code>delka += 2</code>. Ta samá situace ti taky přiřadí do <code>index</co­de>u, dosazovat pokaždé znovu je blbost. Viděl bych to asi tak

namespace One
{
        class Program
        {
                static void Main(string[] args)
                {
                        int n, index, delka = 0;
                        int[] a;
                        Console.Write("Zadejte celé číslo reprezentující velikost pole: ");
                        n = int.Parse(Console.ReadLine());
                        a = new int[n];
            for (int i = 0; i < n; i++)
            {
                Console.Write("Zadejte {0}. prvek: ", i + 1);
                a[i] = int.Parse(Console.ReadLine());
            }
            for (int i = 0; i < n - 1; i++)
            {
                if (a[i] < a[i + 1])
                {
                                        if (delka == 0)
                                        {
                                                index = i + 1;
                                                delka += 2;
                                        }
                                        else delka ++;
                                break;
                                }
            }
            if (delka != 0)
            {
                Console.WriteLine("První rostoucí posloupnost začíná na indexu: " + index + "\nJejí délka: " + delka);
            }
            else
            {
                Console.WriteLine("Pole neobsahuje žádnou rostoucí posloupnost.\nJejí délka je tudíž nulová.");
            }
            Console.WriteLine("Pro ukončení programu stiskněte libovolnou klávesu");
            Console.ReadKey();
        }
    }
}

A sorry za to formátování, já používám <code>tab</code> a ty tam máš mezery. :-)

Nahoru Odpovědět
19.6.2018 22:38
Neaktivní uživatelský účet
Avatar
Odpovídá na Vopet
Matúš Olejník:20.6.2018 10:12

Nie som C#ista :D ale snáď pôjde :)
Názvy premenných som prepísal do angličtiny a trocha poupravil aby bolo jasné na čo slúžia.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace One {
    public class Program {

       static void Main(string[] args) {
            int numbersCount, sequenceStartIndex = 0, sequenceLength = 1;
            int[] numbers;

            Console.Write("Zadejte celé číslo reprezentující velikost pole: ");
            numbersCount = int.Parse(Console.ReadLine());
            numbers = new int[numbersCount];

            for (int i = 0; i < numbersCount; i++){
                Console.Write("Zadejte {0}. prvek: ", i + 1);
                numbers[i] = int.Parse(Console.ReadLine());
            }

            for (int i = 0; i < numbersCount - 1; i++){
                if (numbers[i] < numbers[i + 1]){
                    sequenceStartIndex = i - sequenceLength + 1;
                    sequenceLength++;
                } else if (sequenceLength != 1) {
                    break;
                }
            }

            if (sequenceLength != 1) {
                Console.WriteLine("První rostoucí posloupnost začíná na indexu: "
                                    + (sequenceStartIndex + 1)
                                    + "\n"
                                    + "Její délka: "
                                    + sequenceLength);
            } else {
                Console.WriteLine("Pole neobsahuje žádnou rostoucí posloupnost.");
            }

            Console.WriteLine("Pro ukončení programu stiskněte libovolnou klávesu");
            Console.ReadKey();
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.6.2018 10:12
/* I am not sure why this works but it fixes the problem */
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.6.2018 12:05

Podle mne to tam mas. Jenom ukonceni toho cyklu mas spatne. Pseudo kod

// najit posloupnost
i = 0
cyklus(i<n; i++)
  if (a[i]<a[i+1])
    zacatek = i; break;

U delky muzes zacinat 'i', i=0 neni treba psat, mozna a nebo rovnou i=zacatek.

delka = 1
cyklus(i<n; i++)
  if (a[i]<a[i+1])
    delka++
  else
    break; // zastavit cyklus, kdyz zacne posloupnost zas klesat
Editováno 20.6.2018 12:07
 
Nahoru Odpovědět
20.6.2018 12:05
Avatar
Odpovídá na Peter Mlich
Neaktivní uživatel:20.6.2018 21:03

My dva (tedy ne Matúš Olejník a Vopet) jsme udělali zhruba stejnou chybu, konkrétně u toho <code>break;</co­de>. Já bych cyklus zarazil hned u začátku – to mám z toho, že kopíruju kód a pořádně si ho nečtu. Ty bys pohořel u situace, kde posloupnost nezačíná hned na indexu 0. To je tak smutné, když radíme špatně :-).

Nahoru Odpovědět
20.6.2018 21:03
Neaktivní uživatelský účet
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Neaktivní uživatel
Peter Mlich:21.6.2018 8:07

Netvrdim, ze jsem promyslel vsechny pripady. Tak, ale neni nic jednodussiho, nez to testnout. Nova html stranka, kod

<script>
function hledej(a)
{
var i, n, start, len;
n = a.length - 1;
// najit posloupnost
start = 0;
i = 0
while(i<n)
        {
        if (a[i]<a[i+1])
                {
                start = i;
                break;
                }
        i++;
        }

len = 1;
// 'i' je z predchoziho cyklu
while(i<n)
        {
        if (a[i]<a[i+1])
                {len++;}
        else    {break;} // zastavit cyklus, kdyz zacne posloupnost zas klesat
        i++;
        }
document.write('zacatek = ' + start + '<br>' + 'delka = ' + len + '<br>');
}

hledej([1, 2, 0, 1, 2, 4]);
hledej([3, 2, 1, 2, 0, 1, 2, 4]);
</script>

Vypise to

zacatek = 0
delka = 2
zacatek = 2
delka = 2
 
Nahoru Odpovědět
21.6.2018 8:07
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 6 zpráv z 6.