Программа которая печатает саму себя



Это интересная вещь для общего развития, ниже представляю весь код:

#include <iostream>

using namespace std; string s = "\";\nvoid r(string &s, char c, string str)\n{\n size_t p = 0;\n while ((p = s.find(c, p)) != string::npos)\n { s = s.substr(0, p) + str + s.substr(p + 1); p += str.size(); }\n}\nint main()\n{\n string z = s;\n r(z, '\\\\', \"\\\\\\\\\"); r(z, '\\n', \"\\\\n\"); r(z, '\"', \"\\\\\\\"\");\n cout << \"#include <iostream>\\nusing namespace std; string s = \\\"\" << z << s;\n}\n";

void r(string &s, char c, string str)

{

size_t p = 0;

while ((p = s.find(c, p)) != string::npos)

{ s = s.substr(0, p) + str + s.substr(p + 1); p += str.size(); }

}

int main()

{

string z = s;

r(z, '\\', "\\\\"); r(z, '\n', "\\n"); r(z, '"', "\\\"");

cout << "#include <iostream>\nusing namespace std; string s = \"" << z << s;

}

 

Интерпретатор арифметических выражений

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

Ещё раз, суть программы: я ввожу что-то вроде 7-2, а программа выводит 5. И всё в таком духе.

Ниже рабочий код простейшей такой программы:

#include <iostream>

using namespace std;

// получение числа из вводимых символов

float number() {

int res= 0;

for (;;) {

char c= cin.get();

if (c >= '0' && c <= '9') res = res * 10 + c - '0';

else { cin.putback(c); return res; }

}

}

float expr(); // прототип для видимости в последующих функциях (он тут необходим)

// обработка скобок

float skobki() {

char c = cin.get();

if (c == '(') { float x = expr(); cin.get(); return x; }

else { cin.putback(c); return number(); }

}

// обработка умножения и деления

float factor() {

float x = skobki();

for (;;) {

char c = cin.get();

switch (c) {

case '*':

x *= skobki();

break;

case '/':

x /= skobki();

break;

default:

cin.putback(c);

return x;

}

}

}

// обработка выражения в общем (главная собирательная функция)

float expr() {

float x = factor();

for (;;) {

char c = cin.get();

switch (c) {

case '+':

x += factor();

break;

case '-':

x -= factor();

break;

default:

cin.putback(c);

return x;

}

}

}

// главная функция

int main() {

           setlocale(0,"");

           cout << "Введите выражение: ";

           float res = expr();

           cout << "Результат: " << res << endl;

           system("pause");

}

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

1. Бесконечный цикл можно делать и через цикл for таким образом: for(;;) {}

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

2. Сравнение символов. Оно идёт как по таблице ASCII. Т.е. если номер символа x в таблице больше номера символа y, то символ x больше символа y. Так мы тоже можем делать.

3. Получение символа из вводимого потока в консоли: char c= cin.get(); По сути это аналогично char c; cin>>c; Но мы вводим много символов сразу, поэтому нам нужно обрабатывать каждый и приходится использовать такую вот новую конструкцию.

4. Выражение: res = res * 10 + c - '0'; Здесь мы добавляем новую цифру вправо. Т.е. умножить на 10 и прибавить саму цифру (с - '0'), например: 4 -> 4*10+9= 49 -> 49*10+5= 495 и так далее.

5. Метод cin.putback(c); когда символ не соответствует нашим ожиданиям, мы перестаём его и все последующие обрабатывать, т.е. возвращаем обратно в поток. По сути это аналогично break, как выход из цикла обработки символов.

Остальные кодовые слова должны быть понятны, остаётся только внимательно прочитать код и разобрать что происходит. Здесь, можно заметить, используется рекурсивный вызов функций друг из друга, поэтому в начале нам и потребовался прототип.

________________________________________________

РАЗДЕЛ 6

КОРОТКО О ДРУГИХ ЯЗЫКАХ И ТЕХНОЛОГИЯХ ПРОГРАММИРОВАНИЯ

 

Какие бывают языки программирования

Рассмотрев основные вещи в с++ для любителя, мы можем теперь копнуть шире и больше- а какие ещё другие языки программирования бывают? Чем они отличаются, как классифицируются, на что делятся?

По данным интернета, на текущий момент существует около 8 тыс различных языков программирования. Но наиболее распространённых из них 10-20. Например из тех, которые у всех на слуху: ассемблер (asm), С, С++, С#, Java, Objective C, Swift, Python, Ruby, Pascal, а также чисто веб языки: php, javascript.

Можно представить такую шкалу низкоуровневости-высокоуровневости, на которую мы условно расположим языки программирования. Чем более низкоуровневый язык, тем ближе он к машинному коду и поэтому быстрее работает, но тем сложнее он для человека и дольше для разработки. Поэтому часто нужно выбирать компромисс между скоростью разработки и скоростью работы программы. Для разных задач используются разные языки. Если принципиальна скорость работы программы, например в сложных играх, то пишут на низкоуровневых языках уровня с++/с. Или берут чуть более высокоуровневые, но тоже достаточно быстрые и поворотливые языки такие как c# и java. Естественно, сначала пишут движки- программные шаблоны и интерфейсы, упрощающие написание больших проектов и командное программирование. Есть также общие популярные крупные движки, например для игр это Unity3d и Unreal Engine.

Если нужна скорость работы как можно больше без компромиссов, то используют языки ассемблера- это самые быстрые языки программирования и самые низкоуровневые, но при этом они очень сложные и идёт работа напрямую с компьютерным железом. На таких языках также нужно много писать, т.е. скорость разработки маленькая. Ассемблер используют для написания различных драйверов, вирусов, утилит и прочих фундаментальных программных структур. Для операционных систем часто используются более высокоуровные языки, чем ассемлер- на ступеньку выше- язык си. Например, операционная система Linux.

Высокоуровневые языки используют там, где принципиальна скорость написания программ, а скорость работы этих программ необязательно должна быть слишком большой. Часто это используется в веб-программировании или разработке искусственного интеллекта. Такие высокоуровневые языки имеют динамическую типизацию- т.е. при объявлении переменной не надо указывать её тип. Также все массивы динамические и работать с ними в разы проще чем в языках со статической типизацией типа си плюс плюс.

Языки можно расставить по низко и высокоуровневости, начиная с самых низкоуровневых, примерно так:

1. Ассемблер- драйвера, утилиты, глубокая работа с железом.

2. С/С++ операционные системы, игры, важные программные модули, тоже есть работа с железом (хоть и меньше чем на ассемблере), компьютерные программы- достаточно фундаментальные такие языки.

3. C# / java / Objective C - тоже игры, приложения для телефона, специальных операционных систем. Работа с железом блокируется, операции более высокоуровневые. Первое больше для виндовс, второе для андроид, третье для apple.

4. Python / Ruby - динамическая типизация, веб разработка. Важна скорость написания программ, пусть даже жертвуя скоростью работы самих программ.

Также языки программирования бывают объектно-ориентированные и без этого. Языки без ООП обычно более старые и появились в то время когда ООП ещё не изобрели. Например, язык си не имеет ООП. Для добавления ООП к паскалю используется дельфи (Delfi). Язык java, например, наоборот- заточен чисто под ООП. Но это позже увидим при кратком рассмотрении джавы.

Также языки бывают кроссплатформенные или личные для каких-то платформ. Например, джава кроссплатформенная. Язык С# создавала компания майкрософт специально для виндовс, Objective C- создавала Apple для iOS. Но даже если язык не кроссплатформенный, придумывают всякие прибомбасы, благодаря которым его можно адаптировать и на несвойственные для него платформы.

Также разделяют языки для веб (сетевой) разработки и для обычных компьютерных или телефонных приложений. К вебу относят php, ruby, javascript и другие. Кстати, джаваскрипт не имеет ничего почти общего с джавой, его название было выбрано чисто из коммерческих и маркетинговых соображений.

Не стоит также путать языки программирования с языками разметки. Языки разметки нужны для работы с текстами и объектами- поставить в нужное место, поменять шрифт, выбрать курсив или жирный, гиперссылки и прочее. Вот некоторые языки разметки: html, xml, вики разметка. Первое используется для создания и просмотра страниц в интернете (гипертекстовая разметка), второе ты можешь видеть в MS Excel, но при этом это также используется в приложениях на андроид. Третье- используется в статьях в википедии и также для оформления групп вконтакте.

Есть также другие вещи, которые часто относят к языкам программирования, но это не то. Например css- каскадная таблица стилей. Используется для дизайна html-страниц: всякие рамочки, блоки и прочие украшающие сухой текст вещи. И ещё sql- это язык работы с базами данных.

 


Дата добавления: 2018-09-22; просмотров: 219; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!