Avatar
Vopet
Člen
Avatar
Vopet:19. června 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. června 21:36
Avatar
Odpovídá na Vopet
Andy Scheuchzer:19. června 22:38

Myslím, že to nebude problém. Prostě na začátku zadej do delka nulu a potom při každém true delka++, při nule delka += 2. Ta samá situace ti taky přiřadí do indexu, 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 tab a ty tam máš mezery. :-)

Nahoru Odpovědět 19. června 22:38
Od ASM úroveň jazyků pouze klesá…
Avatar
Odpovídá na Vopet
Matúš Olejník:20. června 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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 20. června 10:12
/* I am not sure why this works but it fixes the problem */
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20. června 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. června 12:07
 
Nahoru Odpovědět 20. června 12:05
Avatar
Odpovídá na Peter Mlich
Andy Scheuchzer:20. června 21:03

My dva (tedy ne Matúš Olejník a Vopet) jsme udělali zhruba stejnou chybu, konkrétně u toho break;. 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  +1 20. června 21:03
Od ASM úroveň jazyků pouze klesá…
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Andy Scheuchzer
Peter Mlich:21. června 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  +1 21. června 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.