viteka32

Ukazatele a dynamická paměť

Oct 25th, 2021
810
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <math.h> // sqrt
  3. #include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE, strtol
  4. #include <time.h>
  5.  
  6. // vytvoreni struktur pro vypocet kvadraticke rovnice
  7. typedef struct {
  8.     float a;
  9.     float b;
  10.     float c;
  11. } koefKvadRovnice;
  12.  
  13. typedef struct{
  14.     float realnaSlozka;
  15.     float imaginarniSlozka;
  16. } komplexniCislo;
  17.  
  18. typedef struct{
  19.     komplexniCislo koren1;
  20.     komplexniCislo koren2;
  21. } korenyKvadRovnice;
  22.  
  23. // deklarace a definice funkce
  24. void vypisKvadRovnice(koefKvadRovnice *rovnice)
  25. {
  26.     printf("%fx^2 + (%fx) + (%f) = 0\n", rovnice->a, rovnice->b, rovnice->c);
  27. }
  28.  
  29. void vypocetKvadRovnice(koefKvadRovnice *rovnice, korenyKvadRovnice *vysledek)
  30. {
  31.     // b^2 - 4 * a * c
  32.     float D = rovnice->b * rovnice->b - (4 * rovnice->a * rovnice->c);
  33.     // 2 * a`
  34.     float doubleA = 2 * rovnice->a;
  35.  
  36.     // vypocet korenu kvadraticke rovnice
  37.     if(D > 0){
  38.         vysledek->koren1.imaginarniSlozka = 0;
  39.         vysledek->koren2.imaginarniSlozka = 0;
  40.         vysledek->koren1.realnaSlozka = (-rovnice->b + sqrt(D))/doubleA;
  41.         vysledek->koren2.realnaSlozka = (-rovnice->b - sqrt(D))/doubleA;
  42.     }else if(D < 0){
  43.         vysledek->koren1.imaginarniSlozka = -sqrt(-D)/doubleA;;
  44.         vysledek->koren2.imaginarniSlozka = -sqrt(-D)/doubleA;;
  45.         vysledek->koren1.realnaSlozka = (-rovnice->b)/doubleA;
  46.         vysledek->koren2.realnaSlozka = (-rovnice->b)/doubleA;
  47.     }else
  48.     {
  49.         vysledek->koren1.realnaSlozka = (-rovnice->b)/doubleA;
  50.         vysledek->koren1.imaginarniSlozka = 0;
  51.         vysledek->koren2 = vysledek->koren1;
  52.  
  53.     }
  54. }
  55.  
  56. void vypisKorenu(korenyKvadRovnice *koreny)
  57. {
  58.     if(fabs(koreny->koren1.imaginarniSlozka) > 0)
  59.     {
  60.         printf("r1 = %f + %fi\n"
  61.                "r2 = %f - %fi\n\n",
  62.                koreny->koren1.realnaSlozka,
  63.                fabs(koreny->koren1.imaginarniSlozka),
  64.                koreny->koren2.realnaSlozka,
  65.                fabs(koreny->koren2.imaginarniSlozka));
  66.     }else{
  67.         printf("r1 = %f\n"
  68.                "r2 = %f\n\n", koreny->koren1.realnaSlozka,
  69.                koreny->koren2.realnaSlozka);
  70.     }
  71. }
  72.  
  73. int main(int argc, char **argv)
  74. {
  75.     // nastaveni inicializacnich hodnot generatoru rand() dle aktualniho casu
  76.     srand(time(NULL));
  77.  
  78.     if(argc != 2)
  79.     {
  80.         printf("Spatny pocet vstupnich argumentu\n");
  81.         return EXIT_FAILURE;
  82.     }
  83.  
  84.     long pocetRovnic = strtol(argv[1], NULL, 10);
  85.  
  86.     // errno != ERANGE - globalni promenna, do ktere se ulozi nekorektni
  87.     // nacteni strtol
  88.     if(pocetRovnic <= 0){
  89.         printf("Nespravna hodnota vstupniho argumentu\n");
  90.         return EXIT_FAILURE;
  91.     }
  92.  
  93.     // alokace pameti pro pole rovnic na stacku
  94.     // malloc prebira pocet bajtu
  95.     koefKvadRovnice *poleRovnic = malloc(pocetRovnic * sizeof(koefKvadRovnice));
  96.     // osetreni alokace pameti zda byla programu prirazena
  97.     if(poleRovnic == NULL){
  98.         printf("Nepodarila se naalokovat pamet\n");
  99.         return EXIT_FAILURE;
  100.     }
  101.  
  102.     // naplneni jednotlivych kvad rovnic
  103.     for(int i = 0; i < pocetRovnic; i++){
  104.         poleRovnic[i].a = rand() % 100;
  105.         poleRovnic[i].b = rand() % 100;
  106.         poleRovnic[i].c = rand() % 100;
  107.     }
  108.  
  109.     // vypocet jednotlivych korenu
  110.     for(int i = 0; i < pocetRovnic; i++)
  111.     {
  112.     // vypis rovnice do konzole
  113.     vypisKvadRovnice(&poleRovnic[i]);
  114.     // vypocitani kvad rovnice
  115.     korenyKvadRovnice vysledek;
  116.     vypocetKvadRovnice((poleRovnic + i), &vysledek);
  117.     // vypsani korenu do konzole
  118.     vypisKorenu(&vysledek);
  119.     }
  120.  
  121.     //dealokace pameti
  122.     free(poleRovnic);
  123.  
  124.     return EXIT_SUCCESS;
  125. }
RAW Paste Data