Strona 1 z 1

[C++] Wielomiany.

: 18 lis 2016, o 22:33
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;
}

[C++] Wielomiany.

: 18 lis 2016, o 23:06
autor: kalwi
Linijka 29 jest zła

[C++] Wielomiany.

: 18 lis 2016, o 23:21
autor: mich12
Hmm, a jak mogę inaczej zadeklarować tablicę c ?

[C++] Wielomiany.

: 18 lis 2016, o 23:38
autor: kalwi
Dynamicznie albo poprzez vector

[C++] Wielomiany.

: 19 lis 2016, o 00:08
autor: mich12
a nie mogę określić że ma rozmiar np. FirstFactor?

[C++] Wielomiany.

: 19 lis 2016, o 00:11
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ć)

[C++] Wielomiany.

: 19 lis 2016, o 07:05
autor: a4karo
Po prostu masz śmieci w tablicach \(\displaystyle{ a}\) i \(\displaystyle{ b}\) (bo deklarujesz krótsze, a działasz na dłuższych)

[C++] Wielomiany.

: 19 lis 2016, o 10:32
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;
}

[C++] Wielomiany.

: 19 lis 2016, o 14:54
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.

[C++] Wielomiany.

: 19 lis 2016, o 23:39
autor: mich12
Dzięki Wam!

A mam pytanie, czy można jakoś inaczej zmodyfikować ten kod, tzn bez użycia fill i vector?

[C++] Wielomiany.

: 19 lis 2016, o 23:43
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.

[C++] Wielomiany.

: 19 lis 2016, o 23:49
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; 
}
	
	

[C++] Wielomiany.

: 20 lis 2016, o 02:11
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