Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"
Avatar
Kubas129
Člen
Avatar
Kubas129:2. listopadu 19:02

Ahoj,
neřekl by mi tu někdo prosím jak přes funkci scanf() můžu načítat číslice, i když na vstup napíšu např: {[1;2]}
nebo {1,2}.

Zkusil jsem: Scanf("{[%lf ;%lf]}", double a, double b);

Chci docílit: Snažím se o to, aby program načetl ty číslice ale zároveň i poznal, co jsem tam napsal na vstup.

 
Odpovědět 2. listopadu 19:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:2. listopadu 20:18

Pokud chceš, aby program načetl jak číslice tak i rozpoznal to co bylo zadáno, je třeba důkladné analýzy. Na to Ti samotná funkce scanf() nestačí. Nejlepším řešením je načíst vstup jako řetězec pomocí fgets() a provést důkladný rozbor celého řetězce. Na základě tohoto rozboru můžeš buďto uživatele nechat opakovat zadání vstupu, nebo být trochu benevolentní a vstup si z celého řetězce vyextrahovat. Přílišná benevolence však není úplně na místě. Funkce scanf() Ti umožňuje buďto definovat svoji znakovou sadu nebo je schopna potlačit vstup. Takže pokud chceš, aby Ti funkce načetla čísla např. z následujících vstupů? [1,2] nebo (1,2) nebo {1,2}, můžeš potlačit ty znaky, které tam nechceš mít.

scanf("%*c%d%*c%d%*c", &x, &y);

To však Ti nezaručí, že uživatel zadá vstup dle tvých představ. Pokud to chceš v tomto stavu, použij to a otestuj návratovou hodnotu funkce scanf() na počet hodnot které načítáš. Pokud To nebude sedět, opakuj zadání vstupu.

Pokud chceš provádět nějaké úpravy na vstupu, využij fgets() k načtení vstupu, proveď úpravy v poli do kterého řetězec načítáš a nakonec použij sscanf() pro načtení vstupu z řetězce. Získat hodnoty a uložit si je do proměnných můžeš samozřejmě provést i v části určené úpravám.

Editováno 2. listopadu 20:19
Nahoru Odpovědět  +1 2. listopadu 20:18
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Kubas129
Člen
Avatar
Kubas129:2. listopadu 20:45

aha díky ale i tak to moc nefunguje :(
píše mi to, že to načetlo 0 proměnných

 
Nahoru Odpovědět 2. listopadu 20:45
Avatar
Kubas129
Člen
Avatar
Kubas129:2. listopadu 21:00

Že já mám za problém pořádně načíst ty vstupy po nás ve škole požadují, aby program poznal, jestli zadáváme strany trojúhelníka, nebo jeho body.
Problém ale je, že to program má poznat podle vstupu:
Bud můžu teda zadat body npř: {[5;2], [6;3],[7;8]} a nebo jeho strany npr: {20,30,40}
Ale problém mám v tom, že nevím jak to mám zjistit vše najednou, že jednotlivě by to bylo nějak takto:

pocet = (scanf("{[%lf; %lf ], [%lf;%lf], [ %lf ; %lf ] }", &a,&b,&c,&d,&e,&f));
pocet = (scanf("{%lf, %lf, %lf}", &a,&b,&c));
printf("%d", pocet);

Jen nevím jak to mám spojit

 
Nahoru Odpovědět 2. listopadu 21:00
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:2. listopadu 21:36

Samozřejmě že to funguje, jen je to třeba řádně opsat. Měl bys vidět, že v řídícím řetězci používám dva aktivní specifikátory formátu, tak je třeba udělat to, aby počet dalších argumentů byl roven dvěma a ne šesti. Když si vyzkoušíš následující program, přesvědčíš se. Stačí to jen zkopírovat.

#include <stdio.h>

int main(void) {
        int x, y;

        printf("Zadej souradnici ve tvaru [X,Y]: ");
        scanf("%*c%d%*c%d%*c", &x, &y);
        printf("x=%d, y=%d\n", x, y);

        return 0;
}
Nahoru Odpovědět 2. listopadu 21:36
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Kubas129
Člen
Avatar
Odpovídá na DarkCoder
Kubas129:2. listopadu 21:54

nj to je hezký ale asi si nepochopil ten můj problém :(
já právě potřebuji, abych do mého programu mohl zadat tohle:
{[5;10]}
ale zároven i tohle:
{ 10 , 15 }
a to v tom tvém kodu nejde :(
ale díky za radu :)

Editováno 2. listopadu 21:56
 
Nahoru Odpovědět 2. listopadu 21:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:2. listopadu 21:56

Upřímně pochybuji, že Vás budou ve škole učit něco pokročilejšího než-li funkci scanf(). Tak to vyřeš následujícím způsobem. Zadej výzvu, dle které které má uživatel zadat vstup, něco ve smyslu následujícího:

printf("Chcete vyjádřit trojúhelník pomocí bodů nebo stran?\n");
printf("Zadejte b - pomocí bodů, s - pomocí stran\n\n");

choice = getchar();

if(choice=='b') // zde formát načtení pomocí bodů
else if(choice=='s') // zde formát načtení pomocí stran
else // zde neznámá volba

// ...
Nahoru Odpovědět 2. listopadu 21:56
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Kubas129
Člen
Avatar
Odpovídá na DarkCoder
Kubas129:2. listopadu 21:57

jo ale to mi progtest nevezme :D

 
Nahoru Odpovědět 2. listopadu 21:57
Avatar
Odpovídá na Kubas129
Matúš Olejník:3. listopadu 17:15

Tak ako má vyzerať korektný vstup? Stačí takto {[5;10]} resp {5,10} alebo treba vždy aby boli zadané všetky tri body/strany?

Nahoru Odpovědět 3. listopadu 17:15
/* I am not sure why this works but it fixes the problem */
Avatar
Kubas129
Člen
Avatar
Kubas129:3. listopadu 21:41

no vstup môže vyzerať bud
{ [ 1.5; 2 ], [3;4.2], [ 0.5 ; 0.6 ] }
a lebo:
{2.1, 3, 3.4}

 
Nahoru Odpovědět 3. listopadu 21:41
Avatar
Odpovídá na Kubas129
Matúš Olejník:3. listopadu 22:14

Nerobievam v C preto upozorňujem, že toto asi nie je korektné, ale pred tým než niekto iný pomôže alebo než by som to začal ručne parsovať :D môžeš skúsiť toto

int main() {
    char s[255];
    double a, b, c, d, e, f;

    fgets(s, 255, stdin);

    if (sscanf(s, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
        printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
    }
    if (sscanf(s, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
        printf("Zadal som strany: %f %f %f\n", a, b, c);
    }

    getchar(); getchar();

    return 0;
}

prípade môžeš použiť knižnicu regex.h?

Editováno 3. listopadu 22:15
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 3. listopadu 22:14
/* I am not sure why this works but it fixes the problem */
Avatar
Kubas129
Člen
Avatar
Kubas129:3. listopadu 22:36

Super! dik moc už to šlape
jo vysvětlil bys mi ještě prosím co přesně znamená tento příkaz?
fgets(s, 255, stdin);
a tento příkaz:
sscanf

 
Nahoru Odpovědět 3. listopadu 22:36
Avatar
Kubas129
Člen
Avatar
Kubas129:3. listopadu 23:24

Mám ještě problém s tím vstupem ono to po mě požaduje abych ty trojúhelníky mohl zadat i tímto způsobem:
{
[
0
;
15
]
, [ 112 ; 0 ] ,[112;15]}

a to nejde :(

 
Nahoru Odpovědět 3. listopadu 23:24
Avatar
Odpovídá na Kubas129
Matúš Olejník:3. listopadu 23:55

Ako nechce sa mi v tom veľmi pokračovať pretože sa mi to nepáči, ale ako rýchlu pomoc môžeš skúsiť takto :D
Ignorovať nové riadky a medzery a ukončiť čítanie ak je zadaná }

#include <stdio.h>
#include <stdlib.h>

#define BUFF_SIZE 255

int main() {
    char buffer[BUFF_SIZE];
    double a, b, c, d, e, f;
    int i = 0, tmp;

    while (1) {
        tmp = fgetc(stdin);
        if (tmp == '\n' || tmp == ' ') {
            continue;
        }
        //nech neskoncime mimo vyhradenej pamate
        if (i + 2 == BUFF_SIZE) {
            buffer[i + 1] = '\0';
            break;
        }

        buffer[i] = tmp;
        i++;

        if (tmp == '}') {
            buffer[i] = '\0';
            break;
        }
    }

    if (sscanf(buffer, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
        printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
    }
    if (sscanf(buffer, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
        printf("Zadal som strany: %f %f %f\n", a, b, c);
    }

    getchar(); getchar();

    return 0;
}
Nahoru Odpovědět 3. listopadu 23:55
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.