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;
}
po pierwsze nie kompiluje się, zapewne na skutek złego wklejenia kodu - wskazane jest przekazywanie kodu poprzez link do ideone.com15 z jednoczesnym wstawieniem tam danych przykładowych
po drugie (po doprowadzeniu do kompilacji) i wstawieniu danych przykładowych nie daje poprawnego wyniku (dziwne, że w ogóle daje jakiś wynik)
a generalnie, to program nie realizuje tego, co podano w zadaniu - przeczytaj uważnie treść zadania
#include <iostream>
using namespace std;
int main()
{
int stos[10], ile=0,w=1;
string znak;
while(cin>>znak)
{
if(znak=="+")
{
if(w!=2)
{
if(w==3)ile++;
w=4;
cin>>stos[ile];
cout<<":)"<<endl;
ile++;
}
else cout<<":("<<endl;
if(ile>9)
{
w=2;
ile--;
}
}
else
{
if(znak=="-")
{
if(w!=1)
{
if(w==4)ile--;
w=3;
cout<<stos[ile]<<endl;
stos[ile]=NULL;
ile--;
}
else
{
cout<<":("<<endl;
}
if(ile<0)
{
w=1;
ile++;
}
}
else
{
cout<<":("<<endl;
}
}
}
return 0;
}
Witam
Mam pewien problem z zadaniem STOS. Po pewnych modyfikacjach przed ktorymi mialem problem z przekroczonym limitem czasu wyskoczyl mi komunikat o blednym programie.Natomiast szczerze mowiac analizujac go kilka razy nie moge za bardzo znalezc bledu.Liczylbym na jakas wskazowke.Nie szukam gotowego rozwiazania ale podpowiedzi
Mam nadzieje ze dobrze wrzucilem kod
Cześć, a co w przypadku, kiedy piszę np. w języku C#, gdzie funkcja “ReadLine” nie zwraca, ani true ani false, więc jak zrobić inaczej pętlę jak nieskończoną, wydaje mi się, że wszystko robię dobrze, tylko błąd leży w przystosowaniu tego zadania do różnych języków
– edit
Dobra troszeczkę za wcześnie zapytałem, w C# po prostu nie można deklarować nowych zmiennych w while, ale można zastosować bez obaw następującą konstrukcję: while((zmienna = Console.ReadLine()) != null)
Może komuś się przyda!