Tuossa pika pikaa tein tuollaisen ohjelman, mutta ongelmaksi tulee se, että ehtolause if suorittaa kummatkin toiminnot. Miksi se tekee niin vaikka käytin aaltosulkuja, käytin elseä ja monta muuta keinoa, mutta sama tulos. En ole opetellu vielä switch case rakenteita ja sellasii joten en halua käyttää niitä ennen kuin opin ehtolauseen hyvin. Miksi ohjelma tekee kummatkin laskutoimitukset vaikka pyydetään tarkistamaan, että onko laskussa plus vai miinus ?
#include<iostream> using namespace std; int calc(int x, char y, int z) /* Tämä funktio tulee ensin, koska se kutsutaan funktiossa calcstart. Eli main kutsuu calcstartin ja clacstart kutsuu calc:in. Se mikä viimeiseksi kutsutaan tulee ekaksi koodissa. */ { int o; if (y, "+") o = x + z; cout << x << y << z << " = " << o; /* koodi on kirjoitettu epäselvästi pötkässä tässä*/ if (y, "-") o = x - z; cout << x << y << z << " = " << o; return (x,y,z); } int calcstart() { int a; char b; int c; int v; cout << "Calculator version 1.0" << endl; cout << "Copyright Azure" << endl; cout << "2007" << endl; cout << "--------------------------------------------" << endl << endl << endl; cout << "Please, Enter a first number" << endl; cin >> a; cout << "Please, Enter a matematic operator" << endl; cin >> b; cout << "Please, Enter a second number" << endl; cin >> c; calc(a,b,c); } int main() { calcstart(); }
Huomasin äsken, että tuli laitettua aihe tänne, vaikka tämä olisi pitäny laittaa tuonne C ja C++ palstalle. Tämän voi ylläpitäjä siirtää sinne jos haluaa. Joten pyytäsin anteeksi töppäyksestäni.
Azure kirjoitti:
if (y, "+")
Ei se iffi ihan noin toimi. C:n perusteet oppaista lukemaan, hopi hopi.
Ja vähän väärällä alueella tämä.
Kieli on C++ ei C. Ovat kyllä samanlaisia, mutta eivät silti aivan. Ehtolauseiden käyttö onnistuu kokonaisluvuilla, mutta ei ASCII-merkeillä. Onkohan edes laillista C++ kielessä käyttää ASCII merkkiehdoissa if lauseita?
Varmaan silti C++:ssakin pitäisi olla
if (y=='-') { /*...*/ } //ja if (y=='+') { /*...*/ }
Ja tosiaan, nyt kun nuo ei ole kaarisuluissa, niin vaikka if toimisikin niin silti vain ensimmäinen sen jälkeisellä rivillä olevista komennoista on ehdollinen ja jälkimmäinen ajetaan aina.
Azure kirjoitti:
Kieli on C++ ei C. Ovat kyllä samanlaisia, mutta eivät silti aivan. Ehtolauseiden käyttö onnistuu kokonaisluvuilla, mutta ei ASCII-merkeillä. Onkohan edes laillista C++ kielessä käyttää ASCII merkkiehdoissa if lauseita?
Huomasin kyllä, että on c++:aa, mutta c:ssä on ihan samat ehtolauseet, niin sitä kehotin mennä katsomaan.
Ja iffi ei toimi noin, vaan näin:
if ( y == '+' ) { // Tee jotain }
calc-funktion return-lauseke on myös väärin, pilkkuoperaattoria ei voi noin käyttää, tai ainakaan siinä ei ole mitään järkeä. Tuossa tapauksessa palautetaan z-muuttujan arvo.
Ja calcstart()-funktio ei palauta mitään vaikka lupaa.
Eikä kyllä liioin mainikaan.
Minun oppimani mukaan kaikki parametrit funktiossa täytyy paluttaa lopussa eli esim:
funktio(int a,int b,int c)
{
return (a,b,c);
}
Ja mikäli haluan sijoittaa arvot tuosta calcstar funktiosta calc funktioon täytyy minun sijoittaa calcstart funktion muuttujat calc funktion kutsuun, jotta kutsu sijoittaisi ne muuttuujien arvot funktiossa jotka vastaa kutsutun funktioin parametrejä. :O
Sitten on kyllä ollut huono opettaja (tai oppi mennyt huonosti perille), koska returnilla ei voi palauttaa kuin yhden arvon.
Azure kirjoitti:
Ja mikäli haluan sijoittaa arvot tuosta calcstar funktiosta calc funktioon täytyy minun sijoittaa calcstart funktion muuttujat calc funktion kutsuun, jotta kutsu sijoittaisi ne muuttuujien arvot funktiossa jotka vastaa kutsutun funktioin parametrejä. :O
Tästä en saa mitään selkoa...
Azure kirjoitti:
Minun oppimani mukaan kaikki parametrit funktiossa täytyy paluttaa lopussa eli esim:
funktio(int a,int b,int c) { return (a,b,c); }
Funktion tulos (result) palautetaan returnilla. Nuo parametrit annetaan funktiota kutsuttaessa.
Eli
int funktio(int a,int b, int c) { int palautettava = 123; return palautettava; //Palautettavan siis täytyy olla int }
Noita parametreja taas käytetään kun kutsutaan funktiota. Tyyliin
funktio(1,2,3);
No koodistani siis pitää muuttaa:
return z;
Onko koodini muuten järkevää, pikku seikkoja lukuun ottamatta? Onko tästä hyvä jatkaa C++ ohjelmoinnin opiskelua vai onko ihan siansaksaa tekemäni koodit?
Laita funktion tyypiksi void (siis intin paikalle) ja ota return kokonaan pois, jos et sitä palautusarvoa mihinkään ole käyttämässä. Suosittelen kovasti vaikkapa perehtymistä jo mainittuun C-oppaaseen. Perusasiat ovat kuitenkin sinänsä samat, ja näytät tuon C++-tyylisen tulostamisen ja lukemisen osaavan. Kaikki iffit, forit ja sellaiset toimivat samalla tavalla, kannattaa siis niihin perehtyä oppaasta, samoin funktioihin.
Eipä tuota z:kaan oikeastaan kannata palauttaa, koska paluuarvolla ei kuitenkaan tehdä mitään. Eli ehkä kannattaa muuttaa noiden funktioiden paluuarvot voideiksi. Ja mainin olisi hyvä palauttaa käyttöjärjestelmälle tieto, onko ohjelman suoritus sujunut mallikkaasti.
Eli näin:
#include <cstdlib> // Täältä löytyy mainin paluuarvolle selkeät vakiot // EXIT_SUCCESS ja EXIT_FAILURE #include <iostream> using namespace std; void calc(int x, char y, int z) { // Toiminta // Ei return -lausetta. } void calcstart() { // Toiminta. // Ei return -lausetta. } int main() { calcstart(); return EXIT_SUCCESS; // Ohjelman suoritus loppuu oikein }
Aihe on jo aika vanha, joten et voi enää vastata siihen.