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

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:

#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;
} 
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?

0

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

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

                for(a=10; a=10; ++a) 
                {
                        scanf("%1d",tab[a]); // 1 cyfra
                }
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?

0

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

0

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

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.

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.

 
#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.

0
#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.

0

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

1
#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;
  }
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.
 #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;
}
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:

#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;
  }
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1