я наткнулся на программу, которая печатает сама на этой сайт, т. е. он печатает код программы.
#include char *program = «#include %cchar *program = %c%s%c;%cint main()%c<%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c>%c»; //what is this line doing, what is the use of %c and %s and what properties of %c and %s are being used here? int main() < printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); //what is this print function doing, and how? return 0; >
и данное объяснение:
два ключевых трюка здесь используют строку со встроенным %s спецификатор, позволяющий строке содержать себя при печати, и используйте спецификатор формата %c для печати специальных символов как newlines, которые не могли иначе быть встроенный в вывод строка.
Я не понял, как работает программа. Я упомянул строки, которые мне нужно объяснить, как они работают и что они делают. Пожалуйста объяснить.
автор: Puppy
4 ответов
char *program = «#include %cchar *program = %c%s%c;%cint main()%c<%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c>%c»;
существует имя указателя char «program», которое используется для хранения строки, а %c и %s являются спецификаторами формата для Аргументов char и string соответственно.
ИИ научили писать код | Copilot от GitHub и OpenAI
printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);
функция printf печатает выход к консоли, 10 здесь код ASCII для NEWLINE и 34 для » параметры printf делают
- программа, передавая строку для печати
- 10, передавая код 10 ASCII для первого %c (будет преобразован в символ новой строки)
- программу , передав строку снова на %S В программа для печати же строку
- 34, передавая код 34 ASCII для второго %c (будет преобразован в двойные qoutes символов)
- 10, передавая код 10 ASCII для 3rd %c (будет преобразован в символ новой строки)
- 10, передавая код 10 ASCII для 4 %c (будет преобразован в символ новой строки)
- 10, передавая код 10 ASCII для 5 %c (будет преобразован в символ новой строки)
- 10, передавая код 10 ASCII для 6 %c (будет преобразован в символ новой строки)
- 10, передавая код 10 ASCII для 7 %c (будет преобразован в символ новой строки)
- 10, передавая код 10 ASCII для 8 %c (будет преобразован в символ новой строки)
автор: ammar26
По сути мы можем пропускать какие-то элементы, необязательно писать все 3. Но разделительные точки с запятой должны стоять обязательно.
2. Сравнение символов. Оно идёт как по таблице ASCII. Т.е. если номер символа x в таблице больше номера символа y, то символ x больше символа y. Так мы тоже можем делать.
3. Получение символа из вводимого потока в консоли: char c= cin.get(); По сути это аналогично char c; cin>>c; Но мы вводим много символов сразу, поэтому нам нужно обрабатывать каждый и приходится использовать такую вот новую конструкцию.
Как стать хакером за 10 секунд?!
4. Выражение: res = res * 10 + c — ‘0’; Здесь мы добавляем новую цифру вправо. Т.е. умножить на 10 и прибавить саму цифру (с — ‘0’), например: 4 -> 4*10+9= 49 -> 49*10+5= 495 и так далее.
5. Метод cin.putback(c); когда символ не соответствует нашим ожиданиям, мы перестаём его и все последующие обрабатывать, т.е. возвращаем обратно в поток. По сути это аналогично break, как выход из цикла обработки символов.
Остальные кодовые слова должны быть понятны, остаётся только внимательно прочитать код и разобрать что происходит. Здесь, можно заметить, используется рекурсивный вызов функций друг из друга, поэтому в начале нам и потребовался прототип.
РАЗДЕЛ 7
КОРОТКО О ДРУГИХ ЯЗЫКАХ И ТЕХНОЛОГИЯХ ПРОГРАММИРОВАНИЯ
Какие бывают языки программирования
Рассмотрев основные вещи в с++ для любителя, мы можем теперь копнуть шире и больше- а какие ещё другие языки программирования бывают? Чем они отличаются, как классифицируются, на что делятся?
По данным интернета, на текущий момент существует около 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 ; просмотров: 266 ; Мы поможем в написании вашей работы!
Источник: studopedia.net
программа, которая сама себя печатает, как она работает?
Я наткнулся на программу, которая печатает себя на этом сайте, т.е. печатает программный код.
#include char *program = «#include %cchar *program = %c%s%c;%cint main()%c<%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c>%c»; //what is this line doing, what is the use of %c and %s and what properties of %c and %s are being used here? int main() < printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); //what is this print function doing, and how? return 0; >
И дано объяснение:
Два ключевых трюка здесь: использование строки со встроенным спецификатором% s, чтобы строка могла содержать себя при печати, и использование спецификатора формата% c, позволяющего выводить специальные символы, такие как новые строки, которые иначе не могли бы быть встроены в строка вывода.
Я не понял, как работает программа. Я упомянул строки, в которых мне нужно объяснение, как они работают и что они делают. Пожалуйста, объясни.
SpeedBirdNine 7 Окт 2011 в 21:39
В последнее время я видел, как это спрашивали несколько раз. Это домашнее задание или задание для программиста?
Michael Dorgan
7 Окт 2011 в 21:48
Ничего подобного, я только что наткнулся на это. Если бы это было домашнее задание, я бы использовал тег «домашнее задание».
SpeedBirdNine
7 Окт 2011 в 21:50
7 Окт 2011 в 21:53
Я предпочитаю эту версию: main()»;printf(s,34,s,34);> (без новой строки в конце).
%c»;
Существует указатель с именем «программа», который используется для хранения строки, а% c и% s являются спецификаторами формата для аргументов типа char и string соответственно.
printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);
Функция printf выводит данные на консоль, 10 — это код ASCII для NEWLINE и 34 — для параметров printf выполняются
- программа, передающая строку для печати
- 10, передавая код ASCII 10 для первого% c (будет преобразован в символ новой строки)
- программа, снова передавая ту же строку% s в программе, чтобы снова напечатать ту же строку
- 34, передавая код ASCII 34 для второго% c (будет преобразован в символьные двойные кавычки)
- 10, передавая код ASCII 10 для 3-го% c (будет преобразован в символ новой строки)
- 10, передавая код ASCII 10 для 4-го% c (будет преобразован в символ новой строки)
- 10, передача кода ASCII 10 для 5-го% c (будет преобразована в символ новой строки)
- 10, передача кода 10 ASCII для 6-го% c (будет преобразована в символ новой строки)
- 10, передача кода ASCII 10 для 7-го% c (будет преобразована в символ новой строки)
- 10, передавая код ASCII 10 для 8-го% c (будет преобразован в символ новой строки)
ammar26 7 Окт 2011 в 21:56
Printf печатает строку, указанную в качестве первого аргумента (в данном случае строку в *program ), заменяя другие аргументы, где у вас есть% s или% c
% s означает, что аргумент является строкой,% c — символом.
Как сказано в примечании, он использует% s для печати копии строки программы внутри строки программы — следовательно, делает копию, и использует% c для печати символов 10 (новая строка) и 34 «
Martin Beckett 7 Окт 2011 в 21:46
Для лучшего понимания переменную program можно было бы записать так:
«#include nchar *program = «%s»;nint main()n. »
Идея в том, что вы запускаете программу, компилируете ее вывод, запускаете эту программу и так далее. Но это можно сделать только со значениями% c 10 для перевода строки и 34 для двойных кавычек.
ott— 7 Окт 2011 в 22:06
Это можно сделать с помощью обработки файлов. Сохраните программу с любым именем и поместите это имя в открытый каталог в команде fopen. Как будто моя программа называется hello.cpp.
Это следующая программа
#include #include int main() < FILE *fp; fp=fopen(«hello.cpp»,»r»); char ch; while((ch=fgetc(fp))!=EOF) < printf(«%c»,ch); >>
Источник: question-it.com