Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Summa eri kertoimilla

Sivun loppuun

JRokka [21.05.2020 14:08:30]

#

Lasketaan summa eri kertoimilla yhdellä for-silmukalla.

#include <iostream>
using namespace std;

int main(){
 int luvut[10] = {13,6,6,16,2,12,10,5,17,8};
 int summa = 0;
 int kerroin = 0;
 for (int x = 0; x < 10; x++){
  cout << luvut[x] << endl;
 }
 //Lasketaan summa kertoimilla 1-10.

 for (int x = 0; x < 100; x++){
  if (x % 10 == 0){
   //Kasvatetaan kerrointa ja näytetään edellinen summa.
   cout << kerroin << ":" << summa << endl;
   kerroin++;
   summa = 0;
  }
  summa += kerroin*luvut[x%10];
 }
 cout << kerroin << ":" << summa << endl;

 cout << "///" << endl;
 return 0;
}

jalski [21.05.2020 17:03:16]

#

Miksi yrität hienostella luettavuuden kustannuksella? Jos selkeään toteutukseen vaaditaan kaksi silmukkaa, niin käytä kahta silmukkaa! Monesta laittamastasi koodista ei saa yhdellä vilkaisulla tolkkua. Tämäkin koodi olisi myös todennäköisesti nopeampikin kahden silmukan toteutuksella!

Monen ohjelmointikielen kirjastoissa löytyy valmiit selkeät ja tehokkaat toteutukset tämän tapaisiin tehtäviin.

Alla sama tehtävä 8th ohjelmointikielellä:

[13,6,6,16,2,12,10,5,17,8] constant luvut

: multiply-and-sum
  >r luvut ( r@ n:* ) a:map ' n:+ 0 a:reduce
  r> "kerroin: %3d summa: %4d\n" s:strfmt . ;

: app:main
  "Luvut: " .
  luvut ( . space ) a:each! drop cr cr
  ' multiply-and-sum 1 10 loop
  bye ;

vesikuusi [21.05.2020 20:19:20]

#

Ei tosin tuosta 8th-koodistakaan moni tämän foorumin vierailija saa yhdellä vilkaisulla tolkkua.

jalski [21.05.2020 23:04:51]

#

vesikuusi kirjoitti:

Ei tosin tuosta 8th-koodistakaan moni tämän foorumin vierailija saa yhdellä vilkaisulla tolkkua.

No, tuo onkin tottumiskysymys... Pointti kuitenkin oli, että miksi tehdä väkisin yhden silmukan avulla luettavuuden kustannuksella kun tuo on pidempi ja hitaampi kuin suoraviivainen kahden sisäkkäisen silmukan toteutus:

#include <iostream>
using namespace std;

int main() {
  int luvut[10] = { 13,6,6,16,2,12,10,5,17,8 };

  for (int i = 0; i <  10; i++) {
    cout << luvut[i] << endl;
  }

  //Lasketaan summa kertoimilla 1-10.
  for (int k = 1; k <= 10; k++) {
    int summa = 0;
    for (int i = 0; i < 10; i++) {
      summa += k*luvut[i];
    }
    cout << k << ":" << summa << endl;
  }
  cout << "///" << endl;
  return 0;
}

Ohjelman tulostus on kauhea kun en viitsinyt korjata 8th versiota vastaavaksi...

tositoo [26.05.2020 17:06:38]

#

Mistä tässä puhutaan, koodista vai hienostelusta? Vai onko tämän aiheena kauheat koodit? Ei koodit näytille alueella tarvitse olla maailman parhaimpia koodeja.

jalski [26.05.2020 19:25:42]

#

tositoo kirjoitti:

Mistä tässä puhutaan, koodista vai hienostelusta? Vai onko tämän aiheena kauheat koodit? Ei koodit näytille alueella tarvitse olla maailman parhaimpia koodeja.

Ei koodit näytille alueellekaan tarvitse silti ihan kaikkea koodia laittaa. Toivottavaa olisi, että koodi esittelisi jonkun näppärän tai kiinnostavan tavan toteuttaa joku asia! Totesin vaan, että silmukoiden määrä koodissa ei välttämättä ole se paras suorituskyvyn mittari. Lisäksi turha kikkailu luettavuuden kustannuksella ei ihan oikeasti kannata. Monesti nykypäivänä kääntäjä osaa tehdä parempaa työtä kuin yksinkertainen yritys optimoida käsin...

tositoo [27.05.2020 08:42:22]

#

No jaa, miten nyt ajattelee.

TapaniS [27.05.2020 09:00:26]

#

JRokka on kooditaiteilija ja hänen hienot esimerkkinsä korostavat erilaisia tapoja toteuttaa muuten hyvin yksinkertaisia ongelmanratkaisuja.


Sivun alkuun

Vastaus

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

Tietoa sivustosta