c++ TłumokMatematyczny: Czy ktoś mi wyjaśni dlaczego gdy wpisuję ''1'' to wyskakuje mi że to liczba pierwsza? #include <iostream> using namespace std; int liczba,x; int main() { cout << "Program sprawdza czy wprowadzona liczba jest liczba pierwsza" << endl; cout<< "Wprowadz liczbe i zatwierdz klawiszem ENTER"; cin>>liczba; for (x=2;x<liczba;x++) { if (liczba%x==0) { cout<< "Wprowadzona liczba nie jest liczba pierwsza"<<endl; return 0; } } cout<< "Wprowadzona liczba jest liczba pierwsza"; return 0; }
22 kwi 14:53
WhiskeyTaster: Bo masz źle sformułowany warunek. Zauważ, że gdy liczba = 1, to w pętli for masz (x = 2; 2 < 1; x++), więc ogółem jest to fałsz, a więc pętla się nie wykona
22 kwi 14:58
TłumokMatematyczny: Hmm, a jak to sformułować poprawnie?
22 kwi 14:58
WhiskeyTaster: Można na przykład dopisać: if (liczba > 1) { for (x=2;x<liczba;x++) { if (liczba%x==0) { cout<< "Wprowadzona liczba nie jest liczba pierwsza"<<endl; return 0; } } cout<< "Wprowadzona liczba jest liczba pierwsza"; }else { cout << "Wprowadzona liczba nie jest pierwsza" }
22 kwi 15:00
WhiskeyTaster: Innymi słowy na wstępie żądamy, żeby liczba była liczbą większą od 1, gdyż takie liczby mają dopiero szansę być liczbą pierwszą. W dodatku taki warunek w instrukcji warunkowej zapewnia, że nawet gdyby użytkownik wpisał liczba = 0, to pętla wewnątrz instrukcji się nie wykona
22 kwi 15:02
TłumokMatematyczny: O, dziękuję, już działa!
22 kwi 15:05
WhiskeyTaster: Ogółem proponuję, byś spróbowała zapisać taki kod, by nie korzystał z return 0; w środku programu emotka Poza main taki kod mógłby nie działać poprawnie. Lepiej uczyć się rozwiązań, które będą elastyczne niż takie sztywne.
22 kwi 15:08
f123: Nie pisz takie czegos w mainie, tylko zrob oddzielna funkcje boolowska isprime(int number), ktora zwraca true kiedy liczba jest pierwsza, a false gdy nie jest, i mozesz sprawdzac w ciele funkcji: if (number < 2) return false;
22 kwi 15:10
f123: i wprowadz optymalizacje do swojego kodu
22 kwi 15:11
f123: bo nie jest to optymalne rozwiazanie
22 kwi 15:12
TłumokMatematyczny: Nie mialam jeszcze funkcji boolowskich. Wiem że to trochę nieestetycznie pisać tak ciągle return0;, pardon me.
22 kwi 15:14
WhiskeyTaster: Tak, dlatego rób na razie tak jak potrafisz i się rozwijaj emotka
22 kwi 15:14
f123: To w takim razie pomysl, jak mozna zoptymalizowac to twoje rozwiazanie
22 kwi 15:16
TłumokMatematyczny: emotka
22 kwi 15:16
f123: mysl mysl
22 kwi 15:17
TłumokMatematyczny: Na razie jestem na takim etapie, że takie rozwiązanie wystarczy. Ale jak się bardziej zaznajomię z programem to na pewno spróbuję trochę zmienić kod.
22 kwi 15:18
f123: przy okazji − czemu uzywasz zmiennych globalnych (szczegolnie zmiennej 'x')?
22 kwi 15:18
f123: Optymalizacja tutaj to bedzie bardzo mala zmiana w kodzie, podpowiem ze cos z "x < liczba"
22 kwi 15:19
TłumokMatematyczny: hmm... używam x bo tak mnie uczono na lekcjach. Ale chyba zazwyczaj uzywa się "i"?
22 kwi 15:20
f123: Bardziej chodzilo mi o to, ze jesli tej zmiennej uzywasz tylko w tym forze(), to po co ja deklarowac jako globalna. Po prostu mozesz zrobic for (int x = ...
22 kwi 15:21
TłumokMatematyczny: Znowuż, wydaję mi się, że tak mnie po prostu uczono
22 kwi 15:24
f123: Szkola to nie jest dobre miejsce do nauki (szczegolnie programowania), polecam samemu cisnac, a po pewnym czasie zoreintujesz sie, ze profesor zle uczyl programowania
22 kwi 15:25
f123: Sam przez to przeszedlem
22 kwi 15:26
TłumokMatematyczny: Pewnie masz rację, ale wydaję mi się, że gdyby nie szkoła to nie programowałabym tak systematycznie, bo samemu trudno się czasem zmusić. Ale chyba w każdym, powiedzmy ''ścisłym'' przedmiocie jest tak, że na początku przedstawia się pewne rzeczy w uproszczeniu, a dopiero później dowiadujesz się, że coś nie do końca jest prawdą albo że można coś zrobić prościej. (Np. całe życie aż do tego roku myślałam że nie ma czegoś takiego jak kąt ujemny )
22 kwi 15:31
f123: Oczywiscie, a ktora klasa liceum i co przerabiacie z programowania na zajeciach teraz?
22 kwi 15:33
TłumokMatematyczny: Albo 2+2 to nie zawsze 4 (w zależności który system liczbowy wybierzemy) Ale przecież nie wyjaśnisz tego komuś w podstawówce...
22 kwi 15:33
wredulus_pospolitus: f123 piszący o optymalizacji ... 'my job is done' emotka
22 kwi 15:34
TłumokMatematyczny: Aktualnie 2 klasa liceum, teraz przerabiamy C++ (zajęcia online więc trochę ciężej jest ale da się przeżyć). Wcześniej mieliśmy trochę grafiki komputerowej oraz bazy danych...
22 kwi 15:35
f123: wredulus zadanie dla ciebie, zobaczymy czy wpadniesz na pomysl jak zoptymalizowac ten kod...mozesz napisac mi na discordzie
22 kwi 15:36
wredulus_pospolitus: f123 −−− całkowicie niepotrzebnie sprawdza wszystkie liczby mniejsze od inputu. Wystarczy sprawdzić te nie większe od input
22 kwi 15:42
wredulus_pospolitus: to jest pierwsza oczywista oczywistość
22 kwi 15:42
f123: i to jest optymalne rozwiazanie i <= std::sqrt(input)
22 kwi 15:44
wredulus_pospolitus: No nie wiem czy takie optymalne ... by mógł pójść krok dalej i nie sprawdzać liczb parzystych (poza 2) nie większych niż input
22 kwi 15:50
wredulus_pospolitus: jeszcze krok dalej to odrzucenie liczb podzielnych także przez 3. Po zastosowaniu tych dwóch dodatkowych rzeczy wyeliminowaliśmy kolejne 66.(6)% przypadków, które wcześniej zbytecznie rozpatrywaliśmy w tejże pętli
22 kwi 15:52
TłumokMatematyczny: A jak sformułować warunek do liczb doskonałych? Mam napisane w poleceniu aby zliczać sumy i zacząć od sumy=0 przy deklaracji zmiennych...
22 kwi 16:04
f123: Podaj cale polecenie, i co to sa liczby doskonale?
22 kwi 16:05
f123: Ok, juz wiem
22 kwi 16:06
TłumokMatematyczny: Napisz program, który sprawdzi, czy wprowadzona z klawiatury liczba całkowita jest liczbą doskonałą
22 kwi 16:07
wredulus_pospolitus: a co to jest liczba doskonała
22 kwi 16:08
f123: Ok, i gdzie lezy problem
22 kwi 16:08
TłumokMatematyczny: To taka liczba naturalna to taka liczba naturalna, która jest równa sumie wszystkich swoich podzielników, mniejszych od tej liczby.
22 kwi 16:09
f123: Mozesz miec zmienna sum, albo mozesz od liczby wejsciowej odejmowac dzielniki
22 kwi 16:09
wredulus_pospolitus: pamiętaj także, że liczby doskonałe są NIEZWYKLE rzadkie. (raptem 43 sztuki na ponad 180milionów liczb)
22 kwi 16:09
f123: Oczywiscie, jezeli chcesz zrobic ze zmienna sum − musisz przypisac jej wartosc poczatkowa 0
22 kwi 16:10
f123: Pierw rozwiaz problem "na papierze", pozniej szukaj do tego odpowiednich narzedzi
22 kwi 16:12
TłumokMatematyczny: Znalazlam w internecie cos takiego ale tu są chyba te funkcje boolowskie. Nie wiem jak zmienić ten program tak aby był zrobiony według funkcji które już znam i szczerze mówiąc nie wiem co ma suma do tego. #include<iostream> #include<cmath> using namespace std; bool czydoskonala(int n) { int s = 1, p = sqrt(n); for(int i=2; i<=p; i++) if(n%i == 0) s+= i + n/i; if(n == p*p) s−=p; if(n == s) return 1; return 0; } int main() { int n; cout<<"Podaj liczbę: "; cin>>n; if(czydoskonala(n)) cout<<"Liczba "<<n<<" jest doskonała"; else cout<<"Liczba "<<n<<" nie jest doskonała"; cin.ignore(); cin.get(); return 0; }
22 kwi 16:16
f123: "ktora jest rowna sumie swoich wszystkich dzielnikow...."
22 kwi 16:17
f123: Tak wlasciwie twojemu nauczycielowi wystarczy cos takiego (fragment) int sum = ...; for (int i = ...; i < ...; i...) { ... } if (...) { std::cout << ...; } else { std::cout << ...; } Taki "szkielet"
22 kwi 16:24
TłumokMatematyczny: co do tego: int sum = ...; for (int i = ...; i < ...; i...) { ... } czy bedzie to tak: int sum = 0; for (int i = 6; i < niejestempewna; i++) { ... }
22 kwi 16:32
f123: a dlaczego 6
22 kwi 16:33
f123: patrz, pojdziemy "brute forcem" czyli − sprawdzasz czy 2, 3, 4, 5, 6, ..., n − 1 jest dzielnikiem calkowitym n
22 kwi 16:35
TłumokMatematyczny: 6 jest najmniejszą liczbą doskonałą... źle to wstawiłam?emotka
22 kwi 16:35
wredulus_pospolitus: fil ... bo nie ma doskonałej mniejszej od 6 emotka
22 kwi 16:36
wredulus_pospolitus: może oto mu chodziło
22 kwi 16:36
f123: nie, za pomoca petli for() znajdujesz dzielniki calkowite liczby − 1
22 kwi 16:36
wredulus_pospolitus: Tłumok −−− źle podchodzisz do kodu. Twoim [i] będą kolejne ewentualne DZIELNIKI, a nie sama liczba (potencjalnie) doskonała
22 kwi 16:37
TłumokMatematyczny: Aaa, dobrze. Więc mam zacząć od 1? i=1?
22 kwi 16:38
f123: 1 bedzie dzielnikiem kazdej liczby, a wiec mozesz zaczac od i = 2, a zmiennej "sum" przypisac wartosc poczatkowa 1
22 kwi 16:39
TłumokMatematyczny: int sum = 1; for (int i = 2; i < ...; i++) { ... } To na razie mam tyle
22 kwi 16:42
wredulus_pospolitus: no i piszesz: jeżeli i jest dzielnikiem liczby 'input' to 'suma dzielników' = 'suma dzielników' + i "przetłumacz" to sobie na kod
22 kwi 16:44
wredulus_pospolitus: a w pętli for wpisujesz i < 'input' i to będzie bardzo podstawowa wersja tego programu (tzw. 'brute force' )
22 kwi 16:45
TłumokMatematyczny: i<....; co tu wstawić w miejsce kropek?
22 kwi 16:46
TłumokMatematyczny: Okej, tak dla pewności int sum = 1; for (int i = 2; i <input; i++) { ... } Jest dobrze?
22 kwi 16:47
wredulus_pospolitus: tak ... jeżeli zmienna input jest odpowiednio wcześniej zdefiniowana
22 kwi 16:50
wredulus_pospolitus: i co w tej pętli masz wtedy
22 kwi 16:50
TłumokMatematyczny: int sum = 1; for (int i = 2; i <input; i++) { coś tu trzeba wpisać ale nie wiem co } if (liczba jest rowna sumie wszystkich swoich dzielnikow mniejszych od tej liczby ale nie wiem jak to zapisać) { cout << Liczba jest liczba doskonala; } else { cout << Liczba nie jest liczba doskonala; }
22 kwi 17:07
wredulus_pospolitus: napisałem Ci co wpisać w miejscu: "coś tu trzeba wpisać ale nie wiem co" o 16:44 "liczba jest rowna sumie wszystkich swoich dzielnikow mniejszych od tej liczby ale nie wiem jak to zapisać" zapisujesz jako: input = sumadzielników
22 kwi 17:10
wredulus_pospolitus: gdzie: input −−−− zmienna przez CIEBIE zdefiniowana, która przyjmuje wartość funkcji która wprowadza się do programu (do sprawdzeni) sumadzielników −−− zmienna przez CIEBIE zdefiniowana wcześniej (o 16:42) jako 'sum'
22 kwi 17:12
TłumokMatematyczny: jeżeli i jest dzielnikiem liczby 'input' to 'suma dzielników' = 'suma dzielników' + i Jak zapisać w ''języku komputera'' jest ''dzielnikiem liczby input''? to bedzie cos w stylu if ("i' = dzielnik liczby input) { cout <<"suma dzielników'' = ''suma dzielników'' + i"<<endl;
22 kwi 17:24
f123: if (input % i == 0) { sum = sum + i; //ewentualnie sum += i (operator inkrementacji) }
22 kwi 17:28
wredulus_pospolitus: Popatrz jak wcześniej robiłaś/−eś w zadaniu gdzie sprawdzane było czy liczba jest pierwsza.
22 kwi 17:29
TłumokMatematyczny: Czy zmierzam w dobrym kierunku #include <iostream> using namespace std; int input,i,sum=1; int main() { cout << "Program sprawdza czy wprowadzona liczba jest liczba doskonala" << endl; cout<< "Wprowadz liczbe i zatwierdz klawiszem ENTER"; cin>>input; for (int i = 2; i <input; i++) { if (input % i == 0) { cout <<"sum=sum+i"<<endl; } if (input = "sum") { cout << "Liczba jest liczba doskonala"; } else { cout << "Liczba nie jest liczba doskonala"; } return 0; }
22 kwi 17:38
wredulus_pospolitus: W dobrym ... teraz można by się ewentualnie zastanowić nad tym, jakby można było zoptymalizować ten program Chociaż wątpię by to (na obecnym poziomie nauki programowania) było specjalnie konieczne.
22 kwi 17:44
f123: Niezbyt. 3 linijka programu − po co ci zmienna 'i' 12 linijka − po prostu samo sum = sum + 1 (bez zadnych coutów, endl czy ""), przy okazji brakuje ci klamry zamykajacej petle for() 15 linijka − w cpp znak sprawdzania rownosci to == a nie =, ponadto porownujesz typ int z typem string (nie mozna tak), u ciebie sum jest intem if (input == sum)...
22 kwi 17:45
wredulus_pospolitus: fil −−− ale w 'dobrym kierunku' idzie emotka
22 kwi 17:45
ICSP: kompilator tych błędów nie łapie ?
22 kwi 17:46
TłumokMatematyczny: kompilator jakies tam bledy lapie, ale jest malo pomocny.
22 kwi 17:57
ICSP: ale nie powinien w ogóle skompilować takiego programu Już nawet nie mówię o tym aby go uruchomić
22 kwi 17:59
TłumokMatematyczny: pozmieniałam trochę, ale wyskakuje mi błąd ,,error: expected '}' at the end of input'' #include <iostream> using namespace std; int input,sum=1; int main() { cout << "Program sprawdza czy wprowadzona liczba jest liczba doskonala" << endl; cout<< "Wprowadz liczbe i zatwierdz klawiszem ENTER"; cin>>input; for (int i = 2; i <input; i++) { if (input % i == 0) { sum=sum+i; } if (input == sum) { cout << "Liczba jest liczba doskonala"; } else { cout << "Liczba nie jest liczba doskonala"; } return 0; }
22 kwi 18:02
f123: brakuje ci klamry zamykajacej petle for()
22 kwi 18:04
TłumokMatematyczny: Dobra zapomnialam o klamerce, juz chyba wszystko działa.
22 kwi 18:04
TłumokMatematyczny: Dziękuję wszystkim pomagającym
22 kwi 18:04
Maciess: Czy ja dobrze rozumie, ze jest jakis serwer Discord dedykowany dla użytkowników tego forum?
22 kwi 20:41
ICSP: jest Saizou wredulus pospolitus wiedzą na ten temat więcej
23 kwi 00:18
wredulus_pospolitus: dedykowany ... za dużo powiedziane. Jeszcze jak matury miały być w pierwotnym terminie, tak wyszło że parę razy na discordzie maturzystom tłumaczyłem 1 vs 1, założyliśmy serwer i tak wchodzą sobie i Saizou wrzuca im jakieś arkusze do rozwiązywania. Trudno to nazwać dedykowanym emotka
23 kwi 00:56
Mariusz: "Szkola to nie jest dobre miejsce do nauki (szczegolnie programowania), polecam samemu cisnac, a po pewnym czasie zoreintujesz sie, ze profesor zle uczyl programowania" No fajnie tylko nie masz pojęcia o nauczaniu a oceniasz program nauczania Może przetestujemy co do tej pory już się nauczyłeś Mamy taką grę w której układamy co najmniej pięć kulek tego samego koloru w jednej linii (w wierszu, kolumnie i na obydwu diagonalach) Po ułożeniu co najmniej pięciu kulek następuje zbicie Kulki poruszają się tylko w wierszach i kolumnach oraz nie przeskakują innych kulek Gra kończy się gdy na planszy nie mamy pustych pól Rozmiar planszy to 9x9 Zwykle poziom trudności to liczba kulek (5,7,9) Jeżeli chodzi o punktację to tutaj są różne pomysły najłatwiejszy z nich to przy liczbie kulek = 5 , 1 punkt za zbitą kulkę przy liczbie kulek = 7 , 2 punkty za zbitą kulkę przy liczbie kulek = 9 , 4 punkt za zbitą kulkę Na początku losowanych jest pięć kulek a następnie po każdym ruchu który nie jest zakończony zbiciem losowane są trzy kulki Dodatkowo są takie opcje jak tablica dziesięciu najlepszych wyników, zapis wyników do pliku i odczyt tych wyników z pliku
28 kwi 14:01
Mariusz: A jeśli chcesz zadania jakie mogą ci dać na pierwszym roku na zaliczenie C/C++ albo spis tematów jakie mogą dać na algorytmach to mogę ci podrzucić
28 kwi 14:23
f123: Zadania ze studiow nie sa mi obce, bo i takich sporo robilem
28 kwi 14:46
f123: Moge ci podlinkowac moj ostatni projekt
28 kwi 14:47
f123: I wtedy ocenisz moje "skillsy" z cpp
28 kwi 14:47
f123: Jakie ja pojecia nie mam o nauczianiu. Wiem, ze czesto ucza blednie programowania w liceum i to mi wytarczy
28 kwi 14:56
TłumokMatematyczny: Ja byłabym chętna na ten spis zadań i tematów emotka
28 kwi 16:17
Mariusz: f123 Napisz program który zadałem to mi wystarczy bo na razie się tylko przechwalasz i nic z tego nie wynika A pojęcia o nauczaniu nie masz TłumokMatematyczny https://pdfhost.io/edit?doc=cd3030d8-1f7a-4e7c-b5ad-42c08140697e 1. Ogólna struktura programu , pojęcia takie jak instrukcja czy blok instrukcji 2. Typy zmiennych i zmienne 3. Pisanie po ekranie, czytanie zmiennych z klawiatury 4. Instrukcje warunkowe 5. Instrukcje iteracyjne 6. Własne funkcje czy procedury (tutaj warto też omówić temat zasięgu zmiennych) 7. Rekurencja 8. Wskaźniki lub referencja 9. Statyczna i dynamiczna alokacja pamięci 10. Rekordy (struct w C) 11. Operacje na łańcuchach 12. Czytanie i pisanie do pliku 13. Podstawy programowania grafiki 14. Własne moduły (w C mamy możliwość jedynie podziału kodu na pliki nagłówkowe i źródłowe) oraz jeśli pogramujemy dla Windows biblioteki łączone dynamicznie 15. Wstęp do programowania obiektowego Już Niklaus Wirth zauważył że bez algorytmów i struktur danych wiele programów nie napiszesz Mamy tutaj takie tematy jak Złożoność obliczeniowa algorytmów np notacja O , Ω, Θ Sortowanie wewnętrzne i zewnętrzne (Wewnętrzne gdy dane zmieszczą się w pamięci RAM, sortujemy głównie tablice czasami listy Zewnętrzne gdy dane nie zmieszczą się w pamięci RAM i musimy korzystać z pamięci masowej np z dysków magnetycznych, sortujemy głównie pliki) Wyszukiwanie liniowe i binarne (Binarne szybsze ale zakłada że ciąg jest posortowany i nie nadaje się do przeszukiwania list) Algorytmy z nawrotami (Znajdowanie rozwiązania problemu metodą prób i błędów) Podstawowe struktury danych jak stos, kolejka, listy Algorytmy geometrii obliczeniowej jak np otoczka wypukła Algorytmy na łańcuchach jak np wyszukiwanie wzorca Algorytmy kryptograficzne takie jak np szyfr RSA Nieco bardziej zaawansowane struktury danych jak drzewa czy grafy Algorytmy grafowe Szukanie cykli , najkrótszych dróg, kolorowanie grafu Problem komiwojażera Algorytmy inne np problem plecakowy
28 kwi 17:35
Mariusz: A to zadanie z grą w kulki jest na poziomie technikum informatycznego Prowadzący zajęcia zadał jednemu uczniowi napisanie takiego programu w policealnym studium informatycznym (takie studium daje tylko zawód bo nadal jest to szkoła średnia)
28 kwi 17:47
f123: No dobra, to podejmuje wyzwanie, tutaj wkleic kod?
28 kwi 18:39
f123: I czy kulki na planszy rozmieszczane sa losowo i co to znaczy ze "kulki poruszaja sie"
28 kwi 18:42
f123: I przy okazji takie pytanie, jakie ty masz pojecie o nauczaniu, skoro nie widzisz bledow w kodzie Tlumoka?
28 kwi 18:43
TłumokMatematyczny: Chyba przyniosę sobie popcorn
28 kwi 18:59