C++ Dev- ciągłe błędy- Program przestał działać

C++ Dev- ciągłe błędy- Program przestał działać
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Witam!
Dość często zdarza się, że mój Dev wyświetla mi ten komunikat. Szczegóły:

Podpis problemu:
Nazwa zdarzenia problemu: APPCRASH
Nazwa aplikacji: ps.exe
Wersja aplikacji: 0.0.0.0
Sygnatura czasowa aplikacji: 515c7b19
Nazwa modułu z błędem: msvcrt.dll
Wersja modułu z błędem: 7.0.7600.16930
Sygnatura czasowa modułu z błędem: 4eeb01e3
Kod wyjątku: c0000005
Przesunięcie wyjątku: 00000000000622dc
Wersja systemu operacyjnego: 6.1.7600.2.0.0.768.3
Identyfikator ustawień regionalnych: 1045
Dodatkowe informacje 1: a902
Dodatkowe informacje 2: a902b52a4c039f2bef8ff124351ae9a2
Dodatkowe informacje 3: e77e
Dodatkowe informacje 4: e77e053b4c0308e7265f2836c04cee6a

No chyba, że to wina części programu ale podesłał mi ją jeden z zaufanych forumowiczów. Najpewniej mój błąd. Oto program:

Kopiuj
#include <iostream>
#include <stdio.h>


 
int main() 
{
	std::string pesel;
	int a;
	int tab[4];
	std::cout<<"podaj PESEL:  ";
	    std::cin>>pesel;
	    
	a=pesel.length();
	{
		for(a=1; a<=6; ++a) 
		{
			scanf("%2d",tab[a]); // 2 cyfry
		}
		
		for(a=10; a=10; ++a) 
		{
			scanf("%1d",tab[a]); // 1 cyfra
		}
	}
	
	if( a!=11 );
	    getchar();
	
	printf("%d\n", tab[a]);
	
	return 0;
} 
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
0

Co to za mix w ogóle? Tablice indeksujemy od 0. Tablica jest indeksowana od zera do 3, a Ty się odwołujesz do 9 elementu. Co Ty chcesz zrobić? Co to za 'zaufany' użytkownik? Maszynaz?

edytowany 1x, ostatnio: kopernik
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
0

Tak: scanf("%2d",tab+a); lub tak: scanf("%2d",&tab[a]);
To ; a=10; też jest błędne.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
0

przecież ta pętla jest bez sensu. Przypisujesz do a w wyrażeniu inicjalizującym wartość 10 następnie przypisujesz do tej zmiennej a 10 Warunek jest spełniony więc pętla się wykona później zwiększaj a o 1 późnierj znów przypisujesz do "a" 10 i warunek jest spełniony itd

Kopiuj
                for(a=10; a=10; ++a) 
                {
                        scanf("%1d",tab[a]); // 1 cyfra
                }

Nie odpowiadam na PW z prośbą o pomoc programistyczną.
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

tablica miała mieścić kolejno:
tab[0]=1.2. ( gdzie 1 i 2 to kolejność ich występowania w tekście wpisanym przez urzytkownika czyli pierwszy i drugi)
tab[1]=3.4.
tab[2]=5.6.
tab[3]=10. (tutaj tylko jeden element dziesiąty)
++a miało dodawać kolejne liczby i sprawdzać dzięki pętli każdą liczbę, ale żeczywiście bez sensu jest to +1 gdy jest tylko jedna cyfra. Byłbym wdzięczny za odp. na pytania:
1.Co jest błędem w tablicy?
2.Czy prawidłowo napisałem "a=pesel.length();" i "a" to ilość znaków w peselu?
3.Czemu program każe wpisywać wielokrotnie liczby po wciśnięciu entera zamiast użyć print?
4.Czy dobrze napisałem "if( a!=11 ); getchar();" i po wpisaniu innej ilości liczb niż 11 program się wyłączy?

edytowany 1x, ostatnio: VanKiller
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
0

a=10 - oznacza wpisz w a liczbę 10
a==10 - oznacza sprawdź czy a równe 10


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
VK
Wiem o tym i na początku wpisałem if( a!==11 ); bo pewnie o to Ci chodzi, ale był error. Można sprawdzić na pierwszej lepszej stronie co nie co o tym, że powinienem napisać if( a!=11 ); z jednym "=". Np. http://www.elektroda.pl/rtvforum/topic1566429.html
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Może ktoś odpowiedzieć na w/w pytania?

_13th_Dragon
1.Nic; 2.Tak; 3.Bo pesel już został wczytany; 4.Napisałeś bez sensu; Taka jest właściwość windows'ów - zamykają zakończoną aplikacje.
LO
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:1
0
VanKiller napisał(a):

tablica miała mieścić kolejno:
tab[0]=1.2. ( gdzie 1 i 2 to kolejność ich występowania w tekście wpisanym przez uŻytkownika czyli pierwszy i drugi)
tab[1]=3.4.
tab[2]=5.6.
tab[3]=10. (tutaj tylko jeden element dziesiąty)
++a miało dodawać kolejne liczby i sprawdzać dzięki pętli każdą liczbę, ale RZeczywiście bez sensu jest to +1 gdy jest tylko jedna cyfra. Byłbym wdzięczny za odp. na pytania:
1.Co jest błędem w tablicy?

Mam rozumieć, że chciałeś umieścić po 2 elementy w jednym polu tablicy? Jeśli chcesz wprowadzić 7 elementów to tablica musi mieć 7 pól to chyba logiczne. Po co tworzysz tablice z 5-oma polami skoro chcesz wykorzystać tylko 4? Kompletnie niezrozumiałe jest dlaczego po stworzeniu tej tablicy próbujesz zapisywać dane poza rozmiarem tablicy.

VanKiller napisał(a):

2.Czy prawidłowo napisałem "a=pesel.length();" i "a" to ilość znaków w peselu?

Tak, a to liczba znaków. Ale to się przydaje do pobierania kolejnych znaków z tego tekstu. To co napisałeś w tej pętli jest totalnie bez sensu

VanKiller napisał(a):

3.Czemu program każe wpisywać wielokrotnie liczby po wciśnięciu entera zamiast użyć print?

scanf służy do pobierania danych ze standardowego wejścia (z twojej klawiatury). Napisałeś pętle która pobierze dane 6 razy więc co w tym dziwnego.

VanKiller napisał(a):

4.Czy dobrze napisałem "if( a!=11 ); getchar();" i po wpisaniu innej ilości liczb niż 11 program się wyłączy?

Warunek jest dobry ale pomyśl czy lepiej go dać na końcu czy na początku. W dodatku przed tym warunkiem zmieniasz wartość a na 10, więc ten if jest do niczego. getchar() nie kończy programu, znajdź w google i przeczytaj co to za funkcja. Jaki sens ma używanie funkcji których działania nie rozumiesz?

Zacznij od czegoś prostszego bo nie znasz podstaw.

VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Widać to getchar(); to jakiś noobek podrzucił bo znalazłem na jednej ze stron, że dosłownie "zamyka program". Teraz spr co dokładnie robi i rzeczywiście to głupota była.
Zacznę od początku.

Kopiuj
 
#include <iostream>
#include <stdio.h>
using namespace std;

 
int main() 
{
	string pesel;
	int a;
	cout<<"podaj PESEL:  ";
	    cin>>pesel;
	a=pesel.length();
	
	if( a!=11 );
	{
		//zamykanie
	}
	cout<<"Podano 11 znaków."<<endl;
	
	


	return 0;
}

Tylko dalej nie mogę dojść jak zamknąć "//zamykanie". Czytałem już kilka stron google i nie mogę dojść. I czego najlepiej byłoby użyć aby potem można było pobierać dane z tablicy a mianowicie pierwszą i drugą cyfrę razem, trzecią i czwartą razem, piątą i szóstą razem, dziesiątą solo.

JS
Ale co Ty chcesz zamykać? Program sam się zamknie, chyba, że się zapętli, wtedy nie. W ogóle bezsensu to piszesz, poczytaj trochę zanim coś zaczniesz pisać (nawet nie wiadomo co Ty chcesz tu osiągnąć) w sieci jest kupę materiałów na temat podstaw C++.
WE
System("pause"); //przed końcem programu i konsola się nie zamknie.
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char buf[12];
    unsigned in;
    scanf("%11s ", buf);
    in=strlen(buf);
    if(in!=11) return -1;
    printf("Podano 11 znakow.\n");
    return 0;
}

Chcesz zrobic cos takiego? W przypadku wpisania mniejszej ilosci znakow, zamyka program.

VK
No tak, ale z tego nie da się wyprowadzić kolejnych liczb do tablicy bo strlen tylko je liczy. A mi zależy żebym również wprowadził liczby do tablicy :(
n0name_l
powiedz co chcesz zrobic, bo tak nigdy nikt Ci nie pomoze...
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Program podający datę urodzenia i płeć za pomocą PESELU.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
1
Zobacz pozostały 1 komentarz
n0name_l
nie musi wcale, ale powinna byc fakt, zapomnialem.
VK
no chyba musi jesli bez niej program nie pali :P
n0name_l
uzyles kompilatora do innego jezyka.
VK
nie. tak jak w temacie: c++. dokladnie Dev
n0name_l
W C nie trzeba dolaczac, w C++ juz tak.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
1
Kopiuj
#include <iostream>
#include <iomanip>
using namespace std;
 
int main() 
  {
   cout<<"podaj PESEL: ";
   string p;
   cin>>p;
   if(p.length()!=11) cout<<"Blad wprowadzenia danych"<<endl;
   else
     {
      int m=10*(p[2]-'0')+(p[3]-'0');
      cout
         <<"KM"[p[9]&1]<<' '
         <<setfill('0')<<setw(2)<<(10*(p[4]-'0')+(p[5]-'0'))<<'.'
         <<setfill('0')<<setw(2)<<(m%20)<<'.'
         <<(1900+10*(p[0]-'0')+(p[1]-'0')+100*((m/20+1)%5-1))<<
      endl;
     }
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
VK
Dzięki. Jak zawsze sprawnie. Zaraz przeanalizuje kod choć to nie będzie łatwe :P Pozdrawiam!
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Pozwoliłem sobie przerobić program n0name'a
Jest prostszy a ja się dopiero uczę więc więcej od niego wyniosę ;)
Tylko 2 problemów dalej nie mogę się pozbyć:

  1. Jeśli wpisane liczby mają długość 11 znaków program jeszcze raz nakazuje coś wpisać, po wpisaniu dosłownie czego się chce (choćby 1 i ENTER) program bierze pod uwagę pierwszy tekst. Niby ok ale nie potrzebna jest ta druga linia. Problem nie występuje jeśli liczb jest więcej niż 11.
  2. Płeć przerobiłem ale szwankuje. Nie wiem w czym problem. Wzór ze sprawdzaniem parzystości też nie odpalił, poniżej jest to napisane ręcznie.
Kopiuj
 #include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;
 
int main()
{
    char buf[12];
		scanf("%11s ", buf);
    if(strlen(buf)!=11) return -1;
    
    printf("Rok: 19%c%c\nMiesiac: %c%c\nDzien:: %c%c\n", 
            buf[0], buf[1], buf[2], buf[3], buf[4], buf[5] );

    if(buf[9]==1 || 3 || 5 || 7 || 9)
    {
		cout << "Plec: Mezczyzna." << endl;
	}
	else
	{
		cout << "Plec: Kobieta." << endl;
	}
    
    return 0;
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
1

Rok i miesiąc wyświetlasz niepoprawnie, patrz jak zaszyfrowane miesiące: http://pl.wikipedia.org/wiki/PESEL
Pleć, jedno z:

  1. if(buf[9]&1)
  2. if(buf[9]%2)
  3. if(strchr("13579",buf[9]))
  4. if(buf[9]=='1' || buf[9]=='3' || buf[9]=='5' || buf[9]=='7' || buf[9]=='9')

Tak beznadziejnie jak to zrobiłeś to wystarczy to:

Kopiuj
#include <stdio.h>
 
int main()
  {
   int y,m,d,x,p;
   if(scanf("%2d%2d%2d%3d%1d%1d",&y,&m,&d,&x,&p,&x)!=6) return -1;
   printf("Rok: 19%02d\nMiesiac: %02d\nDzien:: %02d\nPlec: %s.\n",y,m,d,p&1?"Mezczyzna":"Kobieta");
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 4x, ostatnio: _13th_Dragon
VK
Teraz to przykozaczyłeś. Duuużo skrócone i logiczne dla wszystkich lat. Teraz musze to przeanalizować i podopisywać kosmetyczne i estetyczne dodatki. Dzięki. CLOSE
VK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:31
0

Wiem czytałem o tym, później się domyśli. Na razie przedział z urodzonymi w XX w. ;)
Tylko dalej nie rozumiem czemu program nakazuje ponownie wpisać tekst zamiast przejść do swojej odpowiedzi

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.