Рубрики

Секундомер с использованием языка Си

Создайте цифровую программу секундомера на C, которая работает на базовой системе Linux.

Функция keyboardhit () просто означает нажатие клавиши. После нажатия клавиши он генерирует сигнал и возвращает ненулевое целое число. Здесь есть 4 цикла, 1-й цикл для часов, 2-й для минут, 3-й для секунд и 4-й цикл для поддержания скорости в секундах (3 цикла). После запуска этой программы она ожидает нажатия клавиши запуска с клавиатуры и, когда она нажата, генерирует сигнал. Для хранения клавиши клавиатуры есть переменная (c), если c равно клавише p, то она вызывает функцию ожидания. Поток работает в фоновом режиме, и мы ожидаем нажатия клавиши запуска. После нажатия клавиши s поток снова переходит к функции thread_join, если нажата клавиша r , то она переходит на метку сброса, и все циклы снова начинаются с нулей, если нажата клавиша s, она переходит на метку начала, и если клавиша e нажатие вызывает функцию exit () и программа завершается.

Условие: потоки в c , ожидание системного вызова

To execute the program we use following command :
Input:
Press a key :
s -> start
e -> exit
r -> reset
p -> pause

Output :

// C код для создания секундомера

  
// Заголовочный файл для необходимой системной библиотеки
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

  
// начиная с нуля
#define MIN 0

  
// 1 час = 60 мин; 1 мин = 60 сек
#define MAX 60

  
#define MILLI 200000

  

int i, j, k, n, s;

char c;

pthread_t t1;

  
// Функция для выполнения операций
// в соответствии с хитом keyboeard.

int keyboardhit(void)

{

    struct termios oldt, newt;

    int ch;

    int oldf;

  

    tcgetattr(STDIN_FILENO, &oldt);

    newt = oldt;

    newt.c_lflag &= ~(ICANON | ECHO);

    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);

    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  

    ch = getchar();

  

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

    fcntl(STDIN_FILENO, F_SETFL, oldf);

  

    if (ch != EOF) {

        ungetc(ch, stdin);

        return 1;

    }

  

    return 0;

}

  
// отображать секундомер на экране

void print()

{

    // очистить экранную последовательность

    printf("\033[2J\033[1;1H");

  

    // Отображение часа мин сек на экране

    printf("TIME\t\t\t\tHr: %d Min: %d Sec: %d", n, i, j);

}

  
// функция для остановки секундомера

void* wait(void* arg)

{

  

    while (1) {

  

        // ожидание сигнала клавиатуры, если клавиатура

        // ударить, вернуть не целое число

        if (keyboardhit()) {

            // принять ввод от пользователя и сделать

            // операция соответственно

            c = getchar();

            if (c == 'S' || c == 's') {

                break;

            }

            else if (c == 'r' || c == 'R') {

                s = 1;

                break;

            }

            else if (c == 'e' || c == 'E')

  

                exit(0);

        }

    }

}

  
// код драйвера

int main()

{

  

    // метка для сброса значения

reset:

    n = MIN;

    i = MIN;

    j = MIN;

    k = MIN, s = MIN;

  

    print();

  

    while (1) {

  

        / * s для начала

        е для выхода

        p для паузы

        г для сброса

        * /

        if (keyboardhit()) {

            c = getchar();

  

            if (c != 's')

                continue;

  

            for (n = MIN; n < MAX; n++) {

                for (i = MIN; i < MAX; i++) {

                    for (j = MIN; j < MAX; j++) {

                        for (k = MIN; k < MILLI; k++) {

                        start:

                            print();

                            if (keyboardhit()) {

                                c = getchar();

  

                                if (c == 'r' || c == 'R')

                                    goto reset;

                                else if (c == 'e' || c == 'E')

                                    exit(0);

                                else if (c == 's' || c == 'S')

                                    goto start;

                                else if (c == 'P' || c == 'p') {

  

                                    pthread_create(&t1, NULL, &wait, NULL);

  

                                    // ожидание присоединения к потоку

                                    pthread_join(t1, NULL);

                                    if (s == 1)

                                        goto reset;

                                }

                            }

                        }

                    }

                }

            }

        }

    }

  

    return 0;

}

Выход:


Рекомендуемые посты:

Секундомер с использованием языка Си

0.00 (0%) 0 votes