Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Уроки по C++[Обновлено, добавлен урок 1]  (Прочитано 38592 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Уроки по 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 будут крайне не значительные.
Код: (cpp) [Выделить]
/*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!

Напишем теперь более полезную программу, считающую сумму двух целых чисел:

Код: (cpp) [Выделить]
//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.

Код: (cpp) [Выделить]
//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*x2+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::
можно в начале программы, после включения заголовочных файлов, но перед точкой входа написать такую строку:
Код: (cpp) [Выделить]
using namespace std;Она скажет компилятору, что всегда, если не указано иное необходимо пытаться использовать пространство имён std;
cout - объект (что это такое расскажу намного позже), а именно класс (с ними познакомимся позже), который производит вывод на экран и обеспечивает работу потока вывода.
cin - объект, а именно класс, который производит ввод с клавиатуры и обеспечивает работу потока ввода.
<< - перегруженный оператор бинарного сдвига влево (про перегрузку объясню позже), в данном случае он трактуется не как оператор бинарного сдвига, а как знак операции, указывающей направление передачи данных в поток вывода.
>> - перегруженный оператор бинарного сдвига вправо, в данном случае он трактуется не как оператор бинарного сдвига, а как знак операции, указывающей направление передачи данных из потока ввода в переменную. Передача данных в поток, как в первом, так и во втором случае осуществляется посимвольно.

Начнём новую тему, без которой нельзя программировать на C++:
ЦИКЛЫ.
Иногда, некоторые действия необходимо выполнять последовательно, одно за другим, это мы уже умеем. Мы даже научились ветвить действия, используя оператор if. Но представим себе, что какие-то операторы должны выполниться 100 раз или 1000 раз или в худшем случае n раз, где n узнаётся лишь в ходе выполнения программы, например, нам дана простая задача: вывести на экран все цифры от 5, до n, где n вводит пользователь.  Как же нам поступить в этом случае? На помощь придёт цикл for. Он используется тогда, когда нам точно известно (или мы можем легко узнать), сколько раз надо выполнять то или иное действие. Рассмотрим пример:
Код: (cpp) [Выделить]
//Пример 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 Рассмотрим следующую программу, которая будет просить у пользователя ввода правильного ответа на вопрос:
Код: (cpp) [Выделить]
//пример 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;
Рассмотрим пример:
Код: (cpp) [Выделить]
//пример 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;
}

СЛОЖНЫЕ УСЛОВИЯ.
Иногда бывает так, что необходимо проверить сразу несколько условий. Для этого используют операторы логическое И и логическое ИЛИ.
И - &&
ИЛИ - ||
Например:
Код: (cpp) [Выделить]
//пример 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 этого значения ей присвоится то значение, которое было бы, если остаток отбросить, т.е. программа
Код: (cpp) [Выделить]
//пример 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 вводит пользователь

Замечания и примечания:
  • Полезно называть переменные осмысленно, иначе ваш код превратится в кашу.
  • Используйте верблюжьюНотацию или нотацию_через_подчёркивание, для записи названий переменных и функций
  • Не называйте переменные с большой буквы
  • Имя переменной не должно начинаться с цифры.
  • Комментируйте свои программы. Каждая функция и сложный блок должны быть прокомментированы, для чего они.
  • Не забывайте комментарий в начале программы
  • Читайте книги по программированию
  • Когда используете сложные выражения, так, что их порядок выглядит для вас сложным, разделяйте логические части скобками
Для обсуждения есть соответствующая тема.
« Последнее редактирование: 28 Октября 2013, 21:25:50 от peregrine »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #1 : 11 Августа 2015, 21:15:49 »
Здесь вот дама создала сайт основы программирования на с++, для совершенно начинающих, с нуля...

С одной стороны - этим можно тоже воспользоваться для начального знакомства.
С другой стороны - подбросьте ей задач и статей, если у кого есть что сказать.

Оффлайн ИзБывших

  • Участник
  • *
  • Сообщений: 160
    • Просмотр профиля
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #2 : 05 Сентября 2015, 00:39:16 »
ИМХО для начинающих есть классический учебник Кернигана и Ричи. стоило бы начать с него.

Оффлайн mickhud

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #3 : 08 Сентября 2015, 17:44:56 »
Здесь вот дама создала сайт

Так ведь там в VisualStudio, где на линя вы найдёте?

Оффлайн drfels

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #4 : 08 Января 2016, 14:25:17 »
Уроки хорошо расписаны, но я всё же предпочитаю книги :) Сейчас я как раз такой "начинающий", но читаю С. Прату.

Axa-Ru

  • Гость
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #5 : 08 Января 2016, 14:39:24 »
peregrine,
Очень правильно и круто.
Во первых это здесь.
Во вторых тут все свои. Спросить не зазорно, удобно.
В третьих, написано хорошо.

Всецело поддерживаю.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Уроки по C++[Обновлено, добавлен урок 1]
« Ответ #6 : 20 Февраля 2016, 14:05:11 »
make и nano для работы удобнее.

начало редактор MakeFile.
RUN = test1 test2
RUN1 = test1
DESTDIR=/

LOG = -DLOG

INSTALL_LOCATION=$(DESTDIR)/usr/

LIBS=
# LIBS= `sdl-config --libs`

CFLAGS=
# CFLAGS= `sdl-config --cflags`

N = test3 test4

O = $(addsuffix .o, $(N))
C = $(addsuffix .cpp, ${N})
CXX = g++

all: ${RUN}
# avconv:
# ./install-1.sh
install: test_install

test_install:
mkdir -p $(INSTALL_LOCATION)/share/${RUN1}
cp -v arial.ttf $(INSTALL_LOCATION)/share/${RUN1}
mkdir -p $(INSTALL_LOCATION)/bin
cp -v ${RUN1} $(INSTALL_LOCATION)/bin/${RUN1}

uninstall: test_uninstall
test_uninstall:
rm -rf $(INSTALL_LOCATION)/share/${RUN1}
rm -f $(INSTALL_LOCATION)/bin/${RUN1}

${RUN}: $(addsuffix .o,${RUN} ${N})
@${CXX} -o $@ $@.o ${O} ${LIBS}

.cpp.o:
@${CXX} -c $< ${CFLAGS} ${LOG}

clean:
rm -f $(addsuffix .o,${RUN} ${N}) ${RUN}


<Tab> обятельно, а не пробелов.

test1 и test2 это выполнить два програмы.

test1.h
#include <stdio.h>

void test3 ();
void test4 ();

test1.cpp
#include "test1.h"


int main ()
{
test3();
test4();
#ifdef LOG
printf ("Hello 1\n");
#endif
return 0;
}

test2.cpp
#include "test1.h"


int main ()
{
test3();
test4();
#ifdef LOG
printf ("Hello 2\n");
#endif
return 0;
}
===============

test3 и test4 это на функция.

test3.cpp
#include "test1.h"


void test3 ()
{
#ifdef LOG
printf ("Hello 3\n");
#endif
return;
}


test4.cpp
#include "test1.h"


void test4 ()
{
#ifdef LOG
printf ("Hello 4\n");
#endif
return;
}
всё, выполнить make.
===============

1:L~/c++/test$ ./test1
Hello 3
Hello 4
Hello 1
1:L~/c++/test$ ./test2
Hello 3
Hello 4
Hello 2
1:L~/c++/test$
:)
Wars ~.o

 

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