pseudokod
ola: Jak napiscać psedokod dla tego problemu, wiem że to znany problem i już sprawdziałam wszystkie
linki.
Chodzi oto aby kod zwracał jedna liczbę.
jeśli rszta z dzielenia c przez 2 wynosi 0
to c=c/2
w przeciwnym przypadku:
c=3*c+1
I tak na starcie mamy np dwie liczby c=5 oraz i=2 (oznacza numer i−tego wyrazu)
a zwrócić ma wartość 8
bo
i=1 c=3*5+1=16
i=2 c=16/2=8
14 maj 09:14
yht:
zastosować instrukcję wyboru if
wprowadź liczbę c
jeśli liczba c jest parzysta
to podziel liczbę c przez 2 i wyświetl wynik na ekranie
w przeciwnym przypadku
pomnóż liczbę c przez 3 i dodaj 1, następnie otrzymany wynik podziel przez 2 i wyświetl go na
ekranie
Przykładowa implementacja kodu w Pascalu:
program liczby;
var c,wynik:integer;
begin
clrscr;
writeln('podaj liczbe c');
readln(c);
if c mod 2 = 0 then
wynik:=c/2
else
begin
wynik:=3*c+1;
wynik:=wynik/2;
end;
writeln('zwrocona wartosc wynosi', wynik);
readln;
end.
(nie wiem czy działa, nie mam kompilatora)
w razie pytań − pisz
14 maj 09:34
ola: No tak ale mi czodzi o to aby była pokazywana jedna liczba konkretnie i−ta wartość
14 maj 09:41
ola: mamy dwie liczby na starcie c=5 oraz i=2 (oznacza numer i−tego wyrazu) czyli zwaraca 8
14 maj 09:42
yht:
jakie wartości może przyjmować i ?
i = 1 gdy c jest parzyste
i = 2 gdy c jest nieparzyste ?
dobrze to rozumiem ?
14 maj 09:48
ola: np dla c=5 , i −oznacza kolejne numery ciagu
dla c=5 mamy ciąg 16 8 4 2 1 ,czyli dla
dla
i=1 mamy 16
i=2 mamy 8
itdp
czyli dal pary (5,2) mamy orzymać wynik 8
dla mary (5,4) mamy otrzymac 2
14 maj 09:57
ola: nie zasatanawiamy się o zakresie i oraz c
14 maj 09:57
ola: chodzi o taki prosty sposób bez tablicc tylko zmienne, pętle
14 maj 10:00
yht:
psudokod:
podaj liczbę całkowitą c
podaj liczbę całkowitą i
jeśli i>c, wyświetl napis (błąd)
w przeciwnym przypadku
podnieś liczbę 2 do potęgi (c−1)
podnieś liczbę 2 do potęgi (i−1)
podziel liczbę 2
c−1 przez 2
i−1
otrzymany wynik wyświetl na ekranie
14 maj 10:06
yht:
*pseudokod
14 maj 10:07
yht:
program liczby;
var i,c,a,wyniki,wynikc:integer;
begin
clrscr;
writeln('podaj c');
readln(c);
writeln('podaj i');
readln(i);
if i>c then writeln('Blad')
else
begin
wyniki:=1;
wynikc:=1;
for a:=1 to c−1 do
wynikc:=2*wynikc;
for a:=1 to i−1 do
wyniki:=2*wyniki;
end;
writeln('zwrocona liczba to ',wynikc/wyniki);
readln;
end.
14 maj 10:16
ola: dlaczego zakładasz że i>c, chyba sie sie nie dogadaujemy
dla c=6 mamy ciąg 3 10 5 16 8 4 2 1
i= 1 2 3 4 5 6 7 8
wiec np dla (c=6 i =2) mamy 10
14 maj 10:28
ola: nie znam się na pascalu ewntualnie c lub c++
14 maj 10:31
yht:
c oznacza liczbę wyrazów ciągu ?
wyrazy ciągu sobie sami wymyślamy ?
14 maj 10:32
ola: c= to jest liczba wymyśla
Nie wiemy z ilu elementów składa, choć zawsze wiemy że ostatni
wyraz zawsze bedzie 1
14 maj 10:36
yht:
czemu dla c=6 mamy ciąg 3 10 5 16 8 4 2 1
od czego zależy liczba wyrazów ciągu ?
To kluczowe pytanie, bez tego nie da rady zrobić (choćby) pseudokodu
14 maj 10:40
yht:
a dobraa, już wiem
14 maj 10:41
ola: c=6
mamy
c=6/2 więc c=3
wic teraz c=3 czyli c=3*3+1=10
czyli c=10/2 wiec c=5
c=5 czyli c=3*5+1=16
c=16 wiec c=8/2=4
c=4 wiec c=4/2=2
c=2 wiec c=2/2=1
14 maj 10:43
yht:
podaj c
wyzeruj i=0
wykonuj poniższą instrukcję
jeśli c podzielne przez 2, przypisz liczbie i zwiększonej o 1 wynik działania P:=c/2
w przeciwnym przypadku przypisz liczbie i zwiększonej o 1 wynik działania P:=3*c+1
dopóki c nie osiągnie wartości 1
podaj i
dla podanego i wyświetl wynik działania P
14 maj 10:59
ola: Dzieki a mogłbyś to napisać w pascalu
bo nie wiem jak zrozumiec to zdanie
"przypisz liczbie i o 1 wynik działania"
14 maj 11:06
yht:
musi być koniecznie bez tablic ?
14 maj 11:16
ola: tak bez tablic niestety
14 maj 11:24
yht:
wpadłem jeszcze na inny pomysł:
pseudokod:
podaj c
podaj i końcowe (w programie nazwałem je ik)
wyzeruj i=0
powtarzaj instrukcję
jeśli c podzielne przez 2
zwiększaj i o 1
wykonaj działanie c/2
w przeciwnym przypadku
zwiększaj i o 1
wykonaj działanie 3*c+1
aż do momentu gdy i osiągnie wartość równą podanemu wcześniej ik
zwróć na ekranie wartość c
program liczby;
uses crt;
var c,i,ik:integer;
begin
clrscr;
writeln('podaj c');
readln(c);
writeln('podaj i');
readln(ik);
i:=0;
repeat
if c mod 2 = 0 then
begin
i:=i+1;
c:=c/2;
end
else
begin
i:=i+1;
c:=3*c+1;
end;
until i=ik;
writeln('zwrocona wartosc wynosi ', c);
readln;
end.
Możliwe że są jakieś błędy bo nie mam dostępu do kompilatora, ale idea wg mnie iść mniej więcej
w takim kierunku
14 maj 11:35
yht:
*idea ma iść mniej więcej w takim kierunku
14 maj 11:36
ola: a nie ma jakiś kompiatorów onlin dla Pascala
14 maj 12:09
14 maj 12:36
Pytający:
A Pascala na ideone też da radę skompilować.
14 maj 12:38
14 maj 12:39
ola: yht ten kompilator wyrzuca bład w tej linijce c:=c/2;
Pytający: U ciebie wyświetla wszystkie liczy do danej a miało wyświetlać tylko tę jedną
wartość.
14 maj 12:56
yht:
zamień
var c,i,ik:integer;
na
var i,ik:integer; c:real;
14 maj 13:13
ola: teraz tu pokazuje bład: if c mod 2 = 0 then
14 maj 13:16
14 maj 13:42