Monday, December 14, 2015

Limbajul C. Un cronometru simplu cu ciclu de intarziere

Aplicatia urmatoare simuleaza un cronometru care afiseaza timpul pana la o valoare (ore, minute, secunde) introdusa de utilizator. 

Valoarea sau, mai exact, conversia acesteia in secunde trebuie sa fie mai mica decat numarul secundelor care echivaleaza 24 de ore (==86400).

O structura cu trei variabile int este folosita pentru a stoca timpul curent. O functie Display afiseaza acest timp, secunda cu secunda, parametrul functiei fiind variabila structura.

In mod uzual se folosesc pointeri la structura pentru a evita copierea intregii structuri in parametrul formal. In cazul de fata, nefiind vorba de o structura foarte 'voluminoasa', s-a optat pentru transferul prin valoare.

Evident, era posibila scrierea codului intr-o varianta mai 'rudimentara', renuntand, de pilda, la functie, la stocarea orelor, minutelor si secundelor intr-o structura in favoarea unei implementari integrale cu variabile locale din tipurile de baza in functia main.

Elementul inedit este ciclul de intarziere, implementat ca functie. Functia Delayer() primeste ca parametru timpul curent in secunde si intoarce ca rezultat timpul curent incrementat cu o unitate dupa efectuarea a 15000 * 15000 iteratii pentru intarziere.

N (= 15000) este evident dependent de masina si o valoare acceptabila se obtine prin incercari. Necesarul de 15000^2 s-a dovedit valid pentru o configuratie cu procesor de 2 GHz si 4 GB de RAM instalat.

Sunt doua bucle for() in functia Delayer dar se poate folosi o singura bucla daca se mareste N la 225000000 (== 15000^2).

Codul si printscreen-ul:

// cronometru trivial

#include <stdio.h>
#define N 15000

struct tempus
{
            unsigned sec;
            unsigned mins;
            unsigned hours;
           
};

int Delayer(int count)
{
            int i, j;
            for(i = 0; i < N; i++)
                        for(j = 0; j < N; j++);
    return count + 1;
}

void Display(struct tempus time)
{
            printf("%d : %d : %d\n", time.hours, time.mins, time.sec);
}

int main()
{
            unsigned M, m, n, k, count = 0;
            struct tempus time = {0, 0, 0};
            puts("\nIndicati momentul la care se va opri cronometrul, hrs, mins, secs:");
            scanf("%d, %d, %d", &m, &n, &k);
            M = 3600*m + 60*n + k;
            if(M >= 86400)
            {
                        puts("\nInput eronat, momentul trebuie sa fie mai mic de 24 de ore!");
                        return 2;
            }
            while(count <= M)
            {
                        time.hours = count/3600;
                        time.mins = (count%3600)/60;
                        time.sec = (count%3600)%60;
                        Display(time);
                        count = Delayer(count);
            }
            return 0;
}






No comments:

Post a Comment