Wykład_2

Przykłady prezentowane w trakcie Wykładu 2 dla przedmiotów:

W celu przygotowania raportu w postacipliku html za pomoca narzędzia Publish, w skrypcie zakomentowano linie zawierające polecenie input, a w ich miejsce wprowadzono polecenia generujące losowe liczby całkowite.

Semestr zimowy. Rok akad. 2017/18 Prowadzący: dr inż. Beata Leśniak-Plewińska

Contents

Skrypty

Przykładowy skrypty

type skrypt21
clear;

load('radial.mat');

p = polyfit(t, radial, 3);

czas = linspace(min(t), max(t), 20);
przemiszczenia = polyval(p, czas);

plot(t, radial, 'or', czas, przemiszczenia, '-b');
title('Przemieszczenia promieniowe ściany serca w funkcji czasu');
xlabel('Czas (ms)')
ylabel('Przemieszczenia promieniowe (mm)');
legend('Przemieszczenia zmierzone', 'Dopasowana krzywa wielomianu')

Przykładowy skrypt z komentarzami

type skrypt21a
clear;

% ładowanie danych
load('radial.mat');

% dopasowanie wielomianu
p = polyfit(t, radial, 3);

% zdefiniowanie danych w celu wizualizacji w postaci wykresu liniowego
czas = linspace(min(t), max(t), 20);
przemiszczenia = polyval(p, czas);

% wizualizacja danych w postaci wykresu liniowego
plot(t, radial, 'or', czas, przemiszczenia, '-b');
title('Przemieszczenia promieniowe ściany serca w funkcji czasu');
xlabel('Czas (ms)') % nowy komentarz
ylabel('Przemieszczenia promieniowe (mm)');
legend('Przemieszczenia zmierzone', 'Dopasowana krzywa wielomianu')

[v, koniec_rozkurczu] = max(radial);
[v, koniec_skurczu] = min(radial);
est_koniec_rozkurczu = polyval(p,t(koniec_rozkurczu));
est_koniec_skurczu = polyval(p,t(koniec_skurczu));

roznica_prominiowa = est_koniec_rozkurczu - est_koniec_skurczu;
disp(['Różnica przemieszczeń radialnych ściany serca w skurczu' ... 
    ' i rozkurczu wynosi: ' num2str(roznica_prominiowa)]);

Analizator kodu

Przykładowy skrypt z błędami

type skrypt21b
clear;

% ładowanie danych
load('radial.mat');

% dopasowanie wielomianu
p = polyfit(t, radial, 3);

% zdefiniowanie danych w celu wizualizacji w postaci wykresu liniowego
czas = linspace(min(t), max(t), 20);
przemiszczenia - polyval(p, czas);

% wizualizacja danych w postaci wykresu liniowego
plot(t, radial, 'or', czas, przemiszczenia, '-b');
title('Przemieszczenia promieniowe ściany serca w funkcji czasu');
xlabel('Czas (ms)')
ylabel('Przemieszczenia promieniowe (mm)');
legend('Przemieszczenia zmierzone', 'Dopasowana krzywa wielomianu')

[v, koniec_rozkurczu] = max(radial);
[v, koniec_skurczu] = min(radial);
est_koniec_rozkurczu = polyval(p,t(koniec_rozkurczu);
est_koniec_skurczu = polyval(p,t(koniec_skurczu));

roznica_prominiowa = est_koniec_rozkurczu - est_koniec_skurczu;
disp(['Różnica przemieszczeń radialnych ściany serca w skurczu' ... 
    ' i rozkurczu wynosi: ' num2str(roznica_prominiowa)]);

Wyświetlenie raportu Analizatora Kodu. Funkcje checkcode i mlintrpt

checkcode('skrypt21b.m')
L 11 (C 16): Possible inappropriate use of - operator. Use = if assignment is intended.
L 20 (C 2): The value assigned here to 'v' appears to be unused. Consider replacing it by ~.
L 22 (C 53): Invalid syntax at ';'. Possibly, a ), }, or ] is missing.

mlintrpt('skrypt21b.m')

Instrukcje sterujące

Instrukcja warunkowa if-end

clear

% a = input('Wprowadź liczbę: ');
a = randi([-10 10],1);
if (a >= 0)
    root = sqrt(a);
    disp(['Pierwiastek kwadratowy = ' num2str(root)]);
end
Pierwiastek kwadratowy = 1

Warunek. Operatory logiczne i relacji

help relp

clear

plec = 'f'
kalorie = 2100
zagrozenie = false
if (plec=='m') && (kalorie>2500)
    zagrozenie = true;
end
if (plec=='f') && (kalorie>2000)
    zagrozenie = true;
end
disp(zagrozenie)
relp not found.

Use the Help browser search field to search the documentation, or
type "help help" for help command options, such as help for methods.

plec =
    'f'
kalorie =
        2100
zagrozenie =
  logical
   0
   1
clear

plec = 'f'
kalorie = 2100
zagrozenie = false
if ((plec=='m') && (kalorie>2500)) || ((plec=='f') && (kalorie>2000))
    zagrozenie = true;
end
disp(zagrozenie)
plec =
    'f'
kalorie =
        2100
zagrozenie =
  logical
   0
   1

Instrukcja warunkowa if-else-end

clear

% a = input('Wprowadź liczbę: ');
a = randi([-10 10],1);
if (a >= 0)
    root = sqrt(a);
    disp(['Pierwiastek kwadratowy = ' num2str(root)]);
else
    disp(['Liczba ujemna, nie istnieje rzeczywisty pierwiastek kwadratowy']);
end
Liczba ujemna, nie istnieje rzeczywisty pierwiastek kwadratowy

Kaskada warunków. Wielokrotna instrukcja if-end

clear

x = 1
if x<-1
    y = 1;
end
if x>=-1 && x<=2
    y = x^2
end
if x>2
    y = 4
end
disp(y)
x =
     1
y =
     1
     1

Kaskada warunków. Zagnieżdżone instrukcje if-else-end

clear

x = 1
if x<-1
    % jeśli doszliśmy tutaj to oznacza, że zmienna x ma wartość leżącą w
    % pierwszym przedziale wartości użytym w definicji funkcji y
    y = 1
else
    % jeśli doszliśmy tutaj, to x musi być większe od -1 czyli aby ustalić
    % czy wartość x mieści się w drugim przedziale wartości użytym w
    % definicji funkcji y i wystarczy sprawdzić czy jest ona mniejsza lub
    % równa 2
    if x<=2
        y = x^2
    else
        % jeśli doszliśmy tutaj, to już nie musimy sprawdzać wartości
        % zmiennej x ponieważ na pewno jest ona większa od 2 czyli leży w
        % trzecim przedziale wartości użytym w definicji funkcji y
        y = 4
    end
end
disp(y)
x =
     1
y =
     1
     1

Kaskada warunków. Instrukcja if-elseif-else-end

clear

x = 1
if x<-1
    y = 1
elseif x<=2
    y = x^2
else
    y = 4
end
disp(y)
x =
     1
y =
     1
     1

Instrukcja sterująca switch-end

clear

dzien = 3
switch dzien
    case 1
        nazwa_dnia = 'poniedziałek';
    case 2
        nazwa_dnia = 'wtorek';
    case 3
        nazwa_dnia = 'środa';
    case 4
        nazwa_dnia = 'czwartek';
    case 5
        nazwa_dnia = 'piątek';
    case 6
        nazwa_dnia = 'sobota';
    case 7
        nazwa_dnia = 'niedziela';
    otherwise
        nazwa_dnia = 'nieznana';
end
disp(nazwa_dnia)
dzien =
     3
środa

Instrukcja sterująca switch-end z listą wartości case

clear

dzien = 3
switch dzien
    case {1, 2, 3, 4, 5}
        typ_dnia = 'robocze';
    case {6, 7}
        typ_dnia = 'weekend';
    otherwise
        typ_dnia = 'nieznana';
end
disp(typ_dnia)
dzien =
     3
robocze

Instrukcja sterująca for-end

clear

% n = input('Wprowadź liczbę:');
n = randi([-10 10],1);
f = 1;
if (n >= 0)
    for i = 2:n
        f = f * i;
    end
    disp(['Silnia liczby ' num2str(n) ' wynosi ' num2str(f)]);
else
    disp(['Nie można wyznaczyć silni podanej liczby']);
end
Nie można wyznaczyć silni podanej liczby

Instrukcja sterująca while-end

clear

i=randi([0 9]); % generacja losowej liczby całkowite z przedziału od 0 do 9
zgadnij = -1;
while (zgadnij ~= i)
    % zgadnij = input('Wprowadź liczbę całkowitą z przedziału [0 9]: ');
    zgadnij = randi([0 9],1);
    if (zgadnij == i)
        disp('Gratulacje! Zgadłeś!');
    else
        disp('Niestety nie zgadłeś. Spróbuj ponownie');
    end
end
Niestety nie zgadłeś. Spróbuj ponownie
Niestety nie zgadłeś. Spróbuj ponownie
Gratulacje! Zgadłeś!

Poprawa efektywności kodu przez prealokację obszaru pamięci

Test efektywności bez prealokacji

clear

mem = memUsed

tic
x = 0;
for k = 2:1000000
   x(k) = x(k-1) + 5;
end
toc
mem = memUsed - mem
mem =
   1.4949e+09
Elapsed time is 0.067740 seconds.
mem =
     9326592

Test efektywności z prealokacją

clear

mem = memUsed

tic
x = zeros(1, 1000000); % prealokacja odpowiedniego obszaru pamięci
for k = 2:1000000
   x(k) = x(k-1) + 5;
end
toc
mem = memUsed - mem
mem =
   1.4958e+09
Elapsed time is 0.010770 seconds.
mem =
     8003584

Zagnieżdżanie instrukcji sterujących

clear

% n = input('Wprowadź liczbę: ');
n = randi([-10 10],1);
while (n >= 0)
    f = 1;
    for i = 2:n
        f = f * i;
    end
    disp(f);
    % n = input('Wprowadź liczbę: ');
    n = randi([-10 10],1);
end
     1

Instrukcja break

clear

suma = 0;
while (true)
    % n = input('Wprowadź liczbę: ');
    n = randi([-10 10],1);
    if (n < 0)
        disp('Koniec');
        break;
    end
    suma = suma + n;
end
disp(['Suma wprowadzonych liczb wynosi ' num2str(suma)]);
Koniec
Suma wprowadzonych liczb wynosi 2

Uniknięcie instrukcji break

clear

suma = 0;
n = 0;
while (n >= 0)
    % n = input('Wprowadź liczbę: ');
    n = randi([-10 10],1);
    if (n < 0)
        disp('Koniec');
    else
        suma = suma + n;
    end
end
disp(['Suma wprowadzonych liczb wynosi ' num2str(suma)]);
Koniec
Suma wprowadzonych liczb wynosi 12

Instrukcja continue

clear

suma = 0;
for i = 1:10
    % n = input('Wprowadź liczbę: ');
    n = randi([-10 10],1);
    if (n < 0)
        disp('Zignorowano liczbę ujemną!');
        continue;
    end
    suma = suma + n;
end
disp(['Suma wprowadzonych liczb nieujemnych wynosi ' num2str(suma)]);
Zignorowano liczbę ujemną!
Zignorowano liczbę ujemną!
Zignorowano liczbę ujemną!
Zignorowano liczbę ujemną!
Zignorowano liczbę ujemną!
Zignorowano liczbę ujemną!
Suma wprowadzonych liczb nieujemnych wynosi 27

Uniknięcie instrukcji continue

clear

suma = 0;
for i = 1:10
    % n = input('Wprowadź liczbę: ');
    n = randi([-10 10],1)
    if (n < 0)
        disp('Zignorowano liczbę ujemną!');
    else
        suma = suma + n;
    end
end
disp(['Suma wprowadzonych liczb nieujemnych wynosi ' num2str(suma)]);
n =
    10
n =
   -10
Zignorowano liczbę ujemną!
n =
     6
n =
     7
n =
     8
n =
    -9
Zignorowano liczbę ujemną!
n =
    -2
Zignorowano liczbę ujemną!
n =
    -5
Zignorowano liczbę ujemną!
n =
     6
n =
    -1
Zignorowano liczbę ujemną!
Suma wprowadzonych liczb nieujemnych wynosi 37