Prosty program, wyświetlający animację w terminalu [SOLVED]

0

Witam,

Mam problem z poniższym programem. Chodzi o to, aby była wyświetlana animacja polegająca na przesuwaniu litery J wzdłuż Cisoisy Dioklesa (zwykła krzywa z podanym wzorem w kodzie (x,y) ). Siedzę od dłuższego czasu i nie widzę, gdzie zrobiłem błąd.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
/*OGOLNE WZORY:
    x=(2*a*pow(t,2))/(1+pow(t,2));
    y=(2*a*pow(t,3))/(1+pow(t,2)); */

    /* a=2*/

/*FUNKCJE*/
int y(float t);
int x(float t);
void czysc(char tab[30][40]);
void funkcja(void);
void tablica(char tab[30][40]);


/*FUNKCJA GŁÓWNA*/
int main()
{
    funkcja();
    return 0;
}

int y (float t)
{
    return(int)(((4*pow(t,3))/(1+pow(t,2))));
}
int x (float t)
{
    return(int)((4*pow(t,2))/(1+pow(t,2)));
}

void funkcja(void)
{
    float t=0;
    float rt=0.5;
    char tab[30][40];

        for (t=4;t>=-4;t-=rt)
        {
            czysc(tab);
            tab[y(t)][x(t)]='J';
            printf("y=%d\tx=%d\n", y(t), x(t));
            tablica(tab);
            //usleep(250000);
        }
}

void tablica(char tab[30][40])
{
    int i, j;
        for(i=0;i<=30;i++)
        {
            for(j=0;j<=40;j++)
            {
                printf("%c",tab[i][j]);
            }
            printf("\n");
        }
}
void czysc(char tab[30][40])
{
    int i, j;
        for (i=0;i<=30;i++) for (j=0;j<=40;j++)
            tab[i][j]=' ';
}




 
0

Masz złe warunki w pętlach wewnątrz tablica oraz czysc.

0

@Patryk27 dzieki za odpowiedź, ale już sobie poradziłem. Rzeczywiście warunki nie były do końca poprawne. Jeśli kogoś ciekawi jak to wyszło to proszę :)

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
/*OGOLNE WZORY:
    x=(2*a*pow(t,2))/(1+pow(t,2));
    y=(2*a*pow(t,3))/(1+pow(t,2)); */

    /* a=2.5*/

/*FUNKCJE*/
int y(float t);
int x(float t);
void czysc(char tab[30][40]);
void funkcja(void);
void tablica(char tab[30][40]);
void poczatek(void);
void koniec(void);


/*FUNKCJA GŁÓWNA*/
int main()
{
int g;

        printf("Witaj w programie! Kliknij: \n[1] - Rozpocznij\n[0] - Zamknij\n");
        scanf("%d", &g);
            for (;g<0 || g>1;)
            {
            printf("\n[1] - Rozpocznij\n[0] - Zamknij\n");
            scanf("%d", &g);
            }
            switch(g)

            {
                case 1:{goto B;break;}
                case 0:{goto C;break;}
                default:break;
            }
B:
        funkcja();



    {
    int s;
    printf("KONIEC PROGRAMU\n\n***Autor - JACEK STEC***\n\n[1] - Rozpocznij od nowa\n[0] - Zamknij\n");
        scanf("%d", &s);
            for (;s<0 || s>1;)
            {
            printf("\n[1] - Rozpocznij od nowa\n[0] - Zamknij\n");
            scanf("%d", &s);
            }
            switch(s)
            {
                case 0:{goto D;break;}
                case 1:{goto B;break;}
                default:break;
            }

}
C:
system("cls");
printf("KONIEC PROGRAMU\n\n***Autor - JACEK STEC***\n\n");
D:

printf("Kliknij dowolny klawisz...");
getch();
    return 0;
}

int y (float t)
{

    return(int)((5*pow(t,3))/(1+pow(t,2))+10);
}
int x (float t)
{
    return(int)(3*(5*pow(t,2))/(1+pow(t,2))+3);
}

void funkcja(void)
{
    float t=0;
    float rt=0.25;
    int r=0;
    char tab[25][40];
    czysc(tab);
    system("cls");
{

    for (r=1;r<=5;r++)
        {
        for (t=-3;t<=3;t+=rt)
        {
            switch(r)
{
            case 1:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';tab[y(t+3*rt)][x(t+3*rt)]='E';tab[y(t+4*rt)][x(t+4*rt)]='K';break;}
            case 2:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';tab[y(t+3*rt)][x(t+3*rt)]='E';break;}
            case 3:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';break;}
            case 4:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';break;}
            case 5:{tab[y(t)][x(t)]='J';break;}
            default: break;
}
                tablica(tab);
                //usleep(50000);
                system("cls");
                czysc(tab);
           }
       }
}
}

void tablica(char tab[25][40])
{
    int i, j;
        for(i=0;i<25;i++)
        {
            for(j=0;j<40;j++)
            {

                printf("%c",tab[i][j]);
            }
            printf("\n");
        }
}
void czysc(char tab[25][40])
{
    int i, j;
        for (i=0;i<25;i++) for (j=0;j<40;j++)
            tab[i][j]=' ';
}
0

Nieeee, nope nope nope nope nope.
Pozbądź się tych goto, wydziel kod do funkcji.

Plus to:

            case 1:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';tab[y(t+3*rt)][x(t+3*rt)]='E';tab[y(t+4*rt)][x(t+4*rt)]='K';break;}
            case 2:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';tab[y(t+3*rt)][x(t+3*rt)]='E';break;}
            case 3:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';tab[y(t+2*rt)][x(t+2*rt)]='C';break;}
            case 4:{tab[y(t)][x(t)]='J';tab[y(t+rt)][x(t+rt)]='A';break;}
            case 5:{tab[y(t)][x(t)]='J';break;}

Nie sądzisz, że czegoś tutaj jest... za dużo? Na przykład powtarzania kodu.

0

Wszystko w porzadku tylko do czego sa:
void poczatek
void koniec?

0
Wielki Kot napisał(a):

Wszystko w porzadku tylko do czego sa:
void poczatek
void koniec?

Nie wiem czemu nie zamieściłem. Możliwe, że ilość znaków jest ograniczona. To są proste funkcję zaczynające i kończące program. Same printfy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1