]]> ]]>
Править | Обсудить | История

C++

Русское название:
Cи++
Дата создания:
1983
Создан под влиянием:
Повлиял на:
Парадигма:
Типизация:
Принятые расширения файлов:
.cpp .c++ .cc .h .hpp
Диалекты:
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Си++ (англ. C++) — компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.

Разработка языка началась в 1979 году. Целью создания C++ было дополнение C возможностями, удобными для масштабной разработки ПО, с сохранением гибкости, скорости и портабельности C. Вместе с тем создатели C++ стремились сохранить совместимость с C: синтаксис первого основан на синтаксисе последнего, и большинство программ на C будут работать и как C++. Изначально новый язык назывался “C с классами”, но затем имя было изменено на C++ — это должно было подчеркнуть как его происходжение от C, так и его превосходство над последним.

Первый выпуск C++ для коммерческого использования состоялся в 1985 году, вместе с публикацией книги “The C++ Programming Language”, которая на долгое время стала его неофициальным стандартом. В 1989 году вышла вторая версия языка в сопровождении книги “The Annotated C++ Reference Manual”.

В 1990-х годах язык стал одним из наиболее широко используемых языков программирования общего назначения. Первым официальным стандартом языка стал ISO/IEC 14882:1998, более известный как C++98. В 2003 году была принята его дополненная версия, C++03, а в 2005 году был опубликован “Library Technical Report 1” (сокращенно TR1) — документ, описывающий расширения стандартной библиотеки. TR1 не является стандартом, но большинство актуальных компиляторов C++ поддерживает его. Наконец, в 2011 году был принят текущий стандарт, C++11.

Нововведениями C++ в сравнении с C являются:

  • поддержка объектно-ориентированного программирования через классы. C++ предоставляет все четыре возможности ООП — абстракцию, инкапсуляцию, наследование (в том числе и множественное) и полиморфизм.
  • поддержка обобщённого программирования через шаблоны функций и классов;
  • стандартная библиотека C++ состоит из стандартной библиотеки C (с некоторыми модификациями) и библиотеки шаблонов (Standard Template Library, STL), которая предоставляет обширный набор обобщенных контейнеров и алгоритмов;
  • дополнительные типы данных;
  • обработка исключений;
  • виртуальные функции;
  • пространства имён;
  • встраиваемые (inline) функции;
  • перегрузка (overloading) операторов;
  • перегрузка имён функций;
  • ссылки и операторы управления свободно распределяемой памятью.

Элементы синтаксиса:

Комментарий до конца строки //
Комментарии, которые не могут быть вложенными /* ... */
Регистрозависимость да
Регулярное выражение идентификатора переменной [_a-zA-Z][_a-zA-Z0-9]*
Регулярное выражение идентификатора функции [_a-zA-Z][_a-zA-Z0-9]*
Присваивание значения переменной varname = value
Объявление переменной type varname
Объявление переменной с присваиванием значения type varname = value
Группировка выражений ( ... )
Блок { ... }
Равенство a == b
Неравенство a != b
Тождественное равенство *a == *b (a и b - указатели)
Тождественное неравенство *a != *b (a и b - указатели)
Сравнение < > <= >=
Определение функции returntype functionName (argtype1 argname1, ..., argtypeN argnameN)
Вызов функции functionName(arg1, ..., argN)
Вызов функции без параметров functionName()
Последовательность ;
Если - то if (condition) trueBlock
Если - то - иначе if (condition) trueBlock else falseBlock
Бесконечный цикл while (true) loopBody
Цикл с предусловием while (condition) loopBody
Цикл с постусловием do loopBody while (!condition)
Цикл for - next для диапазона целых чисел с инкрементом на 1 for (int i = first; i <= last ; i++)
Цикл for - next для диапазона целых чисел с декрементом на 1 for (int i = last; i >= first; i--)

Примеры:

Факториал:

Пример для версий Borland C++ Builder 6, g++ 4.x

Используется рекурсивное определение факториала.

#include <iostream>

unsigned long long factorial(unsigned long long n)
{
	if (n == 0) 
		return 1;
	else 
		return n * factorial (n - 1);
}

int main(void)
{
    for (int n = 0; n <= 16; n++) 
        std::cout << n << "! = " << factorial(n) << std::endl;
    return 0;
}

Hello, World!:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5, g++ 4.x
#include <iostream>

int main(void)
{
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

Числа Фибоначчи:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5
#include <iostream>

int fibonacci(int n)
{
    return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
}

int main(void)
{
    for (int n=1; n<=16; n++)
        std::cout << fibonacci(n) << ", ";
    std::cout << "..." << std::endl;
    return 0;
}

Факториал:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5

Используется рекурсивное определение факториала. Реализация отличается от альтернативной использованием типа __int64 вместо unsigned long long и функции вывода на печать printf вместо std::cout <<.

#include "stdio.h"

__int64 factorial(__int64 n)
{
	return (n==0 ? 1 : n*factorial(n-1));
}

int main(int argc, char* argv[])
{
	for (int n=0; n<=16; n++)
		printf("%d! = %I64d\n",n,factorial(n));
	return 0;
}

Квадратное уравнение:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), g++ 3.4.5

В этом примере используется класс complex<>, входящий в состав библиотеки STL. Все вычисления выполняются в комплексных числах, т.к. это позволяет не беспокоиться о знаке дискриминанта и различных представлениях корней для действительного и комплексного случаев.

Оператор >> класса complex<> перегружен так, что он распознает несколько форматов вводимых чисел, в т.ч. и числа без мнимой части, так что константы A, B и C читаются не как целые числа, а сразу как комплексные. Такая реализация позволяет расширить область применения примера до уравнений с дробными и даже комплексными коэффициентами.

Оператор << класса complex<> также перегружен и выводит любое комплексное число x как (x.real(),x.imag()), поэтому для вывода корней без мнимой части как обычных дробных чисел используется функция print.

#include <iostream>
#include <complex>
#include <math>

using namespace std;

void print(int ind, complex<double> x)
{   cout << "x" << ind << " = ";
    if (fabs(x.imag()) < 1E-6)
        cout << x.real() << endl;
    else cout << x << endl;
}

void main()
{   complex<double> A, B, C, D, x1, x2;
    cout << "A = ";
    cin >> A;
    if (abs(A)<1E-3)
    {   cout << "Not a quadratic equation." << endl;
        return;
    }
    cout << "B = ";
    cin >> B;
    cout << "C = ";
    cin >> C;

    A *= 2;
    D = B*B-A*C*2.0;
    if (abs(D)<1E-3)
        cout << "x = " << (-B/A).real();
    else
    {   print(1, (-B+sqrt(D))/A);
        print(2, (-B-sqrt(D))/A);
    }
}

Hello, World!:

Пример для версий Borland C++ Builder 6, TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)
#include <stdio.h>

int main()
{
    printf("Hello, World!\n");
    return 0;
}

Квадратное уравнение:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)

Этот пример работает на C и C++, а также на Objective-C, являющемся строгим надмножеством языка C. В случае C может понадобиться компилировать программу с опцией -lm, чтобы подключить библиотеку математики.

#include <math.h> 
#include <stdio.h>

int main()
{
  int A, B, C, D;
  printf("A = ");
  scanf("%d", &A);
  if (A == 0) {
    printf("Not a quadratic equation.\n");
    return 0;
  }
  
  printf("B = ");
  scanf("%d", &B);
  printf("C = ");
  scanf("%d", &C);

  D = B * B - 4 * A * C;
  if (D == 0) {
    printf("x = %f\n", -B / 2.0 / A);
    return 0;
  }
  
  if (D > 0) {
    printf("x1 = %f\nx2 = %f\n",
           (-B + sqrt(D)) / 2.0 / A, (-B - sqrt(D))/ 2.0 / A);
  } else {
    printf("x1 = (%f, %f)\nx2 = (%f, %f)\n",
           -B / 2.0 / A, sqrt(-D) / 2.0 / A, -B / 2.0 / A, -sqrt(-D) / 2.0 /A);
  }
  return 0;
}

CamelCase:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), g++ 4.x

Эта программа обрабатывает введенную строку посимвольно. Функция getline считывает из потока ввода, заданного первым аргументом, строку (не до пробела, а до конца строки) и записывает ее во второй аргумент. Стандартная функция tolower работает только с одиночными символами, поэтому для преобразования в нижний регистр строки целиком используется функция transform, которая применяет заданную функцию ко всем элементам вектора (а в STL строка — это вектор символов). Затем для каждого символа строки проверяется, является ли он символом алфавита (функция isalpha), и в зависимости от результата он либо дописывается в конец результирующей строки (в верхнем регистре, если перед ним был не-алфавитный символ), либо устанавливает признак “последний символ был пробелом”. Функция isalpha работает с символами любого регистра, поэтому перевод в нижний регистр можно было делать не отдельным действием над всей строкой, а при присоединении каждого отдельного символа.

#include <string> 
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    string text, cc="";
    bool lastSpace = true;
    getline(cin, text);
    transform(text.begin(), text.end(), text.begin(), (int (*)(int))tolower);
    for (int i=0; i<text.size(); i++)
        if (isalpha(text[i])) {
            if (lastSpace)
                cc += toupper(text[i]);
            else
                cc += text[i];
            lastSpace = false;
        }
        else {
            lastSpace = true;        
        }
    cout << cc << endl;
    return 0;
}

Числа Фибоначчи:

Пример для версий g++ 4.x

Используется итеративное вычисление чисел Фибоначчи; вычисленные значения сохраняются в массиве.

#include <iostream>
#include <vector>

using std::cout;
using std::vector;

int main() {
  vector<int> fib(17);
  fib[0] = 0;
  fib[1] = 1;
  for (int i = 2; i < 17; ++i) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  for (int i = 1; i < 17; ++i) {
    cout << fib[i] << ", ";
  }
  cout << "...\n";
}

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам