Понедельник, 11 Ноября 2024, 05:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Покоментируйте код)
vasua99Дата: Среда, 10 Октября 2012, 19:06 | Сообщение # 1
GNU follower
Сейчас нет на сайте
Итак, сегодня я написал свою первую программу размеров +200 строк кода))
Это консольный телефонный справочник, кто может покоментируйте код - т.е что где можно оптимизировать заменить и т.д
Скачать(Исходники + Бинарник для Linux) biggrin


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
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)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
RomanNVKZДата: Пятница, 12 Октября 2012, 04:05 | Сообщение # 6
участник
Сейчас нет на сайте
Не отображается русский язык(WIN7 SP1)



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("Привет", "ПриВеТ");


Code

i > 0

Значит, строка при вызове функции 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, а там, по-умолчанию, кириллицы нет. Есть специальные русификаторы, позволяющие добавить кириллицу, но это лишняя нервотрёпка пользователю. Поэтому, если так хочется работать с консолью - придётся писать на английском, чтобы у всех выглядело одинаково... Заодно количество потенциальных юзеров расширится и знания в английском укрепишь... biggrin
Кстати, обрабатывает русские символы, введённые пользователем, твоя программа правильно - и в файле всё записывается, и ищет вроде бы нормально, и в консоль выводится корректно... Так что, если сейчас заменить текст программы на английский, всё можно будет оставить и так...
Quote (vasua99)
Бинарник для винды: Ссылка

У тебя там серьёзный баг. Если любую команду (--add, --search или --delete) оставить без параметров, программа зацикливается и/или аварийно завершается.
Ещё она вылетает, если в --add сделать 3 параметра. Наверняка тут ещё много таких косяков... Срочно усиливай "защиту от дурака". shades


vasua99Дата: Суббота, 13 Октября 2012, 15:29 | Сообщение # 11
GNU follower
Сейчас нет на сайте
насчет пустых параметров - уже вчера сам заметил и исправлил

Добавлено (13.10.2012, 15:29)
---------------------------------------------
исправил баги вроде)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
NazaДата: Суббота, 13 Октября 2012, 22:05 | Сообщение # 12
GMUser
Сейчас нет на сайте
Открываю - сразу вылетает.
Win7 SP1
RomanNVKZДата: Воскресенье, 14 Октября 2012, 09:06 | Сообщение # 13
участник
Сейчас нет на сайте
Добавь в main() перед return 0; строку system("pause"); а то после запуска сразу закрывается



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 номер - Анастасия Серьеевна, Анастасия Павловна, Магазин (да .. да.. опять он biggrin )
Вводим:
Code
phonebook --search Анастасия
, Выводит 2 номера первых

3)Интерактивный режим:
см. phonebook --help

Бинарник только для LInux happy , в архиве исходники + Makefile.

Кнопочка загрузки
P.S есть еще одно новвоведение, давайте кто первый обнаружит cool


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
RomanNVKZДата: Вторник, 16 Октября 2012, 10:23 | Сообщение # 18
участник
Сейчас нет на сайте
Тогда уж создавай тему в Проектах в разработке, там и выкладывай smile





Сообщение отредактировал RomanNVKZ - Вторник, 16 Октября 2012, 10:23
vasua99Дата: Вторник, 16 Октября 2012, 16:02 | Сообщение # 19
GNU follower
Сейчас нет на сайте
А перенести тему можно?

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг