Dwa programy i dwa problemy z testami.

0

Hej, mam rozwiązać 2 zadania ze szkopuła, jedno to zadanie minimalna i kod, który mam przechodzi na 80/100 nie mam pojęcia dlaczego. Może ktoś będzie wiedział.

program minimalna;

var
  a, b, c: LongInt;

begin
  readln(a);
  readln(b);
  readln(c);

   if (b > a) and (c > a) then
      writeln(a);
   if (a > b) and (c > b) then
      writeln(b);
   if(a > c) and (b > c) then
       writeln(c);

   readln();

end.

Przechodzą wszystkie testy, oprócz dwóch i następujące komunikaty:

1 wczytano EOF, a oczekiwano '-3'
7 wczytano EOF, a oczekiwano '0'

Drugi program to równanie liniowe , w którym uzyskałem max 70/100, wydaje mi się, że uwzględniłem wszystkie warunki spełnienia równanie liniowego

program RownanieLiniowe;

var
  a, b: LongInt;

begin
  readln(a, b);

  if (b = 0) and (a = 0) then
    writeln('NIESKONCZONOSC')
  else if (b = 0) and (a <> 0) then
    writeln(1)
  else if (a = 0) or (b <> 0) then
    writeln(0)
  else if(b mod a = 0) then
    writeln(1);

  readln;

end.

Błędy:

4 wiersz 1: wczytano '0', a oczekiwano '1'
5 wiersz 1: wczytano '0', a oczekiwano '1'
7 wiersz 1: wczytano '0', a oczekiwano '1'
0

A czy możesz podać, dla jakich konkretnych danych wejściowych pojawiają się opisane problemy?

Podejrzewam, że może to mieć miejsce w sytuacji, w której liczby są równe. Zwróć uwagę, że przy ifach masz porównanie, które sprawdza czy liczby są większe/mniejsze. Ale jest możliwość, że przy pewnych danych wejściowych, żaden z trzech testów nie przejdzie pozytywnie. Dlatego program nie zwraca oczekiwanej wartości. Trzeciego if powinieneś zamienić w else i w ten sposób, jeśli żadne z dwóch poprzednich sprawdzeń nie będzie pozytywne, to wykona trzecią akcję.

0

Bo niepotrzebnie wczytujesz zawsze o jedną linijkę za dużo?
Wywal te readln na końcu każdego programu.
Automat sprawdzający zadania podaje dane do programu jednym ciągiem.

0
cerrato napisał(a):

A czy możesz podać, dla jakich konkretnych danych wejściowych pojawiają się opisane problemy?

Podejrzewam, że może to mieć miejsce w sytuacji, w której liczby są równe. Zwróć uwagę, że przy ifach masz porównanie, które sprawdza czy liczby są większe/mniejsze. Ale jest możliwość, że przy pewnych danych wejściowych, żaden z trzech testów nie przejdzie pozytywnie. Dlatego program nie zwraca oczekiwanej wartości. Trzeciego if powinieneś zamienić w else i w ten sposób, jeśli żadne z dwóch poprzednich sprawdzeń nie będzie pozytywne, to wykona trzecią akcję.

Właśnie w tym jest problem, że ta sprawdzarka nie pokazuje mi dla jakich danych to sprawdziła, pokazuje jedynie komunikaty, jakie wstawiłem i że test nie przeszedł. Sprawdziłem z elsem na końcu zamiast ifa i też sypie błędami.

Spine napisał(a):

Bo niepotrzebnie wczytujesz zawsze o jedną linijkę za dużo?
Wywal te readln na końcu każdego programu.
Automat sprawdzający zadania podaje dane do programu jednym ciągiem.

Niestety nie tutaj leży problem, z readln na końcu, czy bez zawsze otrzymuje ten sam wynik i te same testy nie przeszły.

0

Sprawdziłem z elsem na końcu zamiast ifa

wklej proszę to, co napisałeś oraz zrób testy na sytuację, w której dowolne dwie wartości oraz wszystkie 3 są równe.

0

@rav3: jeśli dajesz jakiś kod automatowi do wykonania, to nie używaj końcowego ReadLn oczekującego na Enter.

3

Dobra Panie @rav3, nie wiem czy jesteś, czy tu jeszcze zajrzysz albo czy coś napiszesz.
Ale tak na wszelki wypadek podam Ci działający kod (przetestowany - dostaje 10/10) do pierwszego zadania. Jeśli oczekujesz pomocy z drugim, to będziesz musiał się trochę bardziej zaangażować :P

program minimalna;

var
  a, b, c: LongInt;

begin
  readln(a);
  readln(b);
  readln(c);

if (a>b) then a:=b;
if (a>c) then a:=c;
writeln(a);

end.
1
@Spine napisał(a)](https://4programmers.net/Forum/1542130):

Bo niepotrzebnie wczytujesz zawsze o jedną linijkę za dużo?
Wywal te readln na końcu każdego programu.

Niestety, ale ten readln nie ma tutaj żadnego znaczenia - sprawdziłem i wynik jest taki sam z nim oraz bez niego.

EOF'y, które są zwracane, związane są z pustymi odpowiedziami w sytuacji, w której dane wejściowe są tak dopasowane, że poprawnie nie sprawdza się żaden z warunków podanych przez OP. Zauważ, że masz tam 3xIF, ale są one ze sobą niepowiązane. Wypisanie wartości jest po każdym IF, więc jest możliwość, że wszystkie 3 sprawdzenia są FALSE, w związku z czym program niczego nie zwróci.

Poza tym, jakby readln powodował problem, to wszystkie testy by były oblane, a nie tylko 2/10.

2

To moje rozwiązania, dopisałem w zadaniu minimalna dopisałem ify sprawdzające równość dwóch liczb i uwzględniające przypadek gdy 3 liczby są równe. Rozwiązanie @cerrato jest bardziej przejrzyste i mniej zajmuje. Natomiast do zadania równanie liniowe wystarczyło dopisać na końcu else zwracającego 0. Tutaj moje odpowiedzi, które przechodzą na 100. Dzięki za pomoc w rozwiązaniu tego.

program RownanieLiniowe;

var
  a, b: LongInt;

begin
  readln(a, b);

  if (b = 0) and (a = 0) then
    writeln('NIESKONCZONOSC')
  else if (b = 0) and (a <> 0) then
    writeln(1)
  else if (a = 0) and (b <> 0) then
    writeln(0)
  else if(b mod a = 0) then
    writeln(1)
  else
      writeln(0);

  readln;

end.
program minimalna;

var
  a, b, c: longint;

begin
  readln(a);
  readln(b);
  readln(c);

  if (b > a) and (c > a) then
    writeln(a);
  if (a > b) and (c > b) then
    writeln(b);
  if (a > c) and (b > c) then
    writeln(c);

  if (a = c) then
    if (b > a) then
      writeln(c);
  if (b = c) then
    if (a > c) then
      writeln(b);
  if (b = a) then
    if (c > b) then
      writeln(a);

  if (a = b) and (b = c) then
    writeln(a);

  readln();

end.

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