Anglická verze
logolink

< Zpět na seznam lekcí

Základní programátorské konstrukce I

AlgortimyObsah lekce:

  • Funkce JeVetsi pro porovnání dvou zadaných hodnot
  • Procedura Setrid, která setřídí pole od nejmenšího čísla po největší
  • Funkce Maximum, která vrátí největší prvek pole

Funkce JeVetsi pro porovnání dvou zadaných hodnot

Chceme vytvořit proceduru, která porovná dvě zadaná čísla a vrátí 1 proměnné AjeVetsiNezB (je logická hodnota datového typu int, který může mít hodnotu 1 nebo 0), pokud je první z nich větší než druhé. Jinak vrátí 0.

Mohou nastat tři různe výsledky: a = b , a < b nebo a > b. Hodnoty porovnáváme pomocí operátoru IF (podmínka) a ELSE. Začatek a konec těchto funkcí vymezujeme pomocí { a }. Pokud neplatí podmínka u IF, tak začne probíhat ELSE. Jistě si všimnete, že v programu není nikde zadána podminka a > b. Není tam uvedena, protože pokud neplatí ani jedna z dvou předchozích možností( a = b , a < b ), tak musí logicky platit, že a > b .

Algoritmus pro porovnávání dvou čísel
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int a, b;
    int AjeVetsiNezB;
    
    printf("Zadejte cislo a: ");
    scanf("%d", &a);
    
    printf("Zadejte cislo b: ");
    scanf("%d", &b);
    
    if (a == b) {
        AjeVetsiNezB = 0;
        printf("%d = %d => Hodnota cisla A je rovna hodnota cisla B",a,b);
    }
    else
    {
        if (a < b) {
            AjeVetsiNezB = 0;
            printf("%d < %d => Hodnota cisla A je mensi nez hodnota cisla B",a,b);
        }
        else
        {
            AjeVetsiNezB = 1;
            printf("%d < %d => Hodnota cisla A je vetsi nez hodnota cisla B",a,b);        
        }
    }
    
    printf("Pro ukonceni programu stisknete libovolnou klavesu");
    fflush(stdin);
    getchar();
    return 0;
}				

Chceme-li také specifikovat co je má stát, když podmínka neplatí, pak příkaz IF obsahuje ještě část ELSE, která se vykoná, pokud podmínka neplatí.

Procedura Setrid, která setřídí pole od nejmenšího čísla po největší

Pokud chceme seřadit nějaké prvky v poli, musíme nejprve pole vytvořit. Konstanta n udává počet prvků v poli. Chceme-li snížit nebo zvýšit počet prvků pole, stačí změnit její hodnotu.

K naplnění pole poslouží jednoduchý FOR cyklus, který chce po uživateli zadat čísla, které má pole obsahovat.

Inicializace pole
 const int n=10;
 int p[n];

  for (int i = 0; i < n; i++) {
    printf("Zadejte hodnotu %d pole',i;
    scanf("%d", &p[i]);
   }

Čísla budeme řadit pomocí toho, ze pole budeme prochazet zleva doprava a pokud je předcházející prvek větší než prvek následující, tak je prohodíme. Analogicky prochazíme pole zprava doleva, abychom urychlili řazení. Po prvním průchodu máme na začatku pole(vlevo) nejmenší prvek a na konci (vpravo) největší prvek pole, je tedy zbytečné procházet první a poslední prvek, kdyz už jsou seřazené a tak zavedeme proměnnou k (musí být ze zacátku nastavená na 1, jinak by program správně nefungoval), která tento připad ošetří. Budeme tedy procházet pole dokud prvky nebudou seřazeny tedy dokud proměnná serazene nebude 1.

Pokud je následujíci prvek menší než předcházející, tak prohodíme čísla. Do pomocné proměnné pom uložíme hodnotu jednoho prvku. Do prvku pole, jehož hodnotu máme uloženou v pom, dosadíme hodnotu druhého prvku pole. p[i+1]=pom - nakonec do druhého prvku pole vložíme hodnotu proměnné pom

BUBBLESORT
  k=0;
  serazene=0;
  while (serazene==0) {
    serazene=1;
    for (int i = 0 + k; i < n - k; i++)
     {
      if (p[i]>p[i+1])
       {
        pom=p[i];
        p[i]=p[i+1];
        p[i+1]=pom;
        serazene=0;
       }
     }
     for (int i=(n-k-1); i > k+1; i--)
      {
       if (p[i] < p[i-1])
        {
         pom=p[i];
         p[i]=p[i-1];
         p[i-1]=pom;
         serazene=0;
        }
       }
    k=k+1;
   }

Při každém prúchodu programem se k zvýší o 1 - nebudou se řadit již seřazená čísla. Na začátku WHILE nastavíme serazene na 1 tedy předpokládáme, že prvky pole jsou už seřazené. Pokud ještě prvky nejsou seřazené a proběhne jeden z IF, serazene se změní na 0 a cyklus WHILE proběhne znovu

Algoritmus pro řazení čísel- BUBBLESORT
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
  const int n = 10;
  int p[n];
  int i, k, pom;
  int serazene;

  for (i = 0; i < n; i++) {
    printf("Zadejte hodnotu %d pole',i;
    scanf("%d", &p[i]);
  }

  k=0;
  serazene=0;

  while (serazene==0) {
    serazene=1;
    for (int i = 0 + k; i < n - k; i++)
     {
      if (p[i]>p[i+1])
       {
        pom=p[i];
        p[i]=p[i+1];
        p[i+1]=pom;
        serazene=0;
       }
     }
     for (int i=(n-k-1); i > k+1; i--)
      {
       if (p[i] < p[i-1])
        {
         pom=p[i];
         p[i]=p[i-1];
         p[i-1]=pom;
         serazene=0;
        }
       }
    k=k+1;
   }

  for (i = 0; i < n; i++) {
    if (i==1) printf("Serazene hodnoty od nejmensi po nejvetsi: %d ", p[i])
    else
     printf(", %d",p[i]);
  }

  printf("Pro ukonceni programu stisknete libovolnou klavesu");
  fflush(stdin);
  getchar();
  return 0;
}

Funkce Maximum, která vrátí největší prvek pole

Hledání maxima můžeme začít již při zadávání hodnot do pole. První zadávanou hodnotu ulozíme i do proměnné max, protože je zatím prázdná a nemáme s čím vkládaný prvek porovnávat. V podstatě tedy uvažujeme, ze první prvek pole je tím největším.

Jestliže narazíme na prvek, který je větší než hodnota max, tak ho uložíme do max.

Algoritmus pro výpis maxima
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
 const int n=10;
 int p[n];
   for (int i = 0; i < n; i++)
    {
     printf("Zadejte hodnotu %d pole: ", i);
     scanf("%d", &p[i]);
     if (i==0) max =p[0]
     else
      {
       if (p[i]>max) max=p[i];
      }
    }
   printf("\nNejvetsi prvek pole je hodnota: %d\n",max);

  printf("Pro ukonceni programu stisknete libovolnou klavesu");
  fflush(stdin);
  getchar();
  return 0;
}
webdesign, xhtml, css, php - Mgr. Michal Mikláš