Alle Beiträge Stilett

Arbeiten mit Dateien in C ++. Teil 2 – Библиотека fstream.




Класс ofstream

Обратный классу ifstream, который мы рассмотрели ранее, и призван для записи в файл.

Как и в ifstream, для открытия или создания файла используется конструктор или метод öffnen().

Или конструктором:

Параметр ios_base::app указывается, если нужно дописывать в конец уже имеющегося файла. Например когда программа ведет лог своей работы

За проверку на открытость файла отвечает все та же ist offen()

Принцип тот же. Так же можно проверить открыт ли файл, использовав в logischer Ausdruck саму файловую переменную:

Betreiber <<

Перенаправляет форматированный вывод в файл. Принцип тот же, что и у аналога из iostream.

Предназначен для вывода в текстовые файлы. Управляется операциями форматирования такими как Breite() oder setf(). Их аналоги полностью равны одноименным методам из iostream.

Последовательность вывода переменных так же указывается слева на право: Первой будет выведена переменная, указана ближе всех к fileo, потом следующая за ней.

Оператор endl

Аналогично оператору из iostream производит запись перевода каретки на новую строку в текстовых файлах.

Метод write

Используется в бинарных файлах для записи блока памяти (массива байт) в файл как они есть. Любая переменная так же является массивом Byte, вернее ее так можно рассматривать. Соответственно этот метод запишет в файл ее машинное представление (тот вид как она выглядит в памяти).

Этот метод принимает два параметра: Указатель на блок данных и количество байт, который этот блок занимает. В примере строка занимает strlen() Byte, целое Größe von() (которое даст 4 на 32-х битных операционках для целого и 8 для вещественного).

Еще раз стоит акцентировать, что в отличии от форматированного вывода оператором <<, Verfahren schreiben() не выводит данные в текстовом представлении.

Метод close

Закрывает файл метод schließen(). Для файлов, открытых на запись, в отличии от файлов на чтение, закрытие файлаобязательный ритуал. Незакрытый файл может не получить данные. Происходить такой эффект может из-за буфферизации самой операционки, когда данные, сбрасываемые в файл, хранятся на самом деле в памяти и сразу в файл не поступают. Операционная система сама решает, когда пора данные сливать.

Такойотложенныйслив называетсяКоммитом” (от латинского commit). Кстати этим эффектом весьма удачно пользуются системы управления базами данных, где вставляемые записи попадают в хранилище в памяти (называемой транзакцией). И только после специальной команды скопом пишутся в сам файл базы. Verfahren schließen() как раз пример такой команды закрывающей транзакцию вместе с файлом.

Стоит на всякий случай упомянуть, что если нужно произвести коммит данных без закрытия самого файла, нужно применить метод spülen()

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

Методы форматирования width, Präzision

Как и в iostream, для красивой разметки данных в файле могут применяться методы форматирования данных для вывода оператором << .

Breite() указывает ширину в символах, в которое будет укладываться выводимое значение, und Präzision() количество знаков дробной части вещественного. Простейший пример: вывод таблицей в текстовый файл значений тригонометрической функции:

 

Методы позиционирования seekp, tellp

Для перехода по файлу как и в случае с ifstream существует функция перестановки позиции. Называется она seekp() и получает те же параметры что и описаны выше для seekg().

Для получения текущей позиции в байтах от начала файла используется аналогичная функция tellp().

Видео о работе с файлами в С++:

Newsletter neue Lektionen über die Programmierung:

Arbeiten mit Dateien in C ++. Teil 1 – Библиотека fstream.




Kopfzeile fstream Es bietet die Funktionalität Daten aus einer Datei zu lesen und in die Datei schreiben. Im Allgemeinen ist es sehr ähnlich wie der Kopf iostream, wer arbeitet mit der Konsole, da die Konsole ist auch eine Datei. Daher werden alle grundlegenden Operationen sind die gleichen, für kleine Unterschiede, wie im vorherigen Thema auf iostream.

Die häufigsten Operationen folgende:

  1. Операторы перенаправления ввода\вывода<< und >>
  2. Verfahren zum Aufzeichnen und Lesen Reihen getline() und bekommen() c stellen()
  3. Streaming-Lese- und Schreibmethoden schreiben() und lesen()
  4. Методы открытия\создания и закрытия файлов öffnen() und schließen()
  5. Die Methoden der Überprüfung, ob die Datei geöffnet wird ist offen() und ob das Dateiende erreicht ist eof()
  6. Einstellen der formatierten Ausgabe für >> mit Hilfe Breite() und Präzision()
  7. Positioniervorgang tellg(), tellp() und seekg(), seekp()

Es ist nicht alle Möglichkeiten, die Bibliothek bietet fstream. Betrachten wir jetzt alles tun wir nicht, da deren Einsatzbereich ist schmal genug. Vertraut mit der oben. Beginnen Sie mit der Klasse das Lesen.

Klasse ifstream

Es bietet die Möglichkeit, Dateien zu lesen. Öffnen Sie die Datei auf zwei Arten: Aufruf der Methode öffnen() oder durch den Pfad, um es in den Konstruktor Eingabe. Sie benötigen eine Textdatei vorbereiten, vor, Starten Sie den Code eingeben. Auf der Disk d, erstellen Sie einen Ordner mit dem Namen 1 und darin, erstellen Sie eine Datei mit der Endung txt – “файл.txt”.

eine Datei im Konstruktor Öffnen sieht wie folgt aus:

So stellen wir eine Datei mit dem Namen file.txt txt zu öffnen, die in dem Ordner mit dem Namen 1, und der Ordner auf Laufwerk d.

Mit der offenen Methode() bequem, wenn der Programmierer will nicht direkt in eine Datei gebunden werden. Plötzlich müssen Sie eine Klasse Eigenschaft oder globale Variable, na ja, öffnen Sie dann die Datei bereits. Wenn Sie eine Datei innerhalb einer bestimmten Funktion öffnen müssen, mit ihm zu arbeiten und schließen, Sie können den Pfad zur Datei direkt im Konstruktor gesetzt. In der Regel je nach Situation.

Öffnen der Datei, zu verschreiben wünschenswert durch: wenn er geöffnet? Da gibt es eine Reihe von Gründen,, in dem die Datei nicht geöffnet werden, und wir nicht sehen. beispielsweise, Datei mit dem angegebenen Namen ist nicht in den vorgeschriebenen Ordnern oder Pfad ungültig. Sie können in zwei Richtungen gehen: Überprüfen Sie die Datei in einer Variablen logischer Ausdruck (Anwenden des Bedieners “!”, z.B) oder das Verfahren zu verwenden, ist offen() :

So wird alles gut funktionieren und die Datei wird geöffnet:

библиотека fstream, mit Dateien in c ++ arbeiten, Programmieren für AnfängerVersuchen Sie nun den Namen einzugeben von dem Ordner nicht ist 1, und 2 ifstream Datei ("d:\\<span style ="Farbe: #ff0000;"><stark>2</stark>\\файл.txt”); und starten Sie das Programm. Seit dem angegebenen Ordnernamen, haben wir nicht schaffen, dann die Datei, natürlich, Es kann nicht geöffnet werden:

библиотека fstream, mit Dateien in c ++ arbeiten, Programmieren für Anfänger

Das zweite Ausführungsbeispiel prüft das Verfahren unter Verwendung von ist offen() :

Verfahren ist offen() Rückkehr 1, Wenn die Datei gefunden wird und erfolgreich geöffnet. andernfalls kehrt 0 und Arbeitscode im Block vorgeschriebenen sonst.

Wenn die Datei nicht geöffnet ist – wünschenswert, den Fehler zu behandeln. Allgemein, wenn alle das Arbeitsprogramm im Zusammenhang mit der Datei schreiben sie eine bestimmte Nachricht an die Konsole, und aus dem Programm setzen. Wenn schwerwiegende Fehler üblich, eine Codeausführung zurückzukehren (Anzahl), der eine oder andere Fehler wird charakterisieren. Die Codes für jede Art von Fehlern der Autor des Programms ihre eigenen erfinden. Eine der Möglichkeiten, Fehler im Programm zu handhaben, haben wir in dem Artikel betrachtet Ausnahmen in C ++.

Wenn die Datei erfolgreich geöffnet, daraus kann man lesen.

Lesen Sie den Operator >>

Wie auch in iostream Lesen kann durch den Bediener angeordnet werden, >>, , der angibt, in denen variabel gemacht werden, um zu lesen:

hält Echt, String und integer. Zeilenausleseende, wenn es einen Raum oder Zeilenende. Es ist erwähnenswert,, dass der Betreiber >> Es galt in Textdateien. Lesen aus einer Binärdatei zu machen, die am besten mit der Methode lesen().

By the way, ist diese Aussage sehr bequem, wenn die Aufgabe besteht darin, die Datei in Worte zu spalten:

Methoden getline() и erhalten()

die Zeichenfolge an die Übersetzung des Wagens zu lesen ist das gleiche, wie in iostream durch getline(). Außerdem wird empfohlen, die überladene Version der Funktion zu verwenden, wenn Sie eine Linie vom Typ String lesen:

Wenn Sie in einer Reihe von Zeichen lesen char[], entweder bekommen() oder getline() ebenso wie die Methoden:

Das Prinzip ist in der Regel die gleiche, wie in den Analoga von Iostream: Dargestellt als Parameterpuffer (Variable, wo die Lesung wird getan), oder vielmehr ein Zeiger auf einen Speicherblock (wenn die Variable statisch deklariert: char buffer[255] z.B, es wird in den Parametern geschrieben &Puffer), gibt die maximale Anzahl von lesbaren (in diesem Beispiel n), um nicht zu Überlauf aufgetreten und der Ausgang der Puffergrenzen und die Trennzeichen nach Bedarf, zu denen Korrekturlesen (in diesem Beispiel die Lücke). Надеюсь я не больно наступлю на хобот фанатикам Си, если сажу что эти две функции на 99% взаимозаменяемы, und 95% могут быть заменены методом lesen().

Verfahren lesen()

Похож на предыдущий пример?

Собственно тут тот же результатсчитается указанное количество символов. Исключение только в том, что нельзя указать разделитель. lesen() применяется для неформатированного ввода. Призван в первую очередь читать бинарные файлы. Da die Textdatei – ein Sonderfall eines binären, Diese Methode ist sehr anwendbar auf die Textdatei.

Verfahren schließen()

schließt die Datei. Auch nichts hinzuzufügen. Vielleicht ist die einzige Bemerkung – auf, dass die Datei, открытый для чтения, не будет закрыт этим методом как правило хуже не станет. Очень редки ситуации, когда открытый для чтения файл портится, если завершить программу не закрывая файл. Связана эта порча прежде всего с нестандартными устройствами типа стримеров на магнитной ленте или каких нибудь потоковых хитрых промышленных контроллерах, но по феншую стоит запомнитьоткрытый файл должен быть закрыт. Это считается хорошим тоном.

Verfahren eof()

Проверяет не достигнут ли конец файла. dh. можно ли из него продолжать чтение. Выше пример с считкой слов оператором >> как раз использует такую проверку.

Verfahren seekg()

Производит установку текущей позиции в нужную, указываемую числом. В этот метод так же передается способ позиционирования:

  • ios_base::Ende – Отсчитать новую позицию с конца файла
  • ios_base::begОтсчитать новую позицию с начала файла (абсолютное позиционирование)
  • ios_base::curПерескочить на n байт начиная от текущей позиции в файле (Default)

Verfahren tellg()

Иногда нужно получать информацию о том, сколько уже прочитано. В этом поможет метод tellg():

Он возвращает значение типа int, которое показывает сколько уже пройдено в байтах. Его можно использовать в паре с методом seekg(), чтоб получать размер файла:

В качестве примера работы методов бинарного чтения можно разобрать такой Klasse:

Подобные обертки-классы удобно использовать, если встречается задача читать из бинарного файла целые структуры.

Видео о работе с файлами в С++:

Newsletter neue Lektionen über die Programmierung:

Liste bidirektionale. Ordnen Sie die Felder und Bedingungen




В этой статье я опишу методику работы с двунаправленным списком в классическом его варианте. Beitragsliste, вывод и сортировку по разнообразным условиям и полям элементов списка. Не буду вдаваться в теорию списковперейду к описанию того, что необходимо сделать для решения данной задачи, und auf dem Weg beschreiben ich, warum so angeordnet ich einen Job.

So erstellen Sie eine Liste, die wir brauchen zwei Strukturen: ein – Feldliste Artikel. zweite – er Listenelement mit Ankern, was werden die Elemente zusammenbinden.

Die erste Struktur kann wie folgt aussehen:

Dies ist eine Liste der Datenstruktur. Es muss das Feld enthalten, direkt an die Liste selbst (oder vielmehr seine Struktur ) haben keine Beziehung, aber speichern Informationen. Dieser Eintrag – Behälter (nennen wir es so).

Der zweite Eintrag:

Sie hatte die Absicht, ein Containerelement zu speichern,, в который мы упакуем данные, und ein Feld für die Kommunikation mit benachbarten Elementen in der Liste,.

Was eine solche Wendung auf zwei Strukturen benötigt wird? Es wird leichter sein, zu sortieren. Unter normalen Umständen wird die Liste durch Umleitung seiner Feld Anker auf anderen Elementen sortiert (Nächster und Zurück in diesem Beispiel). dh. die Daten selbst, wie sie in der gleichen Zelle in dem Speicher waren (Zelle) und weiterhin, sondern nur die Zeiger ändern zu den Nachbarn. Und es ist sicherlich gut und richtig, aber schwierig. Die höhere Komplexität, тем больше вероятность нарваться на баг в программе. Daher ist es notwendig, um das Programm zu vereinfachen,, so kann man nicht die Anker ändern, und Orte Daten (wie es ist in der Regel in Sortieranordnungen beispielsweise dadurch geschehen). Daher entsprechenden Daten in einem separaten Blockstruktur, ziehen, um sie einem Betreiber, anstatt jedes Feld einzeln ziehen. Im Folgenden sehen Sie, was gemeint ist,.

Für die Arbeit mit der Liste der erforderlichen Variablen und den Kopf der Liste, der Notwendigkeit, Schwanz:

Und so wird es haben die Liste Füllvorgang zu suchen:

Es kann auch in zwei Teile geteilt werden,: Das erste Element würde geschaffen, der zweite hätte ihn mit einem Behälter Nutzdaten gefüllt, aber es ist zu schmecken.

Не забываем о процедуре освобождения списка. Verlassen Müll im Speicher – Geschmacklosigkeit, Auch wenn intelligente Betriebssystem selbst kann gereinigt werden:

A-Prozedur:

So viel ist es auf Grund “marafeta”. Schöne Anzeige – wichtig genug Optionalität Programm. Поэтому ширину для элементов и табличный вид стоит соблюсти.

Nun zum Spaß – Sortierlisten. Das Verfahren von der Art I in zwei Teile gebrochen haben, убрав из нее условия проверки, die untersuchen, ob die sortierbare Elemente gefördert werden sollte, je nach den Bedingungen der Liste. Die gleiche Sortierverfahren ist wie folgt:

Es werden mir zustimmen, die Sortieroptionen zu übertragen: Feld Name, das ist zu sortier, und die Sortierrichtung (asc – aufsteigend oder desc – absteigend).

In dem Verfahren verwendeten Blasensortierung, als das Chassis. In einem Doppel-Loop ist ein Call-Funktion Analysator, was muss reagieren Sortier, Müssen Sie die Elemente neu anordnen sortiert werden soll oder nicht. Ansicht, убрав условия сортировки, Ich vereinfacht den Code selbst Verfahren Sortierung. Auch wenn Sie brauchen ein paar mehr Bedingungen oder Felder hinzufügen, Art wird selbst müssen nicht berühren.

Analyzer-Funktion sieht wie folgt aus:

es führt 4 Bedingungen:

  1. wenn asc – aufsteigend, und das Feld wird sortiert – x:
  2. wenn desc – absteigend, und das Feld der gleichen
  3. wenn asc – aufsteigend, aber sortiert zweite Feld, strokovoe
  4. wenn desc – Beim Abstieg von einem String-Feld

In jeder der Bedingungen jeweils verglichen werden “größer” oder “weniger” je nach der Menge der Sortierungen. Somit ist diese Funktion verantwortlich Sortierverfahren, как ей поступать с элементами. В целом это и есть весь алгоритм сортировки двунаправленного списка.




Wir setzen es in einem einzigen Programm oben beschrieben und die Funktion anhängt Main():

beachten Sie: Ich weise darauf hin, die Worte, wie eine Liste zu sortieren, für die Feld und in welcher Reihenfolge die.

Ergebnis:

Sortierung bidirektionale Liste in C ++

Auf der zweiten Liste kann die Sortiermethode von perezatsepleniya Anker weiter lesen programmersforum

По просьбе коллег по сайту (was natürlich korrekt bemerkt) zumindest eine kurze Erwähnung von C ++ wert und die Tugenden STL. Ich meine die Klasse Liste, die tatsächlich repräsentiert Listen (bidirektionales). Das Versprechen eines einfachen: alle, Sie müssen mit einer Liste zu arbeiten, der bereits getan. Auf gut, Programmierer, Arbeiten mit Listen, конечно же стоит в бытовых случаях избирать для работы STL.

Ich werde einen kleinen Code unter Verwendung des Behälters beschreiben, als Alternative zu, wie oben beschrieben,:

Sortierung bidirektionale Liste in C ++

Wenn die Aufgabe kann verwendet werden, STL – Verwendung. Решение окажется надежнее и не будет траты времени на изобретения своего механизма хранения списков.

Die Wahl dieser beiden Verfahren sollte auf die Menge der nützlichen Daten kann je, Das sind in ein Listenelement eingegeben. Wenn diese paar Dutzend Felder mit Zahlen oder kleine Linien, der einfachste Weg,, nur – Bewegen Sie den Behälter mit Nutzdaten (wie hier). Wenn die Listenelemente haben eine enorme Größe, desto schneller Umbildung Technik Anker werden durchgeführt (Änderungen Letzte und Nächster für perezatsepleniya Element mit einem anderen Element). В любом случае выбор за программистом.

Zur Unterstützung unserer Website – klicken Sie auf das Sparschwein und wählen Sie eine beliebige bequeme Weise.

Newsletter neue Lektionen über die Programmierung:

Библиотека iostream. Основные операции

библиотека iostream, класс cin, класс cout, методы класса cout,  методы класса cin,  boolalpha, scientific, schreiben, getline, bekommenМодуль (или как говорят в случае с Сихедер) или заголовочный файл iostream призван предоставить средства ввода-вывода, для стандартной консоли. dh. die, что вводит с клавиатуры и читает с экрана пользователь.

Все его возможности размещены в пространстве имен std, поэтому для его использования либо приходится приписывать префикс std, либо указывать пространство имен через using namespace

Или

В этой статье будем использовать первый вариантподключение пространства имен через using namespace.

iostream содержит два основных класса:

  • Gin для обработки ввода с клавиатуры;
  • cout для вывода в консоль переменных или просто текста;

Есть еще классы cerr und clog, но их в целом, используют не так часто, и о них мы упоминать не будем. Если кому интересноэти классы используют для вывода ошибок при операциях и для логирования действий.

Сразу скажу, что не всё, что присуще этим классам будет описано. Только самое часто используемое из функционала. Это операторы перенаправления форматированного вывода (<< und >>), которые занимаются выводом значений переменных в зависимости от их типов и указанного формата. Это операторы неформатированного чтения\записи (lesen: по байтам или посимвольно), Methoden bekommen(), stellen() und schreiben() призванные просто вывести массив символов какими бы они ни были. И операторы форматирования setf(), Breite(), Präzision(), которые указывают для текущего вывода, как форматировать выводимое, как выравнивать его, по какой стороне и сколько ставить символов после запятой.

Класс cin

Klasse Gin содержит множество методов. Все их можно увидеть, если ввести в среде разработки ключевое слово Gin и поставить после него точку. Редактор кода предложит все имеющиеся методы этого класса на выбор:

библиотека iostream, класс cin, класс cout, Cidargaet

Как сказано выше, для начинающих программистов, мы рассмотрим только некоторые из них.

Klasse Gin основан на классе istream, и содержит возможность перенаправления ввода. Используя перегрузку оператора >> , класс позволяет указать в какую переменную будет производиться ввод данных.

Перечисленные в примере переменные получают (считывают) свои данные согласно своим позициям в операции. В данном примере сначала считывается вещественное в d, потом целое в ich, и затем строковая переменная. Это нужно обязательно учитыватьнеправильная последовательность переменных может дать либо ошибку ввода, либо переменные могут получить данные им не предназначающиеся.

При считывании строки нужно помнить, что если при в ней встретится пробел, считка завершится (в операционной системе принято параметры отделять пробелами). Так удобно разбивать строку на слова. Проиллюстрировать это можно таким примером:

библиотека iostream, класс cin, класс cout, Cidargaet

Из личного опыта я не рекомендую применять именно такой метод деления строки на слова, но знать об этом полезно.

Если нужно считать строку целиком до переноса каретки, стоит использовать рассматриваемый ниже метод getline().

Verfahren bekommen()

Позволяет ввести символ или строку. При вводе стоки поддерживает разделитель, указанный программистом, до которого будет читаться строка. По умолчанию стоит символ перевода строки ' N' То есть метод bekommen() ждет нажатия клавиши Энтер. Только потом обрабатывает считываемое.

При вводе символа в числовую переменную, метод возвращает код этого символа:

Cidargaet() часто ставят в конце программы, чтобы задержать консоль с результатами:

В классическом Си популярным аналогом является функция getchar() для такой задержки.

Чтобы сделать с помощью этого метода ввод строки, достаточно передать в его параметры указатель на массив символов, куда будет производиться запись, и количество символов, которое ожидается для ввода.

Схема простая: Передаем указатель на массив символов, передаем количество считываемого, и после нажатия клавиши Энтер, Cidargaet() считает в этот массив заданное количество символов. Остальные символы считаны не будут, поэтому чтобы освободить от них буфер ввода можно вызвать метод ignore().

Если указать третьим параметром символ-разделитель, Cidargaet() будет считывать либо сколько заказано символов, либо пока Gin не встретит этот символ:

Тут в s строку считываются символы вплоть до первого пробела. Если пробелов не обнаружитсясчитываться будет либо до нажатия Энтер либо до n-ного символа.

Verfahren getline()

Аналогичен методу bekommen(). Помимо всего, dass “умеетbekommen(), переопределен для строк типа Schnur. Так же как и bekommen() умеет считывать до символа, указанного в качестве разделителя, так же первым параметром указывается массив символов, а вторым количество символов для считывания.

Использование его переопределенной версии в хедере Schnur Aussehen:

Класс cout

Klasse cout предполагает вывод данных в консоль. Базовый класс ostream. Основной оператор – überladen << Он указывает, какую переменную выводить в консоль.

Правила последовательности те же, dass Gin вывод слева направо.

Для перевода каретки на новую строку рекомендуется использовать оператор endl. Или передавать старый добрый ‘\n

Verfahren stellen() выводит символ в консоль:

Выведет один символ.

Verfahren schreiben() выведет блок символов из массива символов, переданный ему в качестве указателя

Im Prinzip, in schreiben() можно передавать указатель на любой блок памяти, но для вывода в консоль характерны только массивы читаемых, понятных человеку символов.

библиотека iostream, класс cin, класс cout, cout.write

Verfahren Breite() задает ширину выводимого, если необходимо выровнять до определенного количества символов. Как правило применяется при построении таблиц. Типичный пример: Вывод таблицы вычисления формулы (пример ниже).

Verfahren Präzision() указывает сколько цифр будет в дробной части, если выводится вещественная переменная.

Verfahren setf() bestimmt, как будет выравниваться (влево, rechts, по центру) выводимое, и в каком формате оно будет.

Комплексный пример этих методов можно увидеть в задании построения таблицы параболы:

библиотека iostream, класс cin, класс cout, методы класса cout

16-тиричное представление строки можно вывести, beispielsweise, вот так :

библиотека iostream, класс cin, класс cout, методы класса cout, basefield

А так научный формат представления вещественного:

scientific, библиотека iostream, класс cin, класс cout, методы класса cout

Можно задать формат вывода булевских переменных:

библиотека iostream, класс cin, класс cout, методы класса cout, boolalpha

Поработайте с методами этих классов самостоятельно. Versuchen Sie zu verstehen, что делает каждый из них. Такая самостоятельная практика будет вам очень полезна.

Newsletter neue Lektionen über die Programmierung:


Ich bin damit einverstanden, Nachrichten zu empfangen von purecodecpp.com auf meine E-Mail

Aufgabe. Berechnen Sie die Anzahl der Tage zwischen den Terminen.

Die Aufgabe ist einfach: Finden Sie die Anzahl der Tage zwischen zwei Daten. Geben Sie Kontoschaltjahre.

Für die Praxis bot zwei Optionen:

  1. Eine der Grenze Daten beschrieben nur ein Jahr. Das heißt, der Starttermin vollständig eingegeben (beispielsweise 25.12.2015), und die zweite nur ein Jahr (beispielsweise 2016). Sie zählt die Tage vor 01.01.2016
  2. Sowohl der Zeitpunkt der vollständigen – beschreibt Tag Monat Jahr.

Hier ist mein Beispiel, teilweise entscheidende erste vereinfachte Version:

hier ist die Funktion DaysCount() Es nimmt die ersten drei Parameter, den Starttermin (Jahr, Monat, Tag) und der letzte Parameter Grenze (Jahr, 1-ten Tag des Monats Januar,)

Jede Methode kann lösen, obwohl der Zyklus mit etwas anderem. Aber die Entscheidung der zweiten Ausführungsform zeigt nicht :) Lassen Sie es Hausaufgaben. Viel Glück!

Fragen in den Kommentaren fragen

Newsletter neue Lektionen über die Programmierung:

Suchen Teilzeichenfolge in Takt




Suchalgorithmen ++, String-Suche in Takt, c ++, wie eine Teil in einem String zu findenJetzt werden wir an Beispielen sehen, Es mag wie Suchalgorithmus Teilzeichenfolge aussehen. Beispiele sind auf den Standard-Library-Funktionen basierend, ведь именно в таких функциях и проявляются все удобства написания программ. А вот классический разбор алгоритма, basierend auf Zyklen und Vergleiche, Es ist auch bemerkenswert. Deshalb werden wir es in der gleichen Klasse betrachten.

Сам алгоритм в принципе очень прост. Es gibt zwei Leitungen. beispielsweise "Hallo Welt" und "es"

Die Arbeiten werden in zwei Runden sein:

  1. Der erste wird sein, eine Passage über die Linie durchzuführen, und suchen Sie nach Standort Anfangsbuchstabe Suchbegriff ( "es" ).
  2. zweite, da die Position des ersten Buchstaben gefunden – überprüfen, welche Buchstaben sind nach ihm, und wie viele von ihnen in einer Reihe passen.

Wir zeigen die Suche nach Teilzeichen:

Suchalgorithmen ++, String-Suche in Takt, c ++, wie eine Teil in einem String zu finden, C ++ Programmierung für Anfänger, Bericht, Kursarbeit

Die ersten beiden Iterationen der Schleife verglichen die Buchstaben nicht gleich sein (rot hervorgehoben). Die dritte Iteration des gewünschten Buchstaben (das erste Zeichen des gewünschten Wortes) Es deckt sich mit dem Zeichen in der Zeichenfolge, wo die Suche. При таком совпадении в работу включается второй цикл. Es wurde entwickelt, um die Anzahl der Zeichen nach dem ersten in der Suchzeichenfolge zu zählen, die mit den Zeichen in der Original-Zeichenkette zusammenfallen. Wenn eines der Symbole nicht übereinstimmen – Zyklus beendet. Es macht keinen Sinn, den Kreislauf zu fahren verschwendet, nach dem ersten Diskrepanz, denn es ist schon klar,, dass es keinen Titel.

На третьей итерации совпал только первый символ искомой строки, aber das zweite ist nicht das gleiche. Wir haben die Arbeit des ersten Zyklus fortzusetzen. Четвертая итерация дает необходимые результаты – passen alle Zeichen der Zeichenfolge mit einem Teil des Quellstrings. Und da alle Zeichen angepaßt – Teilzeichenfolge gefunden. Algorithmus Arbeit abgeschlossen werden kann.

Mal sehen,, Es sieht aus wie ein klassischer String-Suche Code-String in C ++:

Zwei Zyklen jeder seine Aufgabe. Ein Stampfen auf der Linie in der Hoffnung, “Kopf” Suchbegriff (erste Zeichen). Die zweite Funde, ob es gefunden wird nach “Kopf” “Körper” gesucht. und Kontrollen, ob es nicht liegen “Körper” Ende der Leitung. dh. wenn die Wortlänge ist man nicht gefunden wird mehr als die erforderliche Länge der Zeichenfolge, in Anbetracht, Null-Terminator, der in diese Einheit fällt ( ' 0' ).

Suchalgorithmen ++, String-Suche in Takt, c ++, wie eine Teil in einem String zu finden, C ++ Programmierung für Anfänger, Bericht, Kursarbeit

Wir sehen, что программа нашла начало подстроки jedoch в ячейках символьного массива с индексом 0 und 4. Aber warum? Ведь в слове Parapapa 3 solche Teilzeichenfolge. Die Sache ' 0' .

Im Allgemeinen endet die Bedeutung des hier Algorithmus. Больше никаких сложностей кроме нуля в конце строки нет. jedoch, sollten ihr Augenmerk auf die Vielzahl der Suche zahlen. Was, если нам необходимо найти в строке несколько позиций? Wie oft der Suchbegriff vorkommt in der Linie und in welchen Orten? Именно это и призван контролировать третий параметрint nномер вхождения в строку. Если поставить туда единицу – Er findet das erste Spiel Titel. Wenn ein deuce, es wird die erste Schleife machen zuerst gefunden zu überspringen, und versuchen, eine zweite. wenn drei – sucht die dritte und so weiter. Jeder Suchbegriff gefunden, Vorkommen dieses Zählers dekrementiert. Dies ermöglicht es uns, die Suchschleife zu beschreiben:

Das heißt, zu finden das erste, zweite, dritte, vierte Spiel… Solange die Funktion nicht zurückgibt -1, das zeigen die Abwesenheit von N-tion des Titels in einer Reihe.

 

jetzt, zum Vergleich, Suchen String C ++ Heder Schnur.

alle! Klasse Schnur C ++ ist vorgesehen, durch finden(), gibt die Anzahl der Zelle, die beginnt mit dem Körper des Suchbegriffs in der Quellzeichenfolge. Ergebnis:

Suchalgorithmen ++, String-Suche in Takt, c ++, wie eine Teil in einem String zu finden, C ++ Programmierung für Anfänger, Bericht, Kursarbeit

Wie die Vielzahl? Ja, bitte:

Funktion finden() nimmt zweite Parameter Symbolnummer, von denen die Suche zu starten. dh. Suche nach dem ersten Auftreten, его значение увеличивается на единицу и finden() продолжает поиск со следующего символа после найденной головы. Ergebnis:

Suchalgorithmen ++, String-Suche in Takt, c ++, wie eine Teil in einem String zu finden, C ++ Programmierung für Anfänger, Bericht, Kursarbeit

All dies ist in C ++, selbst Klasse Schnur komfortabel genug mit Streichern zu arbeiten, beide Leitungen, anstatt nur ein Array von Zeichen.

Newsletter neue Lektionen über die Programmierung:

Sortiereinsätze




Insertionsort c ++, Einsätze Sortieralgorithmus, Programmieren für AnfängerEin anderer Algorithmus, entworfen Arrays zu organisieren, Algorithmus Sortiereinsätze (Sortieren durch Einfügen). Этот алгоритм (als andere, auf unserer Website eingesehen) einfach genug. Es besteht aus zwei Zyklen (eine in der anderen eingebettet). Der erste Zyklus erzeugt über ein Array, und die zweite – die Bewegung der Elemente. Lassen Sie uns nur einen Blick, Es könnte aussehen wie eine Art Code, а уже ниже разберем, wie es funktioniert.

Algorithmus Sortiereinsätze можно описать следующими позициями:

  1. Denken Sie daran, in einer temporären Variablen ( polieren в примере) der Wert des aktuellen Datenfeldelement;
  2. Während Elemente der linken Seite der gespeicherte Wert größer als der gespeicherte – Wir bewegen sie in die richtige Position. Es stellt sich heraus,, dem vorherigen Element, wird die gespeicherte Zelle nehmen. und die, also vor dem vorherigen – bewegt sich in die Stelle des vorherigen drehen. И так элементы будут двигаться друг за дружкой.
  3. Der Satz endet mit Elementen, Wenn das nächste Element, verschieben möchten, Es ist sinnvoll weniger, als die, erinnern, dass eine temporäre Variable zu Beginn des Zyklus.
  4. Der Zyklus nimmt den nächsten Punkt, wieder verschiebt alle, die sich vor ihm und groß auf Wert gelegt.

Wir werden zeigen, visuell die Bewegung der Werte in einer Anordnung von sieben Elementen während des Betriebs Sortiereinsätze:

Insertionsort c ++, Einsätze Sortieralgorithmus, Programmieren für Anfänger

На первой итерации в переменную-буфер запишется значение из ячейки с индексом 1 und der Zyklus diesen Artikel überprüfen. Там у нас находится число 2. Es ist größer als der Wert, ist in der Null-Zelle aufgezeichnet, so dass die Bewegung nicht. Ferner wird der variable Puffer den Wert des Index der Zelle geschrieben 2 wieder die Werte zu vergleichen gehen Sie nach links, usw.. Только на четвертой итерации внешнего цикла начнется перезапись значений. Drei wird zuerst mit dem fünf wechselbar, und dann mit dem vier.

Auf diese Weise, im Gange Sortiereinsätze элемент записанный в polieren “gesiebte” zum Anfang des Arrays. А в случаях, когда будет найден элемент со значением меньше чем polieren oder der Beginn der Sequenz erreicht ist – Sieben Stationen.

Eine gute visuelle Darstellung des Algorithmus Sortiereinsätze есть на wikipedia:

Insertionsort c ++, Einsätze Sortieralgorithmus, Programmieren für Anfänger

Zeit auf den Betrieb dieses Algorithmus ausgegeben ist völlig abhängig von der Anfangsdaten: die Anzahl der Elemente in dem Array und das Original-Bestell. Das ist klar, dass je größer die array – desto länger ist die Zeit, die für die Verarbeitung. Также больше времени потребуется на сортировку массива в котором значения абсолютно не упорядочены.

Algorithmus Sortiereinsätze gut für kleine Arrays (bis zu mehreren zehn Elemente). Effizienteres Arbeiten, если данные такого массива ранее были частично отсортированы. Wenn das Array wird neue Daten hinzugefügt werden (Neuheiten), Algorithmus können sortieren sie, wie sie hinzugefügt werden (im Gegensatz zu bubble-sort und Sortieroption). Die Wirksamkeit des Algorithmus wird deutlich erhöhen, wenn Sie in der Code-Algorithmus hinzufügen binäre Suche.

Предлагаем также посмотреть короткий видоурок по информатике с разбором алгоритма Sortiereinsätze:

Newsletter neue Lektionen über die Programmierung:

Sortieren Option C ++




Sortieroption c ++, Wahl des Sortieralgorithmus, für AnfängerBedeutung Auswahl Sortierung (Auswahl sortieren) Es wird der Minimalwert in dem Array-Element zu finden,, und bewegen Sie diesen Wert zu Beginn eines Arrays. Es ist notwendig, um eine Reservierung zu machen, das kann in diesem Fall bezeichnet werden “der Beginn” Feld (gefunden, wo die Minimalwert bewegt). “Start” Algorithmus Auswahl Sortierung mit jedem Schrittzyklus wird in Richtung des Schwanzes des Arrays verschoben. Daher wird bei der ersten Iteration der Schleife,, Ergebnis wird der Minimalwert mit dem Wert Null in dem Zellenfeld vertauscht. In der zweiten Iteration, “Start” schon zum nächsten Punkt (zuerst) Zelle, und so weiter.

Sortieroption c ++, Wahl des Sortieralgorithmus, für Anfänger

In der Tat stellt sich ein einfaches Austauschen von Zellenwerten aus Feld. Wenn ein solcher Austausch muss nicht Werte verschieben (Synchronisation) alle Elemente des Arrays, einen Minimalwert in der entsprechenden Zelle zugewiesen. Das heißt, der Algorithmus Auswahl Sortierung Es erfordert keine zusätzlichen Speicher. Überschreiben Werte erfolgt unmittelbar nach dem Minimalwert in einem Array zu finden,.

Der Programmcode ist ganz einfach, und erfordert keine speziellen Beschreibungen:

Rolle “Anfang” Er spielt einen Zähler ich die äußere Schleife. Bei jedem Schritt wird der Wert des Elements, was zählt die Anzahl der Variablen, als minimal sein. verschachtelte Schleife aufwendet durch den Schweif des Array übergeben, Berechnen der Anzahl der Zellen der Anordnung mit dem Minimalwert (Reihe 18 – ternäre Operator). Wenn nach einer verschachtelten Schleifenvariable min nicht geändert, bedeutet, die ganze Reihe von Schwanz, dass verarbeitet, kein Mindestwert, und das Element “Anfang” Es bleibt in Kraft. andernfalls – Wertänderung Orte mit denen gefunden.

Sortieroption c ++, Wahl des Sortieralgorithmus, für Anfänger

Tail verarbeitet Array mit jedem Durchgang Zyklus verringert, und wenn sie erreicht das Ende des Arrays, es (Feld) wird sortiert. der Algorithmus Auswahl Sortierung stoppen.

Dies ist ein großer kurzes Video auf dem Computer mit der Analyse Auswahl Sortierung (Auswahl sortieren):

Lesen Sie auch zu Sortieralgorithmen unsere folgenden Lektionen gewidmet: bubble-sort und shyeikyernaya sortirovka Feld.

Newsletter neue Lektionen über die Programmierung:

Bit-Felder in C ++




Bit-Feld mit ++, Strukturen in C ++ für AnfängerВ языке С++ есть возможность задавать элементам структур определённое количество памяти в битах. beispielsweise, wenn Sie möchten, eine Datenstruktur zu erstellen, Größe entsprechende Register in jedem Gerät. Die Art des Elements (es wird ein Bit-Feld genannt) такой структуры может быть целочисленное (am häufigsten vom Typ ohne Vorzeichen) oder enumerable (enum).

Syntax-Bit-Feld in der Struktur ist wie folgt definiert:
Bit-Feld mit ++, Strukturen in C ++ für Anfängerbeispielsweise:

Мы определили структуру, в которой переменные будут занимать указанное количество бит. 2 + 2 + 4 es gibt 8 Bit (Wir stellten uns auf Größe in Byte bis). Если в эту структуру дописать еще ohne Vorzeichen kurz fifth : 5; – Es wird bereits beteiligt sein 2 Byte. Во втором байте естественно будет мусор 8 – 5 = 3 Bits, sein nicht beansprucht.

В отличии от Verbände (Union) Größe der Bit-Felder variiert, welche auch immer, wie viele Bits der Programmierer bestellt. Если заказано 7 Bit (sagen die beiden Variablen auf 3 Bits, und ein – 1 Bit), dann nehmen C ++ ein Byte (8 Bit) unter diesen drei Variablen. Wenn der Programmierer bestellen 11 Bit, dann nehmen C ++ zwei Bytes (16 Bit). Und in dem zweiten Byte wird nur verwendet, 5 Bit, und der Rest sind wahrscheinlich zu sein,, als nutzlos Schwanz. Поэтому при описании битовых полей следует учитывать такое “Ausrichtung” In den Bytes. dh. verteilen sie als Variablen, чтоб каждый бит был востребован. Для выравнивания занимаемой памяти можно использовать неименованные битовые поля.

Hier ist ein weiteres kurzes Beispiel, в котором битовые поля отводятся под дату и время для демонстрации этой технологии.

Ergebnis:

Bit-Feld mit ++, Strukturen in C ++ für Anfänger

Wie Sie sehen können, Bit-Felder speichern Datum und Uhrzeit. Занимает эта структура 6 Byte, obwohl es genug für fünf. Und dann gibt es Gründe: сам компилятор может выравнивать отводимую память до четного числа байтов. Zum Beispiel war, wenn wir gebucht 18 Bit, Der Compiler wird uns nicht 3 Byte, und 4, man bedenkt, dass die CPU mit Bytes arbeiten mag, und nicht mit Bits. Wenigstens der Speicher oder Prozessor registriert seine Bits bevorzugt nicht, nämlich Bytes. Nach seiner Bit: x32-Feed 4 Byte, x64 hat 8 Byte. Auch wenn dieser Bytes ist Arbeit nur einer von ihnen, der Rest wird noch aufholen.

Kleine Ergebnis: Битовые поля в Strukturen häufig in Low-Level-Programmierung, когда работа идет со значениями, können keine Bytes zu nehmen, und die einzelnen Bits (da, dass kleine Werte).

Newsletter neue Lektionen über die Programmierung:

Verband der C ++ (Union C ++)




Unions in C ++, Union C ++, Bericht, Kursarbeitunited Technologies Union Es hat seinen Ursprung in den 90er Jahren. Schwache Computer für unsere Zeit (Nun ihre Computer, und es kann nicht aufgerufen werden,), wenig Speicher (alle gemessenen Kilobyte). Festplatten für 40 Megabyte war fast ein Wunder der Technik, ogromennye Mengen an Informationen personifying, Handwerker, dass “Bohrloch” spezielle Software Speicher 80 MB (so war, dass ein wenig mehr). Jedes Byte des Speichers war mit einem Aufschlag, Ich hatte auf alles zu sparen. dass Gewerkschaft Variable wurde auch gedacht (und recht erfolgreich, wie werde ich erklären, unten) helfen dem Programmierer, um eine optimale und wirtschaftliche Programm zu machen, “essen” geringe Mengen an Speicher.

Um zu verstehen, was braucht die Bedeutung des Vereins zu erinnern, wie Variablen gespeichert werden. Verschiedene unterschiedliche Typen von Variablen oder die gleiche Art von Gruppe (wie int, lange und kurz) trotz der Arbeit mit dem gleichen Datentyp, (Ich meine die ganze) eine unterschiedliche Menge an Speicher in Bytes besetzen. lange in jedem Fall dauert es eine maximale Anzahl von Bytes in dem Speicher, zur gleichen Zeit in dem Speicher für eine Variable dieses Typs ist es möglich, den Wert zu notieren int oder kurz. Nehmen Sie einfach, dass nicht alle reservierten Bytes lange-und wird gefragt sein. Wenn Sie zum Beispiel setzen die Zahl der 325 in lange, zwei Bytes belegt (Es hängt von der Bitprozessor), und die übrigen Bytes werden mit Nullen gefüllt,.

Es ist in diesem Sinne erscheint Union, Bei dieser Anweisung teilt dem Compiler: “Ich werde einen Platz für den Datentyp mit einer maximalen Abfragespeicher reservieren, und ich werde selbst sortieren, wie und welchen Wert in sie zu setzen”.

Gewerkschaft – ist ein Datenformat, die ähnlich Struktur. es (Gewerkschaft) der Lage, in einen reservierten Speicherbereich verschiedene Arten von Daten speichert,. Aber zu einem bestimmten Zeitpunkt wird in Verbindung nur eine dieser Datentypen gespeichert und kann nur den Wert des Elements verwenden (Komponente). Syntaktisch definieren, die Union als (sehr ähnlich wie die Definition der Struktur):

Zugriff auf die Elemente der Vereinigung ist die gleiche, sowie auf die Elemente der Strukturen: Der Name des Vereins Hostenko

500

Сервер столкнулся с внутренней ошибкой и не может выполнить ваш запрос.

Сервер зіткнувся з внутрішньою помилкою і не може виконати ваш запит.

The server encountered an internal error and was unable to complete your request.