lion137
2019-01-25 22:39

Nowa Seria

Wymyśliłem nową serię artykułów: Fundamental Algorithms, zobaczymy, jak mi pójdzie:-D. Na poczatek
tzw. order statistics, czyli wyszukiwanie ntego najmniejszego elementu w tablicy, w użyciu standartowe, dziel i rządź:
https://lion137.blogspot.com/[...]1/fundamental-algorithms.html
#theory #algorithms #C++

lion137

Jak zwykle, chociaż nie zawsze to piszę, Big Thanks dla uważnych Czytelników!

lion137
2018-12-19 02:19

Linear Recurrence Solver

Koniec problemów z rozwiązywaniem rekurencji:) oto mini projekcik, rozwiązywanie dowolnej liniowej rekurencji (dokładnie jednorodnej), jak, np. Fibonacci.
https://github.com/lion137/Linear_Recurrence_Solver
Napisane w C++, funkcje w pełni generyczne, przykłady w testach.
#theory #computation #C++

Dregorio

@lion137: Jakie książki? Plus mówienie, że zmiana Python na C++ to Na zdrowie to już choroba :P

lion137

Stepanov - "From Mathematics To Generic Programming", Stroustrup - "A Tour of C++ ", Stroustrup - "The C++ Programming Language 4th Ed" (to jest cegła,jej polowa, już 3/4:)). Następne na celowniku: http://elementsofprogramming.com/. Zdrowia w Nowym Roku Życzę!:)

lion137
2018-11-22 12:16

TDD w C++

Tym razem:). Potestowałem sobie (przyda się) googletest. Powiem, że całkiem przyzwoite extreme programming wychodzi:)
I powstała, a jakże immutable list w stylu funkcyjnym, w C++ (jeśli w ogóle mając wskaźniki coś może być immutable:)). Kod, jeszcze nie uczesany:), tutaj:
https://github.com/lion137/C-Immutable-List/tree/master
#theory #c++ #functional

slsy

@lion137 nie znam się dobrze na scali, ale wydaje mi sie, to o czym napisałeś to po prostu hack pamiętający czasy Javy pozwalający na osiągnięcie sum type wykorzystując abstrakcyjny trait i jego rózne implementacje. Zresztą Dotty wprowadza bardziej elegancki mechanizm: https://dotty.epfl.ch/docs/reference/enums/adts.html . Niestety w C++ nie możesz ograniczyć możliwości dziedziczenia po interfejsie ImmutableList tak jak w Scali, więc musisz się spodziewać, że ktoś będzie mógł stworzyć własną implementację tego typu.

lion137

@jarekr000000: Under development, may change:)

Tenonymous
2018-10-14 00:50

Całkiem fajny jest ten #Swift od Apple. Pobawiłem się i bardzo fajnie. Jako nieposkromiony fan wszystkiego co szybkie, muszę zapytać - jak ten język wypada na tle #C++ #Golang #Rust pod względem prędkości? Ma ktoś jakieś stosunkowo bliskie prawdy benchmarki?

https://benchmarksgame-team.p[...]chmarksgame/faster/swift.html ten chyba był tutaj swego czasu mocno krytykowany.

Tenonymous

Dla fana Go, ten język to nieco bardziej rozbudowany Golang :D nawet jest func i brak nawiasów przy ifach, forach, etc :D

Hispano-Suiza

@Tenonymous: "Fanatyka". Coś jak pasta o fanatyku wędkarstwa :-D

lion137
2018-01-31 18:45

GMP C++

Była ostatnio dyskusja na forum o nakładkach w C++ na GMP, postanowiłem sprawdzić interfejs od twórców. Prosta funkcja, Test Lucasa Lehmera, sprawdza pierwszość liczb Mersenne'a, używany do znajdowania wielkich liczb pierwszych: https://www.mersenne.org/. Kod:

#include <iostream>
#include <gmpxx.h>
#include <gmp.h>

int lucas_lehmer(unsigned long int p){
    mpz_class s = 4;
    mpz_class base = 2;
    mpz_class m = 0;
    mpz_pow_ui (m.get_mpz_t(), base.get_mpz_t(), p);
    m -= 1;
    for (unsigned long i = 0; i < p - 2; ++i){
        //s = s * s - 2;
        //mpz_mod (s.get_mpz_t(), s.get_mpz_t(), m.get_mpz_t());
        s = ((s * s) - 2) % m;
    }
    if (s == 0) return 1;
    else return 0; 
} 

int main(int argc, char **argv)
{   
    unsigned long int p = 44497;
    cout << lucas_lehmer(p) << endl; // -> True
    return 0;
}

Używanie i instalacja są proste, jak już mamy GMP, to trzeba tylko doinstalować libgmpxxv4-4, na linuxie: sudo apt-get install libgmpxxv4-4, do pliku linkujemy nagłówki, jak widać na listingu, a compilacja: g++ -Wall -std=c++11 main.cxx -lgmpxx -lgmp.
Wiekszośc operatorów arytmetycznych jest przeładowana (jak również IO streamy i konstruktory) z elementami typu mpz_class, jeśli funkcji nie ma w przestrzeni mpz_class, to mamy metodę get_mpz_t() "wyciagającą" zmienną mpz z klasy i taki element możemy wysłać do odpowiedniej funkcji w "czystym" GMP. Gdyby mod nie był przeładowany to w ten właśnie sposób (wersja ukomentowana) trzeba by napisać wewnętrzną pętlę.Jak działają funkcje mpz_pow_ui i mpz_mod można poczytać w dokumentacji To tyle, do następnego. #Numerical #Primes #C++

stanik120
2017-11-28 19:30

Chciałbym się pochwalić moim pierwszym programem napisanym w c++ od podstaw samemu.
Jest to prosta gra konsolowa typu snake z możliwością zmieniania wielkości mapy.
Poniżej pełen kod programu:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <time.h>
using namespace std;

void gotoxy(int xx, int yy);//zmiana polozenia kursora
void rysowanie(int x, int y, char z);//rysowanie mapy z=char z jakiego zbudowana jest mapa
void game_over();
void menu();
void gameplay();

int x=7, y=8;//pozycja kursora
char snake=219, mapa=219, jablko=176;//wyglad weza
int predkosc=200, predkosc_=3;
int przycisk, kierunek=0;
int mapa_x=15, mapa_y=15;//wielkosc mapyc
int jablko_x=999, jablko_y=999;
int punkty=0, najlepszy_wynik=0;
int koniec_gry=0;

int main()
{
    for(;;){
        menu();
        rysowanie(mapa_x, mapa_y, mapa);
        if (najlepszy_wynik!=0){
            gotoxy(mapa_x*2+5,2); cout<<"Best Points: "<<najlepszy_wynik-1;
        }
        gameplay();

        //jezeli przegrasz
        if (koniec_gry==1) {
            game_over();
            koniec_gry=0;
        }
    }//for g³owna petla
}//koniec programu

void rysowanie(int x, int y, char z)//rysowanie mapy
{
        //rysowanie mapy
    for (int i=0; i<x*2+3; i++){
        //gorna krawedz
        gotoxy(i,1);
        cout << z;
        //dolna krawedz
        gotoxy(i,y+2);
        cout << z;
    }
    for (int i=1; i<y+3; i++){
        //lewa krawedz
        gotoxy(1,i);
        cout << z<<z;
        //prawa krawedz
        gotoxy(x*2+3,i);
        cout << z<<z;
    }
}
void gotoxy(int xx, int yy)//zmiana polozenia kursora
{
     COORD c;

     c.X = xx-1;

     c.Y = yy-1;

     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
}
void game_over()
{
    system("cls");
    if (najlepszy_wynik<punkty) najlepszy_wynik=punkty;
    cout <<"GAME OVER"<<endl<<"You have scored "<<punkty-1<<" points"<<endl<<"Press Anything to Continue";
    getch();
}
void menu()
{
    system("cls");
    int menu=0;
    cout<<"START GAME"<<endl;
    cout<<"OPTIONS"<<endl;
    cout<<"QUIT GAME"<<endl;
    while (menu!=10){

    if (menu==0){
        gotoxy(15,2);
        cout<<"    ";
        gotoxy(15,3);
        cout<<"    ";
        gotoxy(15,1);
        cout<<"<---";
    }
    else if (menu==1){
        gotoxy(15,1);
        cout<<"    ";
        gotoxy(15,3);
        cout<<"    ";
        gotoxy(15,2);
        cout<<"<---";
    }
    else if (menu==2){
        gotoxy(15,2);
        cout<<"    ";
        gotoxy(15,1);
        cout<<"    ";
        gotoxy(15,3);
        cout<<"<---";
    }

    przycisk = getch();
    switch(przycisk){
        case 0:{
        //gora
        case 72: if (menu!=0) menu=menu-1; break;
        //dol
        case 80: if (menu!=2) menu=menu+1; break;
        //enter
        case 13:{
            if (menu==0){//jeżeli wskaznik menu jest na pierwszej pozycji i nacisniesz enter zakonczy sie petla i program zacznie gre
                menu=10;
            }
            if (menu==1){//opcje
                do {
                system("cls");
                cout<<"Width of the map (minimum: 10, maximum: 50): ";
                cin>>mapa_x;
                }while ((mapa_x<10)||(mapa_x>50));
                do {
                system("cls");
                cout<<"Height of the map (minimum: 10, maximum: 50): ";
                cin>>mapa_y;
                }while ((mapa_y<10)||(mapa_y>50));
                do {
                system("cls");
                cout<<"Speed (minimum: 1, maximum: 6, default: 3): ";
                cin>>predkosc_;
                }while ((predkosc_<1)||(predkosc_>6));
                system("cls");
                menu=0;
                cout<<"START GAME"<<endl;
                cout<<"OPTIONS"<<endl;
                cout<<"QUIT GAME"<<endl;
            }
            if (menu==2){
                exit(0);
            }
        }break;//case 13 enter
        }break;//case 0
        default: break;
    }//switch
}//while
system("cls");
}
void gameplay()
{
    int blokuj_ruch;
    int powtorz_losowanie;
    int rejestr[1000][2];
    x=3; y=3;
    jablko_x=999; jablko_y=999;
    punkty=1;
    kierunek=0;

    //predkosc
    if      (predkosc_==6) predkosc=50;
    else if (predkosc_==5) predkosc=100;
    else if (predkosc_==4) predkosc=150;
    else if (predkosc_==3) predkosc=200;
    else if (predkosc_==2) predkosc=250;
    else if (predkosc_==1) predkosc=300;

    while(koniec_gry==0){//Petla gry
    blokuj_ruch=0;
    while (kbhit()){//pobranie przycisku
    switch(getch()){
        case 0:{
        case 77: if ((kierunek!=1)&&(blokuj_ruch==0)) {kierunek=0; blokuj_ruch=1;} break;//prawo
        case 75: if ((kierunek!=0)&&(blokuj_ruch==0)) {kierunek=1; blokuj_ruch=1;} break;//lewo
        case 72: if ((kierunek!=3)&&(blokuj_ruch==0)) {kierunek=2; blokuj_ruch=1;} break;//gora
        case 80: if ((kierunek!=2)&&(blokuj_ruch==0)) {kierunek=3; blokuj_ruch=1;} break;//dol
        }break;
    }//switch
    }//if (kbhit())
    switch(kierunek){
        case 0: x=x+2; break;//prawo
        case 1: x=x-2; break;//lewo
        case 2: y=y-1; break;//gora
        case 3: y=y+1; break;//dol
    }
    for (int i=punkty; i>0; i--)//rejestr wspolrzednych ogona
    {
        rejestr[i][0]=rejestr[i-1][0];
        rejestr[i][1]=rejestr[i-1][1];
        if ((x==rejestr[i][0])&&(y==rejestr[i][1]))
            koniec_gry=1;//jezeli dotkniesz ogona przegrywasz
    }
    if ((x<2)||(x>mapa_x*2+1)||(y<2)||(y>mapa_y+1))//jezeli waz dotknie krawedzi mapy
    koniec_gry=1;

    gotoxy(x,y);
    cout<<snake<<snake;//rysowanie snake
    rejestr[0][0]=x;
    rejestr[0][1]=y;

    gotoxy(rejestr[punkty][0], rejestr[punkty][1]);
    cout<<"  ";//usuwanie ogona

    gotoxy(1,1);//przesuniecie kursora w lewy gorny rog

    // jablka w losowych miejscach
    if ((jablko_x==999)&&(jablko_y==999)){

    do{
    powtorz_losowanie=0;
    srand(time(NULL));
    jablko_x=rand()%(mapa_x*2-4)+3;
    jablko_y=rand()%(mapa_y-2)+2;
    if (jablko_x%2==0) jablko_x++;
    for (int i=punkty; i>=0; i--){
        if ((jablko_x==rejestr[i][0])&&(jablko_y==rejestr[i][1]))
            powtorz_losowanie=1;
    }
    }while (powtorz_losowanie==1);

    gotoxy(jablko_x, jablko_y);
    cout<<jablko<<jablko;
    }
    if ((jablko_x==x)&(jablko_y==y)){
        punkty++;
        jablko_x=999; jablko_y=999;
        gotoxy(mapa_x*2+5,1); cout<<"Points: "<<punkty-1;
    }
Sleep(predkosc);
}//while petla gry
}

#c++

stanik120

@grzesiek51114: @kq: A co myślicie o książce "Thinking in C++"?

grzesiek51114

@kq: jeszcze z 10 lat temu jak to czytałem to mi się podobała. Dzisiaj jest przestarzała choć naprawdę ciekawa.

Puncher
2017-01-26 11:42

Witam wszystkich forumowiczów.
Jestem nowy na forum. Forum odkryłem przez przypadek. Lubię testować zwłaszcza manualnie. Czasami programuje wizualnie używając języka C++ lub normalnie używając C, zdarza mi się używać języka C# (pomaga mi wujek google).
#c++ #testowanie, testowanie manualne :)

Silv
2015-12-09 23:26

Zmora debuggerów?
Przed chwilą NetBeans/C++ wyświetlił mi błąd (błędy?), którego opis po wklejeniu do Worda (czcionka 11) zajmuje 184 strony, jako źródło wskazywana jest biblioteka <algorithm> (ach, ci bałaganiarscy programiści biblioteki standardowej C++, znów o czymś zapomnieli, wypuszczając nową wersję!), a opis błędu zaczyna się tak: "In file included from..." i zawiera same (nie wiem, czy tylko je, nie przeglądałem wszystkich 184 stron) odwołania do bibliotek.

#netbeans #c++ #debugowanie

satirev

@Michał Bodziony: Wrzuć kod na forum to dostaniesz wyjaśnienie co robisz źle.

Silv

@Satirev: Już to rozwiązałem. Używałem funkcji find zamiast find_if (pomyliły mi się argumentu obu), w wyniku czego zamiast elementu podstawiłem bool.