Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Apua aloittelijalle! max/min määrittely yms

Sivun loppuun

Joonaps [23.08.2009 15:11:25]

#

Hei!
Tarvitsisin hieman apua erään tehtävän hoitamiseen.
En halua valmiita vastauksia koska mieleni tekee myös itse oppia tästä jotain.

Tarkoituksena on korjata virheet valmiista koodista, ja muuttaa sitä hieman.
Olen hieman jumissa koska en ole koskaan ennen törmännyt tilanteeseen jossa pitäisi määritellä tietty maksimi ja minimi.

"Muuta ohjelmaa niin, että voit tulostaa ohjelmalla seuraavat ilmoitukset:
Summa on pienempi kuin MINIMI
Summa on suurempi kuin MAKSIMI
Summa on MINIMIN ja MAKSIMIN välissä"

Tämä on varmasti lastenleikkiä jo vähänkin kokeneemmille mutta en ole varma miten saan määriteltyä maksimin ja minimin.
Annetusta materiaalista en löytänyt muutakuin
const int MAKSIMI = -xxx-... Mutta miten tätä pitäisi käyttää?
ja määritelläänkö minimi samalla tavalla?


PS: tehtävään kuuluu myös että:
"Muuta vakioden nimet niin, että
MAX => MAKSIMI
MIN => MINIMI"

mitenkä tämä onnistuu jos MAX ja MIN ovat jo valmiita komentoja?

Antti Laaksonen [23.08.2009 15:37:50]

#

Voisitko kirjoittaa tähän täydellisen tehtävänannon?

Ainakaan minä en vielä ymmärrä, mitä tehtävässä kuuluu tehdä.

os [23.08.2009 15:45:05]

#

Ongelmasi ei tosiaan tuon viestin perusteella tule nyt ihan selväksi.

Olisiko tilanne siis se, että sinun on valmista koodia muokkamalla (?) tarkoitus tehdä ohjelma, joka laskee jonkin lukujen summan ja vertaa niitä valmiissa koodissa määriteltyihin mielivaltaisiin vakioihin "MAX" ja "MIN", joilla ei ole mitään tekemistä summattavien lukujen tai muunkaan syötteen oikean minimin tai maksimin kanssa?

const int MAKSIMI = jokuluku; nimittäin määrittää vain vakion, jota et voi mitenkään sen enempää "käyttää" minkään oikean maksimin laskemiseen.

Joonaps [23.08.2009 15:51:54]

#

a) Kirjoita, tallenna ja suorita ym. ohjelma. Tehtävänäsi on pystyä korjaamaan kaikki kirjoitusvirheistäsi johtuvat kääntäjän ilmoittamat virheet siten, että saat ohjelmasta ajokelpoisen.

b) Kommentoi ylla olevan esimerkin kaikki rivit (mitä rivillä tapahtuu).

c) Muuta vakioden nimet niin, että

MAX => MAKSIMI

MIN => MINIMI

Muuta ohjelmaa niin, että voit tulostaa ohjelmalla seuraavat ilmoitukset:

Summa on pienempi kuin MINIMI

Summa on suurempi kuin MAKSIMI

Summa on MINIMIN ja MAKSIMIN välissä

-----------
Elikkä on annettu valmiiksi koodi johon on tarkoituksella sisälletty virheitä jotka pitää sitten itse osata korjata.

pieni pätkä koodia:

#include <iostream>
using namespace std;
#define MAX 10
cont int MIN = 20;
int summa;
void Laske(int,int);
main()
{
          int luku1;
          int luku2;
          cout << "syota luku1: ";
          cin >> luku1;

          cout << "syota luku2 ";
          cin >> luku2;
          Laske(luku1, luku2);
          if (summa < MAX)
             cout << "summa on pienempi kuin" << MAX << "\n";
          if (summa < MIN)
           cout << "summa on pienempi kuin " << MIN <<"\n";
cin.get();
return 0;
}
void Laske(int eka, int toka)
{
     summa = eka+toka;
}

....... jaa tulikin sitten kirjoitettua koko roska, mutta eipä olisi varmaan saanut mitään irti jos ei koko koodia näkisi.

itsekkin huomaan suuria määriä virheitä ja uskoisin osaavani kaikki korjata paitsi että menee hieman sormi suuhun tämän max/min asian kanssa :-/

Mod. lisäsi kooditagit

Teuro [23.08.2009 16:00:03]

#

Muutat vain nuo MIN ja MAX arvot sopivan nimisiksi. Siis MAX -> MAKSIMI ja MIN -> MINIMI. Lopuksi muutat tuon koodin vastaamaan muilta osin tehtävän antoa. Tarvinnet ainakin vertailua. Tuota koodia tarvinnee muutoinkin korjailla aika reippaasti ennen kuin se edes kääntyy virheittä. Luultavasti virheet on tehty tahallaan, jotta oppilaat oppisivat lukemaan kääntäjän virheilmoituksia. Lisäksi siinä näkyy olevan tahallinen logiikkavirhekin.

Joonaps [23.08.2009 16:03:19]

#

jep kyllä siinä virheitä piisaa

mutta mitä tarkoitusta on #define MAX 10 ja const int MIN = 20 ?

ja mihin/miten ne kuuluisi kirjoittaa

Teuro [23.08.2009 16:10:04]

#

Laitan tähän korjatun version alle, jossa ohjelma kääntyy. Sinulle jää ainoastaan tuon ongelmasi selvittäminen.

#include <iostream>
const int MAXIMI = 20;
const int MINIMI = 10;
int summa;

int Laske(int a, int b);

int main(){
	int luku1;
	int luku2;

	std::cout << "syota luku1: " << std::endl;
	std::cin >> luku1;

	std::cout << "syota luku2 " << std::endl;
	std::cin >> luku2;

	summa = Laske(luku1, luku2);

	/**
		* Tähän vertailu
	*/

	if(){
		std::cout << "Summa on suurempi, kuin MAXIMI" << std::endl;
	}else if(){
		std::cout << "Summa on pienempi, kuin MINIMI" << std::endl;
	}else{
		std::cout << "Summa on MINIMIN ja MAXIMIN välissä" << std::endl;
	}

	return EXIT_SUCCESS;
}

int Laske(int a, int b){
	return (a + b);
}

os [23.08.2009 16:10:21]

#

Mistä tämä tehtävänanto muuten on peräisin? Tuo esimerkkikoodi on ilman tahallisia virheitäikin niin heikkolaatuista, että suosittelisin pelkästään sen perusteella vaihtamaan opasta. Ohjelmointiputkan C++-opas on vielä keskeneräinen, mutta sen pohjalta pääsee varmasti jo hyvään alkuun.

Hakoulinen [23.08.2009 16:12:09]

#

Sikäli mikäli oikein ymmärsin, sinun pitää vain muuttaa vakioiden nimet ja korjata sitten koodiin toinen muoto (MAX -> MAKSIMI). Lisäksi lopun if-lauseet on tehty tarkoituksella hieman virheellisiksi ja sinun tulee korjata ne vertailemaan oikeita asioita sekä lisätä tarkistus sille, onko summa MINIMIn ja MAKSIMIn välissä.

Metabolix [23.08.2009 16:12:10]

#

Mitäpä, jos aloittaisit vaikkapa C++-oppaasta? Unohda hetkeksi tuo tehtävä (joka on ainakin minusta erittäin huono tehtävä) ja keskity sen sijaan opettelemaan kunnollista C++:aa. Nyt julkaistujen kuuden oppaan perusteella tuonkin koodin pitäisi aueta kokonaisuudessaan.

Itse tehtävästäsi:

a) Tee, kuten tehtävänannossa lukee: korjaa virheet, joista kääntäjä ilmoittaa.
b) Tee, kuten tehtävänannossa lukee.
c) Korvaa jokainen MIN sanaksi MINIMI ja MAX sanaksi MAKSIMI.
d) Lue kolmannesta C++-oppaasta, kuinka if-lauseet toimivat, ja korvaa ohjelman if-lauseet uusilla niin, että saat tulostettua oikein kaikki nuo kolme tekstiä, jotka käsketään tulostaa.

Tee tehtävän kohdat yksitellen; myöhemmät ehkä aukeavat paremmin, kun saat ensimmäiset tehtyä.

Joonaps [23.08.2009 16:17:28]

#

Kiitos teuro
elikkä #define MAX jne... ei tarvita ollenkaan?
tuleeko const int MAKSIMI... jättää toiminnon ulkopuolelle vai sisään?

eli esim :

#include <iostream>
using namespace std;
int main(void)
{
int luku1, luku2, summa;
const int MAKSIMI = 20;
const int MINIMI = 10;
            cout << "syötä luku1: ";
            cin >> luku1;..................
.
.
.
.
return o;
}

vai olenko oikeilla raiteilla?


PS: toista opasta ehdottaneille:
Kiitos ehdotuksesta mutta tämä on itseasiassa koulutehtävä, joten en voi välttää :)

olen tätä koittanut itse jo vääntää pidemmänkin aikaa mutta oli pakko turvautua ulkopuoliseen apuun kun ei tuntunut vääntyvän.
ja deadlineen ei ole montaa tuntia.

Hakoulinen [23.08.2009 16:19:43]

#

Olet oikealla suunnalla jo.

const int MAKSIMI

ja

# MAKSIMI

tarkoittavat käytännössä samaa. Sinun pitäisi vielä soveltaa määrittelemiä vakioitasi if-lauseiden ehtoihin.

Teuro [23.08.2009 16:20:32]

#

define MAX 20 toimisi aivan yhtä hyvin, mutta kääntäjä ei tiedä muuttujan tyyppiä. Eikä näin ollen osaa varoittaa väärästä käytöstä. Näin olen sen siis antanut itselleni kertoa. Mitä tarkoitat "toiminnon ulkopuolelle jättämisellä"? Jos tarkoitat, että voitko määritellä ne main funktion sisällä, niin kokeile kääntäjällä tai lue oppaasta, kuten täällä on jo neuvottu.

Periaate on, että muuttuja on käytettävissä sen määrittelystä eteenpäin aina lohkon loppun asti.

EDIT:

Mistä koulusta tulee näin luokatonta koodia?

Joonaps [23.08.2009 16:24:25]

#

Kiitos vastanneille avusta.

Sainkin koodin selvitelyä ja muutettua kääntökelpoiseksi.
Uskoisin ohjelman nyt toimivan niinkuin sen pitääkin. Jos jotain kiinnostaa lopputulos niin:

#include <iostream>
using namespace std;
int main(void)

{
int summa, luku1, luku2;

const int MAKSIMI = 20;
const int MINIMI = 10;

	cout << "syota luku1: ";
	cin >> luku1;

	cout << "syota luku2 ";
	cin >> luku2;

	summa = luku1 + luku2;

	if (summa > MAKSIMI)
	{
		cout << "summa on suurempi kuin" << MAKSIMI << "\n";
	}
	else if (summa < MINIMI)
	{
           cout << "summa on pienempi kuin " << MINIMI <<"\n";
	}
	else
	{
	cout << "Summa on MINIMIN ja MAKSIMIN välissä" << "\n";
	}

cin.get();
return 0;
}

Ja ohjelman suoritus näyttää tältä :

(min ja maks välissä:)
joona@joona-laptop:~/ohjelmointi/c++$ ./KT_1
syota luku1: 12
syota luku2 3
Summa on MINIMIN ja MAKSIMIN välissä

(suurempi kuin maks:)
joona@joona-laptop:~/ohjelmointi/c++$ ./KT_1
syota luku1: 20
syota luku2 5
summa on suurempi kuin20

(pienempi kuin min:)
joona@joona-laptop:~/ohjelmointi/c++$ ./KT_1
syota luku1: 5
syota luku2 1
summa on pienempi kuin 10

Kiitos kaikille todella paljon avusta, jos en olisi saanut täältä tietoa tuosta MAX / MIN ongelmasta niin olisin luultavasti joutunut jättämään tehtävän tekemättä ja täten en olisi oppinutkaan mitään!

Mod. lisäsi kooditagit

Metabolix [23.08.2009 16:58:10]

#

Ohjelman varmaankin pitäisi tulostaa "10:n ja 20:n välissä" eikä kirjaimellisesti "MINIMIN ja MAKSIMIN".

Toisen oppaan lukeminen ei mitenkään tarkoita, ettet silti voisi tehdä koulutehtäviäsi. Tuon tehtävän perusteella vain vaikuttaa, ettei koulusi opetusmateriaali ole kovin hyvälaatuista. Jostain muusta oppaasta voisit oppia asiat paremmin, ja sen jälkeen osaisit tehdä koulutehtävätkin paremmin.

Voisit myös jatkossa käyttää viesteissäsi kooditageja, ettei moderaattorien tarvitse korjata joka kerta.

Teuro [23.08.2009 17:01:41]

#

Olet jättänyt Laske(int a, int b); funktion esittelemättä ja toteuttamatta. Lopputulokseen sillä ei toki ole merkitystä, mutta kuuluisiko se kuitenkin olla mukana kuvioissa? Ainakin se tuolla ensimmäisessä versiossa on mukana, joskin hiukan hassusti toteutettuna.

Joonaps [23.08.2009 17:11:50]

#

Teuro kirjoitti:

Olet jättänyt Laske(int a, int b); funktion esittelemättä ja toteuttamatta. Lopputulokseen sillä ei toki ole merkitystä, mutta kuuluisiko se kuitenkin olla mukana kuvioissa? Ainakin se tuolla ensimmäisessä versiossa on mukana, joskin hiukan hassusti toteutettuna.

Hmm.. varmaksihan tätä en voi sanoa mutta luulisin sen vihjaavan luku1 ja luku2 yhteenlaskemiseen.

tarkoituksenahan oli korjata virheet ja saada ohjlemasta kääntökelpoinen sekä suorioutumaan oikealla tavalla, joten veikkaisin suurimman osan koodia olleen vain ns. "hämäykseksi" jätettyä.
-----

Metabolix:
Kiitos vinkistä, meinaisitko että tekisin nykyisen sijasta:

cout << "Summa on << MINIMI << ja << MAKSIMI << välissä" << "\n";

Teuro [23.08.2009 17:15:43]

#

Kuten sanottua ei vaikuta mitenkään lopputulokseen, käisitit kuitenkin oikein se liittyy tuohon yhteenlaskuun. Metabolix tarkoitti juuri tuota tapaa, jolla olet tehnyt tuon viimeisimmän koodin.

Metabolix [23.08.2009 17:16:06]

#

Joonaps kirjoitti:

Kiitos vinkistä, meinaisitko että tekisin nykyisen sijasta:

cout << "Summa on << MINIMI << ja << MAKSIMI << välissä" << "\n";

Suunnilleen noin mutta vielä oikein. ;) Nythän tuossa tulostuisi aivan harvinaisen kryptinen ilmoitus.

Joonaps [23.08.2009 17:20:37]

#

Jep kiitos avusta.

Lopputulos näyttää tällä hetkellä tältä:

joona@joona-laptop:~/ohjelmointi/c++$ ./KT_1
syota luku1: 10
syota luku2 1
Summa on minimin: 10 ja maksimin: 20 välissä

Sivun alkuun

Vastaus

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

Tietoa sivustosta