Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelma ehtorakenteessa

Sivun loppuun

Azure [16.04.2007 18:48:38]

#

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.

TsaTsaTsaa [16.04.2007 18:57:31]

#

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ä.

Azure [16.04.2007 19:04:24]

#

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?

Grez [16.04.2007 19:07:37]

#

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.

TsaTsaTsaa [16.04.2007 19:08:00]

#

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
}

thefox [16.04.2007 19:16:52]

#

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.

TsaTsaTsaa [16.04.2007 19:20:14]

#

Ja calcstart()-funktio ei palauta mitään vaikka lupaa.

Eikä kyllä liioin mainikaan.

Azure [16.04.2007 19:33:11]

#

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

TsaTsaTsaa [16.04.2007 19:36:31]

#

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...

Grez [16.04.2007 19:43:32]

#

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);

Azure [16.04.2007 20:10:09]

#

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?

Metabolix [16.04.2007 21:01:39]

#

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.

TsaTsaTsaa [16.04.2007 21:05:42]

#

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
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta