Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачки для новичков! Задачи 
:(
    Опции темы
Crafty
Дата 14.11.2010, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Цитата(Jmylia @  14.11.2010,  02:42 Найти цитируемый пост)
учим С++

А где здесь С++? У вас тут сплошной С.
PM MAIL   Вверх
Jmylia
Дата 14.11.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 12.10.2009
Где: Кривой Рог

Репутация: нет
Всего: нет



Цитата(Crafty @ 14.11.2010,  02:58)
Цитата(Jmylia @  14.11.2010,  02:42 Найти цитируемый пост)
учим С++

А где здесь С++? У вас тут сплошной С.

Упс, это я перепутал, первый семестр, учим С, это второй семестр С++

Говорите полностью на С ... А ошибки какие-то есть? Правильность и логичность написания программы присутствуют?
PM MAIL   Вверх
bsa
Дата 14.11.2010, 15:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Jmylia, ты халтурщик и сачок! Я конечно рад, что ты знаешь стандартную библиотеку, но тут задания не на эти знания, а на знание математики и основ программирования.
Цитата(Jmylia @  14.11.2010,  03:42 Найти цитируемый пост)
2. Даны переменные a и b. Напишите программу, которая будет менять значения этих переменных местами.
В задании было указано не вывести, а обменять значения. Т.е. чтобы в конце программы значения a и b были обменены (проверять отладчиком).
Цитата(Jmylia @  14.11.2010,  03:42 Найти цитируемый пост)
3. Найдите x в степени 4, выполнив наименьшее возможное число умножений. То же самое для  5. x в степени 7. 6. x в степени 22.
...используя только умножение.
Цитата(Jmylia @  14.11.2010,  03:42 Найти цитируемый пост)
7. Даны 2 числа. Вывести наибольшее из них.
решение в одну строчку.
Цитата(Jmylia @  14.11.2010,  03:42 Найти цитируемый пост)
11. Выведите на правильном русском языке, сколько прошло лет с указанного года (между 1 и 2006 годом н.э.) до 2007г. Например, если введено 1986, то надо вывести "21 год", а если 2002, то "5 лет".
Должно быть так: 5 лет, 2 года, или 1 год.
Цитата(Jmylia @  14.11.2010,  03:42 Найти цитируемый пост)
15. Вычислите: a в степени b, b >=  0.
... используя только умножение.

PM   Вверх
Чoо
Дата 14.11.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(bsa @  14.11.2010,  02:36 Найти цитируемый пост)
а realloc для чего был придуман? Только выделяй память с запасом - столько же, сколько уже занято.

просто не знал про эту функцию.  В учебнике до постановки задачи эта функция не рассматривалась. Стараюсь метериал усваивать последовательно. Хотя, уже начинаю чувствовать, что надо искать справочники. Без них ни как...

Цитата(bsa @  14.11.2010,  02:36 Найти цитируемый пост)

это очень медленно. Ты, надеюсь, знаешь, что случайный доступ к элементам списка невозможен с такой же скоростью, как к элементам простого массива?

да, задумался вчера со списками. Поэтому приостановил вчера решение задачи. В данном случае, проблема списка будет заключаться в том, что что-бы перейти скажем к среднему элементу, надо будет последовательно перебрать все другие элементы (в любом направлении, если список двусвязный). Вычислить адрес памяти нужного элемента - не возможно. Другое дело массив. Нужен 10й элемент массива, хранящий элементы типа long, очевидно, что адрес этого элемента будет: адрес нулевого + 10 * 4. Хотя и адрес высчитывать не понадобится, все за нас сделает компилятор. правильно понял, на счет скорости? smile

Цитата(bsa @  14.11.2010,  02:36 Найти цитируемый пост)
Количество строк равно количеству записей в индексном файле.

да.. не подумал просто.. 

Цитата(bsa @  14.11.2010,  02:36 Найти цитируемый пост)
совсем не обязательно - он тоже может в память не поместиться. Ты должен будешь сортировать индексы прямо в файле.

ага, понял, спасибо. Сортировка в файле почти не будет отличаться от сортировки в памяти, поскольку размер каждого индекса одинаков.
Завтра попробую предоставить решение двух задач: последней и с сортировкой большого файла по вашему методу. 

**
кстати, как вам решение задачи http://forum.vingrad.ru/index.php?showtopi...t&p=2246278 ?


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 14.11.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Чoо @  14.11.2010,  22:26 Найти цитируемый пост)
Хотя, уже начинаю чувствовать, что надо искать справочники. Без них ни как...
Тема с часто задаваемыми вопросами прикреплена в разделе.
Цитата(Чoо @  14.11.2010,  22:26 Найти цитируемый пост)
правильно понял, на счет скорости?
да
Цитата(Чoо @  12.11.2010,  15:28 Найти цитируемый пост)
И да.. так кажется, что работа с файлом происходит не напрямую, как я ожидал, а через какой-то буфер.  Сделал такой вывод, потому что светодиод, сигнализирующий обращение к жесткому диску, лишь изредка моргал и не было характерного "треска".
Конечно через буфер. Если бы буферов не было, то скорость работы программ была бы просто катастрофической. Можно работать без буфера, но для этого нужно использовать более низкоуровневое API.

PM   Вверх
Dov
Дата 15.11.2010, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Чoо @  13.11.2010,  12:15 Найти цитируемый пост)
Дан большой текстовый файл с длиной строк не более 100 символов.    Распечатайте 15 последних строк файла

Ещё вариант:
Код
#define N 100

void sCount(FILE * file, int & cnt)
{
    char buf[N];

    while(fgets(buf, N, file))
        cnt++;

    rewind(file);
}

void sPrint(FILE * file, char * str, int cnt)
{
    fgets(str, N, file);
    if(cnt <= 0)
        cout << str;

    if(!feof(file))
        sPrint(file, str, cnt - 1);
}

int main()
{
    int         s_count = 0;          
    int         s_print = 15;
    char        buf[N];
    FILE       *in      = fopen("file_name.txt","rt");

    if(!in) return 0; 

    sCount(in, s_count);
    sPrint(in, buf, s_count - s_print);

    cout << endl;    
    fclose(in);
    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
Дата 15.11.2010, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(bsa @  14.11.2010,  14:05 Найти цитируемый пост)
Jmylia, ты халтурщик и сачок!

bsa, по-моему, он просто прикалывается...  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
  Дата 15.11.2010, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
еще задача.. Нужна помощь..

попробуем...

Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
Для того, что бы воспользоваться алгоритмом бинарного поискА, мне нужно знать количество строк в файле

возможно и так, но не обязательно, достаточно знать размер файла.

Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
а так же уметь позиционироваться на нужную строку в файле.

 smile 

Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
Если я, что бы получить количество строк в файле, буду все их считывать, начиная от первой, возникает вопрос: смысл бинарного поискА, если я и так уже перебрал все строки.

 smile    smile 

Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
Так же, что бы установить указатель на нужную строку, мне нужны индексы (смещения) строк.

 тут думать надо...   smile 

Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
Намекните, куда копать, если не трудно..

думаю, можно так попробовать:

* устанавливаем левую и правую границу(или нижнюю и верхнюю, как тебе хочется).
* далее в цикле(пока левая меньше правой):
   * находим середину файла(это может быть и середина слова)
   * смещаемся в начало слова и проверяем его
   * если совпало, то выводим сообщение, что нашли и завершаем прогу, иначе
   * устанавливаем(смещаем) новые границы поиска
* выводим сообщение, что не нашли и завершаем прогу

Вроде всё...  smile

Добавлено через 2 минуты и 9 секунд
У меня есть одна мысля. Если что, завтра (уже сегодня, но к вечеру) покумекаю... 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Чoо
Дата 15.11.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(Dov @  15.11.2010,  02:32 Найти цитируемый пост)
Ещё вариант:

мм.. вижу реккурсию smile
пока что данный вариант что-то не заработал, еще подумаю над этим. на терминал выводит такую непонятную вещь и очень много:
Код

X'^H,X'^H,X'^H,X'^H,X'^H,X'^ 

хотя вот получение количества строк мне тут не нравится: sCount(in, s_count); (перебор каждой строки). Хотел время вывода строк из текстового файла размером в 25 мб замерить по-быстрому, сравнить, но пока не получилось smile.

Цитата(Dov @  15.11.2010,  03:18 Найти цитируемый пост)
возможно и так, но не обязательно, достаточно знать размер файла.

поспорю smile. Длина каждой строки ограничена в 100 символов. т.е. она может быть и 1 символ и 10 итд. следовательно середина файла - не есть гарантия того, что это середина количества строк.

Цитата(Dov @  15.11.2010,  03:18 Найти цитируемый пост)
Цитата(Чoо @  13.11.2010,  16:21 Найти цитируемый пост)
а так же уметь позиционироваться на нужную строку в файле.
 smile 

ну зная индекс строки - установить указатель на нее не вопрос конечно smile.

Над приведенным ниже алгоритмом подумаю чуть позже, уже в универ сильно опаздываю smile

Это сообщение отредактировал(а) Чoо - 15.11.2010, 15:12


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 15.11.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



а.. ну не работало, потому что я по-невнимательности указал не файл, а директорию, в которой он находится. Однако из рекурсии программа не выходит почему-то. Пишет Segmentation fault. что-то в рекурсии не то. Заменил ее на цикл while с предусловием - всё ок. примерно 0,7 секунд тратится на поиск и вывод последних 15 строк (всего строк 3 163 420
В моем решении 0,125. ну это естественно, так как я не перебираю все строки.
Осталось разобраться почему рекурсия не пошла.
Цитата(Чoо @  15.11.2010,  09:52 Найти цитируемый пост)
поспорю smile. 

ну да, поторопился спорить. но все-равно, как я пойму, что нахожусь не в начале строки?

Это сообщение отредактировал(а) Чoо - 15.11.2010, 15:20


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Dov
Дата 15.11.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Чoо @  15.11.2010,  14:04 Найти цитируемый пост)
Осталось разобраться почему рекурсия не пошла. 

Может ты чего-то в функциях изменил? 

Попробуй такой вариант,  без рекурсии:
Код
#define N 100
int main()
{
    char  buf[N];
    int   s_print = 15;
    FILE *in      = fopen("file_name.txt", "rt");

    if(!in) return 0;
    
    if(s_print)
    {
        fseek(in, 0, SEEK_END);
        for(int k = ftell(in); s_print; k -= 2)
        {
            if(fseek(in, k, SEEK_SET) != 0)
            {
                fseek(in, 0, SEEK_SET);
                break;
            }            
            if(fgetc(in) == '\n')
                s_print--;
        }
    }
    else
    {
        puts("...");
        fclose(in);
        return 0;
    }

    while(!feof(in))
    {
        fgets(buf, N, in);
        if(buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = '\0';
        puts(buf);
    }

    fclose(in);
    return 0;
}
 

Я, правда, особо не тестил, но если что, можно подправить. 


Это сообщение отредактировал(а) Dov - 15.11.2010, 21:36


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
Дата 15.11.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



По поводу бинарного поиска в файле. Вот примерчик, нужно потестировать, ибо руки не дошли. Немного коряво написал, наверняка там что-то нужно доделать, но думаю, что направление ты поймёшь. Что-то бестолковка сегодня совсем не варит... из-за жары, наверно. 
Код
#define N 20
int main()
{
    char     buf[N];
    char  *  key  = "qwerty";
    FILE  *  file = fopen("file_name.txt", "rt");
    int      left, mid, right, cmp;

    fseek(file, 0, SEEK_END);
    left  = 0;
    right = ftell(file);
 
    while(left < (right - 1))
    {
        mid = (left + right) / 2;
        fseek(file, mid, SEEK_SET);

        while(!fseek(file, -2, SEEK_CUR) && ftell(file) > 0 && fgetc(file) != '\n')
            ;

        mid = ftell(file);

        fgets(buf, N, file);
        if(buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = '\0';

        if((cmp = strcmp(key, buf)) == 0)
            break;

        cmp < 0 ? right = mid : left = mid + strlen(buf) + 1;
    }
    printf("%s%sfound!\n", key, cmp ? " not " : " ");
    fclose(file);
    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Чoо
Дата 15.11.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(Dov @  15.11.2010,  21:32 Найти цитируемый пост)
Может ты чего-то в функциях изменил? 

да не, ни чего не менял, кроме пути к файлу. Может какое-то ограничение на количество точек входа? (я такое вообще не встречал). Вобщем суть в чем: маленький файл если взять, то в рекурсию входит и так же норм выходит smile. А если взять файл из 3 с лишним млн. строк, то он на каком-то этапе вылетает (не могу в отладчике узнать где конкретно).
Второй вариант чуть позже потестю. 
По поводу бинарного поиска. Так же гляну позже - в принципе по словесному описанию понял куда копать. Спасибо. Задачу хочу решить сперва сам, пусть хоть и будет криво..  Но пока решать даже и не начал. Что-то с индексами напутал в задаче с сортировкой большого файла. Точнее даже не с индексами.. 
вот функция открытия файла:
Код

/* функция получает путь и имя файла, возвращает указатель на полный путь */
char *get_full_patch(const char *patch, const char *fname)
{
    char *dest;
    int l;
    l=strlen(patch)+strlen(fname);
    dest = new char[l];
    dest = strcpy(dest,patch);
    dest = strcat(dest,fname);
    return dest;
}

/* функция составляет полный путь к файлу и открывает его.
*/
FILE *OpenFile(const char *patch, const char *fname, const char *mode)
{
    char *fullpatch;
    fullpatch = get_full_patch(patch,fname);
    FILE *f = fopen(fullpatch,mode);
    delete []fullpatch;

    return f;
}
void CpyRecordsToFiles(const char *patch, const char *f_ix_nm, int divider)
{
    long *buf; //буфер для индекса
    FILE *f = OpenFile(patch,f_ix_nm,"r");
    FILE *ftemp_a = OpenFile(patch,"temp_a","w"); // <<<<-вот тут ошибка при освобождении строки fullpatch
    FILE *ftemp_b = OpenFile(patch,"temp_b","w");

    //тут в принципе не важно, что - ошибка возникает раньше
    /* записи скопировали. теперь можно закрыть файлы */
}


ну и собственно вызов, при котором возникает ошибка:
Код

CpyRecordsToFiles(patch,"index",divider);
//или так:
const char *f_ix_nm = "index";
CpyRecordsToFiles(patch,f_ix_nm,divider);

а если в вызывающей функции сделать так:
Код

int SortMerge(const char *patch, const char *fname) 
{
...
}
//передача в эту функцию параметров происходит следующим образом:
SortMerge("/home/oem/Developed/Cpp/study/exercise/8.13.2 with indexing/untitled2/","index")

то ни какой ошибки не возникает. Я уже час пытаюсь понять в чем прикол.. 
Может нельзя выделять память в одной функции, а освобождать в другой (get_full_patch и OpenFile)? (про это еще не читал).


Это сообщение отредактировал(а) Чoо - 15.11.2010, 22:38


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Dov
Дата 15.11.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Чoо @  15.11.2010,  21:25 Найти цитируемый пост)
Задачу хочу решить сперва сам, пусть хоть и будет криво.. 

Вот это правильно, давай работай. Потом расскажешь. Удачи!!!


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Чoо
Дата 15.11.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



вообще суть существования последних двух функций в том, что нельзя сформировать полный путь к файлу из составных частей при вызове функции fopen. Может есть, да я не знаю и изобрел вот эти вот костыли...

Добавлено через 41 секунду
Цитата(Dov @  15.11.2010,  22:40 Найти цитируемый пост)
Вот это правильно, давай работай. Потом расскажешь. Удачи!!! 

спасибо smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1161 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.