Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ saman muuttujan eri arvot silmukassa

Sivun loppuun

cshele [28.01.2021 09:56:10]

#

Miten saa käytettyä samaa muuttujaa monen eri syötearvon käsittelyyn ja lopuksi laskettua kaikki (tässä tapauksessa 5) arvot yhteen do-while -toimintoa hyödyntäen? Olen vasta aloittanut ohjelmoinnin c++ -kielellä, eikä monimutkaisemmat silmukkajutut ihan vielä aukea ilman avustusta.

Kyseessä on ohjelma,jolla voi laskea viiden eri tuomarin antamat pisteet yhteen ja kaikkien pisteitä tulee käsitellä saman muuttujan arvoina.

Teuro [28.01.2021 10:11:38]

#

Mitä siis tarkalleen pitää tapahtua? Esimerkiksi tuomarien pisteiden summan saa laskettua ihan helposti silmukassa. Ovatko tuomarien pisteet valmiina taulukossa, vai pitääkö niiden lukeminen toteuttaa myös? Noin muutoin en ihan ymmärrä mitä tarkoitat "käsitellä saman muuttujan arvoina" ilmaisulla.

AtskaFin [28.01.2021 10:27:40]

#

Syötettä voi käsitellä saman muuttujan arvoina seuraavalla tavalla:

int x;
for (int i = 0; i < 5; i++) {
  cin >> x;
  // tee jotain x:n arvolla (laske summaa toiseen muuttujaan)
}

En kyllä ymmärrä miksi pitäisi do while -rakennetta käyttää.

Grez [28.01.2021 10:58:14]

#

AtskaFin kirjoitti:

En kyllä ymmärrä miksi pitäisi do while -rakennetta käyttää.

Jos määrä ei olekaan vakio vaan tuo "tässä tapauksessa 5" oli vaan esimerkki.

Sinänsä for ja do ovat lopputuloksen kannalta ihan identtisiä ja tekemisen luonteesta riippuu kumpi on "tyylikkäämpää". Periaatteessa voisi koodata kokonaan ilman toista.

cshele [28.01.2021 11:20:20]

#

Tehtävänanto menee näin:

Ohjelma, joka laskee mäkihyppääjälle pisteet. Mäkihypyssä on viisi arvostelutuomaria. Ohjelma kysyy hypyn pituuden sekä arvostelutuomareiden hyppääjälle antamat tyylipisteet. Lopuksi ohjelma tulostaa hyppääjän saaman pistemäärän: tyylipisteet + 0,9 * hypyn_pituus. Lopussa ohjelma kysyy: "Uudelleen (k/e)?". 

Hypyn pituus ja kunkin eri tuomarin antamat tyylipisteet kysytään seuraavasti:  

·       Anna hypyn pituus, metriä:

·       Anna 1. tuomarin tyylipisteet:

·       Anna 2. tuomarin tyylipisteet:

·       Anna 3. tuomarin tyylipisteet:

·       Anna 4. tuomarin tyylipisteet:

·       Anna 5. tuomarin tyylipisteet:


Käsittele tuomarien tyylipisteet yhdellä muuttujalla, jolloin tähän kohtaan syntyy silmukka.

Lisäksi vielä toiminto, joka kuten oikeassa kilpailussa poistaa tyylipisteistä pienimmän ja
suurimman pistemäärän.


Ohjelman runko on toimivassa muodossa, mutta tässä monen luvun käsittely samalla muuttujalla loppuu minulta taidot kesken.

AtskaFin [28.01.2021 11:27:20]

#

Laitatko näytille sen mitä olet saanut jo tehtyä?

Metabolix [28.01.2021 11:44:27]

#

Tämä ”samalla muuttujalla käsittely” menee siis aivan noin, kuten AtskaFin yllä esitti. Tosin selvyyden vuoksi int x kannattaa myös sijoittaa silmukan sisäpuolelle. Koska määrä on tiedossa (viisi), for-silmukka sopii tähän vaiheeseen paremmin kuin do–while.

Lue hypyn pituus.

Toista 5 kertaa:
  Lue tuomarin (i) pisteet.
  Lisää pisteet summaan.
  Pidä kirjaa pienimmästä ja suurimmasta.

Laske ja ilmoita tulos.

Tehtävän lopussa on mainittu tuo ”uudelleen (k/e)”, eli varmaan tehtävässä on ajateltu, että do–while olisi koko yllä kuvatun koodin ympärillä ja sillä toteutettaisiin tuo uudelleen suorittaminen:

do
  Hoida tuomarointi.
  Kysy, ajetaanko uudelleen.
while (käyttäjä valitsi, että ajetaan uudelleen).

Näin tehtynä do–while-silmukassa on se huono puoli, että ehtoon käytettävän muuttujan joutuu esittelemään jo ennen silmukkaa. Koodista tulee selvempi, jos käyttää ”ikuista” while-silmukkaa ja break-komentoa tai jos laittaa kysymyksen funktioon:

Esim. näin:

while (true) {
  hoida_tuomarointi();

  char jatkoon = 'e';
  cin >> jatkoon;
  if (jatkoon != 'k') {
    break;
  }
}

Tai näin:

do {
  hoida_tuomarointi();
} while (jatketaanko());

cshele [28.01.2021 11:56:12]

#

Uudelleenajo on tarkoitus tehdä koko ohjelmalle

cshele [28.01.2021 20:17:40]

#

Tällä hetkellä tällainen, en ihan vieläkään aloittelijana ymmärtänyt, miten käytännössä tuo for-silmukalla saman muuttujan 5 eri syötearvoa saa laskettua yhteen. Kiitos, että taitavammat jaksavat neuvoa aloittelijaa.

int main()
{
	setlocale(LC_ALL, "fi_FI");

	char vastaus;
	int hyppy, piste, tuomari, laskuri, tulos;

	do
	{
	cout << "Anna hypyn pituus, metriä \t";
	cin >> hyppy;

	cout << endl;


/*	tuomari = 1;
	while(tuomari <= 5)
	{

	cout << "\t  Anna " << tuomari << ". tuomarin tyylipisteet:  ";
	cin >> piste;

	tuomari++;
	}*/
      //näin aloin värkätä silmukkaa saman muuttujan käyttämiseksi, mutta tajusin, ettei sitä ilmeisesti voi tehdä läheskään tällä tavalla.


	cout << endl << "Hypyn kokonaispisteet \t" << tulos;
  //Tässä vasta hahmoteltuna paikka tuolle tuloksen esittämiselle.


			do
			{

			cout << "\n\nLasketaanko seuraavankin hypyn pisteet? k =kyllä, e =ei\t";
			cin >> vastaus;

			system("cls");

			} while (vastaus != 'K' and vastaus != 'k' and vastaus != 'E' and vastaus != 'e');

	} while (vastaus == 'K' or vastaus == 'k');


	cout << endl << endl;

	system("pause");
	return 0;
}

Metabolix [28.01.2021 21:38:09]

#

Kyllä tuo luonnoksesi on ihan oikein. Sinun pitää vain ennen silmukkaa asettaa summa = 0 ja silmukassa laskea summa = summa + piste (tai lyhennettynä summa += piste). Vastaavasti voit pitää kirjaa pienimmästä ja suurimmasta, eli ennen silmukkaa voit asettaa pienin = 10 ja suurin = 0 ja silmukassa voit korjata näitä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta