Программа которая печатает саму себя
Это интересная вещь для общего развития, ниже представляю весь код:
#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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!