środa, 21 marca 2018

00035 - 617 - StringMerge - www.pl.spoj.com

Treść zadania:

Napisz funkcję:

char* string_merge(char *, char *);


która sklei ze sobą dwa łańcuchy biorąc na przemian po jednym znaku z każdego łańcucha i umieści w nowej dynamicznie alokowanej tablicy znaków, do której zwróci wskaźnik. Należy wziąć po tyle znaków ile jest w krótszym łańcuchu.

Input
W pierwszej linii liczba testów t, w kolejnych liniach po dwa łańcuchy znaków odzielone spacją.

Output
W każdej linii jeden łańcuch, wynik działania funkcji string_merge.

Example

Input:
4
a bb
abs sfd
ewr w
wqeqweqweq eqweqwe

Output:
ab
asbfsd
ew
weqqewqewqewqe


Kod źródłowy w C++:
#include <iostream>
#include <cstring>

#define T_SIZE 1001

using namespace std;

char* string_merge(char *a, char *b)
{
    int i, c;
    i=0;
    c=0;
    char *s = new char [10000];
    while(a[i] != '\0' && b[i] !=  '\0')
    {
        s[c]=a[i];
        ++c;
        s[c]=b[i];
        ++c;
        ++i;
    }
    s[c]='\0';
    return s;
};

int main()
{
    int t, n;
    char S1[T_SIZE], S2[T_SIZE], *S;
    cin >> t; /* wczytaj liczbę testów */
    cin.getline(S1,T_SIZE);
    while(t)
    {
        cin.getline(S1,T_SIZE,' ');
        cin.getline(S2,T_SIZE);
        S=string_merge(S1,S2);
        cout << S << endl;
        delete[] S;
        t--;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0504B/

poniedziałek, 19 marca 2018

00034 - 1300 - Szyfr Cezara - www.pl.spoj.com

Treść zadania:

Szyfr Cezara jest to szyfr za pomocą, którego Juliusz Cezar szyfrował swoje listy do Cycerona. Jako ciekawostkę można podać, że szyfr ten był podobno używany jeszcze w 1915 roku w armii rosyjskiej, gdyż tylko tak prosty szyfr wydawał się zrozumiały dla sztabowców.

Każdą literę tekstu jawnego zamieniamy na literę przesuniętą o 3 miejsca w prawo. I tak literę A szyfrujemy jako literę D, literę B jako E itd. W przypadku litery Z wybieramy literę C. W celu odszyfrowania tekstu powtarzamy operację tym razem przesuwając litery o 3 pozycje w lewo.

Input
Na wejściu pojawi się tekst zawierający jedynie wielkie litery alfabetu łacińskiego, spacje oraz znaki nowej linii, a jego długość nie przekracza 200 znaków.

Output
Na wyjściu otrzymujemy zaszyfrowany tekst używając Szyfru Cezara.

Example

Input:
ABC DEF
TERA EST ROTUNDA

Output:
DEF GHI
WHUD HVW URWXQGD


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/JSZYCER/

środa, 14 marca 2018

00033 - 1910 - Odwracanie wyrazów - www.pl.spoj.com

Treść zadania:

Napisz program, który zapisuje wspak podane na wejściu wyrazy.

Wejście
Na wejście programu podana zostanie pewna nieokreślona ilość wyrazów, tj. ciągów znaków zbudowanych z małych liter. Poszczególne wyrazy zostaną rozdzielone znakiem nowej linii. Przyjmujemy, że długość wyrazów nie przekracza 1000 znaków.

Wyjście
Na wyjściu mają się pojawić te same wyrazy, które pojawiły się na wejściu, ale zapisane wspak. Poszczególne wyrazy należy rozdzielić znakiem nowej linii.

Przykład

Wejście:
alfa
beta
gamma

Wyjście:
afla
ateb
ammag


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int i;
    char input[1000];
    for(;cin>>input;)
    {
        for(i=0;input[i]!='\0';++i)
        {

        }
        --i;
        for(i;i!=-1;--i)
        {
            cout<<input[i];
        }
        cout<<endl;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/KC009/

poniedziałek, 12 marca 2018

00032 - 4138 - Harry and big doughnuts - www.pl.spoj.com

Treść zadania:

Młody Harry został poproszony o kupienie karmy dla kotów przez swoją sąsiadkę - starą, dziwną panią, która była właścicielką wielu kotów. Ale koty też były dziwne i jadały tylko pączki. Toteż sąsiadka chciała aby Harry przyniósł jej dokładnie po jednym pączku dla każdego kota - a posiadała ich c. Harry miał ze sobą plecak, ale że był tylko małym chłopcem, potrafił udźwignąć jedynie k kilogramów. Harry wiedział, że każdy pączek waży w kilogramów (duże koty, duże pączki). Pomóż Harremu zdecydować czy powinien iść do supermarketu i kupić żarcie, czy się po prostu poddać i pomarzyć o odrobinie magii...

Wejście
W pierwszej linii jedna dodatnia liczba całkowita t (t <= 100) oznaczająca ilość testów (Harry został poproszony o kupno pączków kilka razy). Następnie t linii, każda zawierająca 3 liczby: c, k oraz w (1 <= c, k, w <= 100)

t [liczba testów]
c k w [liczba kotów, udźwig Harrego oraz waga pączka]
c k w [następny test]
...

Wyjście
t linii zawierających słowo "yes" jeśli Harry jest w stanie wykonać zadanie lub "no" jeśli pączki złamałyby Harremu kręgosłup.

Przykład

Wejście:
3
5 15 3
1 5 4
13 25 2

Wyjście:
yes
yes
no


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, c, k, w, i;
    scanf("%d",&t);
    for(i=0;i<t;++i)
    {
        scanf("%d%d%d",&c,&k,&w);
        if((w*c)<=k)
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int t, c, k, w;
    cin>>t;
    for(int i=0;i<t;++i)
    {
        cin>>c>>k>>w;
        if((w*c)<=k)
        {
            cout<<"yes"<<endl;
        }
        else
        {
            cout<<"no"<<endl;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/DOUGHNUT/

środa, 7 marca 2018

00031 - 1042 - Test 3 - www.pl.spoj.com

Treść zadania:

Przepisz dane z wejścia na wyjście. Dane wejściowe są dwucyfrowymi liczbami naturalnymi. Zakończ działanie programu, gdy na wejściu pojawi się, trzecia liczba 42 poprzedzona jakąkolwiek inną liczbą, różną od 42.

Wejście
W każdej linii jedna liczba dwucyfrowa.

Wyjście
W każdej linii jedna liczba dwucyfrowa. Odczytane wartości 42 również powinny się pojawić.

Przykład

Wejście:
42
42
12
13
42
11
42
43
42
42
99
01

Wyjście:
42
42
12
13
42
11
42
43
42


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a, b, c=0;
    scanf("%d",&b);
    printf("%d\n",b);
    for(;;)
    {
        scanf("%d",&a);
        if(a==42 && b != 42)
        {
            ++c;
        }
        printf("%d\n",a);
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int a, b, c=0;
    cin>>b;
    cout<<b<<endl;
    for(;;)
    {
        cin>>a;
        if(a==42 && b != 42)
        {
            ++c;
        }
        cout<<a<<endl;
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0601A2/

poniedziałek, 5 marca 2018

00030 - 1042 - Transponowanie macierzy - www.pl.spoj.com

Treść zadania:

Transponuj podaną macierz.

Wejście
W pierwszym wierszu znajdują się dwie liczby m n (1<=m,n<=200) oznaczające odpowiednio liczbę wierszy oraz liczbę kolumn. Następnie następuje m wierszy, w każdym n liczb.

Wyjście
Na wyjściu powinna znaleźć się macierz transponowana do zadanej

Przykład

Wejście:
4 3
1 2 5
4 3 3
3 4 9
8 7 7

Wyjście:
1 4 3 8
2 3 4 7
5 3 9 7


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m, n, i, j;
    int tab [200][200];

    scanf("%d%d",&m,&n);

    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            scanf("%d",&tab[i][j]);
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            printf("%d ",tab[j][i]);
        }
        printf("\n");
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int m, n, i, j;
    int tab [200][200];

 cin>>m>>n;
 
    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            cin>>tab[i][j];
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            cout<<tab[j][i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/TRN/

czwartek, 1 marca 2018

[C++] Biblioteka Tmenu - przewijane menu w konsoli

Witajcie,

Przedstawiam bibliotekę Tmenu.h która pozwala na proste tworzenie przewijanych menu za pomocą strzałek.
Z części programu można skorzystać jako biblioteka lub jako część kodu bez dołączania dodatkowych bibliotek.

Aktywna opcja w programie zanaczona jest na kolor czerwony. Aby ją aktywować należy naciskąć w konsoli kalwisz enter.





Aby przewinąć opcję do góry należy nacisnąć strzałkę do góry.



Aby przewinąć opcję do dołu należy nacisnąć strzałkę do dołu.


Skorzystanie z programu jako biblioteka:

Do katalogu z programem dodaj plik Tmenu.h a następnie w dodaj do programu jako bibliotekę używając

#include "Tmenu.h"



Można także dodać zawartość biblioteki do swojego programu wtedy nie jest wymagane tworzenie biblioteki jednak w praktyce rozdziela się programy na biblioteki.

Obsług biblioteki jest bardzo prosta:
W kontekście każdego z menu należy dodać jego tytuł:
TMenu Menu("Tytuł menu");


Następnie kolejne opcje w menu wraz z nazwą dodajemy za pomocą Menu.add podając najpierw nazwę następnie funkcję którą wywołuje (w tym przypadku tytuł to Funkcja 1 a opcja wywołuje funkcję f1:
Menu.add("Funkcja 1", f1);


Screany z dzialania programu:












Kody źródłowe z dwoma przykładami wykorzystania przewijanego menu - jako część kodu źródłowego programu oraz jako dołączona biblioteka do projektu.

Kod źródłowy biblioteki Tmenu.h:
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>

using namespace std;

class TMenu
{
    public:
        TMenu(string _Title);
        TMenu(void);

        void add(string _Name, void (*procedure) () );
        void view();
        void SetTitle(string _Title);


    private:
        struct TItem
        {
            string Name;
            void (*procedure)();
        };
        string Title;
        string Max;
        string spac;

        int max;
        int index;

        vector <TItem> List;
};

TMenu::TMenu(string _Title)
{
    //system("windows1250");
    Title = _Title;
    max = Title.size() + 4;

    index = 0;
}

void TMenu::add(string Name, void (*procedure) ())
{
    if (Name != "")
    {
        TItem item;
        item.Name = Name;
        item.procedure = procedure;

        List.push_back(item);

        max = (Name.size() + 4 > max)? Name.size() + 4 : max;

        Max  = "";
        spac = "";
        for (int i = 0; i < max; i ++)
        {
            Max += '-';
            spac += ' ';
        }
    }
}

void TMenu::view()
{
    //system("windows1250");
    char c = '/0';
    do
    {
        system("cls");

        cout << endl;

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        cout << "  +" << Max << '+' << endl;

        cout << "  |"
                << spac.substr(0, (max - Title.size()) / 2)
                << Title
                << spac.substr(0, max - Title.size() - ((max - Title.size()) / 2))
                << '|' << endl;

        cout << "  +" << Max.substr(0, max) << '+' << endl;

        for (int i = 0; i < List.size(); i ++)
        {
            cout << "  |";
            if (i == index)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            }

            cout << spac.substr(0, (max - List[i].Name.size()) / 2)
                 << List[i].Name
                 << spac.substr(0, (max - (List[i].Name.size()) - (max - List[i].Name.size()) / 2) );

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);

            cout << '|' << endl;
        }

        cout << "  +" << Max << "+";

        c = getch();
        if (c == 72 && index > 0) //down
        {
            index --;
        }

        if (c == 80 && index < List.size() - 1) //up
        {
            index ++;
        }
    }
    while (c != 13 && c != 27);

    if (c == 27)
    {
        system("exit");
    }

    if (c  == 13)
    {
        //cout << index << endl; //80 down
        system("cls");
        (*List[index].procedure)();
    }
}

Kod źródłowy programu wykorzystującego bibliotekę Tmenu.h:
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>
#include "Tmenu.h"

using namespace std;

void main_menu();

void f1()
{
    TMenu Menu("Funkcja 1");
    Menu.add("Funkcja 1.1", f1);
    Menu.add("Funkcja 1.2", f1);
    Menu.add("Funkcja 1.3", f1);
    Menu.add("Funkcja 1.4", f1);
    Menu.add("Funkcja 1.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f2()
{
    TMenu Menu("Funkcja 2");
    Menu.add("Funkcja 2.1", f2);
    Menu.add("Funkcja 2.2", f2);
    Menu.add("Funkcja 2.3", f2);
    Menu.add("Funkcja 2.4", f2);
    Menu.add("Funkcja 2.5", f2);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f3()
{
    TMenu Menu("Funkcja 3");
    Menu.add("Funkcja 3.1", f1);
    Menu.add("Funkcja 3.2", f1);
    Menu.add("Funkcja 3.3", f1);
    Menu.add("Funkcja 3.4", f1);
    Menu.add("Funkcja 3.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f4()
{
    TMenu Menu("Funkcja 4");
    Menu.add("Funkcja 4.1", f1);
    Menu.add("Funkcja 4.2", f1);
    Menu.add("Funkcja 4.3", f1);
    Menu.add("Funkcja 4.4", f1);
    Menu.add("Funkcja 4.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f5()
{
    TMenu Menu("Funkcja 5");
    Menu.add("Funkcja 5.1", f1);
    Menu.add("Funkcja 5.2", f1);
    Menu.add("Funkcja 5.3", f1);
    Menu.add("Funkcja 5.4", f1);
    Menu.add("Funkcja 5.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f_exit()
{
    cout<<"Program zostanie zamknięty"<<endl;
    _sleep(1000);
    system("cls");
    system("color f");
    exit(0);
}

void main_menu()
{
    TMenu Menu("Program");
    Menu.add("Funkcja 1", f1);
    Menu.add("Funkcja 2", f2);
    Menu.add("Funkcja 3", f3);
    Menu.add("Funkcja 4", f4);
    Menu.add("Funkcja 5", f5);
    Menu.add("Zamknij program", f_exit);
    Menu.view();
}

int main()
{
    setlocale( LC_ALL, "" );
    main_menu();
    return 0;
}

Kod źródłowy programu bez dodawania biblioteki (jako część programu):
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>

using namespace std;

void main_menu();

class TMenu
{
    public:
        TMenu(string _Title);
        TMenu(void);

        void add(string _Name, void (*procedure) () );
        void view();
        void SetTitle(string _Title);


    private:
        struct TItem
        {
            string Name;
            void (*procedure)();
        };
        string Title;
        string Max;
        string spac;

        int max;
        int index;

        vector <TItem> List;
};

TMenu::TMenu(string _Title)
{
    //system("windows1250");
    Title = _Title;
    max = Title.size() + 4;

    index = 0;
}

void TMenu::add(string Name, void (*procedure) ())
{
    if (Name != "")
    {
        TItem item;
        item.Name = Name;
        item.procedure = procedure;

        List.push_back(item);

        max = (Name.size() + 4 > max)? Name.size() + 4 : max;

        Max  = "";
        spac = "";
        for (int i = 0; i < max; i ++)
        {
            Max += '-';
            spac += ' ';
        }
    }
}

void TMenu::view()
{
    //system("windows1250");
    char c = '/0';
    do
    {
        system("cls");

        cout << endl;

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        cout << "  +" << Max << '+' << endl;

        cout << "  |"
                << spac.substr(0, (max - Title.size()) / 2)
                << Title
                << spac.substr(0, max - Title.size() - ((max - Title.size()) / 2))
                << '|' << endl;

        cout << "  +" << Max.substr(0, max) << '+' << endl;

        for (int i = 0; i < List.size(); i ++)
        {
            cout << "  |";
            if (i == index)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            }

            cout << spac.substr(0, (max - List[i].Name.size()) / 2)
                 << List[i].Name
                 << spac.substr(0, (max - (List[i].Name.size()) - (max - List[i].Name.size()) / 2) );

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);

            cout << '|' << endl;
        }

        cout << "  +" << Max << "+";

        c = getch();
        if (c == 72 && index > 0) //down
        {
            index --;
        }

        if (c == 80 && index < List.size() - 1) //up
        {
            index ++;
        }
    }
    while (c != 13 && c != 27);

    if (c == 27)
    {
        system("exit");
    }

    if (c  == 13)
    {
        //cout << index << endl; //80 down
        system("cls");
        (*List[index].procedure)();
    }
}

void f1()
{
    TMenu Menu("Funkcja 1");
    Menu.add("Funkcja 1.1", f1);
    Menu.add("Funkcja 1.2", f1);
    Menu.add("Funkcja 1.3", f1);
    Menu.add("Funkcja 1.4", f1);
    Menu.add("Funkcja 1.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f2()
{
    TMenu Menu("Funkcja 2");
    Menu.add("Funkcja 2.1", f2);
    Menu.add("Funkcja 2.2", f2);
    Menu.add("Funkcja 2.3", f2);
    Menu.add("Funkcja 2.4", f2);
    Menu.add("Funkcja 2.5", f2);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f3()
{
    TMenu Menu("Funkcja 3");
    Menu.add("Funkcja 3.1", f1);
    Menu.add("Funkcja 3.2", f1);
    Menu.add("Funkcja 3.3", f1);
    Menu.add("Funkcja 3.4", f1);
    Menu.add("Funkcja 3.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f4()
{
    TMenu Menu("Funkcja 4");
    Menu.add("Funkcja 4.1", f1);
    Menu.add("Funkcja 4.2", f1);
    Menu.add("Funkcja 4.3", f1);
    Menu.add("Funkcja 4.4", f1);
    Menu.add("Funkcja 4.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f5()
{
    TMenu Menu("Funkcja 5");
    Menu.add("Funkcja 5.1", f1);
    Menu.add("Funkcja 5.2", f1);
    Menu.add("Funkcja 5.3", f1);
    Menu.add("Funkcja 5.4", f1);
    Menu.add("Funkcja 5.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f_exit()
{
    cout<<"Program zostanie zamknięty"<<endl;
    _sleep(1000);
    system("cls");
    system("color f");
    exit(0);
}

void main_menu()
{
    TMenu Menu("Program");
    Menu.add("Funkcja 1", f1);
    Menu.add("Funkcja 2", f2);
    Menu.add("Funkcja 3", f3);
    Menu.add("Funkcja 4", f4);
    Menu.add("Funkcja 5", f5);
    Menu.add("Zamknij program", f_exit);
    Menu.view();
}

int main()
{
    setlocale( LC_ALL, "" );
    main_menu();
    return 0;
}