[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

anilahcim
Użytkownik
Użytkownik
Posty: 209
Rejestracja: 13 lip 2012, o 14:32
Płeć: Kobieta
Lokalizacja: Pcim
Podziękował: 107 razy

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: anilahcim »

Napisz program (przy użyciu pętli), który wyświetli prosty tekstowy wykres ilustrujący wartości reszt z dzielenia przez m (podana liczba) dla kolejnych wyrazów danego ciągu liczb całkowitych. Wczytaj następujące dane od użytkownika:

liczbę określającą numer wyrazu ciągu, od którego ma być rysowany wykres,
liczbę określającą numer wyrazu ciągu, do którego ma być rysowany wykres,
wartość m.
Ciąg określony jest następująco:
\(\displaystyle{ a_n=a_{n-2} - a_{n-1},}\)
gdzie dwa pierwsze wyrazy ciągu wynoszą \(\displaystyle{ a_0=2 ;\; a_1=1}\).

Na wykres składają się kolejne wiersze tekstu, które powinny rozpoczynać się od znaku pionowej kreski (|), a następnie zawierać tyle kropek, ile wynosi reszta z dzielenia przez m kolejnego wyrazu ciągu (począwszy od wyrazu na podanej pozycji) Dodatkowo, na koniec program powinien wypisywać łączną liczbę narysowanych kropek.


Zrobiłam tak:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main()
{
	int x, y, m;

	cout << "Podaj numer pierwszego rysowanego wyrazu ciagu: " << endl;
	cin >> x;
	cout << "Podaj numer ostatniego rysowanego wyrazu ciagu: " << endl;
	cin >> y;
	cout << "Chcesz otrzymac reszte z dzielenia przez: " << endl;
	cin >> m;

	int n=2, a, a0=2, a1=1;
	while (n<=x) {
		n++;
		a=a0-a1;
		a0=a1;
		a1=a;
	}

	int z=0, k;
	while (x<=y) {
		x++;
		k=a%m;
		a=a0-a1;
		a0=a1;
		a1=a;
		cout << "| ";
		while (z<=k) {
			z++;
			cout << ". ";
		}

	}

	system("pause");
	return 0;
}

Będę wdzięczna za pomoc, jeśli komuś chciałoby się to sprawdzić i powiedzieć mi, co jest źle (bo program źle rysuje wykres).
Ostatnio zmieniony 31 paź 2012, o 11:46 przez Afish, łącznie zmieniany 3 razy.
Powód: Nieczytelny zapis - brak LaTeX-a. Proszę zapoznaj się z instrukcją: http://matematyka.pl/latex.htm .
knrdk
Użytkownik
Użytkownik
Posty: 36
Rejestracja: 12 mar 2009, o 13:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 5 razy
Pomógł: 7 razy

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: knrdk »

1) Twój program wysypie się jeśli ktoś będzie chciał zacząć wypisywać reszty od a0 lub a1.
2) Popatrz na drugą pętle while i zastanów się jak wygląda "z" w drugim (trzecim, ...) przebiegu pętli.
3) Czy w pętli wypisującej kropki powinno być z<=k gdy z zaczyna się od 0 ?
4) Co się dzieje liczymy resztę z ujemnej liczby ?
5) Jeśli to ma być wykres to warto by po wypisaniu kropek przejść do nowej linii.
anilahcim
Użytkownik
Użytkownik
Posty: 209
Rejestracja: 13 lip 2012, o 14:32
Płeć: Kobieta
Lokalizacja: Pcim
Podziękował: 107 razy

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: anilahcim »

Dziękuję! Próbowałam popoprawiać zgodnie ze wskazówkami, ale ciągle źle działa... Czy w ogóle można łączyć if z while, tak jak to zrobiłam? Bo dopóki jest samo while (i nie uwzględniam a0 i a1), to program liczy dobrze wyrazy ciągu. W tej wersji - nie.
I jeszcze pytanie, jak przejść do nowej linii... Wiem że z endl albo /n, ale nie wiem, w którym miejscu i jak to wstawić, żeby za każdym razem przechodziło mi do nst. linii.

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main()
{
	int x, y, m;

	cout << "Podaj numer pierwszego rysowanego wyrazu ciagu: " << endl;
	cin >> x;
	cout << "Podaj numer ostatniego rysowanego wyrazu ciagu: " << endl;
	cin >> y;
	cout << "Chcesz otrzymac reszte z dzielenia przez: " << endl;
	cin >> m;
	if (x<0 || y<1 || m<1 || x>y) {
		cout << "Nieprawidlowe dane. " << endl;
		return 0;
	}

	int n=1, a, a0=2, a1=1;
	if (x=0)
		a=2;
		else if (x=1)
			a=1;
			else
				while (n<x) {
					n++;
					a=a0-a1;
					a0=a1;
					a1=a;
				}

	int z=0, k;
	while (x<y) {
		x++;
		if (a<0) {
			a=a+m;
			k=a%m;
			a=a-m;
		}
			else
				k=a%m;
		a=a0-a1;
		a0=a1;
		a1=a;
		cout << "| ";
		while (z<k) {
			z++;
			cout << ". ";
		
		}

	}

	system("pause");
	return 0;
}
knrdk
Użytkownik
Użytkownik
Posty: 36
Rejestracja: 12 mar 2009, o 13:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 5 razy
Pomógł: 7 razy

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: knrdk »

Zastanów się czy twojego kodu nie można by uprościć gdyby znaleźć takie \(\displaystyle{ a_{-1}}\), że \(\displaystyle{ a_{1} = a_{-1}-a_{0}}\) ? Można by wtedy uniknąć rozważania różnych przypadków.
Jak to policzyć ?

Oznaczmy sobie:
n - bieżący element ciągu
an - wartość bieżącego elementu ciągu
an1 - wartość poprzedniego elementu ciągu
tmp - zmienna pomocnicza

Wtedy mamy:

Kod: Zaznacz cały

int n = 0, an = 2, an1 = 3;
int tmp;
Następnie chcemy przejść do elementu x:

Kod: Zaznacz cały

while (n<x){
	n++;
	tmp = an;
	an = an1 - an;
	an1 = tmp;
} 
Po zakończeniu tej pętli mamy n=x
Możemy przejść do wypisywania reszt z dzielenia. W tym celu musimy przejść przez wszystkie elementy ciągu od x do y, czyli mamy pętle:

Kod: Zaznacz cały

int k,z;
while(n<=y){
}
W pętli liczymy resztę dla każdego elementu:

Kod: Zaznacz cały

k = an%m;
if(k<0){
	k+=m;
}
Dlaczego dla ujemnych k dodajemy m ?
Jak już mamy policzone k to wypisujemy kropki:

Kod: Zaznacz cały

z = 0;
while(z<k){
	cout << ".";
	z++;
}
cout << endl;
No i na koniec przechodzimy do następnego elementu w taki sam sposób jak w pierwszej pętli while.
rafal9541
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 31 sty 2012, o 20:38
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: rafal9541 »

Twój kod działa fatalnie, dużo niezrozumiałości... Jak chcesz mogę Ci przysłać poprawiony kod, chyba że już udało się naprawić.
anilahcim
Użytkownik
Użytkownik
Posty: 209
Rejestracja: 13 lip 2012, o 14:32
Płeć: Kobieta
Lokalizacja: Pcim
Podziękował: 107 razy

[C++] Wartości reszt z dzielenia dla kolejnych wyrazów ciągu

Post autor: anilahcim »

Już chyba wszystko rozumiem, dziękuję bardzo za wytłumaczenie
ODPOWIEDZ