JuliaPopadowska

PN

Jun 10th, 2018
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.52 KB | None | 0 0
  1. // Skrypcik do PN z Kniatem by Marcin Jaskuslki, weryfikacja: Kamil Stróżyk, pan z batem: Danik Martich, śmieszki: Szymon Michalak, Paweł Pytel
  2.  
  3. // Deklaracja to wtedy gdy deklarujesz xD (Deklarujesz np. istanienie jakiejś struktury, zmiennej) int a;
  4. // Inicjali jest wtedy, gdy nadajesz zmiennej, strukturze jakąś wartość. (np. a = 4; int b = 5; <b ma deklaracje i nicjalizację w jednym>)
  5. // I Z tą wiedzę lecież do pliku "N" u Kniata. Ważne, bo za jak coś zrobicie z tej listy, to Kniat daje laczki od tak.
  6.  
  7. //Gdy dzielimy liczby zmiennoprzecinkowe, to musimy wyraźnie zaznaczyć, że są takie (np. 2.0/3.0 = 0.6666667 )
  8.  
  9. // Lab 1 -> wstęp
  10. // Lab 2 -> zmiana na bin, dec + przesunięcia bitowe + konwersja string na int -> generalnie najlepszy wzorzec przesunięć bitowych
  11. // Lab 3 -> stringi + tablice dynamiczne + struktury + tablice funkcji
  12. // Lab 4 -> operacje na plikach + struktury + tablice funkcji
  13. // Lab 5 -> operacje na plikach + tablice dynamiczne + struktury + tablice funkcji + rzutowanie <jeśli ktoś zrobił 7/10 tak dziwnie jak ja> (rzutowanie można raczej olać)
  14. // Lab 6 -> operacje na plikach + tablice dynamiczne + struktury + tablice funkcji + przesunięcia bitowe
  15.  
  16. // Biblioteki
  17. #include "stdafx.h"
  18. #include "cmath" // biblioteka do wszystkich matematycznych rzeczy
  19. #include <conio.h> // _getch(); -> zatrzymanie na końcu. Raczej nie stosujemy, bo mamy program w pętli z opcją zatrzymania
  20. #include <string.h> // wykorzystywane przy operacjach na stringach
  21.  
  22.  
  23.  
  24. char vchar() // Kniatowska wersja pobrania znaku, dzieki której nie mamy problemu z jakimiś "\n, \0" i kij wie czym jeszcze
  25. {
  26.     char cc;
  27.     while ((cc = getchar()) <= ' ');
  28.     return cc;
  29. };
  30.  
  31. //* Pomiń. Gdy zobaczysz odpowiednią liczbę gwiazdek wróć
  32. void f(int tab[]) {};
  33. void f(int tab[50]) {};
  34. void f(int* tab) {};
  35.  
  36. //**
  37. void g(int &x) {};
  38.  
  39. //***
  40. void f1(int tab[], int & index, int cos) {};
  41. void f2(int tab[], int & index, int cos) {};
  42.  
  43.  
  44. //**** --- deklaracja struktury ---
  45. struct pracownik {
  46.     char *imie; // tablica dynamiczna
  47.     char nazwisko[16]; // string
  48.     int placa;
  49. };
  50.  
  51.  
  52.  
  53. int main()
  54. {
  55.     // --- TYPY ZMIENNYCH ---
  56.     unsigned int a;             // -> %u   -> unsigned daje same dodatnie. W sensie z zakresu -0x800000000 do +0x 8000 0000  robi się 0x 1 0000 0000 (czyli wszystko na dodatnie) // specjalnie podniosłem o jeden bit, żeby było widać maski
  57.     char c;                     // -> %c
  58.     char slowo[16];             // -> %s   -> Tablica znaków
  59.     int liczba;                 // -> %d
  60.     double przecinekDuzy;       // -> %lf  -> zmiennoprzecinkowa, o dużym zakresie (zakresu nie musicie pamiętać)
  61.     float przecinekMaly;        // -> %f   -> zmiennporzecinkowa, o mniejszym zakresie
  62.     unsigned long long dluuuga; // -> %llu -> unsigned daje same dodatnie, a long to int, ale większy. Ogólnie w pizdu duzy zakres. Na tym robimy maski
  63.                                 // --- MASKA unsigned long long ---
  64.                                 dluuuga = 0x8000000000000000; // 8e15; Binarnie to jest 1 i 63 zera (10000...000). Dzięki temu możemy fajnie robić porównanie masek
  65.  
  66.  
  67.     // --- ROZNE PRZYDATNE ---
  68.     scanf_s("%s", &slowo, 15);   // gdy pobieramy scanf'em to pamiętaj o podaniu "&", oraz po przecinku indexu ostatniego możliwego elementu w tablicy s
  69.     przecinekMaly = (float)(a);  //Rzutowanie -> zamiana typu zmiennej
  70.     przecinekMaly = 1234.567;
  71.     printf_s("%3.3f", przecinekMaly); // pokaże się 234.56
  72.  
  73.  
  74.  
  75.     // --- OPERACJE NA PLIKACH ---
  76.     FILE *F; // deklaracja zmiennej "F" będącą wskaźnikiem do strumienia
  77.     fopen_s(&F, "plik.txt", "rt"); // otwarcie pliku do ODCZYTU .txt
  78.     fopen_s(&F, "plik.txt", "wt"); // otwarcie pliku do ZAPISU .txt
  79.     fopen_s(&F, "plik.txt", "rb"); // otwarcie pliku do ODCZYTU .bin -> W zasadzie nie wiem czemu przekazujemy binarne, wychodzą hexy itd xD Jak ktoś wie, niech da znać #TajneGowno
  80.     fopen_s(&F, "plik.txt", "wb"); // otwarcie pliku do ZAPISU .bin
  81.  
  82.     while (feof(F) == false) { // feof(F) -> sprawdza, czy doszliśmy już do końca pliku
  83.         // --- ODCZYT Z PLIKU ---
  84.         fscanf_s(F, "%s", &slowo, 15); // Strumienń, typ zmiennej, zmienna do zapisu, gdy string podajemy jeszcze index ostatniego elementu w tablicy.
  85.                                        // pobranie z pliku (strumienia) pojedynczego ciągu znaków i "przejście do kolejnego".
  86.                                        // zatrzymuje się na spacjach, enterach.
  87.         fscanf_s(F, "%d", &liczba); // Tutaj dla liczby
  88.         c = fgetc(F); // Pobranie pojedynczego znaku. Będzie on w postaci ASCII -> wykorzystaliśmy w Lab 6
  89.  
  90.         // --- ZAPIS DO PLIKU ---
  91.         fprintf_s(F, "%s", slowo); // Zasada podobna do odczytu i printd_s
  92.         fputc(c, F); // Zapis pojedynczego znaku w postaci ASCII. c jest rzutowane na unsigned char -> wykorzystaliśmy w Lab 6
  93.     }
  94.  
  95.     fclose(F); // zamknięcie pliku. Zamykamy, gdy na pliku wykonaliśmy wszytskie operacje. Jak nie zamkniesz, to wszystko skopałeś, bo nic się nie odczyta, nie zapisze
  96.  
  97.  
  98.     // --- KNIATOWSKIE FUNKCJE WYBORU ---
  99.     char wyb = NULL;
  100.     printf_s("Wybierz jakąś tam opcję poprzez znak \n A - coś \n B - coś innego \n C - coś innego, niż inne");
  101.     wyb = vchar(); // Kniatowska wersja pobrania znaku, dzieki której nie mamy problemu z jakimiś "\n, \0" i kij wie czym jeszcze. Generalnie przydatne
  102.  
  103.     switch (wyb & 0x5F) { // na "wyb" nakładmay maskę 0x5f, co w zasadzie znaczy 101 1111 i dzięki temu czy podamy małą, czy duż literę to dostaniemy dużą
  104.         case 'A': printf_s("Coś wykonuję \n"); break;
  105.         case 'B': printf_s("Coś innego wykonuję \n"); break;
  106.         case 'C': printf_s("Coś innego, niż inne wykonuję \n"); break;
  107.         default: printf_s("Nie ma takiego znaku \n"); break;
  108.     }
  109.  
  110.  
  111.     // --- TABLICE DYNAMICZNE ---
  112.     //-- Jednowymiarowa --
  113.     int n;
  114.     int *Tab;
  115.     scanf_s("%d", &n);
  116.     Tab = new int[n]; // Przyznanie miejsca w pamięci
  117.  
  118.     //-- Dwuwymiarowa --
  119.     int k, w; // kolumna, wiersz
  120.     scanf_s("%d", &k);
  121.     int** Tab1 = new int *[k]; // tutaj tworzę k kolumn
  122.     for (int i = 0; i < w; i++) Tab1[i] = new int[w]; // tutaj dla każdj kolumny tworzę komórki w dół
  123.  
  124.     // --- PRZEKAZYWANIE TABLIC do funkcji ---
  125.     int tab[50];
  126.     f(tab); // *Up: -> przekazanie do funkcji. Wyżej, jak może wyglądać funkcja
  127.  
  128.  
  129.     // --- PRZEKAZYWANIE ZMIENNEJ REFERENCYJNEJ --- -> czyli nie tworzymy kopi zmiennej, tylko przekazujemy ją jako ją (wskaźnik do niej) i działamy na niej
  130.     int x = 4;
  131.     g(x); // **Up:
  132.  
  133.  
  134.     // --- TABLICA FUNKCJI ---
  135.     int index = 0;
  136.     int cos = 123;
  137.     void(*fun[])(int *, int &, int) = { f1,f2 }; //***Up: void - zwracany typ; (int *, int &, int) -> typu argumentów
  138.     fun[0](tab, index, cos);
  139.  
  140.  
  141.     // --- STRUKTURY ---
  142.     // ****UP: -> definicja
  143.     pracownik michalak;
  144.     michalak.imie = new char[16]; // zmienna dynamiczna
  145.     michalak.imie = "Szymon";
  146.     scanf("%s", &michalak.nazwisko, 16); // pobranie ze strumienia
  147.     michalak.placa = 3; // 3 złote <3 (idealnie na pączka, na Półwiejskiej xD)
  148.  
  149.  
  150.     // --- OPERACJE NA STRINGACH ---
  151.     char c = '6';
  152.     int w = c - '0'; // Dzięki temu odejmiemy od ASCII 54 - 48 = 6. I własnie w = 6
  153.  
  154.     if (!strcmp("ola", "jola")) {}; // strcmp(); porównuje dwa ciągi znaków. Gdy będą takie same dostaniemy odp.: 0. Dlatego użyłem negacji w if'ie
  155.  
  156.     //-- gdzie korzystaliśmy z strcpy_s --
  157.     pracownik ziomeczek;
  158.     char bufor[32];
  159.  
  160.     printf_s("Nowy pracownik, Imię: ");
  161.     scanf_s("%s", &bufor, 31); // Pamietaj o 3 argumencie!!!
  162.     ziomeczek.imie = new char[strlen(bufor) + 1]; // deklaracja dynamiczna, bo imię tablicą dynamiczną
  163.     strcpy_s(ziomeczek.imie, strlen(bufor) + 1, bufor); // dokad, jakie dlugie, skad
  164.  
  165.     // -- Zmiana stringa na liczbę --
  166.     char string[16];
  167.     int i = 0;
  168.     int number = 0;
  169.     while (string[i] != 0) {
  170.         number = number * 10 + string[i] - '0';
  171.         i++;
  172.     }
  173.  
  174.     // -- Robienie z stringa liczbę, ale binarną!!! --
  175.     while (string[i] != 0) {
  176.         number = number * 2 + string[i] - '0';
  177.         i++;
  178.     }
  179.  
  180.     // --- OPERACJE BITOWE ---
  181.     int a = 23; // 10111 <binarnie>
  182.     a >>= 2;    // 101          // inaczek a = a >> 2;
  183.     a <<= 3;    // 101000
  184.     a &= 8;     // 8 -> 1000; czyli wynik tego to 1000
  185.     a |= 3;     // 3 -> 11;   czyli wynik tego to 1000 | 11 => 1011
  186.     a = ~a;     // negacja, czyli wyjdzie 0100
  187.     a ^= 8;     // XOR, czyli 0100 ^ 1000 => 1100
  188.    
  189.     //-- szukanie najstarszego bitu --
  190.     unsigned long long liczba;
  191.     printf_s("Podaj liczbe: ");
  192.     scanf_s("%llu", &liczba);
  193.  
  194.     unsigned long long maska = 0x8000000000000000;
  195.     int indexL = 63;
  196.     while ((liczba & maska) == 0) { // sprawdzenie czy znaleźliśmy jedynkę, czy ciągle zera i musimy zmniejszyć maskę
  197.         maska >>= 1; // przesunięcie o jeden bit w prawo, co powoduje <symulacja> => 10000, 1000, 100, 10, 1
  198.         indexL--; // zmienijszenie pozycji najstarszego bitu
  199.     }
  200.     printf_s("Najstarszy bit: %d (liczac od 0) \n", indexL);
  201.  
  202.  
  203.     return 0;
  204. }
Add Comment
Please, Sign In to add comment