Programiranje u C-u

  

Dodatno vrednovanje podataka
Razmotrimo slijedeći program

        #include <stdio.h>
        main() {
                int number;
                printf("Unesite broj\n");
                scanf("%d", &number );
                printf("Uneseni broj je %d\n", number );
        }
Program iznad ima nekoliko problema Možda je najbolji način unosa podataka u C-u taj da se svi uneseni podaci tretiraju kao slijed char znakova, te se onda provede potrebna konverzija tipova podataka.

U ovom trenutku mi ćemo željeti istražiti i neke druge aspekte, kao što su

Ispravljanje podatka pri samom unosu
Ovo znači da je ograničavanje podataka unutar točno određenog opsega i određivanje tipa podataka najbolje napraviti na točki ulaza podataka. Prednosti ovakvog postupka su: Efekt vezane greške
Ovo se odnosi na problem kada se netočni podatak propagira kroz cijeli program. Primjer ovoga je kada se pošalju krivi podaci funkciji da ih obradi.

Kada provjeravamo podatke pri samom unosu, te osiguramo da je točan tip podataka i njihov opseg, spriječavamo da se krivi podaci šalju dalje.  Ovo čini kod koji obrađuje podatke jednostavnijim za pisanje i na taj način se smanjuje pogreška.


Primjer
Pogledajmo slučaj kada upravljamo unosom podataka. Dakle, znamo da su korisnici programa skupina gnjavatora koji troše većinu svog vremena otkrivajući nove i sve ljepše načine da sruše naše programe.

Pokušajmo napisati kod za svrhu općenitog unosa podataka, kao zamjena za funkciju  scanf(). Napisat ćemo funkciju koja će čitati unesene podatke kao niz karaktera.

Funkcija je readinput(), koja ,da bi bila što općenitija, prima nekoliko parametara,

Upotrijebili smo neke funkcije koje se nalaze u  ctype.h da bi usporedili tipove unesenih podataka.
/* version 1.0 */
#include <stdio.h>
#include <ctype.h>

#define MAX      80          /* maksimalna dužina bafera  */
#define DIGIT     1          /* podaci se čitaju kao znamenke 0-9   */
#define ALPHA     2          /* podaci se čitaju kao slova A-Z */
#define STRING    3          /* podaci se čitaju kao  ASCII      */

void readinput( char buff[], int mode, int limit ) {
        int ch, index = 0;
        ch = getchar();
        while( (ch != '\n') && (index < limit) ) {
                switch( mode ) {
                        case DIGIT:
                                if( isdigit( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        case ALPHA:
                                if( isalpha( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        case STRING:
                                if( isascii( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        default:
                                /* ovo se ne bi trebalo dogoditi */
                                break;
                }
                ch = getchar();
        }
        buff[index] = 0x00;  
}

main() {
        char buffer[MAX];
        int number;
        printf("Unesite  integer broj\n");
        readinput( buffer, DIGIT, MAX );
        number = atoi( buffer );
        printf("Uneseni broj je %d\n", number );
}
Naravno, program se može još poboljšati. Možemo promijeniti readinput tako da vraća integer vrijednost koja predstavlja broj učitanih karaktera. Ovo će pomoći pri određivanju da li je podatak uopće unesen. U programu iznad nije jasno da li je korisnik unio neki podatak ( mogli smo provjeriti da li je buffer bio prazan).

Napravimo sada izmjene i pogledajmo kako izgleda modificirani program.

/* version 1.1 */
#include <stdio.h>
#include <ctype.h>
#define MAX      80          /* maksimalna dužina bafera  */
#define DIGIT     1          /* podaci se čitaju kao znamenke 0-9   */
#define ALPHA     2          /* podaci se čitaju kao slova A-Z */
#define STRING    3          /* podaci se čitaju kao  ASCII      */
int readinput( char buff[], int mode, int limit ) {
        int ch, index = 0;
        ch = getchar();
        while( (ch != '\n') && (index < limit) ) {
                switch( mode ) {
                        case DIGIT:
                                if( isdigit( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        case ALPHA:
                                if( isalpha( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        case STRING:
                                if( isascii( ch ) ) {
                                        buff[index] = ch;
                                        index++;
                                }
                                break;

                        default:
                                /* ovo se ne bi trebalo dogoditi */
                                break;
                }
                ch = getchar();
        }
        buff[index] = 0x00; 
        return index;
}



main() {
        char buffer[MAX];
        int number, digits = 0;

        while( digits == 0 ) {
                printf("Unesite integer broj\n");
                digits = readinput( buffer, DIGIT, MAX );
                if( digits != 0 ) {
                        number = atoi( buffer );
                        printf("Uneseni broj je %d\n", number );
                }
        }
}
Druga verzija je mnogo bolje napisana.

Drugi primjeri vrednovanja unosa


©Copyright B Brown. 1984-1998. All rights reserved.