Ciąg liczbowy.

0

Witam,
Mam za zadanie napisać prosty program który wypisze ciąg sum liczb. Program ma być bez tablic, z użyciem pętli for, while do, do while. Napisałem coś takiego:

 program ciagi;
var n, i, suma, x: integer;
begin
i:= 1;
suma:=0;
read(n);
while i <= n do
begin
read(x);
i:=i+1;
suma:=suma+x;
writeln(suma);
end;
readln;
end. 

Moje pytanie brzmi, czy da sie napisać to w taki sposób by wyświetlił mi wszystkie wyniki z pętli po zakończeniu sie pętli w jednej linii ? czyli zamiast:
1 podaje mu
1 wypisuje
3 podaje mu
4 wypisuje
2 podaje mu
6 wypisuje
6 podaje mu
12 wypisuje
to wypisał mi: 1 4 6 12(same wyniki) ? Che mu najpierw podać liczbe n, potem tyle liczb ile liczba n, żeby wykonał pętle tyle razy ile n ale wynik mi podał na sam koniec wszystkie, wypisane w lini a nie po zakonczeniu każdej pętli osobno wynik... Głowie sie nad tym juz 3 dni wiec pomyślałem że skorzystam z Waszej pomocy. Pozdrawiam

0

Można, ale do tego musisz magazynować dane wejściowe lub wyniki. Czyli tablica lub strumień lub string;

0

A jakaś podpowiedź co do tablicy ?
jak ją zadeklarować i w jakim miejscu ? byłbym wdzięczny :)

0

Jak wsztstkie zmienne w Pascalu po słowie kluczowym var. Więcej masz na google i w kursach, a temat przenoszę do Newbie, bo dotyczy banalnych podstaw i na przyszłośc umieszczaj nazwę języka w tagu, a nie temacie wątku. Staraj się też umieszczać kod w konretnych znacznikach dla języka, a nie ogólnych i formatuj go po ludzku.

0

Wydaje mi się że w temacie napisałeś: - "Program ma być bez tablic ..."

0

Wiem, że nie powinienem podawać gotowców, ale zachodziłem w głowę z czym to niektórzy mają problemy. Chcąć pomóc, a nie mając ochoty analizować dlaczego pytającemu coś tam nie działa w jego kodzie. Dlaczego? Ponieważ kod miał formatowanie, które śmiało mozna nazwać "z d_u_p_y". W zasadzie to żadnego. Dopiero z niegramatycznego tłumaczenia co chce osiągnąc pytający domyśliłem się jak to prawidłowo można zakodować. Także napisałem to co poniżej. Sprawa jest - jak widać i jak się mogłem domyśleć - banalna do potęgi banalnej czyli bardzo dużej ;) Przeanalizuj sobie ten kod i wszystko będziesz wiedział. Następnym razem jednak zanim nasmarujesz na forum, usiądź i najpierw zakoduj coś samodzielnie, a przede wszystkim formatuj kod, bo inaczej nie dojdziesz co i jak. Wtedy jeżeli coś nie działa to pomyśl jak zrobić aby zaczeło. Zadanie jakie sobie postawiłeś jest na tyle jak wspomniałem banalne, że nawet debuggera nie potrzeba, bo można całośc szybko przetestować po uruchomieniu.

program ciongi_nie_ciongi_uzywajcie_google_i_myslcie_dziwonlongi;

{$APPTYPE CONSOLE}

var
  S : string;
  Count, DigitValue, DigitsCount, ErrorCode, Sum : integer;
begin
  repeat
    Write('Podaj ilosc cyfr do wprowadzenia: ');
    Readln(S);
    Val(S, DigitsCount, ErrorCode);
  until (DigitsCount > 0) and (ErrorCode = 0);
  Sum := 0;
  Count := 0;
  repeat
    Count := Count + 1;
    repeat
      Write('Podaj liczbe ', Count, ' z ', DigitsCount, ': ');
      Readln(S);
      Val(S, DigitValue, ErrorCode);
    until (ErrorCode = 0);
    Sum := Sum + DigitValue;
    Writeln('Suma dotychczas wprowadzonych liczb to: ', Sum);
  until Count = DigitsCount;
  Readln;
end.
0

@olesio, zrobiłeś to samo co pytający, jedynie że po ludzku - idiotoodpornie.
Zaś pytanie było jak zrobić żeby najpierw odpytało o wszystkie liczby a potem pokazało kumulacje sumy.
Podejrzewam że to zadanie z jakieś sprawdzarki u której na wejściu na się pojawić:
4
1 3 2 6
a na wyjściu:
1 4 6 12
jeżeli to tak to nic nie potrzebujesz robić.

0

Witam ponownie, troche zrozumienia by sie przydało Wam. Sam, tak skomplikowany (jak dla mnie) kod nie rozwiąże mojego problemu. Zapisałem sie na kurs Pascala, miałem zaledwie 1 zajęcia i jak sie domyślacie nie jestem w stanie ogarnąć wyżej napisanego kodu. Chciałem tylko zrozumieć kod który ja napisałem, bo spełniał swoją funkcje lecz nie wypisywał mi liczb w odpowiedniej "kolejności". Ja z moim wykształceniem architekta też moge sypnąć wieloma obliczeniami początkującemu studentowi architektury na odpowiednim forum ale nie na tym polega pomoc. Tak, że "idiotoodpornie" mnie sie nie tyczy. Sam mam wielką wiedze w swojej dziedzinie ale jestem wyrozumiały względem początkujących, gdyż sam kiedyś taki byłem. Dziękuje za pomoc. Pozdrawiam

0

Aż trochę dziwne że osoba o takiej wiedzy i takiego dziwoląga robi:

  Count := 0;
  repeat
    Count := Count + 1;
      [...]
  until Count = DigitsCount;

To powinno być zrobione przy użyciu for

 until (ErrorCOde = 0);

Komuś tu brakuje podpowiadania składni? :)

Program ma być bez tablic

Zawsze mnie bawią tego rodzaju stwierdzenia. Tablicę można zrobić bez użycia tablicy, just skill...

Zaś pytanie było jak zrobić żeby najpierw odpytało o wszystkie liczby a potem pokazało kumulacje sumy.
Podejrzewam że to zadanie z jakieś sprawdzarki u której na wejściu na się pojawić:
4
1 3 2 6
a na wyjściu:
1 4 6 12
jeżeli to tak to nic nie potrzebujesz robić.

No właśnie, na to wychodzi. Skoro tablicy nie powinno się używać to nie możemy pamiętać danych do zakończenia wprowadzania (no chyba że lubimy emulować tablicę).

0

Chciałem tylko zrozumieć kod który ja napisałem, bo spełniał swoją funkcje lecz nie wypisywał mi liczb w odpowiedniej "kolejności"

Writeln wypisuje, readln wczytuje, operacje te są wykonywane w takiej kolejności w jakiej ich używasz w programie. tj. po każdym dodaniu wyświetla ci aktualny stan.
Program nie robi tego co chcesz, tylko to co mu napiszesz. Jeżeli byś najpierw buforował wyniki (np. w tablicy) a dopiero po wyjściu z pętli wczytującej wyświetlał wyniki to byś miał tak jak chcesz. Ale ty po readln masz writeln które powoduje wyświetlenie wyniku natychmiast.

Witam ponownie, troche zrozumienia by sie przydało Wam.

Ja z moim wykształceniem architekta też moge sypnąć wieloma obliczeniami początkującemu studentowi architektury na odpowiednim forum ale nie na tym polega pomoc.

Skąd mieliśmy wiedzieć, że jesteś aż tak początkujący? W dziale newbie wypowiadają się również osoby które wiedzą już sporo ale nie czują się na tyle dobre żeby pisać w dziale dedykowanym poważniejszym zagadnieniom. Niestety wszystkiego nie wiemy, przedstawiłeś problem tak jakby to było zadanie domowe, więc i potraktowaliśmy to tak.

0
-321oho napisał(a):

No właśnie, na to wychodzi. Skoro tablicy nie powinno się używać to nie możemy pamiętać danych do zakończenia wprowadzania (no chyba że lubimy emulować tablicę).

A kto mówi o emulacji tablicy?

program ciagi;

var n, suma, x: integer;
var wynik:string;
begin
  wynik:='';
  suma:=0;
  read(n);
  while n>0 do
  begin
    read(x);
    suma:=suma+x;
    n:=n-1;
    wynik:=wynik+Str(suma)+' ';
  end;
  writeln(wynik);
  readln;
end.
0

Dobra doczytałem teraz, że "zamiast". @Highlander: to jak się nie rozumie kodu, to się googluje co robią dane funkcje czy procedury albo go analizuje. Starałem się napisac jak najprzejrzyściej się da. I nie ma co się wymądrzać co się umie czy nie i robić focha pisząc: Tak, że "idiotoodpornie" mnie sie nie tyczy. Sam mam wielką wiedze w swojej dziedzinie ale jestem wyrozumiały względem początkujących, gdyż sam kiedyś taki byłem.. Ponieważ po pierwsze uzyskałeś pomoc. Po drugie nikt tutaj się nie wywyższa, a uważam że na pewno nie ja. Po trzecie i najważniejsze "idiotoodpornośc" nie jest obrazą kogoś i nie oznacza, że ktoś Ciebie uważa za idiotoodpornośc. Tylko idiotoodporność należy implementować w nawet najprostszym możliwym kodzie. Dlatego użyłem procedury Val żeby uniemożliwić wpradzanie innych niż oczekiwane dane, ale takie rozwiązania w programach, które uniemożliwiają celowe, a nawet i przypadkowe popełnienie błędu nazywa się właśnie "idiotoodpornością". Chodzi o to żeby programu "nie wykrzaczyć". I to że napisałem, że masz formatowanie "z d**y" może nie fachowe ale po prostu brakuje go i czyta się taki kod fatalnie. Nie musisz sam formatować kodu. Wystarczy skorzystać z JEDI Code Formatter. To chyba najprostsze. Jeżeli nie korzysta się nawet z Delphi / Lazarusa jako IDE tylko operuje na plikach z kodem source. @-321: a wiem, że można by było zrobić w pętli for, ale ja patrząc że coś tam autor mota z repeat się tym może niepotrzebnie zasugerowałem. I nie używam podpowiadania składni, klepałem na szybko w Delphi 7. Później przez swój słabszy wzrok dopiero często przeglądając source pod edytorem z FAR'a i pod ConEmu na pełnym ekranie widzę takie kwiatki jak często wielkie "A" lub "O"" po poprzedniej wielkiej literze. W działaniu to nie przeszkadza. Pisząc na szybko tego nie wyłapałem. Na pewno trzeba się wystrzegać braku formatowania. Nie uważam się za pr0 programistę, bo nie pracuje w tym zawodzie, a papier mam tylko na technika informatyka. Jednak załóżmy, że jakieś tam doświadczenia mam i wiem że jak zaczynałem sam zabawę z Delphi to miałem - co wiadomo z persspektywy czasu - idiotyczny zwyczaj, że nawet z gotowego kodu unitu dla formatki pod Delphi mozolnie usuwałem całe formatowanie i go nie stosowałem. Nie reagując na sugestie wykładowcy nawet później w czasie nauki. Ale tylko krowa nie zmienia poglądów. To było głupie i teraz mi tego wsryd. Tylko, że chyba wtedy nie było jeszcze (a może i ich nie znałem) dobrych narzędzi, formatujących kod za człowieka. Teraz po prostu nawet przy szczerej chęci pomocy, jeżeli widzę nie sformatowany kod to na niego za bardzo nie chce mi się patrzeć, bo jak wiecie to cięzkie. A rozwiązanie podał @_13th_Dragon. Tak wiem, poza brakiem lakoniczności można mi czasami zarzucić brak wczytywania się w cały post. Ale wybaczcie, uzupełnianie tagów raz za razem mimo proszenia o to ludzi jest męczące. Wiem, to jedno z zadan Moderatora, ale ileż można, a dalej większośc ma to gdzieś i nie tylko Ci co piszą pierwszy raz :/

0

A kto mówi o emulacji tablicy?

String to też tablica :) . Równie dobrze mogę użyć wbudowanego typu jakiejś tablicy i twierdzić że to nie tablica... String z punktu widzenia kompilatora taka sama tablica jak każda inna tylko indeksowana od 1. Dlatego twoje rozwiązanie nie spełnia warunków ;) .

@-321: a wiem, że można by było zrobić w pętli for, ale ja patrząc że coś tam autor mota z repeat się tym może niepotrzebnie zasugerowałem. I nie używam podpowiadania składni, klepałem na szybko w Delphi 7.

Jak mnie quotujesz, to rób nowy akapit, ułatwi czytanie twoich postów. Autor na górze zaznaczył że używając (blablabla) for. I domyślam się że Twoje wysłużone D7 które ciężko Ci zamienić ;) .

1 użytkowników online, w tym zalogowanych: 0, gości: 1