Russian Qt Forum
Июнь 16, 2024, 08:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 7 8 [9] 10 11 12   Вниз
  Печать  
Автор Тема: Тренировка навыков быстрого программирования  (Прочитано 77749 раз)
8Observer8
Гость
« Ответ #120 : Март 05, 2014, 16:06 »

Очень странно здесь написано: http://qt-project.org/wiki/Qt_Coding_Style_Russian

Пишут, что:
Цитировать
Функции и переменные должны именоваться с прописной буквы, а если имя переменной или функции состоит из нескольких слов, то первое слово должно начинаться с прописной буквы, остальные – со строчных.

Прописная - это значит с большой буквы, то есть имена переменных они рекомендуют писать с большой буквы. А сами пишут с маленькой:
Код
C++ (Qt)
       // А так - правильно
       int height;
       int width;
       char *nameOfThis;
       char *nameOfThat;
 

« Последнее редактирование: Март 05, 2014, 16:32 от 8Observer8 » Записан
OKTA
Гость
« Ответ #121 : Март 05, 2014, 16:13 »

неправильный перевод)
Записан
8Observer8
Гость
« Ответ #122 : Март 05, 2014, 16:15 »

Да, скорее всего, перевод неверный Улыбающийся

По ссылке выше, ещё такое написано:
Цитировать
Public-классы начинаются с буквы ‘Q’ (QRgb)
Что такое "public-классы"? А бывают ещё "private-классы"?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #123 : Март 05, 2014, 16:18 »

Собственно:
Variables and functions start with a lower-case letter. Each consecutive word in a variable’s name starts with an upper-case letter
Записан
8Observer8
Гость
« Ответ #124 : Март 05, 2014, 16:21 »

LisandreL, спасибо! Теперь вижу. Нужно было просто переключить на английский и сравнить Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #125 : Март 05, 2014, 17:55 »

Ну если уж разговор о "каллиграфии" то упомянем еще одну популярную вещь
Код
C++ (Qt)
void MyList::scrollToNode( int index, bool selectIt );
Что здесь может быть плохого  Непонимающий
Записан
8Observer8
Гость
« Ответ #126 : Март 06, 2014, 06:05 »

4) Неуемное использование std:: Чем не устраивал простенький char[4] (вместо векторов)? Да, это не общее решение - но нужна ли здесь какая-то общность? С др стороны по скорости "просто массив" заметно выигрывает.

А на сколько быстрее? Может быть прирост будет настолько мизерный, что им можно принебречь, учитывая современные процессоры?

STL уже сам по себе быстрый по сравнению с другими языками. Вот здесь написано: http://acm.timus.ru/help.aspx?topic=java
Цитировать
Решения на Java почти всегда работают достаточно большое время и требуют много памяти по сравнению с другими языками независимо от сложности задачи. Такова особенность этого языка. Но, тем не менее, гарантируется, что почти все задачи на Timus Online Judge могут быть сданы на Java без особых проблем по сравнению с другими языками. Вот список всех задач, для которых это не гарантируется: 1220, 1275, 1306.

И вот здесь о скорости и памяти программа на C#: http://acm.timus.ru/help.aspx?topic=csharp
Цитировать
Решения на C# по времени работы и по объему используемой памяти сравнимы с решениями на Java. Поэтому, почти все задачи на Timus Online Judge могут быть сданы на C# без особых проблем по сравнению с C/C++ и Pascal. Для решения следующих задач лучше не использовать Java и C#: 1220, 1275, 1306.

Вот здесь я прочитал про STL: http://acm.timus.ru/help.aspx?topic=cpp
Цитировать
STL — стандартная библиотека шаблонов (Standard Template Library), неотъемлемая часть C++, предоставляющая в распоряжение программиста набор контейнеров, итераторов и алгоритмов. Умелое использование этой библиотеки помогает сократить объем кода и уменьшить время на написание программы.

Таким образом, я хочу научиться писать программы с наименьшим количеством строк кода, используя алгоритмы и контейнеры STL, как можно эффективнее.
Записан
OKTA
Гость
« Ответ #127 : Март 06, 2014, 08:11 »

Так быстро писать программы или писать быстрые программы?  Смеющийся
Программа на Си для этих быков и коров будет работать точно быстрее и если при единичном запуске это заметно не будет, то представьте запуск программы 1000 раз, 1000000 раз подряд - здесь уже малейшее ускорение алгоритма будет играть огромную роль. Конечно зависит от целей и задач программы, но в случаях, когда можно обойтись без доп.средств (типа STL) - не стоит к ним обращаться. Ты же не будешь каждый раз браться за шуруповерт, когда надо будет закрутить винтик - удобнее, быстрее и ювелирнее будет взяться за отверточку  Смеющийся Да, несомненно, шуроповерт ускоряет закручивание длинных шурупов, но если шурупы маленькие - больше времени за этим шуруповертом идти Смеющийся Для большего интереса - возьми программу API MOnitor и посмотри, сколько вызовов системных функций делает винда при открытии какого-нибудь файла к примеру - офигеешь  Смеющийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #128 : Март 06, 2014, 08:22 »

Таким образом, я хочу научиться писать программы с наименьшим количеством строк кода, используя алгоритмы и контейнеры STL, как можно эффективнее.
Если вы заранее знаете длину вектора, то рекомендую сразу создавать вектор указанной длины или резервировать необходимое количество памяти. Это исключит ненужные перераспределения памяти и копирования.
Записан
8Observer8
Гость
« Ответ #129 : Март 06, 2014, 08:24 »

Программа на Си для этих быков и коров будет работать точно быстрее

У меня есть знакомый, который всю жизнь (ему уже больше 50) пишет на ассемблере для микроконтроллеров. Когда однажды ему предложили писать на Си он приводил много аргументов, почему на Си программы медленнее, чем на ассемблере, и сколько мусора создаёт компилятор Си. Для написания программ для ПК он использует исключительно Си и WinAPI. Так компилятор C++ (и любой фреймворк) генерирует много лишнего кода.

Вот что Линус Торвальдс написал о языке C++:

Цитировать
C++ - ужасный язык. Еще более ужасным его делает тот факт, что его использует множество неквалифицированных программистов, причем там, где с его помощью проще всего создать полнейшее фуфло. Честно говоря, даже если язык C использовался бы только для того, чтобы держать в отдалении программистов на C++, это само по себе послужило бы достаточным оправданием использования этого языка.Другими словами, выбор языка C является единственным разумным выбором. Я пришел к выводу, что программист, который предпочел бы при написании какой-либо программы использовать язык C++, а не C, скорее всего, принадлежит к такому типу программистов, которых я бы предпочел выгнать вон, так, чтобы они не смогли прийти и испортить проект, которым я занимаюсь. C++ является причиной плохих проектных решений. Вы неизбежно начинаете использовать «изящные» возможности таких библиотек языка, как STL, Boost и другую подобную ерунду, которая может «помочь» вам программировать, однако добиваетесь этим только:
- бесконечного геморроя, когда они не работают (и каждый, кто скажет мне, что STL и, в особенности, Boost, стабильны и переносимы, просто несет полный бред, и это даже не смешно).
- создания неэффективных, оторванных от жизни программных моделей; в результате через пару лет вы замечаете, что некоторые абстракции не слишком эффективны, однако весь ваш код уже находится в зависимости от всех этих изящных объектных моделей, и вы не можете исправить его, не переписав при этом всё приложение.
Другими словами, единственный способ использовать хороший, эффективный, системный и переносимый C++ заключается в том, чтобы ограничить себя теми возможностями, которые в принципе доступны в языке C. Кроме того, использование языка C означает, что никто не испортит ваш проект, и вы сможете найти кучу программистов, которые действительно разбираются в низкоуровневых проблемах и не испортят все дело какой-нибудь идиотской объектно-моделируемой чепухой.

P.S. Вот оригинал его письма: http://harmful.cat-v.org/software/c++/linus
P.S.S. Критика письма: http://dshevchenko.biz/ru/content/%D0%BB%D0%B8%D0%BD%D1%83%D1%81-%D1%82%D0%BE%D1%80%D0%B2%D0%B0%D0%BB%D1%8C%D1%81-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2-c-%D0%BC%D0%BE%D0%B9-%D0%BE%D1%82%D0%B2%D0%B5%D1%82

Так быстро писать программы или писать быстрые программы?  Смеющийся

Я хочу писать именно быстро, и пусть они работают настолько быстро насколько позволит STL Улыбающийся

Таким образом, я хочу научиться писать программы с наименьшим количеством строк кода, используя алгоритмы и контейнеры STL, как можно эффективнее.
Если вы заранее знаете длину вектора, то рекомендую сразу создавать вектор указанной длины или резервировать необходимое количество памяти. Это исключит ненужные перераспределения памяти и копирования.


Отличное замечание! Спасибо большое! Исправил:

Код
C++ (Qt)
void bulls_and_cows(int firstNumber, int secondNumber, int & numberOfBulls, int & numberOfCows) {
   // ...
   const std::size_t nsize = 4;
 
   std::vector<int> vec_first(nsize);
   std::vector<int> vec_second(nsize);
   // ...
}
 
« Последнее редактирование: Март 06, 2014, 09:54 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #130 : Март 06, 2014, 11:02 »

А на сколько быстрее? Может быть прирост будет настолько мизерный, что им можно принебречь, учитывая современные процессоры?
Сожалею что Вы уже начинаете прибегать к 100% типовым аргументам говнокодера  Плачущий
Считать надо не "НАсколько" а "ВО сколько". У Вас  использование вектора снижает скорость минимум в 2 раза, т.к. расчетная часть очень быстрая - бОльшая часть времени будет потрачена на вызываемый вектором malloc.

Таким образом, я хочу научиться писать программы с наименьшим количеством строк кода, используя алгоритмы и контейнеры STL, как можно эффективнее.
"std не дураки придумали. Поэтому использовать std = хорошо, и надо выучить его получше". Этот подход очень популярен Улыбающийся Беда в том что решения "с обильным использованием std" очень часто оказываются неадекватны задаче, потому что человек нацелен на то "как найти это в std" вместо того чтобы думать своей головой.

Хорошо, вот Вы хотите сделать "обязательно с std". Тогда можно было напр так
Код
C++ (Qt)
void CalcBullsCows( const TVector & v1, const TVector & v2, int & numBulls, int & numCows )
{
for (size_t i = 0; i < v2.size(); ++i) {
 TVector:::const_iterator it = std::find(v1.begin(), v1.end(), v2[i]);
 if (it == v1.end()) continue;
 if (std::distance(v1.begin(), it) == i)
  ++numBulls;
 else
  ++numCows;
}
}
Этот код примерно равноценен сишному, и все равно предполагается использование линейного контейнера (иначе std::distance печален). Ну так никто не мешал Вам подойти принципиально и написать для любого контейнера, напр так
Код
C++ (Qt)
template <class Cont1, class Cont2>
void CalcBullsCows( const Cont1 & v1, const Cont2 & v2, int & numBulls, int & numCows )
{
..
}
 
Общий алгоритм - значит общий, в этом есть смысл. А у Вас что? Развели сопли, тут же контейнеры создаете, тут же и считаете. Типа "чем больше std насую - тем круче". Впрочем не Вы первый/последний  Улыбающийся
Записан
8Observer8
Гость
« Ответ #131 : Март 17, 2014, 18:08 »

Подскажите, пожалуйста, почему не работает enum

Я заменил вот этот код:

Код
C++ (Qt)
int showError(int errorCode, const std::string& fileName) {
   switch (errorCode) {
   case 1:
       std::cerr << "Error: cannot open the file " << fileName.c_str() << std::endl;
       break;
   case 2:
       std::cerr << "Error: cannot write to the file " << fileName.c_str() << std::endl;
       break;
   case 3:
       std::cerr << "Error: incorrect data in the file " << fileName.c_str() << std::endl;
       break;
   default:
       std::cerr << "Error code: " << errorCode << "; file name: " << fileName.c_str() << std::endl;
       break;
   }
 
   return errorCode;
}
 

Вот на этот:

Код
C++ (Qt)
enum ErrorType {
   errCannotOpenFile,
   errCannotWriteToFile,
   errIncorrectData
};
 
//...
 
int showError(int errorCode, const std::string& fileName) {
   switch (errorCode) {
   case ErrorType::errCannotOpenFile:
       std::cerr << "Error: cannot open the file " << fileName.c_str() << std::endl;
       break;
   case ErrorType::errCannotWriteToFile:
       std::cerr << "Error: cannot write to the file " << fileName.c_str() << std::endl;
       break;
   case ErrorType::errIncorrectData:
       std::cerr << "Error: incorrect data in the file " << fileName.c_str() << std::endl;
       break;
   default:
       std::cerr << "Error code: " << errorCode << "; file name: " << fileName.c_str() << std::endl;
       break;
   }
 
   return errorCode;
}
 

Выдаёт такие ошибки:
Цитировать
main.cpp:118: error: 'ErrorType' is not a class or namespace
     case ErrorType::errCannotOpenFile:
            ^
Записан
8Observer8
Гость
« Ответ #132 : Март 17, 2014, 18:15 »

Нашёл ошибку Улыбающийся

Нужно вместо: ErrorType::errIncorrectData

Написать: errIncorrectData
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #133 : Март 17, 2014, 19:13 »

в C++11 уже можно и ErrorType::errIncorrectData насколько я помню
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #134 : Март 17, 2014, 19:33 »

в C++11 уже можно и ErrorType::errIncorrectData насколько я помню

Ага, спасибо! Действительно - можно Улыбающийся

В .pro надо написать:
Код
C++ (Qt)
QMAKE_CXXFLAGS += -std=c++11
 
Записан
Страниц: 1 ... 7 8 [9] 10 11 12   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.292 секунд. Запросов: 22.