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

C++ Dev- ciągłe błędy- Program przestał działać
VK
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 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:2 miesiące
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:prawie 12 lat
  • Ostatnio:około 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:2 miesiące
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:prawie 12 lat
  • Ostatnio:około 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:około 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:prawie 12 lat
  • Ostatnio:około 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:prawie 12 lat
  • Ostatnio:około 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:2 miesiące
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:prawie 12 lat
  • Ostatnio:około 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:2 miesiące
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:prawie 12 lat
  • Ostatnio:około 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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)