LINUX.ORG.RU

История изменений

Исправление rtxtxtrx, (текущая версия) :

Лови:

import argparse

def is_number_in_range(number, start, end):
    try:
        num = float(number)
        return start <= num <= end
    except ValueError:
        return False

def process_file(file_path, start, end):
    with open(file_path, 'r') as file:
        for line_number, line in enumerate(file, start=1):
            numbers = line.split()  # Разделяем строку на числа
            for number in numbers:
                if is_number_in_range(number, start, end):
                    print(f'Число {number} найдено на строке {line_number}')

def main():
    parser = argparse.ArgumentParser(description="Утилита для поиска чисел в диапазоне в файле")
    parser.add_argument('file', help='Путь к файлу')
    parser.add_argument('start', type=float, help='Начало диапазона')
    parser.add_argument('end', type=float, help='Конец диапазона')
    
    args = parser.parse_args()

    process_file(args.file, args.start, args.end)

if __name__ == "__main__":
    main()

А вот и на C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int is_number_in_range(double number, double start, double end) {
    return number >= start && number <= end;
}

void process_file(const char* file_path, double start, double end) {
    FILE *file = fopen(file_path, "r");
    if (file == NULL) {
        perror("Ошибка открытия файла");
        return;
    }

    char line[1024];
    int line_number = 0;

    while (fgets(line, sizeof(line), file)) {
        line_number++;
        char *token = strtok(line, " \t\n");  // Разделение строки на токены по пробелам и табуляциям

        while (token != NULL) {
            char *endptr;
            errno = 0;
            double num = strtod(token, &endptr);

            if (endptr != token && errno == 0) {  // Проверяем, что преобразование прошло успешно
                if (is_number_in_range(num, start, end)) {
                    printf("Число %.2f найдено на строке %d\n", num, line_number);
                }
            }

            token = strtok(NULL, " \t\n");
        }
    }

    fclose(file);
}

int main(int argc, char *argv[]) {
    if (argc != 4) {
        fprintf(stderr, "Использование: %s <файл> <начало диапазона> <конец диапазона>\n", argv[0]);
        return 1;
    }

    const char* file_path = argv[1];
    double start = atof(argv[2]);
    double end = atof(argv[3]);

    process_file(file_path, start, end);

    return 0;
}

Исходная версия rtxtxtrx, :

Лови:

import argparse

def is_number_in_range(number, start, end):
    try:
        num = float(number)
        return start <= num <= end
    except ValueError:
        return False

def process_file(file_path, start, end):
    with open(file_path, 'r') as file:
        for line_number, line in enumerate(file, start=1):
            numbers = line.split()  # Разделяем строку на числа
            for number in numbers:
                if is_number_in_range(number, start, end):
                    print(f'Число {number} найдено на строке {line_number}')

def main():
    parser = argparse.ArgumentParser(description="Утилита для поиска чисел в диапазоне в файле")
    parser.add_argument('file', help='Путь к файлу')
    parser.add_argument('start', type=float, help='Начало диапазона')
    parser.add_argument('end', type=float, help='Конец диапазона')
    
    args = parser.parse_args()

    process_file(args.file, args.start, args.end)

if __name__ == "__main__":
    main()