Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

1.6 do- while - silmukka

Aikaisemmin olemme tutustuneet erääseen algoritmiin selvittää onko luku alkuluku vai ei. Koska algoritmi on valmis, voimme kirjoittaa vastaavan ohjelman (% - operaattori antaa jakojäännöksen, 10 % 3 == 1 ):

c-silm\alkuluku.c - testataan onko luku alkuluku

	#include <stdio.h>
	
	/****************************************************************************/
	int pienin_jakaja(int luku)
	/* Palautetaan luvun pienin jakaja (alkuluvulle 1).
	 Algoritmi:
	   Negatiivisesta luvusta otetaan itseisarvo.
	   Kokeillaan jokaista pienempää jakajaa 2,3,5,7 jne, kunnes
	   jako menee tasan tai jakaja on liian iso ollakseen luvun jakaja.
	*/
	{
	  int jakojaannos,jakaja=2,kasvatus=1;
	  if ( luku < 0 ) luku = - luku;
	  if ( luku == 2 ) return 1;
	  do {
	    jakojaannos = luku % jakaja;
	    if ( jakojaannos == 0 ) return jakaja;
	    jakaja  += kasvatus;
	    kasvatus = 2;
	  } while ( jakaja < luku/2 );
	  return 1;
	}
	
	/****************************************************************************/
	int main(void)
	{
	  int luku,jakaja;
	  printf("Tutkin onko luku alkuluku.  Anna luku >");
	  scanf("%d",&luku);
	  jakaja = pienin_jakaja(luku);
	  if ( jakaja == 1 )
	    printf("Luku on alkuluku.\n");
	  else
	    printf("Luku on jaollinen esimerkiksi luvulla %d.\n",jakaja);
	  return 0;
	}

Käytimme tässä silmukkaa:

	do 
	  lause 
	while (ehto); 

Koska esimerkin silmukassa oli useita suoritettavia lauseita, oli lauseet suljettu lausesuluilla. Jälleen voi olla hyvä tapa käyttää AINA lausesulkuja.

Huomautus! Silmukoiden kanssa on syytä olla tarkkana sekä 1. kierroksen että viimeisen kierroksen kanssa. Myös silmukan lopetusehdon on syytä muuttua silmukan suorituksen aikana.

Eräs tyypillinen esimerkki do- while silmukan käytöstä olisi seuraava:

c-silm\dowhile.cpp - lukujen lukeminen kunnes halutulla välillä

	#include <stdio.h>
	#include <iostream.h>
	#include <string>
	using namespace std;
	
	int main(void)
	{
	  int luku;  string s;
	  do {
	    cout << "Anna luku väliltä [0-20]>";
	    getline(cin,s);
	  } while ( ( sscanf(s.c_str(),"%d",&luku) < 1 ) || ( luku<0 ) || ( 20<luku ) );
	  cout << "Annoit luvun " << luku << endl;
	  return 0;
	}


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys