Škôlka jazyka C

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

Aktuálny čas je 29 Mar 2024, 15:15

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




Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 
Autor Správa
 Predmet príspevku: Mohlo by vás zaujímať ;-)
PoslaťNapísal: 03 Nov 2015, 13:39 
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
Aplikacia vypise k zadanym retazcom, ci je to cislo, ak je to cele cislo, ci je to prvocislo, dalej ci je to palindrom, dalej ci je to datum a ak je, nazov dna v tyzdni. Vstup moze byt zadany bud ako vstupne argumenty (napr. test.exe hanah koleso 2015-11-03 123.325 .123) alebo nacitanim z klavesnice. Jednotlive retazce musia byt oddelene jednou medzerou!
Spoiler:
Kód:
#include <stdio.h>
#include <stdlib.h>

// zisti a vrati pocet znakov v retazci (okrem ukoncovacieho znaku '\0')
int dlzka_slova(char *slovo)
{
    int velkost = 0;

    while (*slovo++ != '\0')  // listuje retazec za pomoci pointerov
        velkost++;
    return velkost;
}

// zisti ci je retazec cislo, vrati true/false
int je_cislo(char *retazec)
{
    int i, point = 0;

    for (i = 0; retazec[i] != '\0'; i++) {
        if (retazec[i] == '.') {
            point++; // spocita pocet bodiek
            if (point > 1)
                return 0; // ak je viac ako 1 - false
        }
        if (!isdigit(retazec[i]) && retazec[i] != '.')
            return 0; // ak retazec obsahuje iny znak ako cislicu alebo botku - false
    }
    return 1;
}

// zisti ci je retazec cele cislo, vrati true/false
int je_cele_cislo(char *retazec)
{
    int i, poradie_botky;

    for (i = 0; retazec[i] != '\0'; i++) {
        if (retazec[i] == '.') // nastavi poradie botky, ak je v cisle
            poradie_botky = i;
    }
    for (i = poradie_botky + 1; retazec[i] != '\0'; i++) {
        if (retazec[i] != '0') // ak je za botkou ina cislica ako nula - false
            return 0;
    }
    return 1;
}

// zisti ci je retazec palindrom, vrati true/false
int je_palindrom(char * retazec)
{
    int i, pom = dlzka_slova(retazec);
    int j = pom - 1;

    for (i = 0; i < pom / 2; i++) {
        if (retazec[i] != retazec[j--])
            return 0; // ak sa znaky zrkadlovo umiestnene v retazci nezhoduju - false
    }
    return 1;
}

// zisti ci je retazec datum vo formate DDDD-DD-DD, vrati true/false
int je_datum(char *retazec)
{
    // splnenie podmienok:
    // dlzka retazca musi byt 10
    // znaky 0, 1, 2, 3, 5, 6, 8, 9 musia byt cislice
    // znaky 4, 7 musia byt '-'
    if (dlzka_slova(retazec) == 10 && isdigit(retazec[0]) && isdigit(retazec[1])
               && isdigit(retazec[2]) && isdigit(retazec[3])  && retazec[4] == '-'
               && isdigit(retazec[5]) && isdigit(retazec[6])  && retazec[7] == '-'
               && isdigit(retazec[8]) && isdigit(retazec[9]))
        return 1;
    else
        return 0;
}

// rozdeli retazec na jednotlive casti datumu, prevedie ich na cele cisla a ulozi do pamäti (pole intov)
void cisla_datumu(char *retazec, int *datum)
{
    int i;
    char rok[5], mesiac[3], den[3];

    for (i = 0; retazec[i] != '\0'; i++) {
        (i >= 0 && i < 4) ? rok[i] = retazec[i] : // vytvori retazec rok bez ukoncenia
        (i > 4 && i < 7) ? mesiac[i - 5] = retazec[i] :
        (i > 7) ? den[i - 8] = retazec[i] : 0;
    }
    rok[i + 1] = '\0'; // ukonci retazec rok
    mesiac[i + 1] = '\0';
    den[i + 1] = '\0';
    datum[0] = atoi(rok); // prevedie retazec na cele cislo a vlozi do pola int-ov
    datum[1] = atoi(mesiac);
    datum[2] = atoi(den);
}

// zisti poradove cislo dna v tyzdni a vrati ho (0 = nedela, 1 = pondelok ...)
// neviem poriadne ako to funguje, našiel som to na nete :-D
int den_v_tyzdni(int d, int m, int y)
{
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
    y -= m < 3;
    return ( y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

// zisti ci je retazec prvocislo, vrati true/false
int je_prvocislo(char *retazec)
{
    int i;
    double dbcislo = atof(retazec); // prevedie retazec na desatinne cislo

    if (dbcislo >= 2.0) { // ak je rovne alebo vacsie ako najmensie prvocislo, prevedie vypocet
        if (je_cele_cislo(retazec)) {
        int cislo = atoi(retazec); // prevedie retazec na cele cislo

        for (i = cislo / 2; i > 1; i--) { //v cykle
            if(cislo % i == 0) // (modulo) deli cislo cislom o polovicu mensim a postupne ho znizuje az po cislo 2
            return 0; // ak je cislo delitelne niektorym z uvedenych - false
        }
        return 1;
        }
    }
    return 0;
}

int main(int argc, char **argv)
{
    int i, pocet_slov = 0, pom = 0, pc = 0, datum[3];
    char vstup[1024], **retazce;
    const char *den[] = {"nedela", "pondelok", "utorok", "streda", "svrtok", "piatok", "sobota"};

    printf("\nAplikacia vypise k zadanym retazcom, ci je to cislo, ak je to cele cislo, ci je to prvocislo, dalej ci je to palindrom,\n"
               "dalej ci je to datum a ak je, nazov dna v tyzdni.\n"
               "Vstup moze byt zadany bud ako vstupne argumenty (napr. test.exe hanah koleso 2015-11-03 123.325 .123\n"
               "alebo nacitanim z klavesnice.\n"
               "Jednotlive retazce musia byt oddelene jednou medzerou!\n\n");
    if (argc > 1) { // ak su argumenty zadane cez konzolu
        for (i = 1; i < argc; i++) {
            if (je_cislo(argv[i])) {
                if (je_prvocislo(argv[i]))
                    printf("%s je prvocislo.\n", argv[i]);
                else
                    printf("%s je cislo ale nie prvocislo.\n", argv[i]);
            }
            else if (je_palindrom(argv[i]))
                printf("%s je palindrom.\n", argv[i]);
            else if (je_datum(argv[i])) {
                printf("%s je datum ", argv[i]);
                cisla_datumu(argv[i], datum);
                printf("a je to %s.\n", den[den_v_tyzdni(datum[2], datum[1], datum[0])]);
            }
            else
                printf("%s nie je cislo, datum ani palindrom.\n", argv[i]);
        }
    }
    else { // argumenty budu zadane z klavesnice
        printf("Zadajte vstupne udaje s medzerami a ukoncite klavesou enter:\n");
        gets(vstup);
        // nastavi pocet slov vo vete
        i = 0;
        while (vstup[i] != '\0') {
            if (vstup[i++] == ' ')
                pocet_slov++;
        }

        char retazce[pocet_slov + 1][64]; // deklaracia statickeho pola retazcov

        for (i = 0; vstup[i] != '\0'; i++) { // listuje po znakoch
            if (vstup[i] == ' ') { // ak je znak medzera
                retazce[pom][pc] = '\0'; // ukonci retazec
                pom++; // posun na dalsi retazec
                pc = 0; // prechod na prvy znak noveho retazca
            }
            else {
                retazce[pom][pc] = vstup[i]; // vloz do retazca znak z povodneho
                pc++; // posun na dalsi znak noveho retazca
            }
        }
        retazce[pom][pc] = '\0'; // ukoncenie posledneho retazca
        putchar('\n'); // odriadkovanie
        for (i = 0; i < pocet_slov + 1; i++) { // tak isto ako hore
            if (je_cislo(retazce[i])) {
                if (je_prvocislo(retazce[i]))
                    printf("%s je prvocislo.\n", retazce[i]);
                else
                    printf("%s je cislo ale nie prvocislo.\n", retazce[i]);
            }
            else if (je_palindrom(retazce[i]))
                printf("%s je palindrom.\n", retazce[i]);
            else if (je_datum(retazce[i])) {
                printf("%s je datum ", retazce[i]);
                cisla_datumu(retazce[i], datum);
                printf("a je to %s.\n", den[den_v_tyzdni(datum[2], datum[1], datum[0])]);
            }
            else
                printf("%s nie je cislo, datum ani palindrom.\n", retazce[i]);
        }
    }

    return 0;
}

Ak to chce niekto vyskúšať, pridávam zbalený exe súbor.
Príloha:
test.zip [2.18 KiB]
459 krát

_________________
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  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 

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 1 hosť


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:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK