Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 12. 11. 2010 19:14

paces
Zelenáč
Příspěvky: 14
Reputace:   
 

Max. hodnota s jednim vyskytem

Zdravím, prosím o pomoc s následujícím zadáním příkladu v PASCALU ;-)

"Určete maximální hodnotu, která se v zadané posloupnosti vyskytuje pouze jedenkrát."

tzn.
zadám N čísel (např. 6) potom zadám
2 1 4 4 2 8
a spravným výsledekem bude 8 protože je nejvyšší a vyskytla se jen jednou 

Děkuji za pomoc s vytvořením kódu

Offline

  • (téma jako vyřešené označil(a) paces)

#2 12. 11. 2010 20:56

vojta01
Příspěvky: 63
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

Ahoj! Nejprve si setřiď pole např. quicksortem (nevím, jestli je taková funkce přímo v pascalu). Tím se ti v časo O(N*log2N) v poli dostanou vedle sebe všechny stejné hodnoty, např:

zadání: 2 1 4 4 2 8
po setřízení: 1 2 2 4 4 8

Nyní toto pole procházej z té strany, kde je nevyšší číslo (v mém případě od konce). To pole procházej dokud nenajdeš číslo, které se v poli vyskytuje pouze 1×. V programu neověřuju situaci, kdy je hledané číslo nejmenším číslem nebo žádné takové číslo neexistuje:

Code:

var N, index : integer;
      pole : array[1..10000] of integer;

begin
   readln(N);
   setřiď prvky pole vzestupně;
   index := N;
   while index >= 1 do {dokud nebylo nalezeno řešení}
   begin
      if pole[index] != pole[index-1] then {vlevo je jiná hodnota - bylo nalezeno řešení}
      begin
         writeln(pole[index]);
         index := 0;
      end
      else {více stejných hodnot - nalezni první jinou hodnotu vlevo}
      begin
         while pole[index] == pole[index] do
            index := index-1;
         index := index-1;
      end;
   end;
end.

Pokud tomu nerozumíš, ozvi se.

Offline

 

#3 12. 11. 2010 21:18

paces
Zelenáč
Příspěvky: 14
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

↑ vojta01:
Ahoj! díky moc za snahu pomoci, ale jsem asi marný případ :) cca všemu rozumím co jsi napsal, ale např. nechápu co ve zdrojáku je "!" k té řadící metodě jsem našel tento

kód

Code:

Procedure Rozdel(var i,j:integer;L,R:integer);
var X:integer;
begin {Rozdel}
  i:=L;j:=R;
  X:=A[(i+j)div 2]; {urcim delici hodnotu}
  repeat
    while A[i] < x do i:=i+1;
    while A[j] > x do j:=j-1;
    if i < = j then begin
                      A[i]:=:A[j];
                      i:=i+1;
                      j:=j-1;
                    end;
  until i>j;
end; {Rozdel}


Procedure QuickSort(L,R:integer);
var i,j:integer;
begin {QuickSort}
  Rozdel(i,j,L,R);
  if L < j then QuickSort(L,j);  {levy interval}
  if i < R then QuickSort(i,R);  {pravy interval}
end; {QuickSort}


Procedure NonRecQuickSort(L,R:integer);
var i,j:integer;
begin {NonRecQuickSort}
  SInit(S);
  Push(S,L);
  Push(S,R);
  while not Sempty(S) do begin
    Top(S,R);Pop(S); 
    Top(S,L); Pop(S);
    while L (j-L)then begin
        Push(S,i);
        Push(S,R);
        R:=j;
      end else begin
        Push(S,L);
        Push(S,j);
        L:=i;
      end; {else}
    end; {while}
  end; {while}
end; {NonRecQuickSort}

jak toho mám využít, ale netuším TAKŽE POKUD BY JSI MI S TÍM JEŠTĚ POMOHL, BUDU TI VELMI VELMI VDĚČEN :)
P.S. Jdu to zkusit vecpat, ale jak říkám, již 3dny s tím válčím a nic :(

Offline

 

#4 12. 11. 2010 23:04

xxsawer
Příspěvky: 196
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

↑ paces:

Na quick sort se vybodni. Jde jenom o to seradit to pole (idealne sestupne) a pak ho od zacatku prochazet. V momente kdy narazis na cislo, ktery se lisi od nasledujiciho cisla v poli mas to co si chtel a koncis.
Myslim si, ze casova slozitost razeni je asi to posledni co te zajima :) Serad to normalne bubble sortem...

Jinak jak si se ptal co znamena != tak to je "nerovna se" z jinyho jazyka (treba java). Ma tam byt <>

Offline

 

#5 13. 11. 2010 11:17

vojta01
Příspěvky: 63
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

Jo, použil jsem částečně céčkovskou syntaxi, patří tam:

if pole[index] <> pole[index-1]
while pole[index] = pole[index] do

K tomu quicksortu: Myšlenka tohoto algoritmu spočívá v setřízení zadaného pole. Je jedno, jaký třídící algoritmus použiješ, bubble sort je jednoduchý na naprogramování, ale zase je výrazně pomalejší než qicksort, mergesort a heapsort.
Já jsem navrhl quicksort také proto, že v C/C++ je k dispozici funkce qsort().

Offline

 

#6 13. 11. 2010 13:10

paces
Zelenáč
Příspěvky: 14
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

↑ vojta01:
Mám něco jako /následující/ ale háda se mi vše možné PROSÍM O RADU :)

Code:

var index : integer;
const N = 10000;
type Pole = array[1..10000] of integer;
var i:integer;
    A:Pole;

{procedure BublinkoveTrideni}
procedure BublinkoveTrideni(var A: Pole);
var i,j: integer;               {indexy prvku}
    X: integer;                 {pro vymenu prvku}
begin
  for i:=2 to N do
    for j:=N downto i do
      if A[j-1] > A[j] then     {vymenit sousedni prvky}
        begin X:=A[j-1]; A[j-1]:=A[j]; A[j]:=X  end
end;  {procedure BublinkoveTrideni}

begin
readln(N);
begin
writeln('Zadej tridena cisla:');
for i:=1 to N do read(A[i]);
BublinkoveTrideni(A);
writeln('Setrideno:');
for i:=1 to N do write(A[i]:5)
end;

   index := N;
   while index >= 1 do {dokud nebylo nalezeno řešení}
   begin
      if A[index] <> A[index-1] then {vlevo je jiná hodnota - bylo nalezeno řešení}
      begin
         writeln(A[index]);
         index := 0;
      end
      else {více stejných hodnot - nalezni první jinou hodnotu vlevo}
      begin
         while A[index] = A[index] do
            index := index-1;
         index := index-1;
      end;
   end;
end.

Offline

 

#7 13. 11. 2010 13:24

vojta01
Příspěvky: 63
Reputace:   
 

Re: Max. hodnota s jednim vyskytem

N máš definovanou jako konstantu (const N = 10000;), proto nemůžeš do N načítat číslo (readln(N);).
Konstatnu N změň na proměnnou N typu integer.

Dále jsem udělal chybu na řádku "while A[index] = A[index] do", patří tam "while A[index] = A[index-1] do".

Testoval jsem to ve FPC a funguje to.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson