Informatyka I - wykład 6B

Funkcje – wybrane problemy i ich rozwiązania

Slajd 1

Informatyka I – wykład 6B

G.P.Korbaś

Problem1.

Napisz funkcję o prototypie

string psikus(string s)

która w tekście wyszukuje cyfry i każdą cyfrę zamienia na o 1 większą, czyli '0' zostanie zamienione na '1', '7' na '8', itp. Przy czym cyfra '9' zostanie zamieniona na '0'

Slajd 2

Informatyka I – wykład 6B

G.P.Korbaś

Uwagi do rozwiązania problemu 1.

Koncepcja: sprawdzić każdy znak tekstu – czy leży pomiędzy '0' a '9' (włącznie) – znaki są ułożone kolejno zgodnie z ich kodami ASCII. Jeśli jest to znak od '0' do '8', to wystarczy zmienić jego kod ASCI na o 1 większy, jeśli jest to znak '9' to należy zmienić go na '0'.

Jeśli przekazujemy przez wartość zmienną typu string, to jest wykonywana jej kopia i nie musimy martwić się o zmiany w oryginalnym tekście.

Slajd 3

Informatyka I – wykład 6B

G.P.Korbaś

Problem 1. - przykład rozwiązania

string psikus(string s)

{

int d=s.length();

int nr=0;

while (nr<d)

{if (s[nr]>='0' && s[nr]<='9') if (s[nr]=='9') s[nr]='0';

else s[nr]++;

nr++;

}

return s;

}

Slajd 4

Informatyka I – wykład 6B

G.P.Korbaś

Problem2.

A) Napisz funkcję o prototypie

bool sprawdz(int &a,int &b,int aa=0,int bb=0) Funkcja sprawdza, czy zmienna a jest równa aa. Jeśli nie, to do zmiennej a wpisywana jest wartość aa. Ponadto funkcja sprawdza, czy zmienna b jest równa bb. Jeśli nie, to do zmiennej b wpisywana jest wartość bb. Jeśli w obydwu przypadkach wystąpiła równość, to funkcja zwraca prawdę, w przeciwnym wypadku fałsz.

B) Napisz program, który pobiera od użytkownika 4 liczby całkowite, aż do podania przez użytkownika samych zer. Program wykorzystuje funkcję sprawdz aby sprawdzić, czy pierwsza liczba jest równa drugiej i trzecia czwartej. Jeśli tak, to program pisze “OK”, jeśli nie, to program pisze “NIE”. Po napisaniu program pobiera koljną czwórkę liczb, np: 1 2 3 4

NIE

1 1 2 2

TAK

0 1 0 1

NIE

0 0 0 0 <----koniec

Slajd 5

Informatyka I – wykład 6B

G.P.Korbaś

Uwagi do rozwiązania problemu 2.

Koncepcja funkcji: W przedstawionym dalej rozwiązaniu stosuje się pośredniczącą zmienną typu bool, której wartość zwracana jest pod koniec funkcji. Jeśli jest to możliwe

– warto używać polecenia return jedynie pod koniec funkcji i nie ukrywać go w żadnej pętli lub instrukcji warunkowej. Zmienna pośrednicząca pozwala często osiągnąć ten cel.

Koncepcja programu: Stosowana jest pętla while w nawiasie której występuje polecenie wykonywane przed warunkiem. W nawiasie może być wiele poleceń oddzielonych przecinkami – rzeczywisty warunek pętli powinien być na końcu.

Jak sprawdzić w prosty sposób czy wszystkie 4 liczby są zerami? Wystarczy sprawdzić, czy suma ich kwadratów jest zerami.

Slajd 6

Informatyka I – wykład 6B

G.P.Korbaś

Problem 2. - przykład rozwiązania

#include <iostream>

using namespace std;

bool sprawdz(int &a,int &b,int aa=0,int bb=0)

{

bool rowno=true;

if (a!=aa)

{a=aa;

rowno=false;

}

if (b!=bb)

{b=bb;

rowno=false;

}

return rowno;

}

Slajd 7

Informatyka I – wykład 6B

G.P.Korbaś

int main()

{

int z1,z2,z3,z4;

while (cin>>z1>>z2>>z3>>z4,z1*z1+z2*z2+z3*z3+z4*z4!=0)

{

if (sprawdz(z1,z3,z2,z4))

cout << "OK\n";

else cout << "NIE\n";

}

return 0;

}

Slajd 8

Informatyka I – wykład 6B

G.P.Korbaś

Problem3.

A) Napisz funkcję o prototypie

string zamiana(string s)

która w tekście wyszukuje przecinki i zamienia na kropki i dodatkowo z tekstu usuwa wszystkie spacje

B) Załóżmy, że w pierwszym wierszu strumienia wejściowego znajduje się liczba całkowita n, a następnie n wierszy z tekstem. Napisz program, który (wykorzystując funkcję zamiana) pobierze dane i wyświetli wszystkie teksty zamienione. Można założyć, że n<=1000.

Slajd 9

Informatyka I – wykład 6B

G.P.Korbaś

Uwagi do rozwiązania problemu 3.

Koncepcja funkcji: Funkcja składa się z dwu części. Pierwsza część zamienia przecinki na kropki i jest podobna do problemu 1. Druga część szuka spacji – jeśli spacja jest znaleziona, to następuje jej usunięcie i dalsze sprawdzanie.

Koncepcja programu: Tworzona jest tablica na 1000 zmiennych typu string. Po wprowadzeniu zmiennej liczbowej używamy cin.ignore(), co czyści bufor wejściowy i powoduje, że pierwszy tekst jest wczytywany poprawnie (a nie pusty). Dalej wczytywane są kolejne teksty za pomocą funkcji getline (z biblioteki string) – zapamiętywane w tablicy. Następnie teksty są zamieniane i wyświetlane w kolejnych wierszach.

Slajd 10

Informatyka I – wykład 6B

G.P.Korbaś

Problem 3. - przykład rozwiązania

#include <iostream>

using namespace std;

string zamiana(string s)

{

int d=s.length();

int nr=0;

while (nr<d)

{if (s[nr]==',') s[nr]='.';

nr++;

}

do

{nr=s.find(' ');

if (nr>-1) s.erase(nr,1);

}

while (nr>-1);

return s;

}

Slajd 11

Informatyka I – wykład 6B

G.P.Korbaś

int main()

{

string t[1000];

int n;

cin >> n;

cin.ignore();

for (int i=0;i<n;i++)

{getline(cin,t[i]);

cout<<t[i]<<endl;

}

for (int i=0;i<n;i++)

cout <<zamiana(t[i])<<endl;

return 0;

}

Slajd 12

Informatyka I – wykład 6B

G.P.Korbaś

Problem4.

A) Napisz funkcję, która rozwiązuje równanie postaci ax 2 bx c=0 , gdzie a,b,c są dowolnymi liczbami rzeczywistymi. Funkcja powinna zwracać informację o liczbie pierwiastków tego rówania oraz same pierwiastki.

B) Napisz program, który pobiera od użytkownika współczynniki do podanego równania i rozwiązuje je używając funkcji z podpunktu A. Po wyświetleniu wyników program powinien pytać użytkownika czy chce rozwiązać kolejne równanie.

Slajd 13

Informatyka I – wykład 6B

G.P.Korbaś

Uwagi do rozwiązania problemu 4.

Koncepcja funkcji: Pełne rozwiązanie wymaga rozpatrzenia lewwej strony równania jako funkcji kwadratowej, liniowej lub stałej.

●

Jeśli a≠0 , to obliczamy = b 2−4 a c i możemy mieć zero rozwiązań (gdy

0 ), jedno rozwiązanie (gdy =0 wtedy x 0=− b ) lub dwa rozwiązania (gdy 2a

0 wtedy x =− b− , x =− b ) 1

2a

2

2a

●

Jeśli a=0, to patrzymy na b i c. Jeśli b=0 i c=0 to jest nieskończenie wiele rozwiązań.

Jeśli b=0 i c≠0 , to nie ma rozwiązań. Jeśli b≠0 , to jest jedno rozwiązanie x=-c/b Koncepcja programu: Stosowana jest pętla do while i analiza odpowiedzi użytkownika.

Slajd 14

Informatyka I – wykład 6B

G.P.Korbaś

Problem 4. - przykład rozwiązania

#include <iostream>

#include <cmath>

using namespace std;

// zwraca liczbę rozwiązań lub -1 gdy jest nieskończenie wiele int axxbxc(double a,double b,double c,double &x1,double &x2)

{

int liczroz=0; //licznik rozwiązań

if (a!=0) //kwadratowe

{double delta=b*b-4*a*c;

if (delta<0) liczroz=0;

else if (delta==0)

{x1=-b/(2*a);

liczroz=1;

}

else {x1=(-b-sqrt(delta))/(2*a);

x2=(-b+sqrt(delta))/(2*a);

liczroz=2;

}

}

else

Slajd 15

Informatyka I – wykład 6B

G.P.Korbaś

if (b!=0) //liniowe

{x1=-c/b;

liczroz=1;

}

else //stałe

if (c!=0) liczroz=0;

else liczroz=-1;

return liczroz;

}

Slajd 16

Informatyka I – wykład 6B

G.P.Korbaś

int main()

{ double a,b,c,x1,x2;

char z;

do

{cout << "a="; cin>>a;

cout << "b="; cin>>b;

cout << "c="; cin>>c;

switch (axxbxc(a,b,c,x1,x2)){

case -1: cout<<"Niesk. wiele rozw.."; break; case 0: cout<<"Brak rozwiązań";break; case 1: cout<<"Jedno rozwiązanie, x="<<x1;break; case 2: cout<<"Dwa rozw., x="<<x1<<" lub x="<<x2;break; default: cout<<"BŁĄD!!!";

}

cout<<"\n\nWpisz 't' lub 'T' i naciśnij ENTER, aby liczyć jeszcze raz - inny znak oznacza koniec\nCzy jeszcze raz? "; cin >> z;

}

while (z=='t' || z=='T');

return 0;

}

Slajd 17

Informatyka I – wykład 6B

G.P.Korbaś