Škôlka jazyka C

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

Aktuálny čas je 20 Apr 2024, 06:46

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




Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 
Autor Správa
PoslaťNapísal: 10 Mar 2015, 09:00 
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
Na otázku od ghost0007 sem dávam vlastnú malú knižnicu na parsovanie celých a desatinných čísiel.

Je samozrejme zložená z header a source súboru a napisal som aj main source subor, aby ste videli ako sa to dá použiť v praxi.

parsing.h
Kód:
#ifndef PARSING_H_INCLUDED
#define PARSING_H_INCLUDED

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

/**
* Funkcia skontroluje, ci vstupny retazec obsahuje iba cislice,
* ak nie, prvý odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec (vstupno - vystupny parameter)
* @return retazec prevedeny na int ak retazec obsahuje iba cislice, inaksie 0
*/
int parse_int(char *number);

/**
* Funkcia skontroluje, ci retazec obsahuje iba jednu desatinnu botku,
* ak ich obsahuje viac, vyhodnoti to ako chybu,
* skontroluje, ci obsahuje namiesto botky ciarku, ak ano, prepise ju na botku,
* skontroluje, ci vstupny retazec obsahuje iba cislice (okrem jednej botky),
* ak nie, prvy odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec (vstupno - vystupny parameter)
* @return retazec prevedeny na double ak retazec obsahuje iba cislice,
* alebo cislice a jednu botku, inaksie 0
*/
double parse_double(char *number);

#endif // PARSING_H_INCLUDED

parsing.c
Kód:
#include "parsing.h"
//#define TESTY // pri zakomentovani budu testy odstavene

int parse_int(char *number)
{
    unsigned int i;

    for (i = 0; i < strlen(number); i++) {
        /** ak je v retazci znak iny ako cislica, return 0 **/
        if (!isdigit(number[i])) {
            return 0;
        }
    }
    return atoi(number);
}

double parse_double(char *number)
{
    unsigned int i, point = 0;

    for (i = 0; i < strlen(number); i++) {
        /** kazdu ciarku nahradi bodkou **/
        if (number[i] == ',')
            number[i] = '.';
        /** spocita pocet bodiek **/
        if (number[i] == '.') {
            point++;
            /** ak je bodiek viac ako 1, return 0 **/
            if (point > 1)
                return 0;
        }
        /** ak je znak iny ako cislica alebo bodka, return 0 **/
        if (!isdigit(number[i]) && number[i] != '.') {
            return 0;
        }
    }
    return atof(number);
}

#ifdef TESTY
#define TESTY

int main(void)
{
    /** testy funkcie int parse_int(char *number) **/
    char *cislo1, *cislo2;

    cislo1 = (char*)malloc(10);
    strcpy(cislo1, "123456");
    assert(parse_int(cislo1) == 123456);

    cislo2 = (char*)malloc(10);
    strcpy(cislo2, "123,456");
    assert(parse_int(cislo2) == 0);

    /** testy funkcie int parse_double(char *number) **/
    char *cislo3, *cislo4, *cislo5, *cislo6, *cislo7;

    cislo3 = (char*)malloc(10);
    strcpy(cislo3, "123.456");
    assert(parse_double(cislo3) == 123.456);

    cislo4 = (char*)malloc(10);
    strcpy(cislo4, "123.45.6");
    assert(parse_double(cislo4) == 0);

    cislo5 = (char*)malloc(10);
    strcpy(cislo5, "123,456");
    assert(parse_double(cislo5) == 123.456);

    cislo6 = (char*)malloc(10);
    strcpy(cislo6, "123.4x6");
    assert(parse_double(cislo6) == 0);

    cislo7 = (char*)malloc(10);
    strcpy(cislo7, "123456");
    assert(parse_double(cislo7) == 123456);

    printf("Testy presli.\n");
    free(cislo1);
    free(cislo2);
    free(cislo3);
    free(cislo4);
    free(cislo5);
    free(cislo6);
    free(cislo7);

    return 0;
}

#endif // TESTY

main.c
Kód:
#include "parsing.h"

int main(void)
{
    char buffer[101];
    int opakovat = 1;

    /** parsovanie celeho cisla **/
    while (opakovat) {
        printf("Zadajte cele cislo: ");
        scanf(" %s", buffer);
        if (!parse_int(buffer))
            printf("Nespravny format cisla!\n\n");
        else {
            printf("Zadali ste cele cislo %d.\n\n", parse_int(buffer));
            opakovat = 0;
        }
    }
    /** parsovanie desatinneho cisla **/
    opakovat = 1;
    while (opakovat) {
        printf("Zadajte desatinne cislo: ");
        scanf(" %s", buffer);
        if (!parse_double(buffer))
            printf("Nespravny format cisla!\n\n");
        else {
            printf("Zadali ste desatinne cislo %f.\n\n", parse_double(buffer));
            opakovat = 0;
        }
    }
    printf("Pre ukoncenie stlacte klavesu.\n");
    fflush(stdin);
    getchar();

    return 0;
}

Do prílohy som vložil súbor parsing.exe zabalený do formátu zip pre tých, ktorí si chcú parsovanie vyskúšať.
Príloha:
parsing.zip [8.54 KiB]
313 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