Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jan Honzík Beránek:19.11.2017 19:09

Zdravím mám následující program:

int x,y,a,b,c,z;
int ct;
char r1,r2,r3;

printf ("Intervaly:\n");

if (scanf (" %c%d %c%d %c", &r1,&x,&r2,&y,&r3) == 5 && x > 0 && y > 0 && x <= y && y < 500000) {

ct = 0;
for (a = 1; a <= y; a++)
{ for (b = a; b <= y; b++)
{ for (c = b; c <= y; ++c)
{ int objem = a * b * c;
if (objem >= x && objem <= y)
ct++;}
}
}
printf ("Ruznych kvadru: %d\n", ct); } else printf ("Nespravny vstup.\n");

Tento program vypíše počet kvádrů o celočíselných hranách, jejichž objemy jsou v intervalu <x,y>.

Potřebuji ale vyřešit jeden problém. Chci, aby zadávání vstupů neskončilo Enterem, ale mohl jsem zadávat další intervaly. A program ukončit stisknutím CTRL^D (v Unixu).

Zkoušel jsem to přes cyklus while a getchar (), ale buďto jsem to špatně zapisoval nebo je tento způsob špatný.

Má někdo nějaký nápad ? Budu vděčný, za každou radu nebo pomoc :)

 
Odpovědět
19.11.2017 19:09
Avatar
expoox
Tvůrce
Avatar
Odpovídá na Jan Honzík Beránek
expoox:19.11.2017 20:21

isiel by som na to cez while a kontroloval navratovu hodnotu scanf na EoF... a do buducna, zdrojaky vkladaj radsej cez ctrl+k a prijemnejsie formatovanie by tiez nebolo od veci ;) (ja osobne som tie cykly ani radsej necital :D )

 
Nahoru Odpovědět
19.11.2017 20:21
Avatar
Jan Honzík Beránek:19.11.2017 20:51

Myslíš nějak takto ?

while (scanf (" %c%d %c%d %c", &r1,&x,&r2,&y,&r3) != EOF)
{/*tělo while*/}
return (0);

O tom ctrl+k jsem nevědel, začnu to používat! :D

 
Nahoru Odpovědět
19.11.2017 20:51
Avatar
Odpovídá na Jan Honzík Beránek
Matúš Olejník:19.11.2017 21:58

Nepoužívaj scanf, ale pomocou fgets si načítaj potrebné dáta do buffera, ak bude buffer null tak sa ukončí celý cyklus. Ak nebude tak si pomocou sscanf načítaš formátované dáta do premenných a vyhodnotíš podmienky.

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

#define MAX_INTERVAL 500000

int main(void){
        int startInterval, endInterval;
        int a, b, c;
        int blockCount = 0;
        char buffer[100];

        printf("Intervaly:\n");

        while (1) {
                //ak pride napr EOF
                if (fgets(buffer, sizeof(buffer), stdin) == NULL)
                        break;

                        //sscanf vrati pocet naplnenych premennych
                        if(sscanf(buffer, " %d %d", &startInterval, &endInterval) == 2
                                && startInterval > 0
                                && endInterval > 0
                                && startInterval <= endInterval
                                && endInterval < MAX_INTERVAL) {

                                for (a = 1; a <= endInterval; a++) {
                                        for (b = a; b <= endInterval; b++) {
                                                for (c = b; c <= endInterval; c++) {
                                                        int objem = a * b * c;
                                                        if (objem >= startInterval && objem <= endInterval)
                                                                blockCount++;
                                                }
                                        }
                                }
                                printf("Ruznych kvadru: %d\n", blockCount);
                                blockCount = 0;
                        }
                        else {
                                printf("Nespravny vstup.\n");
                        }
                }

        return 0;
}
Nahoru Odpovědět
19.11.2017 21:58
/* I am not sure why this works but it fixes the problem */
Avatar
Matúš Olejník:19.11.2017 22:02

Sorry hodilo mi to sem väčšie medzery (taby)

Nahoru Odpovědět
19.11.2017 22:02
/* I am not sure why this works but it fixes the problem */
Avatar
Jan Honzík Beránek:22.11.2017 13:58

Díky za odpovědi!
Nakonec se mi to povedlo zprovoznit i pomocí toho scanf :)

 
Nahoru Odpovědět
22.11.2017 13:58
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 6 zpráv z 6.