Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 19 Nov 2019, 10:51

Všetky časy sú v GMT + 1 hodina




Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 9 ] 
Autor Správa
 Predmet príspevku: Deti na lúke
PoslaťNapísal: 19 Mar 2015, 18:37 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Zdravím. Narazil som na stránku https://liahen.ksp.sk, tak som si začal robiť niektoré úlohy. Avšak pri tejto úlohe(https://liahen.ksp.sk//task.php?task_id=21) neviem, ako ju vyriešiť. Keby išlo iba o to, či je Cilka na priamke, tak by to vyriešila jednoduchá analytická geometria, ale tým asi nezistím, či je vpravo alebo vľavo. Preto by som bol vďačný za každú radu :)

Ak by sa stránka nezobrazila správne, predkladám zadanie úlohy:

Spoiler:
Citácia:
Adamko, Betka a Cilka sa hrajú na lúke. Malý Adamko si vymyslel novú zábavu: Otočí sa smerom k Betke a háda, či je práve Cilka na jeho ľavej alebo pravej strane. Asi sa nedivíš, že jeho staršiu sestru Betku táto hra rýchlo omrzela. Zišiel by sa jej program, ktorý by Adamkovi odpovedal namiesto nej.

Vstup

V prvom riadku vstupu je celé číslo T (1 ≤ T ≤ 50 000) – počet testovacích vstupov. Nasleduje T riadkov, každý z nich obsahuje 6 celých čísel (z rozsahu 0..100) oddelených medzerami. Prvé dve čísla sú súradnice Adamka, druhé dve sú súradnice Betky a tretie dve súradnice Cilky. Žiadne dve deti nestoja na tom istom mieste.

Výstup

Pre každý vstup vypíšte jeden riadok výstupu. Ak Cilka stojí na tej istej priamke ako Adamko s Betkou, vypíšte reťazec "rovno", ak stojí na ľavej strane Adamka (ktorý je otočený tak, že pozerá na Betku), vypíšte "vlavo", inak vypíšte "vpravo".

Príklad

vstup
3
3 6 0 7 9 4
3 6 0 7 1 8
3 6 0 7 7 4

výstup
rovno
vpravo
vlavo

Vysvetlenie

Situácia popísaná v príklade vstupu a výstupu je znázornená na nasledujúcom obrázku. Poloha Adamka a Betky sa nemení, Cilkine polohy sú postupne C1, C2 a C3.
Obrázok


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 20 Mar 2015, 09:25 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Toto nie je otázka programovania, ale logiky.
Vytvor si excelácky súbor. Tam si ohranič tabuľku 10 x 10 buniek (niečo ako šachovnica), na ľavej a hornej strane si to očísluj, súradnice čísiel v zadaní ti presne ukážu, kde sa ktoré dieťa nachádza. Toto keď pochopíš, môžeš si to naprogramovať. Ide o porovnanie polohy na ploche.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 20 Mar 2015, 19:53 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Tak spravil som to nakoniec tak, ako som chcel na začiatku, len som si nebol istý, či to bude fungovať. Využil som analytickú geometriu, teda vektory a všeobecnú rovnicu priamky(VRP). Ak sa VRP rovnala 0, deti sa nachádzali na priamke, ak VRP bola väčšia ako 0, tak boli vpravo a ak menšia, tak boli vľavo.
Pripájam aj kód:
Kód:
#include<stdio.h>
int main()
{
  int i,n,ax,ay,bx,by,cx,cy,a,b,c;
  scanf("%d",&n);
  int vysledok[n];
  for(i = 0; i < n; i++){
     scanf("%d %d %d %d %d %d",&ax,&ay,&bx,&by,&cx,&cy);
     a = by-ay;                                               //normálový vektor x
     b = -(bx-ax);                                          //normálový vektor y
     c = -(a*ax) -(b*ay);                                  //posledná časť VRP
     vysledok[i] = (a*cx)+(b*cy)+c;                    //samotná VRP
  }
  for(i = 0; i < n; i++){
    if(vysledok[i] == 0)
        printf("rovno\n");
    else if(vysledok[i] > 0)
        printf("vpravo\n");
    else
        printf("vlavo\n");
  }
  return 0;
}


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 21 Mar 2015, 08:52 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Ešte treba vziať do úvahy aj smer, kde sa kto nachádzal (kam sa pozeral ten hlavný), pretože väčšie alebo menšie môže byť aj vpravo aj vľavo v závislosti na smere detí vzdialených od seba.
Dúfam, že si ma pochopil, ;)
Vpravo a vľavo sa zmení, keď sa postavím čelom lebo chrbtom.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 21 Mar 2015, 18:55 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Máš pravdu. Myslím ,že by sa to dalo ošetriť podľa polohy Betky na ose x, ale keď som svoj program odovzdal aj bez toho, tak mi to uznalo :)
Pripájam aj vzorové riešenie danej úlohy:
Kód:
int main (){
  int T;
  scanf("%d\n",&T); // pocet testov
  while (T--) {
    int ax, ay, bx, by, cx, cy;
    scanf("%d %d %d %d %d %d ",&ax,&ay,&bx,&by,&cx,&cy);

    int ux = bx-ax, uy = by-ay;
    int vx = cx-ax, vy = cy-ay;
    int res = ux*vy - uy*vx;

    if (res == 0) printf("rovno\n");
    if (res < 0)  printf("vpravo\n");
    if (res > 0)  printf("vlavo\n");
  }
  return 0;
}


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 23 Mar 2015, 11:56 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Tvoj kód nevyzerá zle, ale ak ho uvidíš za rok, nebudeš vedieť čo to je.
Navyše v dnešnej dobe sa dosť bazíruje na tom, aby bol kód čo najlepšie čitateľný.
Napísal som tvoju úlohu tak, ako si to predstavujem ja. Nešlo mi o jednoduchosť, ale o čitateľnosť.
Pozri sa na to a odpovedz mi na otázku, či by si tomu rozumel aj za niekoľko rokov.
Kód:
#include <stdio.h>

/** Vysledok je poloha proti pohladu Janka:
* dieta je presne tam kde Janko = 0
* dieta je pred Jankom = 1
* dieta je za Jankom = 2
* dieta je vpravo od Janka, ale na jeho urovni 3
* dieta je vlavo od Janka, ale na jeho urovni 4
* dieta je vpravo pred Jankom = 5
* dieta je vlavo pred Jankom = 6
* dieta je vpravo za Jankom = 7
* dieta je vlavo za Jankom = 8
* @param suradnice Janka a druheho dieteta, smer pohladu Janka
* @return vysledok terarneho operatora
*/
int poloha(const int jx, const int jy, const int ox, const int oy, const int smer)
{
    int vysledok;

    if (smer == 9) { // sever
        vysledok = (jx == ox && jy > oy) ? 1 :
        (jx == ox && jy < oy) ? 2 :
        (jx < ox && jy == oy) ? 3 :
        (jx > ox && jy == oy) ? 4 :
        (jx < ox && jy > oy) ? 5 :
        (jx > ox && jy > oy) ? 6 :
        (jx < ox && jy < oy) ? 7 :
        (jx > ox && jy < oy) ? 8 : 0;
    }
    else // juh
        vysledok = (jx == ox && jy < oy) ? 1 :
        (jx == ox && jy > oy) ? 2 :
        (jx > ox && jy == oy) ? 3 :
        (jx < ox && jy == oy) ? 4 :
        (jx > ox && jy < oy) ? 5 :
        (jx < ox && jy < oy) ? 6 :
        (jx > ox && jy > oy) ? 7 :
        (jx < ox && jy > oy) ? 8 : 0;
    return vysledok;
}

/** Vypise polohu dietata proti pohladu Janka
* @param vysledok z funkcie poloha() a meno dietata
* @return void
*/
void vypis(const int vyber, char *meno)
{
    switch (vyber) {
        case 0:
            printf("%s je na tom istom mieste ako Janko.\n", meno);
            break;
        case 1:
            printf("%s je pred Jankom, na jednej urovni.\n", meno);
            break;
        case 2:
            printf("%s je za Jankom, na jednej urovni.\n", meno);
            break;
        case 3:
            printf("%s je vpravo od Janka, na jednej urovni.\n", meno);
            break;
        case 4:
            printf("%s je vlavo od Janka, na jednej urovni.\n", meno);
            break;
        case 5:
            printf("%s je vpravo pred Jankom.\n", meno);
            break;
        case 6:
            printf("%s je vlavo pred Jankom.\n", meno);
            break;
        case 7:
            printf("%s je vpravo za Jankom.\n", meno);
            break;
        case 8:
            printf("%s je vlavo za Jankom.\n", meno);
            break;
    }
}

int main (void)
{
    int pocet; // velke pismena sa na premenne nepouzivaju
    int smer, jx, jy, ax, ay, mx, my;

    printf("Tento program ma za ulohu urcit vzajomu polohu Janka, Anicky a Marienky na luke.\n");
    printf("Zadaj pocet testov: ");
    scanf("%d",&pocet); // v prikaze scanf sa sa v zatvorkach takymto sposobom znak \n nepouziva
    while (pocet--) {
        printf("\nZadaj suradnice Janka (dve cisla do 10 oddelene medzerou a enter): ");
        scanf("%d%d", &jx, &jy);
        printf("Zadaj suradnice Anicky (dve cisla do 10 oddelene medzerou a enter): ");
        scanf("%d%d", &ax, &ay);
        printf("Zadaj suradnice Marienky (dve cisla do 10 oddelene medzerou a enter): ");
        scanf("%d%d", &mx, &my);
        printf("Janko je otoceny na sever alebo na juh? [9/6]: ");
        scanf("%d", &smer);
        putchar('\n');
        vypis(poloha(jx, jy, ax, ay, smer), "Anicka");
        putchar('\n');
        vypis(poloha(jx, jy, mx, my, smer), "Marienka");
        putchar('\n');
    }

    return 0;
}

/*
Ak pouzivas Code::Blocks, toto si nakopiruj do Settings->Compiler and debugger->Other options a uloz.
Budes mat tazsiu pracu pri pisani kodu, ale vysledok bude skoro uplne bez chyby, pretoze ta na kazdu upozorni
a dokonca aj warning zmeni na chybu a nedovoli scompilovat...

-std=gnu99 -Werror -Wextra -Wall -lm -pedantic
*/

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 23 Mar 2015, 14:49 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Samozrejme je tento tvoj kód oveľa prehľadnejší. Ja si k svojmu píšem komentáre, aby som aj v budúcnosti vedel čo a ako som myslel pri písaní kódu, ale nezachádzal som moc do podrobností a pri kóde som sa snažil len aby fungoval keď ho odovzdám.

C-éčko ma celkom chytilo a baví ma v ňom programovať, takže veľká vďaka za tento web, ktorý ma k nemu priviedol :) No stále viac a viac zisťujem, že je v ňom ešte hrozne veľa na učenie a že veľa vecí ešte vôbec neviem. Zatiaľ som si sám spravil iba jeden taký väčší projekt, keď som skúšal spraviť nejakú jednoduchú kalkulačku aspoň na základné derivácie, inak si robievam podobné zadania,aké som našiel na liahen.ksp.sk alebo teraz aj súťaž KSP.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 23 Mar 2015, 14:52 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Všetko čo riešiš, môžeš dávať aj sem, budme sa baviť spolu. ;)

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
 Predmet príspevku: Re: Deti na lúke
PoslaťNapísal: 23 Mar 2015, 16:10 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Dobre, do novej témy teda vložím čo mám zatiaľ spravenú danú kalkulačku pre derivácie, ale je to dosť amatérsky spravené :) a dosť veľa kódu je tam zbytočne, lebo sa dá nahradiť lepšie, ale teraz som to ešte nechcel opravovať.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 9 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 4 hostia


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK