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:
- liczba różnych podzielników danej liczby całkowitej (dopisać
sygnalizację błędu, jeśli ta liczba jest zerem) — str.4,
- długość linii łamanej na płaszczyźnie (porządnie przetestować
na różnych łamanych) — str.6-7,
- drukowanie słów w ramkach (dla jakiegoś innego krótkiego
tekstu) — str.10,
- 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ć
- funkcję, która jako argumenty bierze 1-wymiarową tablicę
liczb rzeczywistych oraz jej długość; i w wyniku
daje średnią liczb w tej tablicy:
- funkcję, która jako argumenty bierze 1-wymiarową tablicę
liczb rzeczywistych oraz jej długość; i w wyniku daje
odchylenie standardowe, czyli kwadratowe odchylenie od średniej,
liczb w tej tablicy:
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
- wczytujący macierz współczynników
a oraz wektor wyrazów
wolnych b ,
- sprawdzający, czy układ równań jest niesprzeczny i
oznaczony,
- jeśli jest, to wyliczający rozwiązania metodą Cramera.
Do mojej głównej witrynki
Ostatnia modyfikacja: 7 stycznia 2025