Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Teorytycznie Mój Pierwszy Program


Rekomendowane odpowiedzi

Opublikowano

Witam. Ostatnio pytałem tutaj jakiego języka programowania się uczyć. Poradziliście mi C++, więc go wybrałem i zacząłem "przygodę" z nim. Zamówiłem sobie książkę "Symfonia C++", ale dojdzie ona do mnie najprawdopodobniej dopiero we wtorek...

Więc postanowiłem zacząć się uczyć z jakiegoś darmowego toturiala. I w ramach ćwiczeń napisałem mały kalkulator wykorzystujący funkcje, pętlę, instrukcję warunkową i instrukcje wyboru. Niby program działa, ale mam pewien problem. Chciałbym, aby po pętli, za getch(); (tam, gdzie jest komentarz) znalazła się linika return main();. Ale kiedy ją tam dodaję, to kompilator (VC++) pokazuje taki błąd (błędy):

 

1>c:\users\admin\documents\visual studio 2010\projects\first\first\first.cpp(30): warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
1>          d:\program files (x86)\microsoft visual studio 10.0\vc\include\conio.h(128) : see declaration of 'getch'
1>c:\users\admin\documents\visual studio 2010\projects\first\first\first.cpp(31): error C3861: 'main': identifier not found

 

Co mam zrobić, żeby to zadziałało i kompilator nie wywalał mi błędów? Albo czy da się to zrobić w inny sposób?

Kod programu:

 

#include "stdafx.h"

#include "iostream"

#include "conio.h"

using namespace std;

int Dodaj(int nLiczba1, int nLiczba2)

{

return nLiczba1 + nLiczba2;

}

int Odejmij(int nLiczba1, int nLiczba2)

{

return nLiczba1 - nLiczba2;

}

int Pomnoz(int nLiczba1, int nLiczba2)

{

return nLiczba1 * nLiczba2;

}

int Podziel(int nLiczba1, int nLiczba2)

{

if(nLiczba2 == 0)

{

while(nLiczba2 == 0)

{

cout << "Dzielnik nie moze byc zerem!" << endl;

cout << "Podaj dzielnik: ";

cin >> nLiczba2;

}

int nWynik;

nWynik = nLiczba1 / nLiczba2;

cout << nLiczba1 << " / " << nLiczba2 << " = " << nWynik << endl;

getch();

// Tutaj ma być "return main();"

}

else

{

return nLiczba1 / nLiczba2;

}

}

int main()

{

cout << "Podaj pierwsza liczbe: ";

int nLiczba1;

cin >> nLiczba1;

cout << "Podaj druga liczbe: ";

int nLiczba2;

cin >> nLiczba2;

cout << "Co chcesz zrobic?" << endl;

cout << "1. Dodaj" << endl;

cout << "2. Odejmij" << endl;

cout << "3. Pomnoz" << endl;

cout << "4. Podziel" << endl;

cout << "0. Wyjdz" << endl;

cout << "Twoj wybor: ";

int nWybor;

cin >> nWybor;

switch(nWybor)

{

case 1: cout << nLiczba1 << " + " << nLiczba2 << " = " << Dodaj(nLiczba1, nLiczba2); getch(); cout << endl; return main();

case 2: cout << nLiczba1 << " - " << nLiczba2 << " = " << Odejmij(nLiczba1, nLiczba2); getch(); cout << endl; return main();

case 3: cout << nLiczba1 << " * " << nLiczba2 << " = " << Pomnoz(nLiczba1, nLiczba2); getch(); cout << endl; return main();

case 4: cout << nLiczba1 << " / " << nLiczba2 << " = " << Podziel(nLiczba1, nLiczba2); getch(); cout << endl; return main();

case 0:

{

cout << "Wcisnij dowolny klawisz, aby zamknac program.";

getch();

break;

}

default: cout << "Bledna opcja!"; return main();

}

}

 

Tutaj kod jest bardziej czytelny: http://wklej.to/VSkYJ

*

Opublikowano

Zaraz spróbuje ci pomóc dam edita :)

 

EDIT:

 

Zmieniłem go tylko trochę i działa. Jak coś nie tak to pisz ja poprawię.

 

 

#include "iostream"
#include "conio.h"
using namespace std;
int Dodaj(int nLiczba1, int nLiczba2)
{
return nLiczba1 + nLiczba2;
}
int Odejmij(int nLiczba1, int nLiczba2)
{
return nLiczba1 - nLiczba2;
}
int Pomnoz(int nLiczba1, int nLiczba2)
{
return nLiczba1 * nLiczba2;
}
int Podziel(int nLiczba1, int nLiczba2)
{
if(nLiczba2 == 0)
{
	while(nLiczba2 == 0)
	{
		cout << "Dzielnik nie moze byc zerem!" << endl;
		cout << "Podaj dzielnik: ";
		cin >> nLiczba2;
	}
	int nWynik;
	nWynik = nLiczba1 / nLiczba2;
	cout << nLiczba1 << " / " << nLiczba2 << " = " << nWynik << endl;
	getch();
}
else
{
	return nLiczba1 / nLiczba2;
}
}
int main()
{
cout << "Podaj pierwsza liczbe: ";
int nLiczba1;
cin >> nLiczba1;
cout << "Podaj druga liczbe: ";
int nLiczba2;
cin >> nLiczba2;
cout << "Co chcesz zrobic?" << endl;
cout << "1. Dodaj" << endl;
cout << "2. Odejmij" << endl;
cout << "3. Pomnoz" << endl;
cout << "4. Podziel" << endl;
cout << "0. Wyjdz" << endl;
cout << "Twoj wybor: ";
int nWybor;
cin >> nWybor;
switch(nWybor)
{
case 1:
cout << nLiczba1 << " + " << nLiczba2 << " = " << Dodaj(nLiczba1, nLiczba2);
break;
case 2: cout << nLiczba1 << " - " << nLiczba2 << " = " << Odejmij(nLiczba1, nLiczba2);
break;
case 3: cout << nLiczba1 << " * " << nLiczba2 << " = " << Pomnoz(nLiczba1, nLiczba2);
break;
case 4: cout << nLiczba1 << " / " << nLiczba2 << " = " << Podziel(nLiczba1, nLiczba2);
break;
case 0:
	{
		cout << "Wcisnij dowolny klawisz, aby zamknac program.";
		getch();
		break;
	}
default: cout << "Bledna opcja!"; return main();
}
}

 

 

Tam gdzie masz switch....case nie dałeś break'ów i usunąłem parę nie potrzebnych linijek.

 

P.S.

Jak to zrobiłeś SAM całkowicie od PODSTAW to powinieneś być dumny z siebie ;)

GrottyCracker22.png
Opublikowano

@up: różnica taka, że niekiedy antyvirus wykryć może go jako wirusa ;p

 

I powiem tak...od razu na głęboką wode sie rzucasz :) Pętle, if, funkcje, switch... :)

Masz rację. Jak próbujesz nauczyć się na pamięć to nic nie skumasz. To nie jest tak, że jest określony kod na coś ale trzeba myśleć logicznie, trzeba widzieć program w kodzie dosłownie ;) takie moje zdanie :P

GrottyCracker22.png
Opublikowano

@Prime_Bull:

Sprawdziłeś swój poprawiony program? Po wykonaniu działania od razu się zamyka, nie zdążyłem nawet zauważyć wyniku. (:

Nie dawałem break; na końcu, bo nie było to potrzebne, jaki jest sens dawania tej instrukcji po return main();? ;-)

 

Teraz doszłem (czy doszedłem) do wniosku, że chyba źle opisałem swój problem. Chodzi mi o to, żeby po wykonaniu dzielenia program wracał do funkcji main. Tylko kiedy dodam return main(); tam gdzie ma (powinno) być (czyli w linii 31, za getch();), kompilator wywala mi błąd, którego treść zemieściłem w pierwszym poście.

 

@InFlames:

Nie mam pojęcia co robi i jak używać system("PAUSE");, więc jak na razie nie mam zamiaru używać tego dobrodziejstwa. ;-)

 

@SeaMonster131/Prime_Bull:

Po prostu chciałem sprawdzić swoje umiejętności. Wiem, że uczenie się na pamięć nie ma sensu, nie musicie mi tego mówić.

I myślę logicznie. ; >

*

Weteran
Opublikowano

SajberGuru, ja się uczę na pamięć i myślę że dobrze robię i widać że "twój" kod jest skopiowany z jakiejś strony...

Po co w ogóle wsadziłeś tyle niepotrzebnych rzeczy do tego programu?

Masz tu lepszy kalkulator by ja, który jest o wiele wygodniejszy w użyciu i robi to samo:

#include <iostream>

using namespace std;

int main()
{

long double l1;
long double l2;
char z;
long double w;
aaa:
   cout<<"podaj dzialanie: ";

   cin>>l1>>z>>l2;

   if(z== '+')
   {
   w=l1+l2;
   cout<<w;
   }
   else if(z== '-')
   {
   w=l1-l2;
   cout<<w;
   }
   else if(z== '*')
   {
   w=l1*l2;
   cout<<w;
   }
   else if(z== '/')
   {
   w=l1/l2;
   cout<<w;
   }
   else 
   {
        cout<<"\n";
        cout<<"Zle wpisales dzialanie";
   }
   cout<<"\n";
   goto aaa;
}

Opublikowano

@XAULIN:

Zapewniam Cię, że mój kod nie jest kopiowany. Dlaczego tak twierdzisz i po czym to widać?

Nie pisałem, że chcę kalkulator w C++, tylko poprosiłem o pomoc w rozwiązaniu mojego problemu.

*

Opublikowano

Dwóch panów wyżej: jeden źle radzi, a drugi źle poprawia :) Dobraliście się jak w korcu maku.

 

Dlaczego stosowac getchar() zamiast system( "PAUSE" ) ? Bo ten drugi działa tylko na windows, a powinniśmy nabierać dobrych nawyków pisania międzyplatformowego. Funkcja system() służy do wykonywania poleceń systemowych i moim zdaniem nie ma sensu zatrudniać jej do takich pierdół, jak zatrzymanie okienka na ekranie.

 

PS. Poza tym, pierwsza metoda nie wyświetla napisu "Oczekiwania na naciśnięcie dowolnego klawisza..." czy jak on tam brzmi.

Jeżeli szukasz pomocy, piszesz poprawnie po polsku, a rozwiązaniem twojego problemu nie jest pierwszy link w google - prawdopodobnie pomogę.

Jeżeli chcesz gotowca, to najpierw podaj cenę. Cenę w pln, bo za plusy pracują lamusy :)

Weteran
Opublikowano

SajberGuru, na pewno większość kodu jest przepisana ponieważ:

1.Sam przyznałeś się do tego że niedawno zacząłeś się uczyć tego języku, a w tym kodzie masz takie dziwactwa których ja bym nigdy nie użył do zrobienia głupiego kalkulatora.

2.Nie znasz system("pause") chociaż w swoim kodzie masz o wiele trudniejsze do opanowania rzeczy.

3.Sam przyznałeś się do tego że uczenie się na pamięć jest bezsensu, więc musiałeś większość kodu skądś przekopiować :P

A kod kalkulatora pokazałem po to, aby udowodnić że można to napisać o wiele szybciej/krócej.

 

Jeżeli będziesz się uczyć z symfonii c++ to niestety będziesz musiał się uczyć większości na pamięć, ponieważ jeżeli zostanie coś wyjaśnione w np. 4 rozdziale to można spotkać to samo w 10 rozdziale i autor już tego wytłumaczy.

Opublikowano

A mnie to wygląda na kod kalkulatora z "Od zera do gier kodera" :)

Autor tematu dodał coś od siebie do kodu stąd te "zbędne" rzeczy.

Screen z pdf'a: cppd.png

Opublikowano

@XAULIN: nie używaj goto. wsadź to wszystko w pętle (np while) ;p

 

 

@spider44:

PS. Poza tym, pierwsza metoda nie wyświetla napisu "Oczekiwania na naciśnięcie dowolnego klawisza..." czy jak on tam brzmi.

to napisz sobie system("PAUSE >nul"); i już :) Ale i tak odradzam tego używania tak samo jak Ty :)

Weteran
Opublikowano

Wiem że nie powinno się jej używać ( w zasadzie sam nie wiem dlaczego :P )

Ale chyba nic się niestanie jak się użyje tego w programie który ma jedynie 40linijek kodu,Prawda?

Opublikowano

Goto można używać, nic złego w tym nie ma a wręcz czasami jest wygodniejsze użycie goto zamiast jakiejś pętli albo przy skakaniu po kodzie. Zamiast return main() lepiej użyć pętli.

YOU MUST DIE

- Ganon, Koridai

Pomocnik
Opublikowano

Wiem że nie powinno się jej używać ( w zasadzie sam nie wiem dlaczego :P )

Ale chyba nic się niestanie jak się użyje tego w programie który ma jedynie 40linijek kodu,Prawda?

 

Odradza się użycie "goto" ponieważ nie wprawne użycie powoduje zmniejszenie czytelności kodu a w rezultacie człowiek popełnia błędy. Instrukcja "goto" jest masowo używana w directX na przykład . W praktyce dobrze użyta może przyśpieszyć program .

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...