C++ błędy wyrzucone przez kompilację i ich wyeliminowanie


(Danioss) #1

Witam! Jestem zielony w C++, w sumie, to jest mój pierwszy program. Zaczynam studia, muszę z kopyta ruszyć, bo wiadomo, że nikt z nikim się cackać nie będzie :). Pomyślałem o napisaniu programu, który po po daniu wartości zmiennych a, b, c oblicza pierwiastki funkcji (ax^2 + bx + c). Poprawiłem błędy, które wyrzuciło mi kompilowanie, jednak nie jestem w stanie wyeliminować pozostałych paru:

21 expected primary-expression before "else"

21 expected `;' before "else"

26 expected primary-expression before "else"

26 expected `;' before "else"

[build Error] [main.o] Error 1

-


(Drobok) #2

Jeden rzut oka i masz swoje błędy. Składnia if:

if(warunek)

{

  polecenie

}

Ew można użyć else:

if(warunek)

{

  polecenie

}else{

  polecenie

}

Zamiast else można użyć else if. Nie trzeba używać klamerek jak masz jedno polecenie. Pomyśl nad twoim kodem troszkę i powiedz czego nie rozumiesz :slight_smile:


(Darkvifon) #3

Literówka i drobny błąd składniowy na początku

std::cin >> a >> b >> c;

Nadmiarowy else w linijce 22.

Brak zaincludowanej biblioteki cmath, która zawiera sqrt(). Dopisz na górze #include

Brak wyrażenia po << w liniach 25. i 32. Wpisz tam std::endl czyli znak nowej linii (bez tego wszystko będzie w jednej linii, bez "enterów".

I bardzo Cię proszę, nie rób takich dziwolągów z system("PAUSE"). Akurat tej wersji nie znałem, ale rozumiem, że idea była taka, żeby program poczekał z zamknięciem okna cmd/terminala. Jeśli piszesz program działający w terminalu, to włączaj go z terminala - wtedy wypisane dane Ci nie będą znikały.

EDIT:

A, zapomniałem o Twoim pytanie z końca.

int to typ dla liczb całkowitych. Dla ułamków używa się float lub double. Dla pojedynczych znaków używa się char, a dla wartości prawda/fałsz - bool


(Drobok) #4

System pause jest dobre do zatrzymania programu na windows. Na pewno lepsze jest to niż pobieranie jakiegoś znaku etc. Na linuxie chyba też jest polecenie pause w terminalu.


(Danioss) #5
  • include

(Darkvifon) #6

U mnie nie ma. Że lepsze niż pobieranie znaku to bym nie powiedział. Na pewno mniej przenośne (chyba, że ktoś pobiera znak przez conio.h). Moim zdaniem cała idea jest błędna - jak program działa w terminalu, to niech będzie projektowany z myślą o nim.


(Drobok) #7

Rzeczywiście nie ma takiego czegoś w linuxie. O owe conio.h mi chodziło (bo tak jest w większości tutków pobierane ...)

Sam system("pause") dla windowego wiersza poleceń nie jest zły. Mogę wpisać dowolną komendę etc. Wiadomo mało przenośne, ale po co komu przenośna komenda na program do tutka ? Skoro ten program nigdy nie zostanie użyty przez kogoś innego niż autor :slight_smile: Btw w dev c++ jest opcja automatycznego pause po zakończeniu programu :slight_smile:


(system) #8

Jeżeli chodzi o "zatrzymanie" programu konsolowego. To tutaj na forum można było zauważyć alternatywę

system("pause");

w postaci

cin.sync();

cin.get();

Oraz dla autora postu proszę, żeby zwrócił uwagę na linijki :slight_smile: :

std::cout<<"\nFunkcja ma jedno miejsce zerowe:"<

[code]std::cout<<"\nFunkcja ma dwa miejsca zerowe:"<


(Danioss) #9

Dobra, ostateczny wygląd i dwa błędy do rozszyfrowania:

  • include

(Drobok) #10

Albo używasz namespace std, albo std:: przed każdym cin/cout. Do cout nie wysyłasz średnika. Masz użyć float a nie double.

Co do postu Protected_48 dobra alternatywa, aczkolwiek potrafi nieźle namieszać czasami :slight_smile:


(Danioss) #11

Nie zrozumiałem co znaczy,że do cout nie wysyłam średnika. Na końcu linijki? Zmieniłem na float. Zmieniłem wprowadzanie zmiennych, spójrz na ostatni kod, który wkleiłem, tam będę go aktualizował. Zdaję sobie sprawę z tego, że jestem męczący :stuck_out_tongue: jednak dalej nie rozumiem tych dwóch błędów, które pozostają bez zmian. Teraz tylko linijki się zmieniły, bo to wprowadzanie zmiennych rozstrzeliłem.

32 expected primary-expression before ';' token

39 expected primary-expression before ';' token


(Drobok) #12
cout<<"\nFunkcja ma dwa miejsca zerowe:"<


Wysyłasz strumieniem wyjścia (cout) najpierw ciąg znaków, potem zmienną, potem ciąg znaków, potem zmienną i [size=150]średnik[/size], Średnik powinien kończyć linię. Pomyśl co robisz źle. Dla przykłądu:

[code]cout << "to nie wysyła średnika do strumienia wyjścia";


(Danioss) #13

Rozumiem, doszedłem do tego :slight_smile:

Poprawnie:

cout<<"\nFunkcja ma dwa miejsca zerowe:"<

Bardzo bardzo Ci dziękuję:slight_smile: Możesz ocenić proszę mój pierwszy program? Nie pomysł, bo pomysł co najmniej trywialny, ale jego wykonanie ostateczne..


(Darkvifon) #14

(Drobok) #15

Ogólnie na początek jest dobrze, ale jak dla mnie zbyt dużo linijek, robisz podstawowe błędy. Pomyśl o lekturze jakiegoś tutka :slight_smile:


(Danioss) #16

Wczoraj zakupiłem symfonię C++ jednego z profesorów mojej uczelni... I od wczoraj siedzę z nią jak tylko nie śpię. Podstawowe błędy miną, jak tylko trochę programów się popisze i zrozumie lepiej całe działanie instrukcji i funkcji.

Niestety mam problem - mój program daje mi znać o mojej funkcji tylko w pierwszym przypadku, to jest - gdy delta jest mniejsza od zera. W innych przypadkach przechodzi do system pause....


(Drobok) #17

Mówiłem ci robisz podstawowe błędy jak dojdziesz samemu co jest źle to się lepiej utrwali. Napisałem ci jak wygląda instrukcja if.