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