Dwa programy i dwa problemy z testami.

Odpowiedz Nowy wątek
2018-11-23 14:49
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'
edytowany 1x, ostatnio: furious programming, 2018-11-23 18:38

Pozostało 580 znaków

2018-11-23 14:57
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ę.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2018-11-23 15:05

Pozostało 580 znaków

2018-11-23 15:01
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.

edytowany 3x, ostatnio: Spine, 2018-11-23 15:05

Pozostało 580 znaków

2018-11-23 15:35
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.

Pozostało 580 znaków

2018-11-23 15:43
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2018-11-23 15:44

Pozostało 580 znaków

2018-11-23 18:40
0

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


edytowany 2x, ostatnio: furious programming, 2018-11-23 18:41

Pozostało 580 znaków

2018-11-24 07:54

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.

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2018-11-24 07:55
Dzięki wielkie, nie zaglądałem bo udało mi się napisać te programy, tak że przechodzą na 100. Trochę inaczej to zrobiłem ale działają oba. - rav3 2018-11-26 09:58
To wrzuć proszę swoje rozwiązania - może komuś w przyszłości się przydadzą :) Plus jestem ciekawy, co wymyśliłeś w zakresie pierwszego programu. - cerrato 2018-11-26 10:09

Pozostało 580 znaków

2018-11-24 08:03
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2018-11-26 10:11

Pozostało 580 znaków

2018-11-26 10:17
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.
edytowany 1x, ostatnio: furious programming, 2018-11-26 12:48
Dzięki za wrzucenie :) - cerrato 2018-11-26 10:21

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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