Portál AbcLinuxu, 11. května 2025 06:40

Dotaz: vypsání intervalu v ostrých závorkách

13.11.2018 21:24 Kacka99
vypsání intervalu v ostrých závorkách
Přečteno: 1106×
Odpovědět | Admin
Ahoj mám problém a prosím o radu.

Potřebuji udělat interval, který bude v ostrých závorkách < >. Používám na vypsání scanf a poté cyklus for, kde nejnižší hodnota je "a" a nejvyšší "b". Pokud však dám program spustit a napíšu ostré závorky a do nich čísla a nechám si celý cyklus (tedy interval) vypsat, program se zacyklí. Prosím, co s tím?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.11.2018 22:34 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Odpovědět | | Sbalit | Link | Blokovat | Admin
Používám na vypsání scanf

To asi ťažko.

Skús sa spýtať ešte raz.
13.11.2018 22:49 Kacka99
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
ten program vypadá takhle:

int a,b;

scanf("%d%d", &a, &b);

for (int i = a; i <= b; i++)

printf("%d", i);

--------------------------------------------------------------------------

když vkládám čísla, ze kterých chci udělat interval napíšu např. <1;5> a program se zacyklí.
13.11.2018 22:37 sad
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zkus tohle:
#include <stdio.h>

int main()
{
    int min, max, i;
    char end[2];
    
    if (scanf("<%d,%d%1[>]", &min, &max, end) == 3)
    	for (i = min; i <= max; i++)
    		printf("%d\n", i);	
    
    return 0;
}
Funkce scanf vrací počet úspěšně načtených proměnných.
13.11.2018 22:52 Kacka99
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Zkusím to, děkuji moc.
13.11.2018 23:02 sad
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Akorát ten interval musíš zadat ve formátu <1,5> když budeš chtít formát <1;5>, tak ve scanf jen vyměníš tu čárku za středník.
13.11.2018 22:55 Kacka99
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napadlo mě, že bych to mohla udělat takto:

int a, b;

printf("<");

scanf("%d%d", &a, &b);

printf(">");

ale to druhé printf se vypíše pod čísly, které vyberu, tedy neexistuje něco, co by nechalo vše na jednom řádku? Něco jako \n?
14.11.2018 09:43 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
To si treba dobre naštudovať, ako funguje scanf().

scanf() číta zo štandardného vstupu. Teda: a) nerobí výstup. b) scanf() začne spracovávať až dáta, ktoré mu "dodá terminál". Vnútorne je to trocha komplikované, ale na tej úrovni, na ktorej sa bavíme, to skrátka funguje tak, že scanf() začne niečo robiť až keď užívateľ stlačí Enter. Až vtedy zoberie postupnosť znakov, ktoré užívateľ naťukal a začne ich analyzovať a plniť premenné v tvojom prípade premenné 'a' a 'b'. Podstatné je, že v tom čase už terminál prijal stlačenie klávesy Enter a zareagoval na to tak, že posunul kurzor (miesto, kde sa napíše ďalší znak) na ďalší riadok. Preto sa ten znak > objaví na ďalšom riadku.

Ďalšia vec: prvým argumentom funkcie scanf() je tzv. "formatovací reťazec". V tvojom prípade "%d%d". Ten rozhoduje o tom, ako sú znaky napísanú užívateľom "pochopené", analyzované a priradené do premenných 'a' a 'b'. V tomto formátovacom reťazci sú časti začínajúce znakom percento. '%d' hovorí, že postupnosť znakov sa bude interpretovať ako číslo zapísané v desiatkovej sústave. To má tiež svoje nuansy. Napr. čítanie čísla sa zastaví na prvom znaku, ktorý nemožno použiť ako číslicu. Napr. ak je na vstupe "123 456", tak čítanie prvého čísla zastaví po znaku '3', lebo znak medzera nie je možné použiť ako číslicu. Druhá vlastnosť: čítanie číslice preskakuje "biele znaky" (kam patrí aj medzera) na začiatku. Takže čítanie druhého čísla začne medzerou, tá sa preskočí a pokračuje sa číslicou 4 a skončí (neviditeľným ) znakom, ktorý tam dala klávesa Enter. Preto ak na vstup dám "123,456" tak prvé číslo sa prečíta, ale druhé nie, pretože znak ',' nepatrí medzi "biele znaky".

No a nakoniec: formátovací reťazec scanf() môže obsahovať iné znaky, ktoré nemajú pred sebou znak percento a tie musia sedieť s tým, čo je na vstupe. Takže ak budem mať
scanf("<%d,%d>",&a,&b)
a na vstup napíšem
<123,456>
tak to zafunguje, ale užívateľ musí napísať aj znaky '<', '>' a ','. Ak tam dá napr. bodkočiarku, tak to nezafunguje, lebo bodkočiarka nie je čiarka. Ak tam dá miesto čiarky medzeru, tak to nezafunguje lebo čiarka vo formátovacom reťazci sa nenájde na vstupe. Ak dá medzeru na pred znak < tak to zasa nezafunguje, lebo formátovací reťazec začína znakom < a tam sa žiadne biele znaky nepreskakujú.

Cvičenie #1: zafunguje?
<123, 456>
Cvičenie #2: zafunguje?
<123 ,456>
14.11.2018 10:21 Kacka99
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Teda děkuji moc, hned jak budu doma, zkusím to. A fakt moc díky za to vysvětlení všeho. :)
14.11.2018 14:21 debian+
Rozbalit Rozbalit vše Re: vypsání intervalu v ostrých závorkách
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tvoje upravene na univerzalnejsie (upraveny kod uzivatela sad):
#include <stdio.h>

#define IS_NOT_NUMBER(a) (!((a) >= '0' && (a) <= '9'))

/* vsetky ostatne znaky okrem cisiel riadku "zmaze" (nahradi medzerou) */
void clean_on_number(char *buffer, size_t lenght)
{
	char *p;
	
	if(buffer == NULL)
		return;
	
	for(p=buffer;*p != '\0'; p++)
		if(IS_NOT_NUMBER(*p))
			*p=' ';
}

int main(int argc, char **argv)
{
    int min, max, i;
    
    char buffer[100];
    if(fgets(buffer, 100, stdin) != NULL)
    {
		clean_on_number(buffer, 100);
		sscanf(buffer, "%d %d", &min, &max);
    	for (i = min; i <= max; i++)
    		printf("%d\n", i);	
	}
    
    return 0;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.