Advertisement
michciu

Untitled

Dec 4th, 2019
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.56 KB | None | 0 0
  1. lab5zad1
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. enum Rodzaj{OWOC, WARZYWO, INNY}; // Wyliczenie stosujemy, gdy chcemy oznaczyc wiele predefiniowanych rodzajow jakiejs cechy
  7. // Jest to wygodniejszy zapis rownowazny const int OWOC = 0; const int WARZYWO = 1; const int INNY = 2;
  8.  
  9. #define NAZWA_LEN 16
  10. #define IMIE_LEN 8
  11. #define LICZBA_PRZED 3
  12.  
  13. struct Przedmiot{ // Struktura jest zbiorem pol, opisanym typami zmiennych
  14.     char nazwa[NAZWA_LEN];
  15.     char kolor[NAZWA_LEN];
  16.     float cena;
  17.     enum Rodzaj rodzaj;
  18. };
  19.  
  20. typedef struct Klient{ // W strukturach mozemy uzywac innych struktur
  21.     char imie[IMIE_LEN];
  22.     float gotowka;
  23.     struct Przedmiot koszyk[LICZBA_PRZED];
  24. } klient_t;   // wraz ze slowem typedef w ten sposob definiujemy wlasny typ danych (typowo do nazwy oznaczajacej typ dopisuje sie '_t' aby odroznic dany identyfikator od np. nazwy zmiennej)
  25.  
  26. union Liczba{          // Unia jest jednym polem, do ktorego mozemy odwolywac sie w rozny sposob
  27.     float ulamkowa;
  28.     int calkowita;
  29. };
  30.  
  31. void print_przedmiot(struct Przedmiot p){ // Do pol struktury odwolujemy sie operatorem "."
  32.     printf("%s jest %s i kosztuje %f.\n", p.nazwa, p.kolor, p.cena);
  33. }
  34.  
  35. void opisz_przedmiot(struct Przedmiot* p, char* nazwa, char* kolor, enum Rodzaj rodzaj, float cena){
  36.     strcpy(p->nazwa, nazwa); // Do pol wskaznika na strukture odwolujemy sie operatorem "->"
  37.     strcpy(p->kolor, kolor);
  38.     p->cena = cena;
  39.     p->rodzaj = rodzaj;
  40. }
  41.  
  42. void zaplac(struct Klient* k){
  43.     float suma = 0.0;
  44.     int n;
  45.     int i;
  46.     float kosztOwoc = 0;
  47.     for(i = 0; i < LICZBA_PRZED; i++){
  48.         if(k->koszyk[i].rodzaj == OWOC){
  49.             kosztOwoc += k->koszyk[i].cena;
  50.         }
  51.     }
  52.    
  53.     if(kosztOwoc <  k->gotowka){
  54.         printf("Klient %s moze kupic owoce za %f.\n\n", k->imie, kosztOwoc);
  55.  
  56.     }else{
  57.         printf("Klient %s nie moze zaplacic %f za owoce!\n\n", k->imie, kosztOwoc);
  58.     }
  59.  
  60.     for(n = 0; n < LICZBA_PRZED; n++)
  61.         suma += k->koszyk[n].cena;
  62.  
  63.     if(suma < k->gotowka)
  64.         printf("Klient %s zaplacil %f.\n\n", k->imie, suma);
  65.     else
  66.         printf("Klient %s nie moze zaplacic %f!\n\n", k->imie, suma);
  67. }
  68.  
  69. void wyswietl_liczbe(union Liczba k)
  70. {
  71.     printf("Rozmiar unii: %d\twartosc calkowita: %d\twartosc ulamkowa: %f\n", sizeof(k), k.calkowita, k.ulamkowa); // poniewaz union moze przechowywac jedna wartosc na raz
  72. }
  73.  
  74. int main(){
  75.     struct Przedmiot banan, pomarancza, pomidor, mleko; // Zmienne odwolujace sie do struktu definiujemy podobnie do typow podstawowych
  76.     struct Przedmiot kompot = { "Kompot wisniowy", "czerwony", 2.5, INNY };  // Przypisanie wartosci do pol struktury od razu w momencie jej deklarowania
  77.     union Liczba k;
  78.  
  79.     opisz_przedmiot(&banan, "Banan", "zolty", OWOC, 1.0);
  80.     opisz_przedmiot(&pomarancza, "Pomarancza", "pomaranczowa", OWOC, 1.5);
  81.     opisz_przedmiot(&pomidor, "Pomidor", "czerwony", WARZYWO, 1.2);
  82.     opisz_przedmiot(&mleko, "Mleko", "biale", INNY, 2.0);
  83.  
  84.     print_przedmiot(banan);
  85.     print_przedmiot(pomarancza);
  86.     print_przedmiot(pomidor);
  87.     print_przedmiot(mleko);
  88.     print_przedmiot(kompot);
  89.  
  90.     printf("\nRozmiar struktury Przedmiot: %d\n", sizeof(struct Przedmiot)); // rozmiar struktury jest suma rozmiarow typow ktore zawiera
  91.     printf("Rozmiar struktury Klient: %d\n", sizeof(struct Klient)); // dlaczego tu jest taki rozmiar?
  92.     printf("Rozmiar typu strukturalnego klient_t: %d\n\n", sizeof(klient_t)); // zapis w tej linijce jest rownowazny zapisowi z linijki powyzszej
  93.     klient_t* klient = malloc(sizeof(klient_t)); // do struktur rowniez mozemy przypisac pamiec dynamicznie; tu dodatkowo korzystamy ze struktury Klient zdefiniowanej jako wlasny typ danych `klient_t`
  94.  
  95.     klient->gotowka = 3.0;
  96.     strcpy(klient->imie, "Ala"); // dlaczego tu robimy tak, a nie poprostu przypisujemy?
  97.     klient->koszyk[0] = banan;
  98.     klient->koszyk[1] = pomarancza;
  99.     klient->koszyk[2] = mleko;
  100.  
  101.     zaplac(klient);
  102.  
  103.     // Dlaczego ponizsze wywolania funkcji wyswietl_liczbe() daja tak rozne wyniki?
  104.     k.calkowita = 5;
  105.     wyswietl_liczbe(k);
  106.     k.ulamkowa = 5;
  107.     wyswietl_liczbe(k);
  108.  
  109.     free(klient);   // musze zwolnic zaalokowana dynamicznie pamiec
  110.  
  111.     return 0;
  112. }
  113.  
  114.  
  115. lab5zad2
  116. #include <stdio.h>
  117. #include <stdlib.h>
  118.  
  119. struct Punkt{
  120.     float x;
  121.     float y;
  122. };
  123.  
  124. float random01(){
  125.     float temp = rand(); // funkcja rand zwraca liczby calkowite, a my chcemy zmienno przecinkowe z zakresu <0.0;1.0>
  126.  
  127.     return temp / RAND_MAX;
  128. }
  129.  
  130. void print_punkt(struct Punkt punkt){
  131.     printf("x = %f, y = %f\n", punkt.x, punkt.y);
  132. }
  133.  
  134. struct Punkt* srodkowy_punkt(struct Punkt* punkty, int ile){
  135.     struct Punkt* srodkowy = malloc(sizeof(struct Punkt));
  136.     srodkowy->x = 0.0;
  137.     srodkowy->y = 0.0;
  138.  
  139.     int n;
  140.  
  141.     printf("Licze srednia dla %d punktow\n", ile);
  142.  
  143.     for(n = 0; n < ile; n++){
  144.         srodkowy->x += punkty[n].x;
  145.         srodkowy->y += punkty[n].y;
  146.     }
  147.  
  148.     srodkowy->x /= ile;
  149.     srodkowy->y /= ile;
  150.  
  151.     return srodkowy; // nie wolno zwracac adresu do lokalnej zmiennej! jak to poprawic?
  152. }
  153.  
  154. int main(){
  155.     srand(time(NULL)); // inicjacja funkcji losowej ze zmienna wartoscia (aktualny czas), co sie stanie jak tu bedzie ta sama wartosc?
  156.  
  157.     int ile, n;
  158.  
  159.     printf("Wpisz ile punktow wylosowac\n");
  160.     scanf("%d", &ile);
  161.  
  162.     struct Punkt* punkty = malloc(sizeof(struct Punkt)*ile); // to trzeba zrobic dynamicznie (taka deklaracja nie skompiluje sie w niektorych wersjach jezyka C)
  163.  
  164.     for(n = 0; n < ile; n++){
  165.         punkty[n].x = random01();
  166.         punkty[n].y = random01();
  167.  
  168.         print_punkt(punkty[n]);
  169.     }
  170.  
  171.     struct Punkt* srodek = srodkowy_punkt(punkty, ile); // zle przekazana jest liczba punktow
  172.  
  173.     print_punkt(*srodek);
  174.  
  175.     return EXIT_SUCCESS; // jezeli korzystamy z naglowka stdlib mozemy zrobic tak zamiast pisac return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement