Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Silmukan aloittaminen alusta ja luvun toisto

JRokka [31.12.2019 00:05:37]

#

Tässä ohjelmassa aloitetaan while-silmukkaa alusta ja toistetaan kolmella jaollisia lukuja.

Koodi

#include <iostream>
using namespace std;

int main(){
 int min = 0;
 int luku = 0;
 bool onko = false;
 //Suoritetaan silmukalle kaksi tuomintoa.
 //Ensimmäisessä silmukassa aloitetaan silmukka alusta, kun luku on jaollinen kolmella.
 while (luku < 100){
  if (luku % 3 == 0 && onko == false){
   //Aloitetaan silmukka alusta.
   luku = 0;
   onko = true;
  }
  else {
   luku++; //Seuraava luku.
  }
  if (luku == min){
   //Olemme päässeet samaan lukuun kuin ennen nollausta.
   min += 3; //Kasvatetaan minimiä.
   onko = false;
  }
  cout << luku << endl;
 }
 //Seuraavassa silmukassa toistetaan luku kymmenen kertaa, jos luku on kolmella jaollinen.
 luku = 0;
 int kerta = 0;
 cout << "" << endl;
 while (luku < 100){
   if (luku % 3 == 0){
    //Luku on kolmella jaollinen toistetaan sitä.
    kerta++; //Lasketaan kerrat.
   }

   else {
     luku++; //Seuraava luku
   }
   if (kerta == 10){
    //Lukua on toistettu kymmenen kertaa siirrytään seuraavaan lukuun.
    kerta = 0;
    luku++;
   }
   cout << luku << endl;
 }
 return 0;
}

Metabolix [31.12.2019 03:10:53]

#

Tässä ei ole mitään järkeä. Koodia joutuu lukemaan huolella läpi, jotta saa jonkin käsityksen, mitä se tulostaa, ja lopputulos on niin outo, että mahtaako olla tarkoituksella niin.

Vaikeinta tässä on se, että kuvaat kommenteissa koodin kulkua etkä tarkoitusta. Yleensä selitetään juuri sitä tavoitetta. Tässä on ilmeisesti tarkoitus tulostaa lukuja tietyssä järjestyksessä, muutenhan koko silmukka olisi turha. Kommentit tai viestisi leipäteksti eivät kerro, mikä se toivottu tulostus on.

Koodi olisi paljon selvempi sisäkkäisillä for-silmukoilla ja joka tapauksessa ilman tuota onko-muuttujaa. Silloin koodista näkisi heti, mitä tapahtuu, ja voisi olla varma, että tulos on tarkoituksellinen. Osaatko tehdä niin?

The Alchemist [31.12.2019 06:22:25]

#

Koodin toiminnan näkee lukemalla koodia ja jos ei näe, niin ongelma ei ratkea kirjoittamalla koodi suomeksi kommentteihin vaan kirjoittamalla koodi niin, ettei se ole sekavaa paskaa. Vain silloin, kun oikeasti tehdään jotain algoritmisesti monimutkaista, on koodin toimintaa avaavasta kommentista hyötyä. Josset ymmärrä, mitä "luku++" tekee ilman kommenttia sen perässä, niin silloin ei kannata edes yrittää koodata.

Sitä paitsi ne kommentit, jotka yrittävät kuvata ohjelman toimintaa, ovat kaikki väärin, koska ne eivät kuvaa sitä.

Teuro [05.01.2020 12:15:35]

#

Koodi tuottaa tuloksena listan luvuista välille alku - loppu. Luvut ovat järjestyksessä, sekä aina vuorossaolevan luvun ollessa kolmella jaollinen tulostetaan luvut alku - vuorossaoleva luku. Seuraavaksi tulostetaan luvut väliltä alku - loppu järjestyksessä. Tässä välissä tulostetaan yksi rivinvaihto. Viimeisenä tulosteaan luvut välille alku- loppu järjestyksessä. Luvun ollessa kolmella jaollinen tulostetaan luku kymmenen kertaa paitsi jos luku on nolla. Luvun ollessa nolla tulostetaan lukua vain yhdeksän kertaa.

Koodin rakenne on kohtalaisen vaikeasti toteutettu ja osa tulostuksesta on luultavasti väärin. Arvelen ettei lukuja ole tarkoitus tulostaan järjestyksessä näiden kahden silmukan välissä. Ainakaan kuvaus toiminnasta ei tue tätä oletusta. Oletettavasti muuttuja onko häiritsee koodin toimintaa. Toisessa silmukassa on epäilemättä tarkoitus tulostaa myös lukua nolla kymmenen kertaa, mutta tulostus on väärässä paikassa.

Vaikka tämä ei mikään todellinen tehtävä ehkä olekaan, niin kirjoittelin silti toimivamman version koodista. Tuloksena on 2125 rivin tulostus. Aloittajan koodi tuottaa 2225 rivin tulostuksen johtuen juurikin tuosta lukujen tulostamisesta järjestyksessä.

#include <iostream>

int main() {
	int alku = 0;
	int loppu = 100;
	int laskuri = alku;

	/**
		* Tulostetaan luvut alku - loppu järjestyksessä
		* Luvun ollessa jaollinen kolmella tulostetaan luvut alku - luku
	**/

	while (laskuri <= loppu) {
		if (laskuri % 3 == 0) {
			for (int i = alku; i <= laskuri; ++i) {
				std::cout << i << std::endl;
			}
		}

		++laskuri;
	}

	std::cout << std::endl;
	laskuri = alku;

	/**
		* Tulostetaan luvut väliltä alku - loppu
		* kolmella jaolliset tulostetaan 10 kertaa peräkkäin
	**/

	while (laskuri <= loppu) {
		std::cout << laskuri << std::endl;

		if (laskuri % 3 == 0) {
			for (int i = 1; i < 10; ++i) {
				std::cout << laskuri << std::endl;
			}
		}

		++laskuri;
	}

	return 0;
}

Vastaus

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

Tietoa sivustosta