Hmmmm....
Pętle for (swoja droga totalnie tutaj zbędne) nie wykonają się dopóki nie będzie EOF co jest złym założeniem. Te buźki, liczby maja się pojawiać zaraz po wprowadzeniu danych.
Np.
if( zmiesci sie w tablicy){
cout << ":)" << endl;
wczytaj liczbe;
zapisz do tablicy;
przeskocz do nastepnej komorki;}
Czyli w skrócie postaraj się te wszystkie pętle for zawrzeć w if'ach:)
Źle wczytujesz dane.
while(cin>>znak)
{
if(znak<10)break;
}
To jest najlepszy sposób.
//TODO: Zrobić tutoriale odnośnie wczytywania danych i nie używania nigdy na SPOJu cin.eof.
Żeby dostać AC musisz jeszcze przemyśleć różnicę między licznikiem i pomocą. Pytanie pomocnicze: po co Ci licznik jeśli masz pomoc?
[quote="kokosek"]Źle wczytujesz dane.
while(cin>>znak)
{
if(znak<10)break;
}
To jest najlepszy sposób.
//TODO: Zrobić tutoriale odnośnie wczytywania danych i nie używania nigdy na SPOJu cin.eof.
Żeby dostać AC musisz jeszcze przemyśleć różnicę między licznikiem i pomocą. Pytanie pomocnicze: po co Ci licznik jeśli masz pomoc?[/quote]
Działa, dziękuję serdecznie
pl.spoj.pl/forum/viewtopic.php?f=1&t=121495 pkt.15 jak już bardzo chcesz uwagę admina
co do kodu to nie potrafię znaleźć błędu, ale w takiej postaci da sie go przeczytać i ktoś może zechcieć pomóc.
Poprawka, nadal nie wiem gdzie błąd, ale raczej w magazynowaniu wyników. Jak zmieniłam kod tak by od razu wypisywał wynik operacji to mam AC.
Te CTRL F9 i F10 kojarzą mi się z code:blocks czy jakimś innym IDE. Jeżeli faktycznie używasz go, to otwiera się terminal, ale tylko do wprowadzania danych - ten terminal jest pod całkowitą kontrolą IDE i nie możesz tu zrobić [w nim zrobić] przekierowania.
Aby w windowsie mieć dostęp do terminala "systemowego" musisz uruchomić go komendą "cmd" [cmd.exe]. Dopiero w nim, jak znajdziesz się w odpowiednim katalogu możesz właśnie to zrobić. W IDE też pewnie gdzieś w konfiguracji możesz sobie takie przekierowania też wpisać na stałe, lub każdorazowo modyfikować..
Jeżeli używasz menadżera plików np totalcommander to całą taką linijkę polecenia + przekierowania możesz wpisać w lini poleceń total commandera czy jakiegokolwiek innego menadżera, jeżeli ma taką możliwość.
niby tak, po prostu przyzwyczaiłem się, że zadania nawet kończące się EOF dało się kończyć pustym Strigiem
a ready() znam, ale z jakiegoś powodu nie korzystam. mam wrażenie(obiecuję sobie w końcu doczytać implementację), że jak zostaną znaki kontrolne w buforze to stream jest ready, co o ile pamiętam kilka razy dało mi WA.
dobra, jeszcze kilka łatwych i czas ruszyć do średnich. tak czy inaczej bez urazy, po prostu mało śpię a to zadanie dawało mi rozstrój żołądka, chociaż rozwiązanie było banalne(a samych wersji algorytmu napisałem ze 4 szukając błędu w obsłudze wejścia)
Raczej estetyka, np ja użyłbym tylko typu int, [iwszędzie zamiast %hd, %d, a w poniższy sposób można deklarować zmienne [także short]:
int stack[11], // tu dodatkowy 1 element
stack_pointer = 0, // też int
operation; // też int
getchar_unlocked() - jeżeli bardzo Ci zależy na i/o ale przecież używaśz wolnego scanf i printf, więc tu raczej użyłbym samego getchar()
scanf("%d\n", &stack[stack_pointer**++**]); // lub %hd "\n"dodatkowo konsumuje enter i nie muszę póżniej "zjadać" go getcharem()
Jeżeli jednak chcesz koniecznie użyć short int to wystarczy jeden wyraz short [kompilatror domyśli się, że chodzi o short int].
Czyli w sumie same takie tam drobiazgi.
PS
Wiadomo, że każdy program, można napisać na 1000 sposobów, więc jeszcze taki mój inny sposób [pomijamy-niepotrzebny skanf z gwiazdką, zawsze gdzieś wczytujemy.]
W gałęzi else [+], można najpierw wczytać: scanf("%hd", &stack[stack_pointer]); bez ++ [i po to był mi potrzebny 11 element], a potem dopiero zastanawiać się co zrobić. Jeżeli 11 to tylko wypisujemy ;( i nic więcej, jeżeli nie to incrementujemy wskaźnik i drukujemy [bo wczytaliśmy już wcześniej, na samiutkim początku pętli]
Chciałbym jeszcze dopisać małe uzupełnienie. W twoim [pierwotnym] kodzie jest jeszcze mała, niewidoczna wada. Ale najpierw jeszcze jeden pomysł na AC tamtym twoim kodem.
Wystarczy tylko dodać dwie magiczne ukośne kreseczki "//" w odpowiednim miejscu, czyli zakomentować, lub wprost usunąć jedną linijkę. Oczywiście domyślasz się, że chodzi o:
// scanf("%hd");
Jednak taki kod ma tą samą wadę co pierwotny, ale jeszcze bardziej "rozbuchaną" i w jeszcze większym stopniu [jeżeli jest to możliwe]. Dodatkowo, dla specyficznych testów, specjalnie-wrednie przygotowanych, być może, może nawet dawać błędne wyniki.
Dlaczego stosujesz konstrukcję:
if (operation == '-') .....
else if (operation == '+') ...
zamiast:
if (operation == '-') .....
else { ........
Dlatego, że zmienna operation, może od czasu do czasu zawierać także "śmieci" [czyli ta zmienna powinna się tak naprawdę nazywać operationORgarbage ]
Czy da się to jakoś naprawić/poprawić? Oczywiście, że można. Np.: Należy wczytywać operację jako string [o długości jednego znaku], czyli nie getchar[_unlocked]. A takie wredne testy to np:
+
-1
+
+2
itd
PS
Jeżeli ktoś uczy się C++ + OOP, może napisać mały template klasy stos dla wartości różnych typów [char, int, long long, string itd] i dwie metody - operatory + - działające w tej klasie.
Mam błąd kompilacji, i nic dziwnego bo zmienna s pojawia się w switch(s), mimo że wcześniej jej nawet nie deklarowałeś (można zresztą kliknąć na błąd kompilacji i przeczytać komunikat błędu). Ale mimo tego daje ci złą odpowiedź, bo próbujesz wczytać t którego w tym zadaniu niema, masz wczytywać póki coś się będzie na wejściu pojawiać. (więc na przykładowych danych nie mógł zadziałać), więc zamień pętlę for (int i...) na while (cin >> znak) i usuń wczytywanie z wnętrza pętli.
Popoprawiaj to i usuń kod z forum bo ci zaliczy.
ps Do tego funkcje które nic nie zwracają masz zadeklarowane jako zwracające inta.
Hej, mój kod w Code Bloksie działa zgodnie z wymogami zadania, ale w Spoju wyskakuje błąd kompilacji - dotyczy to biblioteki conio.h i funkcji getch (). Czym mogę zamienić funkcję getch(), tak aby po wpisaniu liczby także nie pokazywała się ona na ekranie??
include
include
using namespace std;
char dane[10];
int rozmiar=0;
void push()
{
if (rozmiar>=10)
{
dane[rozmiar]=getch();
cout<<":("<<endl;
}
else
{dane[rozmiar]=getch();
rozmiar++;
cout<<":)"<<endl;}
}
void pop()
{
if(rozmiar>0)
{rozmiar--;
cout<<dane[rozmiar]<<endl;}
else cout <<":("<<endl;
}
int main()
{
char wybor;
while(true)
{
wybor=getch();
if (wybor == '-') pop ();
else if (wybor == '+') push();
else cout<<":("<<endl;
}
return 0;
}
Witam , mógłby ktoś zerknąć na ten kod oraz wskazać mi co jest nie tak z tym kodem ?
#include
using namespace std;
int rozmiar;
int dane;
double *tab = new double [dane];
void push()
{
cin >> tab[rozmiar];
rozmiar = rozmiar +1;
cout<<":)"<<endl;
}
void pop()
{ if(rozmiar>=1)
{
cout<<tab[rozmiar]<<endl;
rozmiar = rozmiar - 1;
}
else
{
cout<<":("<<endl;
}
}
int main()
{
char znak;
while(cin>>znak)
{
switch(znak)
{
case '+' : push(); break;
case '-' : pop (); break;
}
}
return 0;
}