Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- #include <fstream>
- using namespace std;
- // ////////////////////////////////////////////////
- // Polynomial class
- // ///////////////////////////////////////////////
- class Polynomial {
- private:
- unsigned int degree;
- double * coefficients;
- public:
- void setCoefficient(unsigned int i, double value)
- {
- coefficients[i]=value;
- }
- double getCoefficient(unsigned int i)
- {
- return coefficients[i];
- }
- double value(double x)
- {
- double v=0.0;
- for(unsigned int i=degree; i>0; i--) v=x*v+coefficients[i];
- v=x*v+coefficients[0];
- return v;
- }
- Polynomial(unsigned int n)
- {
- degree=n;
- coefficients=new double[n+1];
- for(unsigned int i=0; i<n; i++)
- {
- coefficients[i]=0.0;
- }
- coefficients[n]=1.0;
- }
- ~Polynomial()
- {
- delete coefficients;
- }
- friend ostream & operator<<(ostream & out, Polynomial & p)
- {
- bool first=false;
- for(unsigned int i=p.degree; i>1; i--)
- {
- if(first && p.coefficients[i]!=0) out << "+";
- if(p.coefficients[i]!=0) { out << p.coefficients[i] << "*x^" << i; first=true; }
- }
- if(first && p.coefficients[1]!=0) out << "+";
- if(p.coefficients[1]!=0) { out << p.coefficients[1] << "*x"; first=true; }
- if(first && p.coefficients[0]!=0) out << "+";
- if(p.coefficients[0]!=0) out << p.coefficients[0];
- return out;
- }
- };
- // //////////////////////////////////////////////////
- // other program-specific variables and functions
- // ///////////////////////////////////////////////////
- /* prosi o podanie liczby int lub lancucha
- * wyswietlajac komunikat txt
- * ustawia odpowiednio:
- * n i zwraca READ_INT
- * ALBO
- * s i zwraca READ_STRING
- */
- typedef enum { READ_ERROR, READ_INT, READ_STRING } readValue_t;
- readValue_t getIntOrString(string txt, unsigned int &n, string &s)
- {
- char decyzja;
- cout << txt;
- decyzja = cin.peek();
- if(isdigit(decyzja))
- {
- cin >> n;
- return READ_INT;
- }
- else
- {
- getline(cin, s);
- return READ_STRING;
- }
- return READ_ERROR;
- }
- // czyta z zadanego strumienia wartosc float
- // mozna etykietowac jako inline - krotki kawalek, czesto wykonywany
- // aby nie generowac narzutu w postaci kazdorazowego wywolywania funkcji
- // kompilator wstawi cialo tej funkcji bezposrednio w kazdym miejscu,
- // gdzie jest wywolywana
- inline double readDoubleFromStream(istream &str)
- {
- double f;
- str >> f;
- return f;
- }
- int main(int argc, char* argv[])
- {
- string nazwaPliku;
- char decyzja;
- unsigned int stopien;
- ifstream infs;
- double val;
- // wskaznik na obiekt typu istream
- istream *czytanie = NULL;
- do {
- // pobierz nazwe lub liczbe
- readValue_t
- wynik = getIntOrString("Podaj nazwę pliku lub stopień wielomianiu, lub 0 by zakończyć: ",
- stopien,
- nazwaPliku);
- switch(wynik)
- {
- // wpisano liczbe
- case READ_INT:
- if(stopien == 0) // opcja na wyjscie -- stopien != 0
- return 0;
- cout << endl << "Ok, stopień to " << stopien << endl;
- // ustaw wskaznik tak, by wskazywal na cin
- // bo bedziemy czytac z klawiatury
- czytanie = &cin;
- break;
- case READ_STRING:
- cout << endl << "Ok, plik to " << nazwaPliku << endl;
- // proba otwarcia
- infs.open(nazwaPliku.c_str());
- if(infs.fail()) { // nie powiodlo sie
- cout << "Nie mogę otworzyć pliku: " << nazwaPliku << endl;
- break;
- }
- // tutaj kawalek zaznaczony na diagramie wykrzyknikiem
- // trzeba jeszcze przeczytac stopien wielomianu
- // zanim zabierzemy sie za czytanie wspolczynnikow
- infs >> stopien;
- cout << "Stopien z pliku to: " << stopien << endl;
- // ustaw wskaznik tak, by wskazywal na plik
- // bo czytanie bedzie z pliku
- czytanie = &infs;
- break;
- default:
- cout << "BĹ‚Ä…d czytania" << endl;
- }
- } while(czytanie == NULL);
- // instancja klasy, bo znamy juz stopien
- Polynomial p(stopien);
- for(int i=0; i<=stopien; i++)
- {
- // wskaznik czytanie pokazuje na wybrany wczesniej
- // strumien wejsciowy - cin (klasy istream) albo infs (klasy ifstream)
- // poniewaz ifstream jest potomkiem istream -- wszystko sie zgadza
- val = readDoubleFromStream(*czytanie);
- p.setCoefficient(i, val);
- }
- cout << "Wielomian: " << p << endl;
- cout << "Dla jakiej wartości wyliczyć? : ";
- cin >> val;
- cout << "Wartość wielomianu dla " << val << " = " << p.value(val) << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement