• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy da się zapisać ten kod z użyciem funkcji?

Object Storage Arubacloud
0 głosów
270 wizyt
pytanie zadane 25 listopada 2015 w C i C++ przez Chajol Początkujący (290 p.)
edycja 26 listopada 2015 przez Chajol

Moj wykładowca powiedział że nie podoba mu się to że mam tak długiego maina i musze użyć funkcji, ale nie mam pojecia jak... :( oto kodzik:
 

//Projekt 1 PRM £ukasz Chajewski
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#include <windows.h>

int main()
{
    int g,i,j,x,y;
    char tab[80][24],obiekt[4][2]={'$','%','%','$','*','&','&','*'};;
    float t;

    for(g=1;y>0;g++)  // tutaj określamy ile razy wykona się ta pętal
    {
        system("clear");
        //system("cls");
        t=g*M_PI/40;    // t jest kątem w kolejnych powtórzeniach
        x=-(t*sin(t))+40; // współrzędna pozioma pętli
        y=t*cos(t)+11;  // współrzędna pionowa pętli

        memset(tab, ' ', 80*24);  // uzupełniamy tablice pustymi polami

        for(j=0;j<24;j++) //liczba kolumn
        {
            for(i=0;i<80;i++) //liczba wierszy
            {
                if(i==(x-1) && j==(y-1)) //jezeli petla natrafi na i i j -wspolrzedne tabeli ,odpowiadajace x i y spirali to w zaleznosci od g wybiera jakie znaki z tabeli obiekt wpisac w puste pola, jak widac usupelniamy na raz az 4 pola tabeli tab
                {
                    if(g%2==0)
                    {
                    tab[i][j]=obiekt[0][0];
                    }
                    else
                    tab[i][j]=obiekt[2][0];
                }
                if(i==x && j==(y-1))
                {
                    if(g%2==0)
                    {
                    tab[i][j]=obiekt[0][1];
                    }
                    else
                    tab[i][j]=obiekt[2][1];
                }
                if(i==(x-1) && j==y)
                    {
                    if(g%2==0)
                    {
                    tab[i][j]=obiekt[1][0];
                    }
                    else
                    tab[i][j]=obiekt[3][0];
                    }
                if(i==x && j==y)
                {
                    if(g%2==0)
                    {
                    tab[i][j]=obiekt[1][1];
                    }
                    else
                    tab[i][j]=obiekt[3][1];
                }
                {
                    printf("%c",tab[i][j]);
                }
            }
        }

        usleep (100000); // pauzujemy dzialanie programu zeby byl  czytelniejszy dla uzytkownika
    }
    printf("Lukasz Chajewski, projekt semigrafiki. \n\n\n\n");
    return 0;
}



 

3 odpowiedzi

+1 głos
odpowiedź 25 listopada 2015 przez draghan VIP (106,230 p.)
Pewnie, że się da zastosować funkcje. Najpierw może opatrz kod komentarzami, nikt nie lubi domyślać się, jak program ma działać. Potem wydziel na przykład każdą z pętli do osobnej funkcji, podając jako parametr tablicę i zakres działania.

Jeśli poprawisz kod, żebym wiedział, co on robi bez potrzeby wróżenia, to Ci pomogę z podzieleniem go. ;)

A co do switcha - w C również jest ta instrukcja (nie "funkcja"!). ;)
komentarz 25 listopada 2015 przez Chajol Początkujący (290 p.)
Ok, sorki już pisze o co chodzi z kodem :p Generalnie jest to semigrafika, po spirali porusza sie obiekt zlozony z 4 elementow z tablicy "obiekt". Zmienne: g- mnoznik ktory bedzie sie zmienial za kazdy razem kiedy pętla for sie powtorzy, warunkuje on X i Y ktore sa wspołrzędnymi spirali gdzie spirala jest wpisana w tablice TAB. WArunek ze g<y poprostu stopuje nam pętle w odpowiednim miejscu, tak zeby spirala miala ladny ksztalt i konczyla sie w odpowiednim miejscu, tablica ma rozmiar 80x24 bo taki jest rozmiar okna konsoli. Funkcja system("cls") odswiezam obraz po kazdym wykonaniu petli for po to zeby obiekt po prostu zmieniał ksztalt a nie rysowal spirale. $ ify najbardziej w srodku funkcji sa po to zeby okreslic w ktore pole wpisac jakis znaczek z tablicy "obiekt" i w zaleznosci od tego czy G jest parzyste wybrac odpowiedni znak poniewaz grafika ma zmieniac ksztalt poruszajac sie po krzywej. Z grubsza tyle, jak cos to bede odpowiadal na kolejne pytania, z gory dziekuje za pomoc :D
komentarz 26 listopada 2015 przez draghan VIP (106,230 p.)
Byłbym wdzięczny, gdybyś jednak opatrzył kod źródłowy odpowiednimi komentarzami. ;) Łatwiej wtedy wydzielić sensownie funkcje, kiedy się wie, co dany fragment programu robi.

Co ciekawe, program u mnie wykonuje się w 0.002s, produkując przy tym jedynie Twój podpis. :P
komentarz 26 listopada 2015 przez Chajol Początkujący (290 p.)
Dobra machne to juz jutro :p
komentarz 26 listopada 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Nie tyle komentarzami, co nazywanie zmiennych adekwatnie do tego co przechowują. Jeżeli łapiesz się w nazwach z pojedynczych literek to gratuluję :)
komentarz 26 listopada 2015 przez draghan VIP (106,230 p.)
Oczywiście jak najbardziej tak, zmienne o identyfikatorach i, j, g, x, y są fatalnym wyborem (chyba że oznaczają wektory jednostkowe, przyspieszenie ziemskie i położenie :P).
Ale dla wydzielenia funkcji, naprawdę fajnie byłoby wiedzieć, jak nazwać ten blok kodu - a więc komentarz byłby jak najbardziej wskazany. Szczególnie dla tego przypadku, gdzie mamy spore zagęszczenie bloków warunkowych.
komentarz 27 listopada 2015 przez Chajol Początkujący (290 p.)
Wszystko dodane :D
komentarz 27 listopada 2015 przez draghan VIP (106,230 p.)

Pasuje coś takiego...? Nadal nie za bardzo wiem, jak nazwać i rozdzielić na atomy tę część z podwójnym forem.

//Projekt 1 PRM £ukasz Chajewski
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h> // memset()

/*
Generalnie jest to semigrafika,
po spirali porusza sie obiekt zlozony z 4 elementow z tablicy "obiekt".
Zmienne: g- mnoznik ktory bedzie sie zmienial za kazdy razem kiedy pętla for sie powtorzy,
warunkuje on X i Y ktore sa wspołrzędnymi spirali gdzie spirala jest wpisana w tablice TAB.
WArunek ze g<y poprostu stopuje nam pętle w odpowiednim miejscu, tak zeby spirala miala
ladny ksztalt i konczyla sie w odpowiednim miejscu, tablica ma rozmiar 80x24 bo taki jest
rozmiar okna konsoli. Funkcja system("cls") odswiezam obraz po kazdym wykonaniu petli for po
to zeby obiekt po prostu zmieniał ksztalt a nie rysowal spirale. $ ify najbardziej w srodku
funkcji sa po to zeby okreslic w ktore pole wpisac jakis znaczek z tablicy "obiekt" i w
zaleznosci od tego czy G jest parzyste wybrac odpowiedni znak poniewaz grafika ma
zmieniac ksztalt poruszajac sie po krzywej. */


int get_x(float angle);
int get_y(float angle);
float get_angle(int g);
void clear_table(char tab[][24]);
void proceed(int g, int x, int y, char tab[][24], char obiekt[][2]);

int main()
{
    int g, x, y;
    float angle;
    char tab[80][24], obiekt[4][2]= {'$','%','%','$','*','&','&','*'};


    for(g=1; y>0; g++) // tutaj określamy ile razy wykona się ta pętla
    {
        system("clear");

        angle = get_angle(g);
        x = get_x(angle);
        y = get_y(angle);

        clear_table(tab);
        proceed(g, x, y, tab, obiekt); // nie za bardzo wiedziałem, jak to nazwać albo jak to bardziej rozdzielić
        usleep(10000); // pauzujemy dzialanie programu zeby byl  czytelniejszy dla uzytkownika
    }
    printf("Lukasz Chajewski, projekt semigrafiki. \n\n\n\n");
    return 0;
}

float get_angle(int g)
{
    return g*M_PI/40.0;    // t jest kątem w kolejnych powtórzeniach
}

int get_x(float angle)
{
    return -(angle * sin(angle))+40; // współrzędna pozioma pętli
}

int get_y(float angle)
{
    return angle * cos(angle)+11;  // współrzędna pionowa pętli
}

void clear_table(char tab[][24])
{
    memset(tab, ' ', 80*24);  // uzupełniamy tablice pustymi polami
}

void proceed(int g, int x, int y, char tab[][24], char obiekt[][2])
{
    int j, i;
    for(j=0; j<24; j++) //liczba kolumn
    {
        for(i=0; i<80; i++) //liczba wierszy
        {
            if(i==(x-1) && j==(y-1)) //jezeli petla natrafi na i i j -wspolrzedne tabeli ,odpowiadajace x i y spirali to w zaleznosci od g wybiera jakie znaki z tabeli obiekt wpisac w puste pola, jak widac usupelniamy na raz az 4 pola tabeli tab
            {
                if(g%2==0)
                {
                    tab[i][j]=obiekt[0][0];
                }
                else
                    tab[i][j]=obiekt[2][0];
            }
            if(i==x && j==(y-1))
            {
                if(g%2==0)
                {
                    tab[i][j]=obiekt[0][1];
                }
                else
                    tab[i][j]=obiekt[2][1];
            }
            if(i==(x-1) && j==y)
            {
                if(g%2==0)
                {
                    tab[i][j]=obiekt[1][0];
                }
                else
                    tab[i][j]=obiekt[3][0];
            }
            if(i==x && j==y)
            {
                if(g%2==0)
                {
                    tab[i][j]=obiekt[1][1];
                }
                else
                    tab[i][j]=obiekt[3][1];
            }
            printf("%c",tab[i][j]);
        }
    }
}

 

komentarz 27 listopada 2015 przez Chajol Początkujący (290 p.)
edycja 27 listopada 2015 przez Chajol
O stary, genialne, nawet nie wiem jak Ci dziekowc! Mam tylko jedno pytanko, pisałem je niby poniżej ale mogłeś przeoczyc :p mianowicie mam taką mysl:

czy zamiast tablicy "obiekt" moge uzyc chara np postaci \*/ i drugiego postaci -*- zeby zmienial sie wyswietlany obrazek. Chodzi o to czy mozliwe jest zeby w tej glownej tablicy wyswietlac te chary zamiast bawic sie w umieszcznie jednej tablicy w drugiej?

To by bardzo uprosciło funkcje ponieważ zniknely by te 4 ify zastapione jednym, bo juz nie trzeba by bylo uzupelniac 4 kratek znaczkami tylko 1 lancuchem :) O ile to mozliwe :p

Edit: Ostatnie pytanko, widze że np funkcja nazywa sie get_x a potem uzywasz samego x bez get, to znaczy ze ten get_ nie wplywa na nazwe funkcji? Bo na moj chlposki rozum funkcja x i get_x to nie jest to samo :p

I jeszcze pytanko odnosnie tablic, zapisujesz je np tab[][24], czyli jak rozumiem nie ma znaczenia to ze w jednj rameczce nie wpisales 80?

Z gory dziekuje za odpowiedz, mega mi pomogles, prosze jeszcze o odrobinke wyrozumialosci i cierpliwosci :D
0 głosów
odpowiedź 25 listopada 2015 przez Mavimix Dyskutant (8,390 p.)
Najlepsza by była funkcja switch, Pan M. Zelent mówi o tym w którymś odcinku c++
komentarz 25 listopada 2015 przez Chajol Początkujący (290 p.)
Tyle że ja pisze w C a nie C++ :/
0 głosów
odpowiedź 26 listopada 2015 przez Chajol Początkujący (290 p.)
Dodałem już komentarze, mam nadzieje że są choć troche czytelne :p wpadłem dzis na nowy pomysł który jesli sie da chciałbym zaimplementować w kodzie, mianowicie jak mozna zauwazycz moj obiekt jest znakami z jednej tabeli wpisanymi do drugiej, pomyslalem ze duzo ladniej i prosciej wygladalby kod jezeli moglbym w piejsca tabeli tab wpisywac nie znaki z tabeli obiekt a lancuch. Czy jest to mozliwe czy do tablicy nie mozna wrzucac lancuchow?

Podobne pytania

0 głosów
4 odpowiedzi 577 wizyt
pytanie zadane 1 stycznia 2016 w C i C++ przez CichoCiemny Początkujący (480 p.)
0 głosów
2 odpowiedzi 384 wizyt
+1 głos
2 odpowiedzi 397 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...