[C++] Wielomiany.

mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wielomiany.

Post autor: mich12 »

Witajcie, czy ktoś mógłby dostrzec błąd w kodzie? Chodzi o to że np. dla danych wejściowych:
tablica pierwszego wielomianu: 1 2 3
tablica drugiego wielomianu: 1 2 3 4 5 6 7 8 9 10

otrzymuję sumę:
tablica trzeciego wielomianu:
2 4 6 4 15 6 7 8 19 10

Wniosek jest taki, że przy niektórych wyrazach coś się nie zgadza... Czy ktoś widzi błąd?

Kod: Zaznacz cały

#include <iostream>
using namespace std;


int main ()
{

int FirstFactor;
int SecondFactor;

cout << "Podaj stopien pierwszego wielomianu:" << endl;
	cin >> FirstFactor;
	cout << "Podaj stopien drugiego wielomianu:" << endl;
	cin >> SecondFactor;

	int a[FirstFactor + 1];
	int b[SecondFactor + 1];

	cout << "Wpisz kolejno wspolczynniki pierwszego wielomianu." << endl;
	for (int i = 0; i <= FirstFactor; i++) {
		cin >> a[i];
	}

	cout << "Wpisz kolejno wspolczynniki drugiego wielomianu." << endl;
	for (int i = 0; i <= SecondFactor; i++) {
		cin >> b[i];
	}
	int i;
	int c[i];

	if(SecondFactor <= FirstFactor) {
		for(int i = 0; i <= FirstFactor; i++) {
			c[i] = a[i] + b[i];
		}
	} 
	else {
		for(int i = 0; i <= SecondFactor; i++) {
			c[i] = a[i] + b[i];
		}
	}
	
	
	cout << "Wielomian bedacy suma Twoich wielomianow:" << endl;
	

	if(SecondFactor <= FirstFactor) {
		cout << c[0] << " + " << c[1] << "n";
		for(int i = 2; i <= FirstFactor; i++) {
			cout << " + " << c[i] << "n^" << i;
		}
	} else {
		cout << c[0] << " + " << c[1] << "n";
		for(int i = 2; i <= SecondFactor; i++) {
			cout << " + " << c[i] << "n^" << i;
		}
	}
return 0;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wielomiany.

Post autor: kalwi »

Linijka 29 jest zła
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wielomiany.

Post autor: mich12 »

Hmm, a jak mogę inaczej zadeklarować tablicę c ?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wielomiany.

Post autor: kalwi »

Dynamicznie albo poprzez vector
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wielomiany.

Post autor: mich12 »

a nie mogę określić że ma rozmiar np. FirstFactor?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wielomiany.

Post autor: kalwi »

Nie, to nie jest C99. C++ nie obsługuje VLA (ewentualnie kompilacja za pomocą g++/clang++ posiada taką opcję, ale nie jest to zapewnione przez standard). Ale co to za problem napisać

Kod: Zaznacz cały

vector <int>c(FirstFactor)
i wtedy korzystasz jak z normalnej tablicy intów (i nie zamartwiasz się pamięcią, bo tu nic nie trzeba zwalniać)
a4karo
Użytkownik
Użytkownik
Posty: 22171
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3748 razy

[C++] Wielomiany.

Post autor: a4karo »

Po prostu masz śmieci w tablicach \(\displaystyle{ a}\) i \(\displaystyle{ b}\) (bo deklarujesz krótsze, a działasz na dłuższych)
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wielomiany.

Post autor: kalwi »

Kod: Zaznacz cały

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int first_factor;
    int second_factor;
    int max;

    cout << "Podaj stopien pierwszego wielomianu:" << endl;
    cin >> first_factor;
    cout << "Podaj stopien drugiego wielomianu:" << endl;
    cin >> second_factor;

    max = (first_factor > second_factor ? first_factor : second_factor) + 1;
    vector <int>a(max);
    vector <int>b(max);
    vector <int>c(max);
    fill(a.begin(), a.end(), 0);
    fill(b.begin(), b.end(), 0);
    fill(b.begin(), c.end(), 0);

    cout << "Wpisz kolejno wspolczynniki pierwszego wielomianu." << endl;
    for (int i = 0; i < first_factor + 1; ++i) 
        cin >> a[i];

    cout << "Wpisz kolejno wspolczynniki drugiego wielomianu." << endl;
    for (int i = 0; i < second_factor + 1; ++i)
        cin >> b[i];

    for(int i = 0; i < max; ++i)
        c[i] = a[i] + b[i];
  
    cout << "Wielomian bedacy suma Twoich wielomianow:" << endl;
    cout << c[0] << " + " << c[1] << "n";
    for(int i = 2; i < max; ++i)
        cout << " + " << c[i] << "n^" << i;

    return 0;
}
-- 19 lis 2016, o 10:44 --lub nieco szybciej:

Kod: Zaznacz cały

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int first_factor;
    int second_factor;
    int max;
    int x;

    cout << "Podaj stopien pierwszego wielomianu:" << endl;
    cin >> first_factor;
    cout << "Podaj stopien drugiego wielomianu:" << endl;
    cin >> second_factor;

    max = (first_factor > second_factor ? first_factor : second_factor) + 1;
    vector <int>a(max);
    fill(a.begin(), a.end(), 0);

    cout << "Wpisz kolejno wspolczynniki pierwszego wielomianu." << endl;
    for (int i = 0; i < first_factor + 1; ++i) 
        cin >> a[i];

    cout << "Wpisz kolejno wspolczynniki drugiego wielomianu." << endl;
    for (int i = 0; i < second_factor + 1; ++i)
    {
        cin >> x;
        a[i] += x;
    }   
  
    cout << "Wielomian bedacy suma Twoich wielomianow:" << endl;
    cout << a[0] << " + " << a[1] << "n";
    for(int i = 2; i < max; ++i)
        cout << " + " << a[i] << "n^" << i;

    return 0;
}
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10211
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2359 razy

[C++] Wielomiany.

Post autor: Dasio11 »

kalwi pisze:

Kod: Zaznacz cały

    vector <int>a(max);
    fill(a.begin(), a.end(), 0);
Można ciut prościej:

vector <int>a(max, 0);

albo nawet

vector <int>a(max);

bo zero jest domyślną wartością przy inicjalizacji inta jako elementu vectora.
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wielomiany.

Post autor: mich12 »

Dzięki Wam!

A mam pytanie, czy można jakoś inaczej zmodyfikować ten kod, tzn bez użycia fill i vector?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10211
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2359 razy

[C++] Wielomiany.

Post autor: Dasio11 »

Jeśli stopień wielomianu jest zmienną podawaną na wejściu, to dynamiczna alokacja pamięci jest niezbędna, a vector jest zdecydowanie najwygodniejszy w tym celu. Jeśli nie chcesz używać wektora, to należałoby użyć operatora new.
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wielomiany.

Post autor: mich12 »

A gdy zadeklaruję tablicę

Kod: Zaznacz cały

int c [ 100 ];
to też mi nie do końca dobrze liczy, czemu nie mogę tak zrobić w takim razie?

Jeszcze mam pytanie co do mnożenia wielomianów- możecie rzucić okiem na kod? Bo niestety nie spełnia swojej funkcji :/

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main () {
	int n1; // stopień pierwszego wielomianu
	int n2; // stopień drugiego wielomianu
 	int n;  // stopień wielomianu po przemnożeniu
 	
	cout << "Podaj stopien pierwszego wielomianu:" << endl;
	cin >> n1;
	cout << "Podaj stopien drugiego wielomianu:" << endl;
	cin >> n2;

	int a[n1 + 1];
	int b[n2 + 1];

	cout << "Wpisz kolejno wspolczynniki pierwszego wielomianu." << endl;
	for(int x = 0; x <= n1; x++) {
		cin >> a[x];
	}

	cout << "Wpisz kolejno wspolczynniki drugiego wielomianu." << endl;
	for(int y = 0; y <= n2; y++) {
		cin >> b[y];
	}

	n = n1 + n2;
	
	for (int i = 0; i <= n; i++) {
		 for (int x = 0; x <= n1; x++) {
 	 	 	 for (int y = 0; y <= n2; y++ ) {
				 int c[i];
		 		 c[i] = a[x] * b[y];
	 	  		 cout << "+" << c[i] << "n^" << x + y;	 
		 	 } 
		 }
    }    
return 0; 
}
	
	
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Wielomiany.

Post autor: kalwi »

Kod: Zaznacz cały

 int a[n1 + 1];
   int b[n2 + 1];
Nie możesz tak napisać w cpp. VLA nie jest tu obsługiwane.

Kod: Zaznacz cały

int c[i];
c[i] = a[x] * b[y];
ten fragment jest bez sensu
ODPOWIEDZ