Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

4 - Cykly

1. Výpočet odmocniny metodou binárního půlení

#include <stdio.h>
#include <math.h>
 
double odmocnina (double cislo, double presnost)
{
    double horni_mez = cislo;
    double dolni_mez = 0;
    double stred = (horni_mez + dolni_mez) / 2;
 
    while (fabs(stred*stred - cislo) > presnost)
    {
        printf("%4.4f %4.4f %4.4f\n", dolni_mez, stred, horni_mez);
 
        if (stred*stred > cislo)
            horni_mez = stred;
        else
            dolni_mez = stred;
 
        stred = (horni_mez + dolni_mez) / 2;
    }
    return stred;
}
 
int main()
{
    float a, b;
 
    printf("zadej cislo: ");
    scanf("%f", &a);
    printf("zadej presnost: ");
    scanf("%f", &b);
 
    printf("odmocnina cisla %4.4f s presnosti %4.4f je %4.4f\n", a, b, odmocnina(a, b));
 
    return 0;
}

2. Výpočet Ludolfova čísla metodou Monte Carlo

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
 
#define SEED 35791246
 
main(int argc, char* argv)
{
   int niter=0; /* počet iterací algoritmu */
   double x,y;
   int count=0; /* počet bodů v 1. kvadrantu jednotkové kružnice */
   double z;
   double pi;
 
   printf("Zadejte pocet iteraci pro vypocet PI: ");
   scanf("%d",&niter);
 
   /* initialize random numbers */
   srand(SEED);
 
   for (int i=0; i<niter; i++) 
   {
      x = (double)rand()/RAND_MAX;
      y = (double)rand()/RAND_MAX;
      z = x*x+y*y;
      if (z<=1) count++;
   }
   pi=(double)count/niter*4;
   printf("PI = %g / %i iteraci\n", pi, niter);
 
   return 0;
}

3. Ciferný součet

#include <stdio.h>
 
int main()
{
    int a, s = 0;
 
    printf("Zadej cele cislo: ");
    scanf("%i", &a);
 
    while (a > 0)
    {
        s += a % 10;
        a /= 10;
    }
 
    printf("Ciferny soucet cisla %i je %i\n", a, s);
 
    return 0;
}

4. Armstrongovo číslo

#include <stdio.h>
#include <math.h>
 
int main() 
{
    int cislo, vstup, zbytek, n = 0;
    float vysledek = 0.0;
 
    printf("Napis cele cislo: ");
    scanf("%d", &vstup);
 
    // zjisteni poctu cifer cisla n
    for (cislo = vstup; cislo != 0; ++n) 
    {
        cislo /= 10;
    }
 
    for (cislo = vstup; cislo != 0; cislo /= 10) 
    {   
        zbytek = cislo % 10;
        // soucet n-tych mocnin jednotlivych cifer cisla
        vysledek += pow(zbytek, n);
    }
 
    // pokud je soucet n-tych mocnin cifer cisla roven cislu samotnemu, je to Armstrongovo cislo
    printf ("%d %s Armstrongovo cislo.\n", vstup,  ((int)vysledek == vstup) ? "je" : "neni");
 
    return 0;
}

5. Součet nalezení maxima z řady čísel na standardním vstupu

#include <stdio.h>
 
int main()
{
    // promenna pro nactenou hodnotu (provedenou konverzi)
    int a;
    // pocitadlo nactenych cisel
    int i = 0;
    // aktualni nalezene maximum z rady cisel
    // lze ho nastavit napr. na nejmensi mozne cislo v datovem typu
    int max;
 
    while (scanf("%i", &a) > 0)
    {
        // prvni nactene cislo je zcela jiste aktualne nejvetsim
        if (i++ == 0)
        {
            // nasledujici prirazeni se provede jednou
            // pak jiz podminka neni platna
            max = a;
        }
        // pokud je cislo a vetsi nez dosavadni nalezene maximum
        // stava se cislo a novym maximem
        if (a > max)
        {
            max = a;
        }
    }
    printf("maximum z rady: %i\n", max);
 
    return 0;
}

courses/b0b99prpa/solutions/lab04.txt · Last modified: 2021/10/27 14:34 by viteks