niejasny blad w dzialaniu programu

niejasny blad w dzialaniu programu
K5
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:1
0

od niedawna zaczalem pisac w c++;
moje umiejetnosci sa na poziomie level 2 ~ noob
wiec prosze o wyrozumienie gdyby okazalo sie ze nie zauwazylem smiesznie prostego bledu;
program pokazany ponizej mial na celu wylosowac trzy niepowtarzalne pytania (z naciskiem na "niepowtarzalne"),
ale zamiast tego program wywala czesto w losowym momencie a dwa pierwsze pytania sie za kazdym razem powtarzaja;

Kopiuj
#include <iostream>
#include <time.h>
#include <windows.h>

using namespace std;

short l0,l1[3],l2,l3;
string n0;
void pytania();
short los_bez_powt();

int main()
{
	srand(time(NULL));
	l0=los_bez_powt();
	pytania();
	l0=los_bez_powt();
	pytania();
	l0=los_bez_powt();
	pytania();
	cout <<"Zdobyles: "<<l3<<" puntkow";
	
}

short los_bez_powt()
{
	for (int i;i<=0;)
	{
		l2=rand()%3+1;
		if ((l2!=l1[0]&&l2!=l1[1]&&l2!=l1[2]))
		{
			i+=1;
			return l2;
		}
    }
}

void pytania()
{
	switch (l0)
	{
		case 1: cout << "Ile skrzydel ma ptak?: ";
		        cin>>n0;
		        if (n0=="2")
		        {
		        	cout<< "Poprawna odpowiedz - zdobywasz 1 punkt" <<endl;
		        	l1[0]+=1;
		        	l3+=1;
		        	break;
				}
				else
				{
					cout<< "bledna odpowiedz - brak puntku" <<endl;
					l1[0]+=1;
					break;
				}
		case 2: cout << "Ile jest palcow u jednej dloni czlowieka?: ";
		        cin>>n0;
		        if (n0=="5")
		        {
		        	cout<< "Poprawna odpowiedz - zdobywasz 1 punkt"<<endl;
		        	l1[1]+=2;
		        	l3+=1;
		        	break;
				}
				else
				{
					cout<< "bledna odpowiedz - brak puntku"<<endl;
					l1[1]+=2;
					break;
				}
		case 3: cout << "Ile nog ma pajak?: ";
		        cin>>n0;
		        if (n0=="8")
		        {
		        	cout << "Poprawna odpowiedz - zdobywasz 1 punkt"<<endl;
		        	l1[2]+=3;
		        	l3+=1;
		        	break;
				}
				else
				{
					cout<< "bledna odpowiedz - brak puntku"<<endl;
					l1[2]+=3;
					break;
				}
				default: break;	
	}
}

ale to ze nie dziala nie jest najciekawsze(...) najciekawszym jest za to to ze jesli usune void pytania(); oraz kod z void pytania(); wkleje do
int main() na miejsce pytania() (czyli wkleje ten sam kod 3 razy zamiast tworzyc void pytania) to w magiczny sposob program zaczyna dzialac jak nalezy...
prosze o wyedukowanie mnie jesli komus by sie chcialo

edytowany 1x, ostatnio: cerrato
DO
  • Rejestracja:około 5 lat
  • Ostatnio:4 miesiące
  • Postów:85
2

ogólnie to wiele rzeczy może tutaj źle działać ;)
Masz np. funkcję short los_bez_powt(), która na pewno nie działa poprawnie: w pętli używasz zmiennej "i" która nie ma podanej wartości początkowej. Dodatkowo jak warunek zostanie spełniony to inkrementujesz tę zmienną, ale zaraz później masz "return", więc nawet nigdzie nie wykorzystasz tej zmienionej wartości. Co do samego warunku, to porównujesz wynik losowania do tablicy, która też nie ma zdefiniowanych wartości, więc raczej też nie może działać dobrze. Może zrób tak: nazwij zmienne tak, żeby ich nazwy mówiły co one dokładnie przechowują i ustaw dla nich wartości początkowe. Następnie też przenieś je do wnętrza funkcji main (raczej nie powinno się używać zmiennych statycznych). Potem jeśli program nie będzie dalej działał to wklej nowy kod, to będziemy myśleć dalej.

D5
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:16
2

Tak jak wspomniał @_dominik, nazwy zmiennych muszą mówić co reprezentują bo inaczej czytanie kodu przypomina czytanie hieroglifów.
Zamiast 'l0' to napisz nie wiem, np. 'question_id', albo 'numer_pytania' jeśli po polsku wolisz, czy coś podobnego.
Zacznij od tego.

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:13 dni
  • Postów:3561
1
Darek554 napisał(a):

Tak jak wspomniał @_dominik, nazwy zmiennych muszą mówić co reprezentują bo inaczej czytanie kodu przypomina czytanie hieroglifów.
Zamiast 'l0' to napisz nie wiem, np. 'question_id', albo 'numer_pytania' jeśli po polsku wolisz, czy coś podobnego.
Zacznij od tego.

Dodam: zmienne globalne, bleeee
Wystarczy żeby funkcje dostawały argument void pytania(int x), i globalsy mogą zniknąć.

Faktycznie, tego się czytać nie chce.

Edit:
użycie zmiennej indeksowanej ze stałymi jak l1[2]+=3; zwykle oznacza, że powinna być struktura struct z dobrze nazwanymi polami. proponuję powrót do książki, gdzieś blisko pcozątku.
Ta dwójka to w zamyśle autora coś jest, niestety my nie wiemy co

_dominik napisał(a):

ogólnie to wiele rzeczy może tutaj źle działać ;)

Dokładnie.

Edit2: mam takie swoje porzekadło: kod, który jest nieczytelny, jest praktycznie na pewno (wielokrotnie w tym przypadku) błędny


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 5x, ostatnio: AnyKtokolwiek
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Wersja prymitywna:

Kopiuj
#include <iostream>
#include <ctime>
using namespace std;

struct data { unsigned answer; const char *ask; }
Data[]=
{
	{ 2,   "Ile skrzydel ma ptak" },
	{ 5,   "Ile jest palcow u jednej dloni czlowieka" },
	{ 8,   "Ile nog ma pajak" },
	{ 101, "Ile programistow treba aby napisac ten program" },
};
const size_t DataSize=sizeof(Data)/sizeof(*Data);
const char *BadGood[]={"Bledna odpowiedz - brak puntku","Poprawna odpowiedz - zdobywasz 1 punkt"};

int main()
{
	srand(time(NULL));
	const size_t count=3;
	size_t ord[DataSize];
	for(size_t i=0;i<DataSize;++i) ord[i]=i;
	size_t goodcount=0;
	for(size_t i=0;i<count;++i)
	{
		size_t p=i+rand()%(DataSize-i);
		size_t swp=ord[i];
		ord[i]=ord[p];
		ord[p]=swp;
		size_t k=ord[i];
		cout<<Data[k].ask<<": ";
		unsigned answer;
        cin>>answer;
        bool goodanswer=(answer==Data[k].answer);
        goodcount+=goodanswer;
		cout<<BadGood[goodanswer]<<endl;
	}
	cout<<"Zdobyles: "<<goodcount<<" puntkow"<<endl;
	return 0;
}

Wersja bardziej sensowna:

Kopiuj
#include <iostream>
#include <algorithm>
#include <array>
#include <random>
#include <chrono>
using namespace std;

const struct data { unsigned answer; const string ask; }
Data[]=
{
	{ 2,   "Ile skrzydel ma ptak" },
	{ 5,   "Ile jest palcow u jednej dloni czlowieka" },
	{ 8,   "Ile nog ma pajak" },
	{ 101, "Ile programistow treba aby napisac ten program" },
};
constexpr size_t DataSize=sizeof(Data)/sizeof(*Data);
const string BadGood[]={"Bledna odpowiedz - brak puntku","Poprawna odpowiedz - zdobywasz 1 punkt"};

int main()
{
	unsigned seed=chrono::system_clock::now().time_since_epoch().count();
	constexpr size_t count=3;
	array<size_t,count> ord;
	for(size_t i=0;i<DataSize;++i) ord[i]=i;
  	shuffle(ord.begin(),ord.end(),default_random_engine(seed));
	size_t goodcount=0;
	for(size_t i=0;i<count;++i)
	{
		size_t k=ord[i];
		cout<<Data[k].ask<<": ";
		unsigned answer;
        cin>>answer;
        bool goodanswer=(answer==Data[k].answer);
        goodcount+=goodanswer;
		cout<<BadGood[goodanswer]<<endl;
	}
	cout<<"Zdobyles: "<<goodcount<<" puntkow"<<endl;
	return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:530
1

Zobacz jak można napisać podobny przykład nie używając

  • zmienny globalnych
  • dziwnych nazw typu l0, które bardziej przypominają liczbę 10
  • losowania w którym prawdziwie losowe wartości przyjmuje tylko zmienna i w pętli for
  • wielokrotnie tego samego kodu w odpowiedziach
Kopiuj
#include <iostream>
#include <algorithm>
#include <map>
#include <numeric>
#include <random>
#include <chrono>
#include <vector>

using namespace std;

struct Question
{
    string text;
    int answer {0};
};

const map<int,Question> question { {1,{"2+2 = ? ",4}} , {2,{"7-4 = ? ",3}} , {3,{"5*5 = ? ",25}} };

bool ask_question( int choise )
{
    int answer {0};
    cout << question.at(choise).text;
    cin >> answer;
    return ( answer == question.at(choise).answer ) ? true : false;
}


int main()
{
    int points {0};
    vector<int> question_order(question.size());

    default_random_engine random(chrono::system_clock::now().time_since_epoch().count());
    iota(question_order.begin(),question_order.end(),1);
    shuffle(question_order.begin(),question_order.end(),random);

    for( const auto& order : question_order )
    {
        if( ask_question(order) )
        {
            cout << "Correct!\n"; ++points;
        }
        else cout << "Wrong!\n";
    }

    cout <<"\nYou score " << points << " points";
}
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)