Kodowanie. Uruchamianie programu. Stałe symboliczne. Instrukcja pętli
(while
).
Przed przystąpieniem do zajęć należy przygotować 3 opisane poniżej programy oraz zaproponować algorytm wykrywający przecięcia zera zgodnie z podaną specyfikacją.
- Programy:
- Wypisywanie na ekran wartości z zakresu od 1 do 99 w formie jak
pokazano poniżej (instrukcje
while
/for
).
[john_doe@diablo:~]$ ./a.out
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99
- Pobieranie z klawiatury wartości aktualnej temperatury
i wyświetlanie pozytywnego bądź negatywnego komunikatu w zależności
od przekroczenia ustalonego progu, zadanego w stałej symbolicznej
(instrukcja
if
, stała symboliczna).
# prog = 20
[john_doe@diablo:~]$ ./a.out
Podaj temperature we Wroclawiu: 15
Nie jest zbyt cieplo!
[john_doe@diablo:~]$ ./a.out
Podaj temperature we Wroclawiu: 27
Jest bardzo ladna pogoda!
- Wielokrotnego pobierania ze standardowego wejścia wartości
pojedynczego parametru, z przedziału od -5 do 5, do momentu
wprowadzenia wartości 99. W przypadku podania poprawnej wartości
z przedziału należy wypisać ją na standardowe wyjście - niepoprawna
wartość powinna powodować wyświetlenie komunikatu z ostrzeżeniem.
[john_doe@diablo:~]$ ./a.out
Podaj 1. wartosc parametru: 3
Aktualna wartosc parametru: 3
Podaj 2. wartosc parametru: 7
Bledna wartosc parametru!
Podaj 3. wartosc parametru: -3
Aktualna wartosc parametru: -3
Podaj 4. wartosc parametru: -9
Bledna wartosc parametru!
Podaj 5. wartosc parametru: -1
Aktualna wartosc parametru: -1
Podaj 6. wartosc parametru: 99
- Zaproponuj i zapisz kompletny algorytm pozwalający na realizację
następującego zadania (zadanie jest inspirowane programem do
wyliczania częstotliwości pracy serca na podstawie sygnału ekg):
- Napisz program, który ma
odczytywać sekwencję danych z terminala i wyliczać na ich podstawie
częstotliwość wystąpień przecięć zera we wczytywanym strumieniu
wejściowym.
Dane wejściowe pochodzą z urządzeń służących do pomiaru tętna
człowieka, które zapisują je w jednym z dwóch formatów postaci (zobacz zawartość załączonych do zadania przykładowych plików z danymi wejściowymi)
hh:mm:ss.sss pp.pp
gdzie hh
, mm
, ss.sss
to odpowiednio liczba
godzin, minut oraz sekund, które upłynęły od rozpoczęcia pomiaru,
a pp.pp
jest zmierzoną wartością w postaci liczby
rzeczywistej z kropką pełniącą rolę separatora dziesiętnego, lub
[ mm' ] ss.ss pp.pp
gdzie mm'ss.ss
jest czasem, jaki upłynął od rozpoczęcia
pomiaru, z mm
oznaczającym liczbę minut (opcjonalne), zaś
ss.ss
liczbę sekund.
Przecięcie zera następuje każdorazowo, gdy po zmierzonej wartości
dodatniej następuje wartość ujemna lub po wartości ujemnej dodatnia
(także, gdy między tymi wartościami pojawia się jedno lub więcej
zer). W szczególności:
- pod uwagę mają być brane jedynie liczby z przedziału od -10 do
10 oraz liczba 99 oznaczająca koniec strumienia danych; pozostałe
wartości są uznawane za niepoprawne i pomijane;
- częstotliwość ma być określana jako liczba wystąpień
przecięcia zera w kolejnych grupach złożonych z 99 liczb
(co odpowiada okresowi pomiaru równemu 10 sekund)
- wartość częstotliwości spoza przedziału od 8 do 14
(co odpowiada pulsowi spoza zakresu 50–80 uderzeń na minutę)
uznawana jest za niepoprawną i powoduje pojawienie się na wyjściu
programu odpowiedniego komunikatu; w pozostałych przypadkach nie
nie pojawiają się żadne dane na wyjściu programu.
- Wskaż warunek stopu algorytmu.
- Zaproponuj efektywny sposób przetestowania programu
realizującego algorytm.
- Zadeklaruj stałe symboliczne mające sens w przypadku
rozpatrywanego algorytmu zgodnie ze składnią języka ANSI C.
- Zadeklaruj zmienne potrzebne do implementacji algorytmu
zgodnie ze składnią języka ANSI C.
- (Opcjonalne) Generatywny transformer wstępnie przetrenowany (jak sam siebie nazywa:) poproszony o rozwiązanie prostszego zadania: ''Napisz w języku C program, który w ciągu liczb całkowitych będzie zliczał liczbę zmian znaku liczby. Wartość 99 oznacza koniec danych'' zaproponował następujący kod:
#include <stdio.h>
int main() {
int liczba, poprzednia_liczba, zmiany_znaku = 0;
printf("Podaj liczby calkowite (99 konczy wprowadzanie):\n");
scanf("%d", &liczba);
poprzednia_liczba = liczba;
while (liczba != 99) {
scanf("%d", &liczba);
if ((liczba > 0 && poprzednia_liczba < 0) || (liczba < 0 && poprzednia_liczba > 0)) {
zmiany_znaku++;
}
poprzednia_liczba = liczba;
}
if (poprzednia_liczba != 0) {
zmiany_znaku--; // Nie uwzględniamy ostatniej liczby niezerowej jako zmiany znaku
}
printf("Liczba zmian znaku: %d\n", zmiany_znaku);
return 0;
}
Przetestuj, skomentuj i popraw.
W celu realizacji postawionego powyżej zadania algorytmicznego:
- Zidentyfikuj wszystkie stałe, określone w jego treści.
- Zidentyfikuj dane wejściowe i wyjściowe algorytmu (zobacz wskazówka 1 poniżej).
- W zbiorze danych wejściowych określ te, które są uznawane za poprawne.
- Określ relację pomiędzy poprawnymi danymi wejściowymi
a wyjściowymi (zobacz wskazówka 2 poniżej).
- Zaproponuj strukturę danych niezbędną do rozwiązania problemu.
- Zaproponuj algorytm rozwiązujący zadanie bez podziału danych wejściowych na grupy (zobacz wskazówka 3).
- Zmodyfikuj zaproponowany algorytm tak, by uwzględniał konieczność
podziału danych wejściowych na grupy. Zapisz ostateczną postać algorytmu za pomocą diagramu.
- Zastanów się, czy przedstawione zadanie algorytmiczne jest kompletne. Ewentualnie uzupełnij jego specyfikację.
- Napisać program pozwalający na rozwiązanie postawionego powyżej
zadania. Nie zapomnieć o wprowadzaniu do pliku komentarzy
równocześnie z wprowadzaniem do niego kodu programu.
- Uruchomić program dla różnych wartości danych wejściowych,
określić zakres poprawnego działania programu. Przy testowaniu
programu zmodyfikować wartości używanych stałych symbolicznych tak,
by testy przebiegały możliwie najszybciej.
- Wyposażyć plik z kodem źródłowym w dokumentację, która oprócz
wprowadzanych wcześniej komentarzy powinna zawierać dane o autorze,
dacie utworzenia programu, jego wersji, modyfikacjach itp., krótką
charakterystykę programu, specyfikację danych wejściowych i
wyjściowych, opis sposobu korzystania z programu.
- Warto zauważyć, że do stwierdzenia faktu
wystąpienia przecięcia zera, ze strumienia danych wejściowych
potrzebne są jedynie same wartości zmierzone. Oznacza to, że dane
określające czas będą w procesie obliczeniowym pomijane. Można tego
dokonać:
- w opracowywanym programie w języku C (co niekoniecznie
będzie łatwe ze względu na dwoistość formatu czasu i w ramach naszych zajęć jest
niezalecane), lub też
- przez odpowiednie sformatowanie danych przed ich podaniem na
wejście opracowywanego programu, (i takie rozwiązanie będziemy
stosować na zajęciach). Formatowania można dokonać np. w shellu,
z poziomu terminala, przez wywołanie z odpowiednimi opcjami
polecenia
cut
(dwukrotnie z wykorzystaniem przetwarzania
potokowego w systemie UNIX: pierwsze wywołanie wybierze ze
strumienia danych liczby rzeczywiste stanowiące pomiary, drugie
zamieni je na liczby całkowite – tym, którzy nie wiedzą jak to
zrobić, rzecz zostanie przedstawiona na zajęciach).
- Proszę zauważ, że do poprawnej identyfikacji wystąpienia
w danym miejscu przecięcia zera potrzebne są jedynie dwie wartości
z podawanej sekwencji i tyle tylko ze strumienia danych wejściowych należy
zapamiętywać w programie – przecięcie następuje, jeśli te wartości są
przeciwnych znaków.
- Zastanów się, co zaproponowany algorytm będzie
robił, gdy przecięcie pojawi się na granicy pomiędzy kolejnymi
grupami (np. ostatnia liczba w poprzedniej grupie dodatnia,
pierwsza w następnej – ujemna) – takie przecięcie nie powinno
zostać zaliczone do żadnej z grup.
Pamiętaj o rzetelnym przeprowadzeniu testów napisanego programu. To, że
program działa, nie oznacza, że działa poprawnie. Zadbaj, by każdy z testów
sprawdzał oddzielny aspekt działania algorytmu i został właściwie
opisany w sprawozdaniu.
Sprawozdanie powinno zawierać:
- Imię i nazwisko autora, temat ćwiczenia, datę wykonania;
- Kod źródłowy programu;
- Testy programu (opis przebiegu z wynikami) w tym kolejno:
- Co dany test ma na celu;
- Metoda testowania - dane wejściowe;
- Dane wyjściowe zwrócone w teście przez program;
- Rezultat testu - ocena plus ewentualny komentarz;
- Wnioski końcowe.
- Przypomnij, jakie bloki są wykorzystywane do tworzenia diagramu algorytmu, a jakie diagramu czynności.
- W jaki sposób deklaruje się w języku C stałe symboliczne? Podaj przykład.
- Jakiego typu powinna być zmienna pozwalająca na zapisanie wartości
częstotliwości?
- W jaki sposób można wczytać liczbę z terminala do programu w C?
- Jak wygląda składnia instrukcji warunkowej
if
?
- Jak wygląda składnia instrukcji pętli
while
?
- Napisz instrukcję pętli
while
, która będzie zwiększała wartość
zmiennej dopóki nie stanie się ona większa od 99.
- Zapisz instrukcję, która pozwoli na sprawdzenie, czy dane wejściowe
programu są poprawne (mieszczą się w zadanym przedziale).
- Jak wygląda warunek stopu w rozważanym zadaniu?
This document was generated using the
LaTeX2HTML translator Version 2021.2 (Released July 1, 2021)
The command line arguments were:
latex2html -html_version 3.2,latin2,unicode -split 0 -no_navigation PProg_lab_02
The translation was initiated on 2023-10-05