1 / 5
Mar 2020

Zaczynam dopiero przygodę ze spoju, mam problem z wrzuceniem 1-szego zadania.
Używam Visual Studio 2019, programuje w języku C. Robię proste zadanie.
https://pl.spoj.com/problems/TABLICA/2 .
Pytanie 1: Jak interpretować wejście? “Podana zostanie pewna nieokreślona, ale niewielka ilość liczb” oznacza, że hipotetycznie użytkownik wprowadza te liczby?
Pytanie 2: Czy plik załączony do rozwiązania powinien być z rozszerzeniem .c?
Pytanie 3: Jaki kompilator wybrać? Dowiedziałem się, że w Visual Studio 2019 używa kompilatora Microsoft C++ ( która opcja odpowiada temu?
Wszystkie moje próby dotychczas zostały odrzucone (Błędna odpowiedź)

Mój kod:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>

    int main()
    {
    	int N = 10;
    	int array[10], invArray[10], number;

    	printf("Wprowadz 10 liczb do tablicy\n");

    	for (int i = 0; i < N; i++)
    	{
    		scanf("%d", &number);
    		array[i] = number;
    	}

    	printf("\n\n");

    	for (int i = 0; i < N; i++)
    	{
    		invArray[i] = array[N - 1 - i];
    		printf("%d ", invArray[i]);
    	}
    }
  • created

    Mar '20
  • last reply

    Mar '20
  • 4

    replies

  • 728

    views

  • 3

    users

  • 3

    links

  1. Hipotetycznie uzytkownik moglby z tego programu korzystac w konsoli. Jednakze sedzia nie jest czlowiekiem lecz programem komputerowym, ktory kompiluje twoj program i podstawia mu na standardowe wejscie pliki testowe np 10 rozniacych sie wielkoscia niektore zawieraja podchwytliwe, graniczne przypadki. Program nie zrozumie

albo dodatkowe znaki konca linii uzna za blad.

  1. nie musi miec rozszerzenia .c

  2. ja używam c(gcc 8.3)

Twoj program nie jest przygotowany na nieokreslona liczbe liczb :slight_smile:

ja w swoim program zadeklarowalem wielkosc tablicy na 10000.
Sprawdz co zwraca scanf jesli skonczyly sie liczby na wejsciu.

Racja, teraz widzę, że muszę jakoś inaczej podejsc do sprawy nieokreslonej liczby liczb. Spróbowałem zrobić https://pl.spoj.com/problems/PP0502B/3, bo jest to zadanie bardzo podobne, ale tu już podają mi ile ma być liczb na wejściu.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
int array[100], invArray[100], number, howMany;

scanf("%d", &howMany);

for (int i = 0; i < howMany; i++)
{
scanf("%d", &number);
array[i] = number;
}

for (int i = 0; i < howMany; i++)
{
invArray[i] = array[howMany - 1 - i];
}
return 0;
}

Wszystko w konsoli działa poprawnie, a rozwiazanie odrzuca… Błędna odpowiedź. Dlaczego?

nie calkiem podobne.
w pierwszej linii dostajesz liczbe testow-linijek
i z tego powodu musisz zrobic dodatkowy for.
w kazdej linijce pierwsza wartosc to u Ciebie howMany.

Visual jest bardzo dobrym środowiskiem do pisania kodów w C/C++ i innych, ale co do przenośności programów na SPOJ’a nie działa to 1:1 niestety. Visual ma wbudowanych bardzo dużo ciekawych mechanizmów zabraniających brzydkie rzeczy, dodatkowo środowisko to stosuje szereg optymalizacji pod system. Przechodząc do najważniejszej rzeczy jeśli będziesz sprawdzał działanie programu pod linuxem to prawdopodobnie zadziała ten kod tak samo i na spoju, jeśli pod windowsem sobie potestujesz to może zdarzyć się (głównie w obszarach zarządzania pamięcią), że coś zadziała trochę inaczej, bądź wyrzuci niestandardowe błędy.
Polecam sprawdzić zawsze dla przypadku testowego czy kod działa na www.ideone.com1