Funkcje – wybrane problemy i ich rozwiązania
Slajd 1
Informatyka I – wykład 6B
G.P.Korbaś
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ś
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 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ś
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ś
{
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ś
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ś
{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ś
{ 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ś