1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.

Помогите новичку с C++

  1. Привет всем!. За 2 недели осилил книгу C++ без страха, на мой взгляд очень интересная книга намного лучше чем C++ for Dummies, на которую я кстати "положыл" после 30ой страницы... Написал свою первую нормальную программу просьба высказать все минусы в программе и тд. Программа вычисляет площадь треугольника или трапеции. Вот код программы:
    Код:
    #include <iostream>
    using std::cout; /*Я слышал, что так делать лучше чем namespace std. Вопрос почему? :)*/
    using std::cin;
    using std::endl;
    
    int main() {
    	int a, b, h, i, s;
    
    	cout << "This program calculates area of triangle and trapeze\n";	
    	
    	cout << "0 to exit; 1 for triangle; 2 for trapeze: ";	
    
    	cin >> i;
    	
    	
    	switch (i) {
    	case 1:		
    		Length:
    		cout << "Please enter base length and press ENTER: ";
    		cin >> a;
    			if (a <= 0) 
    				{cout << "\nLength cannot be less than 0!"; goto Length;}
    		Height:
    		cout << "\nPlease enter vertical height and press ENTER: ";
    		cin >> h;	
    			if (h <= 0)	
    				{cout << "\nHeight cannot be less than 0!"; goto Height;}
    		s = (a*h)/2;
    		cout << "\nArea of triangle is: " << s << " ";
    		cout << endl;
    		break;
    	case 2: 
    		Length2:
    		cout << "Please enter base length of A and press ENTER: ";
    		cin >> a;
    			if (a <= 0)
    				{cout << "\nLength cannot be less than 0!"; goto Length2;}
    		Length3:
    		cout << "\nPlease enter base length of B and press ENTER: ";
    		cin >> b;
    			if (b <= 0)
    				{cout << "\nLength cannot be less than 0!"; goto Length3;}
    		Height2:
    		cout << "\nPlease enter vertical height(h) and press ENTER: ";	
    		cin >> h;
    			if (h <= 0) 
    				{cout << "\nHeight cannot be less than 0!"; goto Height2;}
    		s = ((a + b)/2)*h;
    		cout << "\nArea of triangle is: " << s << " ";
    		cout << endl;
    		break;
    	case 0: 
    		cout << "Terminating program!\n";
    		break;
    	}
    	return 0;
    	}
     
    2 пользователям это понравилось.
  2. MacMordainCadal,
    Для начала хорошо :)
    я кстати тож начинал с подобных вычислительных программ учить беёсик xD

    Я смотрю ты использовал конструкцию Case, некоторые тупо из-за того что у них маленький мозг везде используют конструкции IF

    Добавлено через 1 минуту
    название топика по моему не в тему раз уж ты помочь не чем не попросил)
     
  3. Я вообще хотел узнать нету ли ужасных ляпов. А так спасибо ;)
     
  4. MacMordainCadal, использование оператора GOTO в любом виде - признак дурного тона.

    Доопределение, всегда лучше. Хотя и трудоемко. :)

    Код:
    s = (a*h)/2;
    Вот так лучше НЕ делать. Или используй функции приведения к целому(целочисленного деления), или делай явный type-cast.

    1. Далеко не все условия можно определить с помощью CASE
    2. Смысла в CASE нет, если нужно сделать a = b>c?d:e;
    3....
     
  5. Я знаю, просто не знал как реализовать по другому. Спасибо за помощь.
     
  6. Если будешь писать кроссплатформенные програмки, или просто под разные ОС то лучше использовать std::endl, потому что перенос строки в разных ОС разный :)
    Goto сойдет разве что для выхода из вложенных циклов ( в Яве для этого есть специальный брейк), а так только усложняет.

    Кстати у тебя много кода повторяется, чтобы не писать по многу раз, придумали функции, и много чего еще :) Я бы написал так:
    https://gist.github.com/f651ee79147eaa5cf438

    lytgeygen,
    case ограниченная, и на самом деле крайне неудобная штука, в С++ по крайней мере
     
  7. Реалистичный пример можно?)
     
  8. ~|~евто|-|,
    При написании алгоритмов которые что-то ищут, например в многомерных массивах, бывает что при нахождении нужного значения, дальнейший поиск не нужен, поэтому примерно такой код:

    Код:
    for()
    {
        for()
        {
            while()
            {
                for()
                {
                    check();
                    calcule();
                    retag();
                    if (found) 
                    {
                        a = b;
                        c = d;
                        long long penis;
                        goto afterloop;
                    }
                }
            }
        }
    }
    
    afterloop: 
        makePlan();
        doSomething();
        profit();
    
    Если значение не найдется во всем множестве, то он все равно перейдет в эту область (afterloop), после окончания всех циклов
     
  9. luninet, хм...
    1. В данном случае, GOTO - можно заменить реализацией с 1 флагом.
    2. В большистве случаев, такой код должен быть функцией...
    3. GOTO в корне своем зло. Ибо сопровождая и развивая код, можно провести много веселых минут в отладчике... )
    4....
     
  10. Ого спасибо. Про существование функций я знаю просто сам писать их покачто не могу. :)
     
  11. Кстати, тема фигур - благодатная тема для развития навыков Объектно Ориентированного Программирования. Как развитие твоей программы - создать общий класс фигур, и набором общих сущеностей и свойственных функций. Его наследниками сделать уже обычный фигуры, чтоб допустим можно было написать такой код:

    Код:
    ...
    Trapeze t = new Trapeze(); 
    t.readValues(); 
    std::cout << t.square(); 
    ...
    
    Там уже и до графического представления рукой подать
    Удачи
     
    1 человеку нравится это.
  12. 3 недели назад вновь решил учить СИ, учу язык в общей сложности 8 месяцев. Когда узнал о библиотеке SDL загорелся желанием написать простой платформер. Идея считывать настройки экрана с файла startup.cfg. Получилось у меня "не очень" красиво[​IMG]. Можно ли как-нибудь по короче переписать?. И еще я знаю только один способ преобразования string в int (stringstream). Может есть другой способ? Более эффективный?

    Код:
    bool init_screen_from_files()
    {
        screen = SDL_SetVideoMode( 640, 480, 16, SDL_SWSURFACE ); // setup the screen
        string filename = "game/startup.cfg";
        ifstream ReadScreenSettings( filename.c_str() ); // open startup.cfg for reading
        if(  ReadScreenSettings != NULL ) // if startup.cfg isn't empty then screen settings will be overwritten
        {
            string searchwidth;
            string searchheight;
            string searchfullscreen;
            searchwidth = "width";
            searchheight = "height";
            searchfullscreen = "fullscreen";
    
            string tempwidth, tempheight, tempfullsceeen;
    
            while (getline(ReadScreenSettings, tempwidth))
                {
    
                while (getline(ReadScreenSettings, tempheight))
                {
                    while (getline(ReadScreenSettings, tempfullsceeen))
                    {
                        if (tempwidth.find(searchwidth) != std::string::npos)
                        {
                            if(tempheight.find(searchheight) != std::string::npos)
                            {
                                if(tempfullsceeen.find(searchfullscreen) != std::string::npos)
                                {
                                    if (tempwidth != HurrrrDurrrDerpDerpDerp)
                                    {
                                        if (tempheight != HurrrrDurrrDerpDerpDerp)
                                        {
                                            if (tempfullsceeen != HurrrrDurrrDerpDerpDerp)
                                            {
                                            stringstream global_width, global_height, global_fullscreen; // stringstream provides an interface to manipulate strings as if they were input/output streams needed to convert variables for SDL_setvideomode....
                                            string ss_width, ss_height, ss_fullscreen;              // create a temporary string
                                            int Vid_Width, Vid_Height, Vid_Fullscreen;
                                            ss_width = tempwidth.substr(6,4);  // assing ss_width to line (width variable in startup.cfg) and leave out only last 4 (!) characters so that the user doesnt have a problem using width higher than 999.
                                            ss_height = tempheight.substr(7,4); // same as above
                                            ss_fullscreen = tempfullsceeen.substr(11,1);
                                            global_width << ss_width;
                                            global_height << ss_height;
                                            global_fullscreen << ss_fullscreen;
                                            global_width >> Vid_Width;
                                            global_height >> Vid_Height;
                                            global_fullscreen >> Vid_Fullscreen;
                                            cout << "width: " << Vid_Width << endl;
                                            cout << "height: " << Vid_Height << endl;
                                            cout << "fullscreen: " << Vid_Fullscreen << endl;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
    
                }
    
    
                }
    
        }
        ReadScreenSettings.close();
       return true;
    }
    
    Startup.cfg такого вида:
    Код:
    width=640
    height=480
    fullscreen=1
    
     
  13. NightWolf
    )

    Слушай бро. скинь книжонку почитать;)
     
  14. Информация считывается только в определенном порядке. Придется переписывать. /facepalm

    Какую книгу? Если ты про SDL, то Focus on SDL. Если C, то C++ Primer.
     
  15. XML.
    Благо движков для работы с ним, в том числе и open source, тьма тьмущая) Начиная от кроссплатфоменной libxml до... до всяких MS наработок)
     
  16. Спасибо конечно, но для маленького платформера не хотелось бы подключать миллион библиотек. Попробую как-нибудь переписать что ли. :mda: На libxml гляну вдруг пригодится. :dance4:
     
  17. 1. Она(libxml) opensource, при правильном подходе выкинешь все не нужное
    2. XML универсальный стандарт де-факто.
    3. Есть куча технологий на нем... Ну самые известные Jabber(XMPP), SOAP, ...
    4. Из личного опыта. Все конфиги, все пользовательские настройки, ... переводим на XML. Приимуществ масса: поддержка кодировок, открытый формат, структурированный формат, прекрасно сжимается, ...

    [ADD]
    Учись писать код не для сейчас, а для послезавтра) Естественно не получится, но делать это стоит) При правильном подходе, сделаешь оболочку под libxml и будешь ее пользовать до старости)
    Кстати, libxml поддерживает xslt - а это еще одна очень мощная штука, при правильном взгляде на нее :)