Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2014, 12:09   #1
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию Калькулятор, работа с файлами

Нужно вычислить арифметическое выражение, записанное в input.txt (между цифрами может быть сколько угодно пробелов) и записать его в output.txt
У меня программа работает, но тест. система говорит, что превышен лимит времени. Не пойму в чем дело, с файлами раньше не работала.
И подскажите, пожалуйста, как код нормально вставить?
Код:
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

long long int strint(char c1[], int i) {
    long long int res = 0;
    for (int j = 0; j <= i ; j++) {
            res = 10 * res +  c1[j] - '0';
    }
    return res;
}

int main(void)
{
    FILE *a, *b;
    a = fopen("input.txt", "r");
    b = fopen("output.txt", "w");
    char c, c1[20], op;
    int i = -1, fin = 0;
    long long sum = 0;
    while ( fscanf(a, "%c", &c) && c <= '9' && c >= '0') {
        c1[++i] = c;
    }
    sum += strint(c1, i);
    while ( c == ' ' )
        fscanf(a, "%c", &c);
    op = c;
    fscanf(a, "%c", &c);
    while ( c == ' ' ) {
        fscanf(a, "%c", &c);
    }

    while (1) {
        if (fin != 2) {
            i = 0;
            c1[0] = c;
            c1[1] = '\0';

            while ( !fin && c <= '9' && c >= '0' ){
                if (fscanf(a, "%c", &c) != EOF ) {
                    if (c <= '9' && c >= '0') {
                        c1[++i] = c;
                    }
                }
                else
                    fin = 1;
            }
            c1[i + 1] = '\0';
            if ( op == '+')
                sum += strint(c1, i);
            else
                sum -= strint(c1, i);
        }
        if ( fin ) {

            char s[20];
            int j, m = 0;
            if ( sum < 0 ) {
                sum = - sum;
                m = 1;
            }
            for (j = 0; sum ; j++) {
                s[j] = (sum % 10) + '0';

                sum /= 10;
            }
            s[j] = '\0';
            if (m)
                fputc('-', b);
            for (int z = j - 1; z >= 0; z--)
                fputc( s[z] , b);
            fclose(a);
            fclose(b);

            return 0;
        }
        int m = 0;
        while ( !m && c == ' ') {
            m = 0;
            if (fscanf(a, "%c", &c) != EOF) {

            }
            else {
                fin = 2;
                m = 1;
            }
        }
        if ( !fin ) {
            op = c;
            fscanf(a, "%c", &c);
            while ( c == ' ' ) {
                fscanf(a, "%c", &c);
            }
        }
    }
    return 0;
}

Последний раз редактировалось Stilet; 06.12.2014 в 16:11.
Renge вне форума Ответить с цитированием
Старый 06.12.2014, 12:25   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
loong long int
Блин, Алиса, в стране чудес. Вы, хоть понятие имеете, что этим объявлением сотворили? Указатеоль на указатель и еще на необъявленный объект strint. Моск вынес, реально....
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 12:31   #3
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию

Почему не объявленный объект? Это же просто функция типа long long, принимающая указатель на массив и число элементов, не так?
Renge вне форума Ответить с цитированием
Старый 06.12.2014, 13:42   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Считывание файла символ за символом довольно медленно.
Прочитайте про setvbuf() - это несколько ускорит, хотя все равно лучше читать файл блоками и обрабатывать эти блоки.
waleri вне форума Ответить с цитированием
Старый 06.12.2014, 13:50   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Всё так, почему и компиль мочит. Проблема в другом, в нерациональном использовании память. Как ни странно, но указатель на указатель, по-умолчанию исполъзует сегмент в 256 бит. Это не касается явнных выделений памяти alloc и malloc. Под них ваыделяется сплошная область. Для new, выдлятся динамичмкое пространство. Можно узнать и физические адреса выделения, но зачем?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 14:47   #6
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию

waleri
Вы имеете в виду считать весь файл в буфер и обрабатывать его будет быстрее?
Smitt&Wesson
Все не пойму, а где я использую указатель на указатель, разве у меня не просто указатель? Про память вроде поняла, тогда, наверное, попробую выделить по указателю память маллоком и передать этот указатель в функцию.
Renge вне форума Ответить с цитированием
Старый 06.12.2014, 15:24   #7
Renge
Пользователь
 
Аватар для Renge
 
Регистрация: 07.12.2010
Сообщений: 35
По умолчанию

Написала что - то такое, но результат вроде тот же
Код:
char *cur = malloc( i + 1 );
    for (int j = 0; j <= i ; j++) {
            cur[j] = c1[j];
    }
    sum += strint(cur);
    free(cur);
В буфер прочесть не получится, символов в файле неограниченное количество. А блоками как читать, я не понимаю/

Вопрос решен

Последний раз редактировалось Renge; 07.12.2014 в 11:48.
Renge вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами krikqwerty Помощь студентам 0 22.01.2013 18:14
Калькулятор, работа над ошибками. Artem23 Общие вопросы C/C++ 6 22.12.2012 13:56
Работа с файлами в С Tasha_no Помощь студентам 0 26.12.2010 17:08
работа с файлами voron.kz Помощь студентам 4 15.11.2009 17:25