Уроки по C++. Урок 0 (вводный).
Здравствуйте, уважаемые читатели. Сегодня я хочу познакомить вас с таким интересным и сложным языком, как C++. Это компилируемый язык, т.е. исполняется не сам текстовой файл с кодом, а
бинарный файл, созданный специальной программой -
компилятором. На самом деле, компиляция - сложный процесс и файл обрабатывается не одной программой, а несколькими, например линковщик(иногда его называют компоновщиком) включает или подключает в код программы код библиотек, подключаемых к вашему проекту. Подробнее про компиляцию можно почитать
здесь. Но мы начнём с самых элементарных программ. Рекомендую также прикупить книжку по программированию. Не стоит начинать со Страуструпа, если у Вас не семь пядей во лбу. Нудная и сложная книжка отобьёт всю охоту к программированию. Начните с книги Подбельского ВВ "Стандартный C++", если не знакомы с таким языком, как C. Знание C очень приветствуется в мире C++, поскольку C++ основан на C. Мне также нравится книга Герберта Шилдта C++: A Beginner's Guide. К сожалению в русском переводе последней есть некоторые неточности и опечатки, но разобраться можно.
Для начала установим необходимые программы и настроим их.
sudo apt-get install g++ geany geany-plugin*
Вместо g++ можно установить компилятор clang++
sudo apt-get install clang++
Иногда он пишет более понятно о причине ошибки, чем g++.
Настроим Geany для себя: настроим автодополнение, отступы и т.д., как Вам удобно, выберем шрифты (мне нравится моноширные шрифты Source Code Pro или Anonymous Pro), поставим необходимую тему редактора, к сообщению прилагаю архив с разными темами, распакуйте его в скрытом каталоге /home/user/.config/geany/colorschemes, вместо user поставьте имя своего пользователя. Потом выберите подходящую тему в Вид-Редактор-Цветовые схемы. Обязательно настройте отображение номеров строк.
Можно использовать и любой другой текстовой редактор с подсветкой синтаксиса. Но не стоит начинать с навороченных IDE.
К сожалению, язык C++ довольно сложен для изучения и работу некоторых вещей сразу понять не получится. Например до поры, до времени я не буду рассказывать про то, что такое
cout, но буду его использовать и т.д. Справочной книжкой я тоже не буду, так как рекомендую купить теорию. Уроки в первую очередь хочу посвятить практике.
По сложившейся традиции начнём с самой простой программы. Hello World:
PSВсе приведённые ниже коды будут хорошо работать в GNU Linux, но не в MSWindows из-за некоторых проблем Microsoft, например кодировке и работе их терминала. Изменения кода для MSWindows будут крайне не значительные.
/*hello.cpp
* Это моя первая программа, которая не делает ничего полезного, но выводит надпись Hello world!
* Каждую программу лучше всего начинать с комментария, для чего она служит. Звёздочка в начале этой строки не обязательна, просто для более красивого отображения кода. Это многострочный комментарий. Компилятор его игнорирует, он нужен именно Вам, а не компьютеру.
*/
#include <iostream>//Подключается заголовочный файл потоков ввода/вывода
int main ()//объявляется точка входа в программу
{//Открывается блок функции main
std::cout << "Hello world!" << std::endl;//Выводится текст Hello world! std::endl объявляет переход на новую строку.
return 0;//Так уж принято, что программа должна вернуть какое-либо целое цифровое значение операционной системе. 0 возвращают, если всё прошло успешно.
}//Закрывается блок функции main
В дальнейшем столь подробных разъяснений не будет, так как читайте книжку, там всё написано более правильно, чем я говорю.
Сохраните файл в каталог (папку) my_first_programm под именем hello.cpp. Перейдите в терминале в этот каталог командой cd. Если вы не знаете команд терминала, то срочно читайте
man man
На английском, так как без него программировать очень туго, особенно в Unix.
Считаю, что вы находитесь в каталоге с файлом hello.cpp, в терминале выполняете команду
g++ hello.cpp -o hello
Должен скомпилироваться бинарный файл hello (задан ключом -o hello)
Запустите его командой
./hello
Должно отобразиться сообщение Hello world!
Напишем теперь более полезную программу, считающую сумму двух целых чисел:
//summa.cpp
#include <iostream>
int main ()
{
int a, b;//Объявляем 2 переменные типа int, т.е. целые числа в диапазоне от -2147483648 до 2147483647
std::cout << "Введите 2 целых числа через пробел" << std::endl;
std::cin >> a >> b; //Считываем подряд две переменные a и b
std::cout << a << "+" << b << "=" << a+b << std::endl;//текст при выводе надо заключать в "", а переменные нет.
return 0;
}
И наконец напишем более сложную программу, с
условным оператором if
Его структура такова:
if(логическое выражение)
{
какие-то операторы,
}
else
{
какие-то операторы,
}Логическое выражение должно принимать численные значения. В бинарной логике - это 1 (ИСТИНА) и 0 (ЛОЖЬ), но C++ будет трактовать любое число, отличное от 0, как истину. Не путайте знак присваивания
a=7 со знаком равенства
a==7. Первое выражение даст истину, так как функция присваивания вернёт указатель на изменённый объект, т.е. на число 7.
Фигурные скобки после if или else не обязательны, т.е. если надо выполнить 1 оператор, но крайне желательны, чтоб вы не допустили ошибки.
Блок else не является обязательным. В случае, если логическое выражение вернёт истину, выполнятся только те операторы, которые заключены в блоке if, в противном случае те, что заключены в блоке else.
//numbers.cpp
#include <iostream>
int main()
{
float a;
std::cout << "Введите число\n";// символ \n является управляющим. Он переводит курсор на новую строку. Это пришло в C++ из языка C. Так тоже можно писать.
std::cin>>a;
if(a>0)//если a больше 0
{
std::cout<< a << ">" << 0<< std::endl;//0 - число, а не текст, его можно и не брать в кавычки
}
else
{
if(a!=0)//если a не равно 0
{
std::cout<< a << "<" << 0<< std::endl;
}
else
std::cout<< a <<" это "<< 0 << std::endl;//Так можно, так как у нас один оператор после else, но лучше так не делать.
}
return 0;
}
Домашнее задание:Написать 4 программы
1)Пользователь вводит с клавиатуры 2 целых числа, надо посчитать их разность.
2)Пользователь вводит с клавиатуры 3 целых числа a b и c. Найти значение x формулы x=2*a+4*b-9*c и вывести число x на экран.
3)Пользователь вводит с клавиатуры по вашему запросу a, b и c (могут быть дробными float) в квадратном уравнении (напомню формулу) a*x
2+b*x+c=0. Найти x и написать решение. Т.е. прямо как в тетрадке в школе писали, по всем правилам оформления. Для того, чтобы сделать доступной функцию получения корня, необходимо подключить заголовочный файл math.h. Функция называется sqrt, используется так: y=sqrt(x); (Y равен корень квадратный от X). x передаётся в функцию в качестве аргумента.
4)Пользователь вводит с клавиатуры 2 числа, расположить их в порядке возрастания и вывести на экран.
Для обсуждения есть соответствующая тема.
Пользователь решил продолжить мысль 27 Моктября 2013, 20:05:38:
Уроки по C++. Урок 1. Циклы.
Очень печально, что я не увидел ни одного решённого домашнего задания, надеюсь потому, что прошло слишком мало времени. Практика в программировании - самое важное. Не стесняйтесь писать свои решения, даже если они некрасивы.
Прошлый урок закончился на разборе условного оператора if. добавлю некоторые пояснения к вводному уроку:
Каждый оператор в c++ заканчивается
;Регистр в C++ имеет значение, т.е. большие и маленькие буквы отличаются.
Объясню чуть-чуть поподробнее про std::cout<< и std::cin>>.
std - это пространство имён стандартной библиотеки языка C++
:: - оператор разрешения области видимости.
Для того, чтобы не писать каждый раз
std::можно в начале программы, после включения заголовочных файлов, но перед точкой входа написать такую строку:
using namespace std;
Она скажет компилятору, что всегда, если не указано иное необходимо пытаться использовать пространство имён std;
cout -
объект (что это такое расскажу намного позже), а именно
класс (с ними познакомимся позже), который производит вывод на экран и обеспечивает работу потока вывода.
cin - объект, а именно класс, который производит ввод с клавиатуры и обеспечивает работу потока ввода.
<< -
перегруженный оператор бинарного сдвига влево (про перегрузку объясню позже), в данном случае он трактуется не как оператор бинарного сдвига, а как знак операции, указывающей направление передачи данных в поток вывода.
>> - перегруженный оператор бинарного сдвига вправо, в данном случае он трактуется не как оператор бинарного сдвига, а как знак операции, указывающей направление передачи данных из потока ввода в переменную. Передача данных в поток, как в первом, так и во втором случае осуществляется посимвольно.
Начнём новую тему, без которой нельзя программировать на C++:
ЦИКЛЫ.
Иногда, некоторые действия необходимо выполнять последовательно, одно за другим, это мы уже умеем. Мы даже научились ветвить действия, используя оператор
if. Но представим себе, что какие-то операторы должны выполниться 100 раз или 1000 раз или в худшем случае n раз, где n узнаётся лишь в ходе выполнения программы, например, нам дана простая задача: вывести на экран все цифры от 5, до n, где n вводит пользователь. Как же нам поступить в этом случае? На помощь придёт цикл
for. Он используется тогда, когда нам точно известно (или мы можем легко узнать), сколько раз надо выполнять то или иное действие. Рассмотрим пример:
//Пример 4
#include <iostream>
using namespace std;//Тут я включаю пространство имён по умолчанию. В дальнейшем употреблять это буду редко, так как полезно запомнить, к какому пространству имён относятся те или иные, часто употребляемые объекты.
int main ()
{
int n;
cout << "Введите n!" << endl;
cin >> n;
for(int i=5; i<=n; i++)//тут объявляется цикл for. В нём объявляется переменная i и ей присваивается начальное значение 5, второй оператор, отделённый ; показывает при каком условии надо выполнять тело цикла, третий меняет значение i, чтоб цикл не выполнялся вечно. В данном случае увеличивает через операцию инкремента значение i на 1
{
cout << i << endl;
}
return 0;
}
Всё понятно?
Перейдём к следующему примеру:
Иногда, необходимо выполнять действия до получения какого-либо результата, не зная заранее, через сколько циклов будет этот самый результат. Тогда нам поможет цикл
while Рассмотрим следующую программу, которая будет просить у пользователя ввода правильного ответа на вопрос:
//пример 5
#include <iostream>
int main ()
{
int n;
std::cout << "Введите результат выражения 7*8" << std::endl;
std::cin >> n;
while(n!=56)//Вот и объявление цикла. Он будет выполняться до тех пор, пока выражение в скобках истинно. Не забудьте изменять его в теле цикла, чтоб не получит вечный цикл и зависание компьютера.
{
std::cout << "Учите таблицу умножения!" << std::endl;
std::cout << "Попробуйте снова!" << std::endl;
std::cin >> n;
}
std::cout << "Вы справились!"<< std::endl;
return 0;
}
Иногда, бывает необходимо, чтобы тело цикла выполнилось хотя бы 1 раз. Тогда используют цикл do while;
Рассмотрим пример:
//пример 6
#include <iostream>
int main ()
{
int n;
do
{
std::cout << "Введите результат выражения 7*8" << std::endl;
std::cin >> n;
if(n!=56)
{
std::cout << "Учите таблицу умножения!" << std::endl;
}
}
while(n!=56)//Блок do выполнится хотя бы 1 раз, независимо от условия.
std::cout<<"Вы справились!"<<std::endl;
return 0;
}
СЛОЖНЫЕ УСЛОВИЯ.
Иногда бывает так, что необходимо проверить сразу несколько условий. Для этого используют операторы логическое
И и логическое
ИЛИ.
И -
&&ИЛИ -
||Например:
//пример 7
#include <iostream>
int main()
{
int a, b;
std::cout << "Введите a и b:" << std::endl;
std::cin >> a >> b;
if(a>0 && b>0)
{
std::cout << "И " << a << " и " << b << " > 0" << std::endl;
}
if(a>0 || b>0)
{
std::cout << "Или " << a << " или " << b << " > 0" << std::endl;
}
return 0;
}
НЕКОТОРЫЕ ОПЕРАЦИИ.
В домашнем задании я дал задачки посложнее и Вам потребуется знать о некоторых операциях.
Это получение остатка при делении целых -
%и больше или равно -
>= и меньше или равно -
<=.
PSПри делении целого числа на целое и присвоении переменной типа int этого значения ей присвоится то значение, которое было бы, если остаток отбросить, т.е. программа
//пример 8
#include <iostream>
int main()
{
int i=5, b=3, c=i/b;
std::cout << c << std::endl;
return 0;
}
Выведет не 2, как мы бы округляли 1,(6), а 1.
Домашнее задание:- Написать программу для вывода всех целых чисел в диапазоне от n до m, где m и n вводит пользователь
- Написать программу, выводящую все простые числа до m, вводимого пользователем, использовать для этого решето Эратосфена.
- Написать программу для вывода всех чётных чисел от 0, до N, вводимого пользователем.
- Написать программу для вывода всех чисел, которые делятся на 4 или на 9, от 0, до N, вводимого пользователем.
- Написать программу для вывода всех чисел, которые делятся и на 4 и на 9, от 0, до N, вводимого пользователем.
- Написать программу, которая считает сумму всех целых цифр в диапазоне от n до m, где m и n вводит пользователь
Замечания и примечания:- Полезно называть переменные осмысленно, иначе ваш код превратится в кашу.
- Используйте верблюжьюНотацию или нотацию_через_подчёркивание, для записи названий переменных и функций
- Не называйте переменные с большой буквы
- Имя переменной не должно начинаться с цифры.
- Комментируйте свои программы. Каждая функция и сложный блок должны быть прокомментированы, для чего они.
- Не забывайте комментарий в начале программы
- Читайте книги по программированию
- Когда используете сложные выражения, так, что их порядок выглядит для вас сложным, разделяйте логические части скобками
Для обсуждения есть соответствующая тема.