Software estimation models: study, analysis, comparison, guidelines and proposing models for a given requirements of the software