Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Odświeżanie jednego elementu i własne funkcje

Ostatnio zmodyfikowano 2011-01-17 02:00
Autor Wiadomość
Marys
Temat założony przez niniejszego użytkownika
Odświeżanie jednego elementu i własne funkcje
» 2011-01-07 03:08:24
Witam ponownie,
mam programik, który przesuwa, powiększa itd. litery wyrysowane przez mnie, poniżej mam legendę do tego i teraz jak manipuluje tym wszystkim to wszystko mi się odświeża tzn robi clear screen, a jak wyrzucić z clear screena z legendy. Aplikacja uruchamia się w konsoli i pracuję na C++ Builder.

Drugie pytanie to jak tworzyć własne funkcje po za programem głównym, w osobnym pliku? Np. mam pętle w wyżej wymienionym programie i wystarczy, że napisze w osobnym pliku funkcje i ja nazwę, a później dołączę odpowiedni nagłówek i wstawię funkcje z odpowiednimi parametrami, mogę jakiś przykład.  
P-26282
DejaVu
» 2011-01-07 03:58:38
Przeczytaj swój pierwszy akapit... tak ze trzy razy, bo ja piłem a Ty chyba jesteś pijany ;p

Funkcję utwórz najpierw sobie w pliku na którym pracujesz, a później poczytaj jak się dzili kod na kilka plików źródłowych.
http://cpp0x.pl/kursy/Kurs-C++-v2-0 /Dzielenie-kodu-na-kilka-plikow-zrodlowych/144
Powyższy materiał jest dostępny dla zarejestrowanych użytkowników lub pod starym adresem serwisu tj. ddt.pl
P-26283
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-08 05:13:27
Już prostuje moją wypowiedź :P
Na początek może obrazek, będzie łatwiej wytłumaczyć -> http://img835.imageshack.us/i/beztytuugs.png http://img835.imageshack.us/img835/1323/beztytuugs.png

Chodzi o to aby clearscreen działał tylko na to co jest zaznaczone na niebiesko, a co jest zaznaczone na czerwono "nie używało" clearscreena.

Co do tych funkcji, to zanim dostałem ten ciekawy link spróbowałem czegoś takiego i moje pytanie czy to tak może być?
Oto kod głównego programu
C/C++
#include <iostream.h>
#include <conio.h>
#include "funkcje.cpp"
const int RANGE_BEGIN = 5;
const int RANGE_END = 17;
//--Funkcje--
void tresc();
void czyt( int & dl );
void zadanie( int dl );
//--Funkcje-End--
int main()
{
    int dl;
    tresc();
    clrscr();
    czyt( dl );
    clrscr();
    zadanie( dl );
   
    return 0;
}
//---------------------------------------------------------------------------
void tresc()
{
    do
    {
        cout << "ZADANIE PROJEKOTWE\n"
        << "---------------------------------------------------------"
        << "-----------------------\n\n";
        cout << "Program wyswietla pierwsze litery imienia i nazwsika (Marcin "
        << "Michalik) oraz \nostatnia cyfre indeksu (8132)."
        << " Tekst mozna powiekszac i pomniejszac za pomoca\n"
        << "klawiszy + i - oraz przesuwac za pomoca strzalek. "
        << "Przed uruchomieniam nalezy\npodac rozmiar wyswietlanego"
        << " tekstu. Podany rozmiar musi byc liczba calkowita,"
        << "\nnieparzysta o wartosci minimalnej 5.\n\n\n\n\n\n";
        cout << "Autor: Marcin Michalik\n"
        << "Nr grupy: GID101 (grupa I)\n"
        << "Data: 3.01.2011\n";
        cout << "\n\tPrzejdz dalej -> Enter\n";
    }
    while( getch() != 13 );
   
}
//----------------------------------------------------------------------------
void czyt( int & dl )
{
    int er, x, y;
    cout << "Prosze podac rozmiar wyswietlanego tekstu (prosze wczytac "
    << "cyfre calkowita,\nz przedzialu <5, 17>): ";
    x = wherex();
    y = wherey();
    do
    {
        gotoxy( x, y );
        clreol();
        er = 0;
        cin >> dl;
        if( cin.fail() )
        {
            er = 1;
            cin.clear();
            cin.ignore( 0xff,( int ) '\n' );
        }
    }
    while(( dl < RANGE_BEGIN ) ||( dl > RANGE_END ) || er );
   
}
//--------------------------------------------------------------------------
void zadanie( int dl )
{
    int x, x1, x2 = 1, y, y1, y2 = 27, z, a, szer, g, f;
    char klawisz;
    szer = dl - 1;
    z = szer - 1;
    a =( z - 1 ) / 2;
    y =( 25 - dl ) / 2;
    x =( 80 - 2 *( z + z - 1 ) - dl - 4 ) / 2;
    do
    {
        _setcursortype( _NORMALCURSOR );
       
        clrscr();
        /*Rysowanie pierwszej litery M*/
        x1 = x;
        y1 = y;
        gotoxy( x1, y1 );
        mpion( dl, y1, x1, x, z );
        //----
        y1 = y;
        x1 = x;
        gotoxy( x1, y1 );
        mskos( y1, x1, z );
        //---------------------------------------------------------------
        /*Rysowanie drugiej litery M*/
        //---Funkcja rysująca dwie pionowe kolumny składające się z litery "M"---
        x1 = x + 2 *( z - 1 ) + 3;
        y1 = y;
        gotoxy( x1, y1 );
        m2pion( y1, x1, dl, x, z );
        y1 = y;
        x1 = x + 2 *( z - 1 ) + 3;
        gotoxy( x1, y1 );
        m2skos( y1, x1, z );
        //------------------------------------
        x1 = x + 4 *( z - 1 ) + 5;
        y1 = y + 1;
        gotoxy( x1, y1 );
        dwapoziom( y1, x1, y, dl );
        //---Funkcja rysująca pionowy, prawy, górny element---
        x1 = x + 4 *( z - 1 ) + 4 + dl;
        y1 = y + 2;
        gotoxy( x1, y1 );
        dwaprawo( x1, y1, dl );
        //---Funkcja rysująca pionowy, lewy, dolny element---
        x1 = x + 4 *( z - 1 ) + 6;
        y1 = y + dl -(( dl + dl % 2 ) / 2 - 2 );
        gotoxy( x1, y1 );
        dwalewo( x1, y1, dl );
        x1 = x2;
        y1 = y2;
        gotoxy( x1, y1 );
        legenda( x1, y1, y2, g, f );
        //---------------------------
        _setcursortype( _NOCURSOR );
        klawisz = getch();
        sterowanie( x, y, dl, szer, z, a, klawisz );
    }
    while( klawisz != 27 );
   
}

A to kod funkcji:
C/C++
#include <iostream.h>
#include <conio.h>
#include <math.h>
void mpion( int dl, int y1, int x1, int x, int z )
{
    for( int i = 1; i <= dl; i++ )
    {
        y1++;
        gotoxy( x1, y1 );
        cout << 'M';
        x1 = x + 2 *( z - 1 );
        gotoxy( x1, y1 );
        cout << 'M';
        x1 = x;
    }
}
void mskos( int y1, int x1, int z )
{
    for( int i = 1; i <= z; i++ )
    {
        y1++;
        gotoxy( x1, y1 );
        cout << 'M';
        x1++;
    }
    for( int i = 1; i <= z - 1; i++ )
    {
        y1--;
        gotoxy( x1, y1 );
        cout << 'M';
        x1++;
    }
}
void m2pion( int y1, int x1, int dl, int x, int z )
{
    for( int i = 1; i <= dl; i++ )
    {
        y1++;
        x1 = x + 2 *( z - 1 ) + 3;
        gotoxy( x1, y1 );
        cout << 'M';
        x1 = x + 4 *( z - 1 ) + 3;
        gotoxy( x1, y1 );
        cout << 'M';
        x1 = x;
    }
}
void m2skos( int y1, int x1, int z )
{
    for( int i = 1; i <= z; i++ )
    {
        y1++;
        gotoxy( x1, y1 );
        cout << 'M';
        x1++;
       
    }
    for( int i = 1; i <= z - 1; i++ )
    {
        y1--;
        gotoxy( x1, y1 );
        cout << 'M';
        x1++;
    }
}
void dwapoziom( int y1, int x1, int y, int dl )
{
    for( int i = 1; i < dl; i++ )
    {
        x1++;
        gotoxy( x1, y1 );
        cout << '2';
        y1 = y +(( dl - dl % 2 ) / 2 - 1 ) + 2;
        gotoxy( x1, y1 );
        cout << '2';
        y1 = y + dl;
        gotoxy( x1, y1 );
        cout << '2';
        y1 = y + 1;
    }
}
void dwaprawo( int x1, int y1, int dl )
{
    for( int i = 0; i <( dl - dl % 2 ) / 2 - 1; i++ )
    {
        cout << '2';
        y1++;
        gotoxy( x1, y1 );
    }
}
void dwalewo( int x1, int y1, int dl )
{
    for( int i = 0; i <( dl + dl % 2 ) / 2 - 2; i++ )
    {
        cout << '2';
        y1++;
        gotoxy( x1, y1 );
    }
}
void legenda( int x1, int y1, int y2, int g, int f )
{
    string T[ 10 ];
    for( int i = 0; i < 80; i++ )
         cout << '-';
   
    x1 =( 80 - 8 ) / 2;
    y1 = y2 + 1;
    gotoxy( x1, y1 );
    cout << "LEGENDA:";
    T[ 0 ] = "Powiekszanie: +";
    T[ 1 ] = "Pomniejszanie: -";
    T[ 2 ] = "Przsuniecie w lewo: <-";
    T[ 3 ] = "Przesuniecie w prawo: ->";
    T[ 4 ] = "Przesuniecie w gore: ^";
    T[ 5 ] = "Przesuniecie w dol: *";
    T[ 6 ] = "Wyjscie: ESC";
    g = 0;
    f = 1;
    x1 = 1;
    y1++;
    gotoxy( x1, y1 );
    for( int i = 0; i <= 6; i++ )
    {
        x1 = 1;
        y1++;
        gotoxy( x1, y1 );
        cout << T[ g ];
        x1 = 40;
        gotoxy( x1, y1 );
        cout << T[ f ];
        if( g <= 6 )
             g = g + 2;
       
        if( f <= 5 )
             f = f + 2;
       
    }
}
void sterowanie( int & x, int & y, int & dl, int & szer, int & z, int & a, char & klawisz )
{
    switch( klawisz )
    {
    case 43: if( dl <= 17 && x <= 80 - 2 *( z + z ) - dl - 3 && y <= 25 && x > 1 && y > 0 )
        {
            dl++;
            szer++;
            z++;
            a++;
            y--;
            x--;
            break;
        }
    case 45: if( dl > 5 && szer > 4 )
        {
            dl--;
            szer--;
            z--;
            a--;
            y++;
            x = x + 3;
            break;
        }
    case 72: if( y > 0 )
        {
            y--;
            break;
        }
    case 80: if( y < 26 - dl )
        {
            y++;
            break;
        }
    case 75: if( x > 1 )
        {
            x--;
            break;
        }
    case 77: if( x < 80 - 2 *( z + z - 1 ) - dl - 2 )
        {
            x++;
            break;
        }
    }
}


Chodzi o to aby ten kod był bardziej czytelny jakoś i pomyślałem, że część funkcji (głównie te funkcje odpowiedzialne za rysowanie liter) wywalić do innego pliku, a plik z funkcją główną będzie je sobie pobierał.
P-26314
DejaVu
» 2011-01-08 07:38:33
W zasadzie jeżeli działa to i może tak być. Rozwiązanie nie jest jednak poprawne, bowiem za pomocą #include nie należy dołączać plików źródłowych (*.cpp) tylko pliki nagłówkowe (*.h / *.hpp). Co do czyszczenia ekranu. Skoro nie chcesz czyścić całego ekranu to zamaluj prostokątem obszar, który chcesz 'zmazać'. Nie wiem czy taką funkcję masz dostępną w tym czego używasz ale to jest jakieś rozwiązanie. A jeżeli nie masz takiej funkcji to po prostu rysuj menu czy cokolwiek innego po każdym czyszczeniu ekranu i sprawę będziesz miał załatwioną.
P-26315
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-08 12:15:23
Nie kumam tego z tym clearscreenem. Babka mi powiedziała, że mam zdefiniować jakby dwa okna i jedno będzie miało clearscreena a drugie nie, ale kompletnie nie wiem o co chodzi i jak to zrobić :/
P-26318
malan
» 2011-01-08 15:13:06
Mam coś, co mogłoby rozwiązać Twój problem aczkolwiek przy próbie kompilacji Twojego kodu wyskakuje trochę błędów.
1. Na jakim IDE pracujesz? Borland?
2. System operacyjny?
3. Ten kod jest kompletny?

/edit:
C/C++
#include <windows.h>

//...

HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );

CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo( hConsole, & info );

COORD newLocation = { 0, 0 };

DWORD writtenChars;
FillConsoleOutputCharacterW( hConsole, L' ', info.dwSize.X * info.dwSize.Y, newLocation, & writtenChars );

SetConsoleCursorPosition( hConsole, newLocation );
Zamiast
info.dwSize.Y
 wstaw pozycję (OY), która będzie mówiła, gdzie zakończyć czyszczenie. Czyli, w Twoim przypadku, to będzie miejsce, gdzie zaczynasz rysować linię nad "legendą".
Nie testowałem, ale spróbować nie zaszkodzi ;p.
P-26333
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-09 23:46:02
Tak na Borlandzie.
Windows
Tak to jest kompletny kod
P-26391
Marys
Temat założony przez niniejszego użytkownika
» 2011-01-10 02:21:17
A można jakoś podzielić konsole na 2 okna?
Znalazłem taki kod, ale Builder nie ma takiej biblioteki. Proszę o szybką pomoc.
P-26394
« 1 » 2 3
  Strona 1 z 3 Następna strona