Stefan Sokołowski, Podstawy programowania
LABORATORIUM 11


Zadanie 0:

Funkcje służą do rozbijania skomplikowanego zadania na mniejsze, do pewnego stopnia niezależne, fragmenty.

Proszę wysłuchać wykładziku o funkcjach w C. Demonstrowane slajdy są dostępne tutaj; a w postaci do przeglądania lub drukowania — tutaj.
Proszę uruchomić programy z wykładziku:
  1. liczba różnych podzielników danej liczby całkowitej (dopisać sygnalizację błędu, jeśli ta liczba jest zerem) — str.4,
  2. długość linii łamanej na płaszczyźnie (porządnie przetestować na różnych łamanych) — str.6-7,
  3. drukowanie słów w ramkach (dla jakiegoś innego krótkiego tekstu) — str.10,
  4. porównanie alfabetyczne słów — str.12.
Dla przykładu D dopisać własny program testujący. Słowo, czyli ciąg znaków niezawierający spacji ani innych ,,białych znaków'' (spacja, zmiana wiersza, tabulacja, itp.) daje się wczytać do tablicy znaków i wydrukować np. takimi komendami:
deklaracja char napis[duzo]; duzo == co najmniej o 1 więcej niż długość słowa
czytanie scanf("%s", napis); uwaga: zmienna napis nie poprzedzona znakiem   &
wyświetlanie printf("%s", napis);


Jednym z zasadniczych powodów, dla których warto stosować funkcje, jest możliwość rozbicia zadania na mniejsze części stosunkowo niezależne od siebie i rozwiązywane osobno. W szczególności rozbicie na fragmenty opracowywane przez różnych programistów. Następne dwa zadania służą do przećwiczenia tego podejścia.


Zadanie 1 (mój program główny, Wasza funkcja):

Zdefiniować funkcję, która dla danej liczby całkowitej nieujemnej oblicza jej silnię.

Jeśli definicja silni będzie poprawna, to program poniżej po lewej (bez żadnych zmian) wydrukuje tabelkę po prawej:

#include<stdio.h>
               
    TABLICA SILNI:

     n |     n!
   ----+-----------
     0 |         1
     1 |         1
     2 |         2
     3 |         6
     4 |        24
     5 |       120
     6 |       720
     7 |      5040
     8 |     40320
     9 |    362880
    10 |   3628800
    11 |  39916800
    12 | 479001600
... tu definicja silni...
int main() {
  int n;
  printf("\n   TABLICA SILNI:\n\n");
  printf("    n |     n!\n");
  printf("  ----+-----------\n");
  for (n=0; n<13; n++)
    printf("   %2i | %9i\n", n, silnia(n));
  printf("\n");
  return 0;
}


Zadanie 2 (moja funkcja, Wasz program główny):

Poniższa funkcja

void bin(int n) {
  int tab[32], i, j;
  for (i=0; i<32; i++) {
    tab[i] = n%2;  n /= 2;
  }
  for (i=3; i>=0; i--) {
    printf(" ");
    for (j=7; j>=0; j--)
      printf("%i", tab[8*i+j]);
  }
}

drukuje binarną postać (w rozbiciu na bajty) swojego nieujemnego argumentu  n . Proszę użyć jej we własnym programie do sporządzenia tabelki binarnych rozkładów liczb naturalnych pomiędzy podanymi przez użytkownika liczbami  min  i  max . Na przykład dla  min=1020  i  max=1040  tabelka powinna wyglądać tak:

  ROZKLADY BINARNE:

   min = 1020
   max = 1040

    n  |          binarny obraz  n           
 ------+-------------------------------------
  1020 | 00000000 00000000 00000011 11111100
  1021 | 00000000 00000000 00000011 11111101
  1022 | 00000000 00000000 00000011 11111110
  1023 | 00000000 00000000 00000011 11111111
  1024 | 00000000 00000000 00000100 00000000
  1025 | 00000000 00000000 00000100 00000001
  1026 | 00000000 00000000 00000100 00000010
  1027 | 00000000 00000000 00000100 00000011
  1028 | 00000000 00000000 00000100 00000100
  1029 | 00000000 00000000 00000100 00000101
  1030 | 00000000 00000000 00000100 00000110
  1031 | 00000000 00000000 00000100 00000111
  1032 | 00000000 00000000 00000100 00001000
  1033 | 00000000 00000000 00000100 00001001
  1034 | 00000000 00000000 00000100 00001010
  1035 | 00000000 00000000 00000100 00001011
  1036 | 00000000 00000000 00000100 00001100
  1037 | 00000000 00000000 00000100 00001101
  1038 | 00000000 00000000 00000100 00001110
  1039 | 00000000 00000000 00000100 00001111

Ale oczywiście program powinien prawidłowo działać dla dowolnych liczb  min  i  max .


Zadanie 3:

Proszę napisać Napisać do tego program testowy, który wczytuje tablicę liczb rzeczywistych i stosuje powyższe funkcje dla policzenia ich średniej oraz odchylenia standardowego.


Zadanie 4 domowe:

Jak wynika ze wzorów Cramera (znanych z algebry i łatwych do znalezienia w internecie), rozwiązanie układu równań

można znaleźć przez podzielenie przez siebie wyznaczników macierzy:
       
Oczywiście wyznacznik występujący w mianowniku musi być różny od zera, inaczej układ rownań jest sprzeczny lub nieoznaczony.

Jak widać, potrzebne jest policzenie wyznaczników czterech macierzy. Proszę więc napisać jedną funkcję biorącą jako argument dowolną macierz 3×3 i oddającą jej wyznacznik (por. zad.2(a) z lab.10), a następnie wykorzystujący tą funkcję program


Do mojej głównej witrynki

Ostatnia modyfikacja: 7 stycznia 2025