Jazyk C 2013 – 3. cvičenie

Polia

Dĺžka lomenej čiary

Na dvojrozmernej mape rátajte celkovú dĺžku lomenej čiary.

  • Vyjdime zo zadania vzdialenosti pre dva body.
  • Uvažujme už nad reálnymi súradnicami, teda typu double alebo float.
  • Uvažujme nad reprezentáciou poľa bodov:

    • buď dve polia (jedno s x-ovými súradnicami, druhé s y-ovými)

      double x_suradnice[] = { 2, 5, 7, -3, 4 };
      double y_suradnice[] = { -2, 3.14, 7, 2.5, -2.71};
      
      • pozor na zrozumiteľné názvy premenných (nie x a y, ktoré sú ťažko čitateľné)
    • alebo jedno pole s xovými súradnicami na nepárnych miestach a y na párnych miestach

    • alebo dvojrozmerné pole
  • Definujme funkciu pre výpočet vzdialenosti:

    double vzdialenost(double x1, double y1, double x2, double y2) {
      return sqrt( pow(x2 - x1, 2) + pow(y2 - y1, 2) );
    }
    
  • Pozor pri prechádzaní cyklom: Polia v jazyku C nemajú svoju dĺžku!

  • Nezabudnime deklarovať počet prvkov ako konštantu v #define˛.

  • Pozor: premenné a názvy funkcií sú v C v rovnakom mennom priestore. Premenná sa nesmie volať rovnako ako funkcia (double vzdialenost vs. funkcia vzdialenost()).
  • Technická: Pripočítavanie k premennej vie využiť operátor +=.

Výsledný zdroják

#include<stdio.h>
#include<math.h>

#define POCET_BODOV 5

double vzdialenost(double x1, double y1, double x2, double y2) {
  return sqrt( pow(x2 - x1, 2) + pow(y2 - y1, 2) );
}

int main() {
  int i = 0;

  double x_suradnice[] = { 2, 5, 7, -3, 4 };
  double y_suradnice[] = { -2, 3.14, 7, 2.5, -2.71};

  double celkova_vzdialenost = 0;

  for(i = 0; i < POCET_BODOV - 1; i++) {
    celkova_vzdialenost = celkova_vzdialenost
       + vzdialenost(x_suradnice[i], y_suradnice[i], x_suradnice[i+1], y_suradnice[i+1]);
  }

  printf("Vzdialenost je: %f", celkova_vzdialenost);

  return 0;
}

Príklady pretečenia polí

Vytvorte pole piatich čísiel a prejdite jeho prvých 10 (sic!) prvkov

Jazyk C nekontroluje medze polí! Nič nebráni načítavať dáta z indexu, ktorý nepatrí poľu. Tam, kde v Jave nastáva ArrayIndexOutOfBoundsException, v C sa číta z cudzej pamäte. Program môže vracať náhodné dáta (najhorší prípad), alebo spadne na Segmentation Fault (pozitívna indikácia, že čítame z pamäte, ktorá nepatrí programu.)

Skúste dokonca záporné indexy!

#include<stdio.h>

int main() {
  int i = 0;
  int cisla[] = {1, 2, 3, 4, 5 };

  for(i = -4; i < 10; i++) {
    cisla[i] = cisla[i] * 2;
    printf("%d\n", cisla[i]);
  }

  return 0;
}

Rady ku kompilácii

Nastavenie make.

  1. Vytvorte jednoduchý makefile:

    CC=gcc CFLAGS=-Wall -Wextra -ansi -pedantic -Werror -lm

  2. Zadanie so zdrojákom vzdialenost.c zostavíte cez:

    make vzdialenost

  3. Skompilovať a spustiť môžeme zoradením príkazov v shelli:

    make vzdialenost && ./vzdialenost

Ďalšie čítanie k make: Urobme niečo s make.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *