Модераторы: bsa
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Ответы на часто задаваемые вопросы! Есть вопрос? Тогда поищи ответ тут! 
:(
    Опции темы
bsa
Дата 16.8.2009, 11:57 (ссылка) |   (голосов:13) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ниже приводятся ссылки на статьи описывающие те или иные задачи, которые ставятся перед начинающими осваивать языки программирования. Уверен, что ответы на большинство из них вы найдете именно там.
Вопросы в них задавать нельзя - будут удаляться модераторами! Если что-то непонятно, то надо создать отдельную тему, сослаться на статью и описать, что именно вызвало затруднения. Возможно, именно благодаря вам статья станет в будущем близка к идеалу.

Книги или с чего начать изучение языка © bsa (обсуждение, незавершено)
Современный "Hello word!" или простейшая программа на С++ © archimed7592 (незавершено)
Программа быстро закрывается, и не удается увидеть результат © bsa
Оформление кода © bsa (незавершено)
++i или i++ © bsa
Указатели и ссылки © bsa (незавершено)
Динамические массивы © bsa (незавершено)
Русский язык в программах © bsa (незавершено)
Защита от повторного включения или Стражи заголовочных файлов © JackYF (Несколько файлов? Один включает другой? Компилятор ругается? Хотите знать почему и что делать?)
"Преобразование" int, float, double к char* и обратно © zkv (незавершено)
Как создать проект: MS Visual Studio (незавершено)
Что такое компилятор или Этапы сборки программы... © bsa (незавершено)
Выбор IDE (незавершено)

Если у вас есть большой опыт работы на Си и/или С++, а так же возникло желание поделиться своими знаниями с новичками, то вам сюда.

Это сообщение отредактировал(а) bsa - 16.5.2011, 17:33
PM   Вверх
bsa
Дата 30.9.2009, 11:08 (ссылка) |   (голосов:12) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Многие изучающие языки Си и С++ почти везде используют постфиксную форму операторов ++ и -- (i++), особенно в цикле for(;;), объясняя это тем, что выполняться они должны после тела цикла. Но все не так, как кажется. На самом деле цикл for(;;) работает несколько иным образом. Возьмем некий условный цикл for(EXP1; EXP2; EXP3) EXP4; и перепишем его с помощью while:
Код
{
   EXP1;           //выполняем EXP1 до цикла
   while(EXP2) {  //пока EXP2 истинно (т.е. результат выражения не равен нулю)
      EXP4;       //выполняем EXP4 ("тело" цикла for),
      EXP3;       //а затем EXP3
   }
}
Таким образом выходит, что не важно ++i вы написали или i++, все равно оно будет выполнено после тела цикла for(;;).
Теперь рассмотрим, а чем собственно эти формы операторов отличаются на примере ++: по описанию обе формы оператора увеличат переменную на 1, а вот результат операции будет отличаться - старое значение переменной для постфиксной формы и новое для префиксной:
Код
int i = 1;
int x;
x = ++i; //результат: x = 2, i = 2
i = 1;
x = i++; //результат: x = 1, i = 2
Теперь попробуем реализовать обе формы операторов:
Код
int incPre(int &i)
{
   i = i + 1; //увеличиваем переменную на 1
   return i;   //возвращаем новое значение
}

int incPos(int &i)
{
   int r = i;  //сохраняем исходное значение
   i = i + 1; //увеличиваем переменную на 1
   return r;  //возвращаем старое значение
}
Как нетрудно заметить, в случае постфиксной формы количество операций больше.
В случае языка Си компилятор способен распознать неверное использование постфиксной формы и оптимизировать ее. А вот в С++ эти операторы могут применяться к сложные объектам (например, итераторам), которые уже компилятор оптимизировать не в силах.
Поэтому, всегда используйте префиксную (++i и --i) форму этих операторов, кроме тех случаев, когда нужна функциональность постфиксной, даже если применяете к объектам стандартных типов (char, short, int, long, long long) - тем самым набьете руку и уже там, где разница чувствительна, будете использовать нужную форму автоматически.

Это сообщение отредактировал(а) bsa - 12.10.2009, 11:09
PM   Вверх
bsa
Дата 2.2.2010, 01:00 (ссылка) |   (голосов:8) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Многие начинающие (и не очень) программисты под Windows (в первую очередь) сталкиваются с проблемой русского языка. В код программы записывается строка содержащая кириллицу, а готовая программа в результате выводит какие-то кракозябры. Причина этого кроется в том, что текстовый редактор работает в одной кодировке (cp1251 под Windows), а консоль в другой (IBM866 под Windows). Для решения этих проблем уже придуманы стандартные средства. В частности, функция setlocale() и wchar_t. Например, нужно вывести на экран строку "Привет мир!". Для этого обычно пишут на С:
Код
#include <stdio.h>

int main()
{
   printf("Привет мир!\n");
}
Или на C++:
Код
#include <iostream>

int main()
{
   std::cout << "Привет мир!" << std::endl;
}
Но в результате получаются иероглифы.
Чтобы на консоль поступали правильным образом подготовленные символы нужно указать программе, в какой кодировке работать надо. Для этого существует функция setlocale(). Документацию на нее легко можно найти в Интернет (функция стандартная), поэтому я только скажу, как ее нужно правильно вызывать. А именно: setlocale(LC_ALL, "") - установка текущих параметров локали пользователя. По началу можно подумать, что это все. На самом деле это не так! Предположим, что текущая локаль у пользователя английская, что будет тогда? Вместо кириллицы будут отображаться западно-европейские символы, а так же псевдографика. Поэтому следует использовать UNICODE.
Итак, программы будут выглядеть так:
Код
#include <stdio.h>
#include <locale.h> /* для setlocale() */

int main()
{
   setlocale(LC_ALL, "");
   printf("%S\n", L"Привет мир!"); //По стандарту C99 должно быть %ls, но MSVC не поддерживает стандарт
}
И на С++:
Код
#include <iostream>
#include <clocale> //для std::setlocale()

int main()
{
   std::setlocale(LC_ALL, "");
   std::wcout << L"Привет мир!" << std::endl;
}
Конечно, можно явно задать кодировку файла-исходника вторым параметром setlocale, что позволит отказаться от использования wchar_t. Но тут есть одна загвоздка. Некоторые разработчики ОС решили пойти своим путем, поэтому параметры различаются в зависимости от ОС. Например, в MS Windows необходимо указывать "russian_Russia.1251", а в *nix "ru_RU.CP1251".

Данный метод работает под Windows только при использовании компилятора Microsoft (возможно, в MSVS 6.0 он тоже не работает).
Чтобы он заработал при компиляции отличными от MS компиляторами, придется писать перекодировщики из cp1251 в 866 и обратно. Делается это функциями WinAPI: CharToOem() и OemToChar()
Пример на С++:
Код
#include <windows.h>
#include <string>
#include <vector>
#include <iostream>
#include <stdexcept>

namespace details {

template<class Func>
inline std::string converter(const std::string &text, Func func)
{
    std::vector<char> buffer(text.size() + 1);
    if ( !func(text.c_str(), &buffer[0]) )
        throw std::runtime_error("Invalid character");
    return std::string(buffer.begin(), buffer.end() - 1);
}

} //namespace details

std::string ansiFromOem(const std::string &text)
{
    return ::details::converter(text, &OemToCharA);
}

std::string oemFromAnsi(const std::string &text)
{
    return ::details::converter(text, &CharToOemA);
}

int main()
{
    std::cout << oemFromAnsi("Привет мир!\nВведите текст: ") << std::flush;
    std::string oemText, ansiText;
    std::getline(std::cin, oemText); //вводим строку, она в кодировке 866
    ansiText = ansiFromOem(oemText); //преобразуем ее в кодировку cp1251 для дальнейшей работы
    ansiText += " добавлен русский текст"; //что-то делаем
    std::cout << oemFromAnsi(ansiText) << std::endl; //преобразуем в 866 и выводим
    return 0;
}


Это сообщение отредактировал(а) bsa - 8.4.2010, 10:50
PM   Вверх
bsa
Дата 19.2.2010, 00:43 (ссылка) |   (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Новички использующие некоторые IDE (например, Dev-C++) под MS Windows часто сталкиваются с проблемой, когда при запуске программы появляется на мгновение черное окно и тут же исчезает, что не позволяет увидеть результат работы программы. Это связано с тем, что ОС автоматически закрывает окна завершивших свою работу приложений.
Чтобы задержать окно на экране необходимо сделать задержку. Наиболее простой и универсальный способ - ждать пока пользователь нажмет клавишу Enter. Делается это так:
На языке С:
Код
#include <stdio.h>

int main()
{
   getchar();  //ждем ввод
   return 0;
}
На языке С++:
Код
#include <iostream>

int main()
{
   std::cin.ignore(std::cin.gcount()).get(); //ждем ввод
   return 0;
}


Это сообщение отредактировал(а) bsa - 4.5.2011, 10:33
PM   Вверх
bsa
Дата 16.5.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



У новичков часто возникают с проблемы выбора IDE (интегрированной среды разработки). Одни из них сложные и навороченные, другие не работают "из коробки", а третьи отсутствуют под требуемую операционную систему.
Вот список бесплатных IDE, позволяющих создавать код на С/С++:
Dev-C++ - среда разработки под Windows, имеет удобную возможность установки дополнительных библиотек.
Qt Creator - кроссплатформенная IDE от создателей Qt. Быстрая и достаточно мощная. Qt SDK содержит и компилятор, и IDE.
Code::Blocks - легкая кроссплатформенная среда разработки.
Microsoft Visual Studio Express Edition - среда разработки под Windows и только.
Eclipse CDT - очень мощная кроссплатформенная IDE, написанная на Java (очень сильно тормозит на больших и сложных проектах)
NetBeans - мощная IDE, но имеющая некоторые проблемы с Windows (нужно дополнительно настраивать)
KDevelop - среда разработки для KDE (Linux)
Anjuta - среда разработки для Gnome (Linux)

Новичкам рекомендую Dev-C++, Code::Blocks или Qt Creator. Они требуют минимальных настроек, имеют маленькие дистрибутивы (установщик Qt SDK позволяет отключить компоненты, занимающие львиную долю места), существуют версии для всех популярных настольных систем.
PM   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1500 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.