Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 5935
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2594
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2209
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1610
Дата выхода:16.12.2010, 15:30
Администратор рассылки:Verena (Профессор)
Подписчиков / экспертов:330 / 178
Вопросов / ответов:1 / 2

Вопрос № 181219: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос как можно скорее.Написать нужно на Си. В Dev-C++. Прокомментируйте пожалуйста Написать программу,которая считывает текст из файла и выводит на экран только строки ,не сод...



Вопрос № 181219:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос как можно скорее.Написать нужно на Си. В Dev-C++. Прокомментируйте пожалуйста

Написать программу,которая считывает текст из файла и выводит на экран только строки ,не содержащие двузначных чисел.
Оформить в виде функций законченные последовательности действий.Все необходимые данные для функций должны передаваться им в качестве параметров.Использование глобальных переменных в функциях не допускается.

Отправлен: 11.12.2010, 15:06
Вопрос задал: Olgaa (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Павел Юрьевич (5-й класс) :
Здравствуйте, Olgaa!

Обратите внимание:
Для компиляции проекта необходима опция -std=c99.
Обработка исключительных ситуаций не предусмотрена.


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

FILE *f;
char *str;
int file_size;

int check_two_digits(char *s)
{
for (int i=1; i<strlen(s); i++)
{
if (((s[i]>='0')&&(s[i]<='9'))&&
((s[i-1]>='0')&&(s[i-1]<='9')))
return(1);
}
return(0);
}

int main(int argc, char *argv[])
{
if (argc < 2)
{
printf ("Не указан файл\n");
return(1);
}

f=fopen(argv[1],"rb");
if (f)
{
fseek(f,0,SEEK_END);
file_size=ftell(f);
rewind(f);
str=(char *)malloc(file_size);

while((fgets(str,file_size,f))!=NULL)
{
if (check_two_digits(str)==0) printf("%s",str);< br> }

free(str);
fclose(f);
}

return(0);
}
Дополнение ответа
-----
∙ Отредактировал: Verena (Профессор)
∙ Дата редактирования: 13.12.2010, 20:46 (время московское)

Ответ отправил: Павел Юрьевич (5-й класс)
Ответ отправлен: 11.12.2010, 21:12
Номер ответа: 264666

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264666 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Micren (Профессионал) :
    Здравствуйте, Olgaa!
    Программа. C. Компилировал GCC.
    Код:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>

    #define DIGITS 2

    void error(const char* const msg);
    char* getLine();
    bool isValidLine(const char* line);

    /*
    *
    */
    int main()
    {

    char* line = 0;

    // Читаем построчно
    while (line = getLine())
    {
    // Если строка удовлетворяет условию
    if (isValidLine(line))
    {
    printf("%s", line);
    }

    // Освободим память
    free(line);
    }

    return EXIT_SUCCESS;
    }

    // Выводит сообщение об ошибке

    void error(const char* const msg)
    {
    fprintf(stderr, "%s\n", msg);
    exit(EXIT_FAILURE);
    }

    // Читает строку

    char* getLine()
    {
    // Буфер
    char buffer[BUFSIZ];
    char* result = 0, *tmp = 0;
    size_t size = 0;

    while (true)
    {
    // Читаем
    if (!fgets(buffer, sizeof (buffer), stdin))
    {
    // Если конец файла
    if (feof(stdin))
    {
    return result;
    }
    else
    {
    error("Ошибка ввода/вывода");
    }
    }

    // Добавим к длине строки
    size += strlen(buffer);

    // Попытка выделить память
    if (!(tmp = realloc(result, size + 1)))
    {
    error("Не могу выделить память");
    }

    // Копируем из бу фера
    if (!result)
    {
    strcpy(tmp, buffer);
    }
    else
    {
    // Присоединяем, если не первый раз
    strcat(tmp, buffer);
    }

    result = tmp;

    // Если прочли до конца строки, то выход
    if (size && result[size - 1] == '\n')
    {
    return result;
    }
    }
    }

    // Проверка строки на соответствие условию

    bool isValidLine(const char* line)
    {
    if (!line)
    {
    return false;
    }

    size_t cnt = 0;
    // Идем посимвольно
    while (*line)
    {
    // Если цифра
    if (isdigit(*line++))
    {
    // Увеличим счетчик
    ++cnt;
    }
    else
    {
    // Если не цифра и к-во цифр совпало с условием
    if (cnt == DIGITS)
    {
    break;
    }
    // Иначе обнулим счетчик
    cnt = 0;
    }
    }
    return cnt != DIGITS;
    }

    Пример исходного файла:
    Код:
    > cat ./test.txt 
    valid string
    not valid string 12
    123456
    11

    Пример работы:
    Код:
    > ./181219 < test.txt 
    valid string
    123456


    Программа читае т данные из стандартного потока вода(stdin) и выводит на стандартный поток вывода(stdout). Для того, чтоб использовать ее для обработки лю бого файла необходимо использовать перенаправление ввода/вывода. Т.е запускать так: "имя программы" < "входной файл". Что и продемонстрировано в примере.

    Ответ отправил: Micren (Профессионал)
    Ответ отправлен: 12.12.2010, 15:00
    Номер ответа: 264676

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264676 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное