Покоментируйте код)
| |
vasua99 | Дата: Среда, 10 Октября 2012, 19:06 | Сообщение # 1 |
GNU follower
Сейчас нет на сайте
| Итак, сегодня я написал свою первую программу размеров +200 строк кода)) Это консольный телефонный справочник, кто может покоментируйте код - т.е что где можно оптимизировать заменить и т.д Скачать(Исходники + Бинарник для Linux)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
RUNGOGET2THECHOPAH | Дата: Среда, 10 Октября 2012, 19:45 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Перепаковка массивов не есть хорошо.
|
|
| |
vasua99 | Дата: Четверг, 11 Октября 2012, 18:43 | Сообщение # 3 |
GNU follower
Сейчас нет на сайте
| всмысле, можно отрывок из кода, чтобы понятнее было)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
RUNGOGET2THECHOPAH | Дата: Четверг, 11 Октября 2012, 20:07 | Сообщение # 4 |
участник
Сейчас нет на сайте
| vasua99, в файле dyn_array. Насколько я понял, ты хранишь структуры из указателей на данные (имя и телефон) внутри динамического массива. И если пользователь пытается добавить что-то в уже заполненный массив, то ты вызываешь функцию increase_size, которая запиливает новый массив размером со старый + место для одного нового элемента. При этом вся инфа из старого копируется в новый. Вот именно это копирование, или перепаковка, приводит к линейному росту времени работы алгоритма в зависимости от размера массива (допустим, в массиве было 1000 элементов, и перепаковка заняла десятую долю секунды. А вот если в нем 10000 элементов, то потребуется уже одна секунда и так далее). Чтобы избежать перепаковки, можно использовать списковые структуры (http://ermak.cs.nstu.ru/cprog/html/063.htm) - элемент структуры содержит "единицу данных" (в твоем случае указатели на имя, номер и т.д.) + указатель на следующий элемент. Что-то вроде того: Code struct Node //звено списка { //твои данные char* name; char* number; //указатель на следующее звено списка Node* next_node; } Сами же данные можно определять указателем на первый (или/и последний) элемент списка. Таким образом все добавление новых данных сводится к выделению памяти под один новый элемент, и передаче предыдущему элементу указателя на эту память. Но следует учесть, что при использовании списков обращение к данным по порядковому номеру очень медленное - в массиве все данные лежат в памяти одном блоком, и нужно всего лишь сразу сместиться на соответствующую ячейку, а в списке данные в памяти расположены как попало, их связывают только указатели, поэтому приходится пробегать по всем предыдущим элементам, пока не встретим нужный. Это скажется, например, при попытке поиска номера телефона по имени (хотя в твоей реализации ты тоже ищешь простым последовательным перебором, так что разницы не будет). Вообще в таких задачах лучше сразу решить, что тебе нужнее - быстрое добавление данных (юзаешь списки) или быстрое обращение к ним (массив).
|
|
| |
vasua99 | Дата: Четверг, 11 Октября 2012, 22:44 | Сообщение # 5 |
GNU follower
Сейчас нет на сайте
| ну мне это надо на конкурс по программированию и времени мало, поэтому писал - как мысли в голову приходили, позже перепишу с использованием односвязного списка может быть)
и еще вопрос - как платформо-независимо очистить файл от данных, а то в результате моей очистки и записи получается что то вроде этого, что не очень приятно: Добавлено (11.10.2012, 21:21) --------------------------------------------- хех, после исправление небольшой другой ошибки(при добавлении нового элемента в БД он писался в одной строке с другим) баг исправлся сам как то)
Есть желающие потестить программу?просто не охото сдавать на конкурс лажную прогу))
бинарник под Linux, под винду чуть позже будет - т.к нету пока времени перезапускать оси)
Бинарник(Linux)
файл phonebook.db скидывать в одну папку с бинарником.
P.S как платформо-независимо создать пустой файл? Добавлено (11.10.2012, 22:44) --------------------------------------------- Бинарник для винды:
Ссылка
конкретно интересует - отображаются ли нормально русские символы в винде и ошибки с псевдо БД(phonebook.db)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| | |
vasua99 | Дата: Пятница, 12 Октября 2012, 20:23 | Сообщение # 7 |
GNU follower
Сейчас нет на сайте
| я тоже самое заметил, только не пойму почему - пробовал и кодовую страницу менять и setlocale()
может потому что у меня исходники(файлы) в UTF-8?Добавлено (12.10.2012, 18:47) --------------------------------------------- Опять мне нужна помощь - есть 2 функции:
Code // приводим строку str к нижнему регистру, сохраняем ее в dest, и возвращаем указатель на него char *tolower_str(char *str, char *dest) { char *tmp = dest; for(; *str; *tmp = tolower(*str), str++, tmp++); if(*(str - 1) == '\n') *(tmp - 1) = '\0'; return dest; }
// сравнение без учета регистра int unregister_strcmp(char *s1, char *s2) { char *tmp1 = calloc(64, sizeof(char)); char *tmp2 = calloc(64, sizeof(char)); tolower_str(s1, tmp1); tolower_str(s2, tmp2); printf("s1 = %s\ns2 = %s\n", tmp1, tmp2); int i = strcmp(tmp1, tmp2); free(tmp1), free(tmp2); return i; }
Но при вызове: Code int i = unregister_strcmp("Привет", "ПриВеТ");
Значит, строка при вызове функции tolower_str() не меняется! Простестировав его "внутрипрограмным" отладчиком - оказалось что так на самом деле, но почему?Добавлено (12.10.2012, 18:58) --------------------------------------------- при этом такое только с русскими символами Добавлено (12.10.2012, 20:23) --------------------------------------------- решил пока не заходить дальше, т.к с кодировками проблема.
Новая версия пожалуйста, подскажите как бы сделать, чтобы русские символы нормально отображались и в лине и в винде?за правильный ответ +)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
Нохчи | Дата: Пятница, 12 Октября 2012, 20:31 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Quote (vasua99) Значит, строка при вызове функции tolower_str() не меняется! tolower не работает для русских букв.
Многие вопросы по Windows отпадут, если посмотреть тут
Сообщение отредактировал Нохчи - Пятница, 12 Октября 2012, 20:31 |
|
| |
vasua99 | Дата: Пятница, 12 Октября 2012, 21:10 | Сообщение # 9 |
GNU follower
Сейчас нет на сайте
| хех, я уже разобрался - меня сейчас интересуют 2 вещи - utf-8 в виндовской консоле и tolower() для юникода(двухбайтового)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
TimKruz | Дата: Пятница, 12 Октября 2012, 22:39 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Quote (vasua99) utf-8 в виндовской консоле В консоли Windows программам предоставляется только 8-битная ASCII, а там, по-умолчанию, кириллицы нет. Есть специальные русификаторы, позволяющие добавить кириллицу, но это лишняя нервотрёпка пользователю. Поэтому, если так хочется работать с консолью - придётся писать на английском, чтобы у всех выглядело одинаково... Заодно количество потенциальных юзеров расширится и знания в английском укрепишь... Кстати, обрабатывает русские символы, введённые пользователем, твоя программа правильно - и в файле всё записывается, и ищет вроде бы нормально, и в консоль выводится корректно... Так что, если сейчас заменить текст программы на английский, всё можно будет оставить и так... Quote (vasua99) Бинарник для винды: Ссылка У тебя там серьёзный баг. Если любую команду (--add, --search или --delete) оставить без параметров, программа зацикливается и/или аварийно завершается. Ещё она вылетает, если в --add сделать 3 параметра. Наверняка тут ещё много таких косяков... Срочно усиливай "защиту от дурака".
|
|
| |
vasua99 | Дата: Суббота, 13 Октября 2012, 15:29 | Сообщение # 11 |
GNU follower
Сейчас нет на сайте
| насчет пустых параметров - уже вчера сам заметил и исправлил Добавлено (13.10.2012, 15:29) --------------------------------------------- исправил баги вроде)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
Naza | Дата: Суббота, 13 Октября 2012, 22:05 | Сообщение # 12 |
GMUser
Сейчас нет на сайте
| Открываю - сразу вылетает. Win7 SP1
|
|
| | |
TimKruz | Дата: Воскресенье, 14 Октября 2012, 10:49 | Сообщение # 14 |
старожил
Сейчас нет на сайте
| Naza, RomanNVKZ, просто нужно запускать из командной строки, по-другому смысла нет. Запускаете Пуск - Выполнить (либо WinKey+R), там вводите cmd (консоль типа), в ней вводите cd папка_с_программой, затем - имя программы (phonebook-win). Программа выдаст справку - какие параметры вводить. Делается это так: имя_программы параметр1 параметр2 значение1 и т.д. Например, phonebook --add TimKruz 12-34-56.
Хотя я бы, конечно, сделал программу в цикле с паузой (выводит и запрашивает данные внутри себя), это проще и понятнее для пользователя, особенно современному...
Vasua99, сделай поиск по фрагменту имени/телефона, это просто сделать и удобнее юзеру. И еще добавь какое-нибудь форматирование к номеру телефона. Можно, например, сохранять только цифры, а при выводе на экран вставлять дефисы и скобки, либо сохранять в формате пользователя, а искать только по цифрам.
|
|
| |
vasua99 | Дата: Воскресенье, 14 Октября 2012, 12:45 | Сообщение # 15 |
GNU follower
Сейчас нет на сайте
| После выходного думаю добавлю интерактивный режим помимо параметровно(ну который сейчас) + поиск по части имена и телефона) и посмотрю что еще можно сделать... Добавлено (14.10.2012, 12:45) --------------------------------------------- Наверное небольшой рефакторинг сделаю))
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
RomanNVKZ | Дата: Понедельник, 15 Октября 2012, 11:55 | Сообщение # 16 |
участник
Сейчас нет на сайте
| Quote (vasua99) Naza, RomanNVKZ, просто нужно запускать из командной строки, по-другому смысла нет. Запускаете Пуск - Выполнить (либо WinKey+R), там вводите cmd (консоль типа), в ней вводите cd папка_с_программой, затем - имя программы (phonebook-win). Программа выдаст справку - какие параметры вводить. Делается это так: имя_программы параметр1 параметр2 значение1 и т.д. Например, phonebook --add TimKruz 12-34-56. Вот теперь всё ясно. Возьму на заметку =)
|
|
| |
vasua99 | Дата: Понедельник, 15 Октября 2012, 21:39 | Сообщение # 17 |
GNU follower
Сейчас нет на сайте
| Вот и написал я новую версию... Итак новое: 1) Поддержка поиска нескольких имен одновременно: Пример: В БД есть 4 номера - Мама,Папа,Магазин,Школа... если ввести Code phonebook --search Мама,Папа,Школа то выведет 3 номера из найденных. Имена перечисляются через запятую.
2) Поддержка поиска по слову из имени: Пример: В БД есть 3 номер - Анастасия Серьеевна, Анастасия Павловна, Магазин (да .. да.. опять он ) Вводим: Code phonebook --search Анастасия , Выводит 2 номера первых
3)Интерактивный режим: см. phonebook --help
Бинарник только для LInux , в архиве исходники + Makefile.
Кнопочка загрузки P.S есть еще одно новвоведение, давайте кто первый обнаружит
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| | |
vasua99 | Дата: Вторник, 16 Октября 2012, 16:02 | Сообщение # 19 |
GNU follower
Сейчас нет на сайте
| А перенести тему можно?
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
|