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

я наткнулся на программу, которая печатает сама на этой сайт, т. е. он печатает код программы.

#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, позволяющего выводить специальные символы, такие как новые строки, которые иначе не могли бы быть встроены в строка вывода.

Я не понял, как работает программа. Я упомянул строки, в которых мне нужно объяснение, как они работают и что они делают. Пожалуйста, объясни.

Читайте также:
Можно ли устанавливать на mac пиратские программы

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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru