Wstęp do programowania w języku C/Instrukcja while

From Studia Informatyczne

while

Rozpoczniemy od rozwiązania bardzo prostego zadania.

Na wejściu dany jest ciąg liczb całkowitych dodatnich. Kolejne liczby w ciągu są pooddzielane pojedynczymi spacjami lub znakami końca wiersza. Ostatnim elementem danych wejściowych jest 0, które oznacza koniec danych. Należy napisać program, który znajduje największą i najmniejszą liczbę w ciągu wejściowym.

#include <stdio.h>
 
main()
{
  long min, max, kolejna;
 
  scanf("%d", &kolejna);
 
  if (kolejna > 0){
    min = kolejna;
    max = kolejna;
    scanf("%d", &kolejna)
    while ( kolejna ){
      if (kolejna > max)
        max = kolejna;
      else
        if (kolejna < min)
          min = kolejna;
      scanf("%d", &kolejna);
    }
    printf("min = %d, max = %d\n", min, max);
  }
  else
    printf("Ciag wejsciowy jest pusty.\n");
  return 0;
}

W tym programie mieliśmy przykład użycie instrukcji iteracyjnej "dopóki". Oto ogólna postać instrukcji dopóki:

while (wyrażenie) {instrukcja}

Wykonanie "dopóki" polega na wykonywaniu instrukcji za każdym razem, gdy wartość wyrażenia jest różna od 0 (czyli ma wartość logiczną PRAWDA). Instrukcja nie jest wykonywana ani razu, gdy na samym początku wartością wyrażenia jest 0 (FAŁSZ).

do while

Oto wzór iteracyjny na liczenie coraz dokładniejszych przybliżeń \sqrt{(n)}.

  • x_0 = dowolna dodatnia liczba całkowita
  • x_i = \frac{x_{i-1}+n}{x_{i-1}+1}, dla i>0.

Niech \epsilon będzie liczbą rzeczywistą większą od 0. Kończymy iterowanie, gdy x_i - x_{i-1} < \epsilon.

Oto program liczenia pierwiastka kwadratowego z zadaną dokładnością \epsilon.

#include <stdio.h>
#include <math.h>
 
main()
{
  double x_i, x_i_minus_1, epsilon;
  long int n;
  int ile_po_kropce;
 
  printf("n = ");
  scanf("%d", &n);
  if (n < 0)
    printf("Niepoprawne dane: n < 0.\n");
  else if (n <= 1)
    printf("sqrt(%d) = %d\n", n, n);
  else{
    printf("Do ktorego miejsca po kropce? ");
    scanf("%d",&ile_po_kropce);
    if (ile_po_kropce < 0 ){
      printf("Liczba miejsc po kropce");
      printf(" powinna byc nieujemna.");
    }
    else{
      epsilon =  pow(10,-ile_po_kropce);
      x_i = 1;
 
      do{
        x_i_minus_1 = x_i;
        x_i = (x_i_minus_1 + n)/(x_i_minus_1 + 1);
      }while ( fabs(x_i - x_i_minus_1) >= epsilon );
 
      printf("sqrt(%d) = %*.*f\n", n,
        ile_po_kropce+2, ile_po_kropce, x_i);
    }
  }
 
  return 0;
}

Do liczenia pierwiastka użyliśmy instrukcji iteracyjnej

do instrukcja while (wyrażenie) ;

Instrukcja jest zawsze wykonywana co najmniej raz, a następnie za każdym razem, gdy wartość wyrażenia jest różna od 0.

Instrukcje while oraz do ... często nazywamy pętlami. Pętle można zagnieżdżać. Rozważmy następujące zadanie.

Liczbami Duffy'ego nazywamy liczby naturalne większe od 1 które nie są liczbami pierwszymi i których suma dzielników właściwych nie jest podzielna przez żaden z dzielników właściwych różnych od 1. Dla danej liczby naturalnej n > 3 należy znaleźć wszystkie liczby Duffy'ego nie większe od n.

#include <stdio.h>
#include <math.h>
 
#define bool int
#define TRUE 1
#define FALSE 0
 
main()
{
  long int n, m, suma_po, i, m_div_2;
  bool duffy_nr;
 
  printf("n = ");
  scanf("%d", &n);
  printf("Liczby Duffy'ego <= %6ld\n",n);
 
  m = 3;
  while ( m < n ){
 
    m = m + 1;
    suma_po = 0;
    i = 1;
    m_div_2 = m/2;
    while ( i <= m_div_2 ){
      if ( (m % i) == 0)
        suma_po = suma_po + i;
      i = i+1;
    }
 
    duffy_nr = FALSE;
    if ( suma_po > 1 ){
      duffy_nr = TRUE;
      i = 1;
      do{
        i = i + 1;
        if ( (m % i) == 0 )
          duffy_nr = ( suma_po % i ) != 0;
      } while ( duffy_nr && ((i+1) <= (m_div_2)) );
 
    if (duffy_nr)
      printf("%10ld\n", m);
    }
  }
  return 0;
}