Sprawdź się
Zadanie 3. Dostawa górska
Pani Zofia pracuje jako kierowca samochodu ciężarowego. Co tydzień dostarcza materiały do budowy parku rozrywki, który ma się znajdować w górach. Główna droga do parku została niestety uszkodzona, przez co pani Zofia zmuszona jest wybrać jedną z bocznych tras. Do parku rozrywki poza główną drogą prowadzi wiele bocznych dróg, jednak większość z nich jest zbyt wąska, aby samochód ciężarowy był w stanie bezpiecznie nimi przejechać.
Każda droga opisana jest za pomocą funkcji: szerokość drogi to odległość od miejsca zerowego funkcji do sufitu lub podłogi miejsca zerowego – w zależności od tego, która długość jest większa. Szerokości dróg zaokrąglane są do dwóch miejsc po przecinku.
Jest to najmniejsza liczba całkowita nie mniejsza od X.
Dla podanych liczb ich sufitami są odpowiednio:
3.4 --> 4
2.01 --> 3
-1.3 --> -1
5 --> 5
Jest to największa liczba całkowita nie większa od X.
Dla podanych liczb ich podłogami są odpowiednio:
3.4 --> 3
2.01 --> 2
-1.3 --> -2
5 --> 5
Plik funkcje.txt
zawiera 20 wierszy ze współczynnikami funkcji opisujących kolejne drogi.
Plik tekstowy zawierający wartości liczbowe. Pobierz załącznik
Pojedynczy wiersz zawiera informację o liczbie współczynników oraz kolejne współczynniki funkcji oddzielone znakami odstępu, zapisane malejąco względem potęgi x
, przy której się znajdują.
Dla kolejnych funkcji ich zapis w pliku wyglądałby następująco:
3 3 2 1
2 -2 -1
3 5 0 1
Wszystkie miejsca zerowe funkcji, które opisują szerokość dróg, znajdują się w przedziale . Do znajdowania miejsc zerowych przyjmij dokładność .
Przyjmij, że wszystkie funkcje w podanym przedziale są określone, ciągłe oraz posiadają tylko jedno miejsce zerowe.
Napisz program w wybranym języku programowania, który dla danych z pliku funkcje.txt
wyznaczy najszerszą drogę, czyli największą odległość od miejsca zerowego do sufitu lub podłogi funkcji. Wynik zaokrąglij do dwóch miejsc po przecinku i zapisz go do pliku najszersza.txt
.
Do oceny oddajesz:
plik
najszersza.txt
zawierający odpowiedź (liczba rzeczywista dodatnia – szerokość najszerszej drogi),plik(i) z komputerową realizacją zadania.
Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego do swojego programu. Odpowiedź do zadania dla danych z pliku znajdziesz pod sekcją ćwiczeń.
JĘZYK C++
#include <iostream>
#include <cmath>
using namespace std;
double f(double x, double wsp[]) {
double wynik = wsp[1];
for(int i = 2; i <= wsp[0]; i++) {
wynik = wynik*x + wsp[i];
}
return wynik;
}
double bisekcja(double a, double b, double E, double wsp[]) {
if(f(a, wsp) == 0.0)
return a;
if(f(b, wsp) == 0.0)
return b;
double c;
while(E < (b - a)) {
c = (a + b)/2;
if(f(c, wsp) == 0.0)
return c;
if(f(a, wsp) * f(c, wsp) < 0)
b = c;
else
a = c;
}
return (a+b)/2;
}
double sufit(double liczba) {
if((int)liczba == liczba)
return liczba;
if(liczba < 0)
return (int)liczba;
else
return (int)liczba + 1;
}
double podloga(double liczba) {
if((int)liczba == liczba)
return liczba;
if(liczba < 0)
return (int)liczba - 1;
else
return (int)liczba;
}
double bezwzgledna(double x) {
if(x < 0)
return -x;
else
return x;
}
double szerokosc(double x) {
if(bezwzgledna(sufit(x) - x) > bezwzgledna(podloga(x) - x))
return bezwzgledna(sufit(x) - x);
else
return bezwzgledna(podloga(x) - x);
}
int main()
{
double Funkcje[][7] =
{{6, 1, 0, 0, 0, -2, 7},
{4, 3.2, 0, -2, 5},
{3, 3, 6, -3}};
double E = 0.01;
double n = 3;
double maks = 0;
double zerowe;
for(int i = 0; i < n; i ++) {
zerowe = bisekcja(-2, 2, E, Funkcje[i]);
if(szerokosc(zerowe) > maks)
maks = szerokosc(zerowe);
}
cout << roundf(maks*100)/100;
return 0;
}
JĘZYK JAVA
public class Main
{
static double f(double x, double[] wsp)
{
double wynik = wsp[1];
for (int i = 2; i <= wsp[0]; i++)
{
wynik = wynik * x + wsp[i];
}
return wynik;
}
static double bisekcja(double a, double b, double E, double[] wsp)
{
if (f(a, wsp) == 0.0)
return a;
if (f(b, wsp) == 0.0)
return b;
double c;
while (E < (b - a))
{
c = (a + b) / 2;
if (f(c, wsp) == 0.0)
return c;
if (f(a, wsp) * f(c, wsp) < 0)
b = c;
else
a = c;
}
return (a + b) / 2;
}
static double sufit(double liczba)
{
if ((int) liczba == liczba)
return liczba;
if (liczba < 0)
return (int) liczba;
else
return (int) liczba + 1;
}
static double podloga(double liczba)
{
if ((int) liczba == liczba)
return liczba;
if (liczba < 0)
return (int) liczba - 1;
else
return (int) liczba;
}
static double bezwzgledna(double x)
{
if (x < 0)
return -x;
else
return x;
}
static double szerokosc(double x)
{
if (bezwzgledna(sufit(x) - x) > bezwzgledna(podloga(x) - x))
return bezwzgledna(sufit(x) - x);
else
return bezwzgledna(podloga(x) - x);
}
public static void main(String[] args)
{
double[][] Funkcje = new double[][]{
{6, 1, 0, 0, 0, -2, 7},
{4, 3.2, 0, -2, 5},
{3, 3, 6, -3}
} ;
double E = 0.01;
double n = 3;
double maks = 0;
double zerowe;
for (int i = 0; i < n; i++)
{
zerowe = bisekcja(-2, 2, E, Funkcje[i]);
if (szerokosc(zerowe) > maks)
maks = szerokosc(zerowe);
}
System.out.printf("%.2f", (maks * 100) / 100);
}
}
JĘZYK PYTHON
def f(x, wsp):
wynik = wsp[1]
for i in range(2, wsp[0]+1):
wynik = wynik*x + wsp[i]
return wynik
def bisekcja(a, b, E, wsp):
if f(a, wsp) == 0.0:
return a
if(b, wsp) == 0.0:
return b
while E < (b - a):
c = (a + b)/2
if f(c, wsp) == 0.0:
return c
if f(a, wsp) * f(c, wsp) < 0:
b = c
else:
a = c
return (a+b)/2
def sufit(liczba):
if int(liczba) == liczba:
return liczba
if liczba < 0:
return int(liczba)
else:
return int(liczba) + 1
def podloga(liczba):
if int(liczba) == liczba:
return liczba
if liczba < 0:
return int(liczba) - 1
else:
return int(liczba)
def bezwzgledna(x):
if x < 0:
return -x
else:
return x
def szerokosc(x):
if bezwzgledna(sufit(x) - x) > bezwzgledna(podloga(x) - x):
return bezwzgledna(sufit(x) - x)
else:
return bezwzgledna(podloga(x) - x)
Funkcje = [
[6, 1, 0, 0, 0, -2, 7],
[4, 3.2, 0, -2, 5],
[3, 3, 6, -3]
]
E = 0.01
n = 3
maks = 0
for i in range(n):
zerowe = bisekcja(-2, 2, E, Funkcje[i])
if szerokosc(zerowe) > maks:
maks = szerokosc(zerowe)
print(round(maks, 2))
Odpowiedź do zadania
0.99
Uwaga: Ze względu na niedokładność odpowiedź może się różnić o 0,01.