Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Czemu zmienna się zmiena po ustaleniu innej zmiennej?


Rekomendowane odpowiedzi

Opublikowano

#include <iostream>
using namespace std;
int main()
{
int testy;
cin >> testy;
while(testy--)
{
	int suma = 0, pesel[11];
	char liczby[11];
	cin >> liczby;
	for(int i = 0; i < 11; i++)
	{
		switch (i)
		{
			case 1:
			pesel[i]*=3;
			break;
			case 2:
			pesel[i]*=7;
			break;
			case 3:
			pesel[i]*=9;
			break;
			case 5:
			pesel[i]*=3;
			break;
			case 6:
			pesel[i]*=7;
			break;
			case 7:
			pesel[i]*=9;
			break;
			case 9:
			pesel[i]*=3;
			break;
		}
		suma+=pesel[i];
	}
	if (!(suma%10)) cout << "D\n"; else cout << "N\n";
}
}

 

Chodzi konkretnie o tę linijkę:

// testy = 3
cin >> liczby;
// testy = 0

 

Dlaczego zmienna "testy" zmienia się po zapisaniu tablicy "liczby"?

 

Zasada działania programu:

http://pl.spoj.pl/problems/JPESEL/

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Weteran
Opublikowano

Jesteś pewien, że się zmienia akurat wtedy?

Próbowałeś wypisać cout`em wartość tej zmiennej przed i po cin >> liczby?

Pamiętaj, że warunek w pętli while jest wykonywany na początku, przed wykonaniem bloku instrukcji.

Opublikowano

Jesteś pewien, że się zmienia akurat wtedy?

Próbowałeś wypisać cout`em wartość tej zmiennej przed i po cin >> liczby?

Pamiętaj, że warunek w pętli while jest wykonywany na początku, przed wykonaniem bloku instrukcji.

 

No właśnie tak sprawdzałem w którym miejscu jest błąd. Tutaj kod wyświetlający wartość "testy":

http://ideone.com/9usaD

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Cóż, C++ czego się w sumie spodziewać :D

Sprawdzę u siebie co sie dzieje

 

Haha, na VC++ wszystko działa jak powinno. Więc poradzę ci - zmień kompilator na jakiś normalny. Czego w ogóle używasz?

Twoja stara robi catch the clowny w Game Makerze.

Weteran
Opublikowano

Wpisana przez ciebie wartość nie mieści się w 4 bajtach.

Zmień typ zmiennej z int na np. double i powinno działać.

 

Założę się, że nawet najprostszy debugger wykryłby ten błąd.

Opublikowano

@UP

 

W sensie, że 3 nie mieści się w int? Po zmianie na double rzeczywiście działa jak powinno.

 

@woBniaR

Nie działa w Code::blocks, na Spoju ani Ideone.

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Weteran
Opublikowano

@UP

 

W sensie, że 3 nie mieści się w int? Po zmianie na double rzeczywiście działa jak powinno.

Nie wiem co się nie mieści, bo nie wiem co w tej chwili wpisujesz.

Wywnioskowałem to po tym 44051401458. Na int to jest trochę za dużo.

Ale fajnie, że już działa :]

Opublikowano

Nie wiem co się nie mieści, bo nie wiem co w tej chwili wpisujesz.

Wywnioskowałem to po tym 44051401458. Na int to jest trochę za dużo.

Ale fajnie, że już działa :]

 

Do testy wpisuję 3, ta liczba co podałeś jest rozbijana na pojedyncze cyfry i wpisana do tablicy.

 

Temat nadal aktualny, czekam aż ktoś wyjaśni dlaczego int nie działał.

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Wydaje mi się że dlatego iż PESEL w rzeczywistości ma 11 znaków ale własnie dlatego potrzebuje 12 elementowej tablicy jeżeli używasz cin.

 

Dlaczego?

 

Jest to standardowy string asciiz czyli JEST zakańczany zerem.

Czyli do tablicy zostało wpisane 11 znaków peselu plus do liczby[12] bajt zero.

 

Z racji tego że liczby[12] nie jest zarezerowoane możliwe było że została nadpisana inna zmienna na stosie tym zerem, i w tym wypadku wszystko wskazuje ze tak własnie sie stało.

 

 

To moja teoria. I jestem pewny że mam racje, aczkolwiek mogę się mylić xD

 

 

Bardzo pochwalam używanie char* do stringów, to takie słodkie i niskopoziomowe <3

 

ale jak już używasz cout, całego ...std itd, to mógłbyś również użyć klasy string i nie mieć takich problemów.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Tablica pesel[11] nie jest inicjalizowana i jest zmienną lokalną, czyli posiada "śmieci". Nigdzie nie przypisujesz żadnemu elementowi tej tablicy żadnej znanej wartości. Gdy mnożysz wychodzą ci jeszcze inne śmieci, bo mnożysz śmieci.

 

Wszystko się jebie na ideone, bo pierwszy input to nie "2" tylko "Input:" (przyjrzyjcie się)

Input:

2

44051401458

12345678901

 

Po wysłaniu prawidłowego wejścia wszystko działa poprawnie.

U mnie na C::B też wszystko jest poprawnie. Coś ty zjebałeś, ale nie wiemy co, bo nawet nie wiemy jakie dane wpisywałeś.

Opublikowano

testowałem - po wpisanu testów 3 a potem prawidłowego peselu zmienna testy rzeczywiśćie była napisywana. C::B

 

rzeczywiście fail z tablicą pesel, ale nie zmienia to fakty że testy są nadpisywane po pobraniu peselu do liczby.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Przez przypadek usunąłem jedną linijkę, ale to nie w tym problem.

Tutaj w pełni działający już kod:

http://ideone.com/6WyME

Nie ten program :D

 

http://ideone.com/h5uK1

 

Tak czy siak, zmiana z int na double pomogła.

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Proszę.

http://ideone.com/vVlfV

 

 

int suma = 0, pesel[12];

char liczby[12];

 

Null terminated string.

Wpisujesz 11 char'ów + '\0' do 11 elementowej tablicy. std::cin::operator>> wychodzi poza zakres i jebie cię w kakao, że pozwolę sobię na takie wyrażenie.

 

@PS

Pomysł zmieniania int na double był <ciach>. Jeśli nawet pomogło ( w co wątpię ) to zupełnym przypadkiem. To jedno z rozwiązań z kategorii " zadeklaruj więcej bajtów, może to, co się jebie, akurat trafi na te nieprzydatne ".

 

 

Autorowi radzę jak najszybciej zapoznać się z STL'em, w szczególności std::string.

 

 

"

Wszystko się jebie na ideone, bo pierwszy input to nie "2" tylko "Input:" (przyjrzyjcie się)

Input:

2

44051401458

12345678901"

 

Czy na tej samej zasadzie, wszystkie swoje posty zaczynam słowami

"4ggr35510n MPC Elite Rank I Napisano dziś, 03:44" ???

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...