Komputery ze współczesnym światem

§1 Ogólne informacje o języku. Etapy projektowania programu

Język programowania C++

Ostatnia aktualizacja: 28.08.2017

Język programowania C++ to wysokopoziomowy, statycznie wpisany, skompilowany język programowania ogólnego przeznaczenia, odpowiedni do tworzenia szerokiej gamy aplikacji. Obecnie C++ jest jednym z najpopularniejszych i najbardziej rozpowszechnionych języków.

Ma swoje korzenie w języku C, który został opracowany w latach 1969-1973 w Bell Labs przez programistę Dennisa Ritchiego. We wczesnych latach 80-tych duński programista Bjarne Stroustrup, pracujący wówczas w Bell Labs, opracował C++ jako rozszerzenie języka C. Tak naprawdę na początku C++ po prostu uzupełniał język C o pewne możliwości programowania obiektowego. I dlatego sam Stroustrup początkowo nazwał to „C z klasami”.

Następnie nowy język zaczął zyskiwać na popularności. Dodano do niego nowe funkcje, które sprawiły, że stał się nie tylko dodatkiem do C, ale zupełnie nowym językiem programowania. W rezultacie nazwę „C z klasami” zmieniono na C++. Odtąd oba języki zaczęły się rozwijać niezależnie od siebie.

C++ jest potężny język, odziedziczywszy bogate możliwości pracy z pamięcią z C. Dlatego C++ często znajduje zastosowanie w programowaniu systemów, w szczególności przy tworzeniu systemów operacyjnych, sterowników, różnych narzędzi, programów antywirusowych itp. Nawiasem mówiąc, system operacyjny Windows jest w większości napisany w języku C++. Ale tylko aplikacja do programowania systemowego tego języka bez limitu. C++ można używać w programach na każdym poziomie, gdzie ważna jest szybkość i wydajność. Często służy do tworzenia aplikacje graficzne, różne programy użytkowe. Szczególnie często wykorzystuje się go także do tworzenia gier z bogatą, bogatą wizualizacją. Poza tym w Ostatnio Kierunek mobilny nabiera tempa, gdzie swoje zastosowanie znalazł także C++. Nawet przy tworzeniu stron internetowych możesz także używać C++ do tworzenia aplikacji internetowych lub niektórych usług pomocniczych obsługujących aplikacje internetowe. Ogólnie rzecz biorąc, C++ jest powszechnie używanym językiem, w którym można stworzyć niemal każdy typ programu.

C++ jest językiem kompilowanym, co oznacza, że ​​kompilator tłumaczy kod źródłowy C++ na plik wykonywalny zawierający zestaw instrukcji maszynowych. Jednak różne platformy mają swoją własną charakterystykę, więc skompilowanych programów nie można po prostu przenieść z jednej platformy na drugą i tam uruchomić. Jednak na poziomie kodu źródłowego programu w C++ w większym stopniu Są przenośne, jeśli nie używasz żadnych funkcji specyficznych dla bieżącego systemu operacyjnego. A dostępność kompilatorów, bibliotek i narzędzi programistycznych dla prawie wszystkich popularnych platform pozwala na kompilowanie tego samego kodu źródłowego C++ w aplikacje dla tych platform.

W przeciwieństwie do C, język C++ umożliwia pisanie aplikacji w stylu obiektowym, reprezentując program jako zbiór klas i obiektów wchodzących w interakcję ze sobą. Co upraszcza tworzenie dużych aplikacji.

Główne etapy rozwoju

W latach 1979-80 Bjarne Stroustrup opracował rozszerzenie języka C - „C z klasami”. W 1983 roku zmieniono nazwę języka na C++.

W 1985 roku ukazała się pierwsza komercyjna wersja języka C++, a także pierwsze wydanie książki „The C++ Programming Language”, która stanowiła pierwszy opis tego języka w przypadku braku oficjalnego standardu.

Został wydany w 1989 roku nowa wersja Język C++ 2.0, który zawiera szereg nowych funkcji. Następnie język rozwijał się stosunkowo powoli, aż do 2011 roku. Ale jednocześnie w 1998 r. podjęto pierwszą próbę standaryzacji języka przez organizację ISO (Międzynarodowa Organizacja Normalizacyjna). Pierwszy standard nosił nazwę ISO/IEC 14882:1998, w skrócie C++98. Następnie w 2003 roku opublikowano nową wersję standardu C++03.

W 2011 roku ukazało się nowy standard C++11, który zawierał wiele dodatków i wzbogacał język C++ o dużą liczbę nowych funkcjonalności. Następnie w 2014 roku wydano niewielki dodatek do standardu, znany również jako C++ 14. Kolejna kluczowa wersja tego języka zaplanowana jest na rok 2017.

Kompilatory i środowiska programistyczne

Do tworzenia programów w C++ potrzebny jest kompilator - tłumaczy on kod źródłowy w C++ na plik wykonywalny, który można następnie uruchomić. Ale w tej chwili istnieje wiele różnych kompilatorów. Mogą się one różnić w różnych aspektach, w szczególności w zakresie wdrażania standardów. Podstawową listę kompilatorów dla C++ można znaleźć na Wikipedii. Do programowania zaleca się wybranie tych kompilatorów, które opracowują i wdrażają wszystkie najnowsze standardy. Dlatego w tym samouczku będziemy głównie używać ogólnodostępnego kompilatora g++ opracowanego w ramach projektu GNU.

Do tworzenia programów możesz także używać IDE, takich jak Visual Studio, Netbeans, Eclipse, Qt itp.

C++ (czytaj c-plus-plus) to skompilowany, statycznie typowany język programowania ogólnego przeznaczenia, w którym można tworzyć programy o dowolnym poziomie złożoności.
Od ponad 20 lat język ten znajduje się w gronie trzech najpopularniejszych i najbardziej poszukiwanych języków programowania. (Możesz to sprawdzić odwiedzając stronę internetową TIOBE).
Język powstał na początku lat 80. XX wieku, kiedy pracownik Bell Labs, Björn Stroustrup, wprowadził szereg ulepszeń języka C na własne potrzeby.

Bjarne Stroustrup – twórca języka C++

Stroustrup zdecydował się rozszerzyć język C o możliwości, jakie daje język Simula. Język C jako język bazowy Systemy UNIX, na którym działały komputery Bell, jest szybki, bogaty w funkcje i przenośny. Stroustrup dodał możliwość pracy z klasami i obiektami. W rezultacie praktyczne problemy modelowania okazały się łatwe do rozwiązania zarówno pod względem czasu programowania (dzięki zastosowaniu klas typu Simula), jak i czasu obliczeń (dzięki szybkości C).
Oto jak mówi o tym sam twórca języka:



W 1998 roku komitet normalizacyjny opublikował pierwszy standard językowy, znany jako C++ 98. C++ wciąż ewoluuje, aby sprostać dzisiejszym wymaganiom. Jedną z grup rozwijających język C++ i zgłaszających propozycje jego udoskonalenia do Komitetu Standardów C++ jest Zwiększyć, która zajmuje się między innymi ulepszaniem możliwości języka poprzez dodanie do niego funkcji metaprogramowania. Najnowszy standard został wydany w 2017 roku i nosi nazwę C++17. Na kolejny standard nie trzeba długo czekać i oczekuje się, że pojawi się w 2020 roku.
Nikt nie ma praw do języka C++; jest on bezpłatny. W marcu 2016 roku w Rosji powstała grupa robocza WP21 C++. Grupa została zorganizowana w celu zbierania propozycji standardu C++, przesyłania ich do komisji i obrony na walnych zgromadzeniach Międzynarodowej Organizacji Normalizacyjnej.
C++ jest językiem wieloparadygmatowym (od słowa paradygmat – styl pisania programy komputerowe), w tym szeroką gamę różnych stylów i technologii programowania. Często jest klasyfikowany jako język obiektowy, ale ściśle rzecz biorąc, tak nie jest. W trakcie pracy programista otrzymuje całkowitą swobodę w doborze narzędzi, tak aby rozwiązany problem przy zastosowaniu określonego podejścia został rozwiązany możliwie najskuteczniej. Innymi słowy, C++ nie zmusza programisty do trzymania się tylko jednego stylu tworzenia programu (na przykład zorientowanego obiektowo).
C++ ma bogatą bibliotekę standardową, która zawiera typowe kontenery i algorytmy, operacje we/wy, wyrażenia regularne, obsługę wielowątkowości i inne funkcje. C++ wywarło wpływ na wiele języków programowania, m.in.: Java, C#, D. Ponieważ C++ należy do rodziny języków opartych na składni języka C, można łatwo opanować inne języki programowania z tej rodziny: JavaScript, PHP , Perl, Objective-C i wiele innych. itp., w tym sam język macierzysty - C. ()
W trakcie swojego istnienia język C++ narobił utrwalonych mitów, które łatwo obalić (patrz tutaj: część 1 i część 2)

Historia wydania języka i standardów

1983

Twórcą języka jest Björn Stroustrup, pracownik Bell Labs, wprowadził wczesną wersję języka C++ („C z klasami”)

1985

Pierwsza komercyjna wersja języka C++. Język ten przyjmuje swoją współczesną nazwę

1986

Wydanie pierwszego wydania The C++ Programming Language - książki poświęconej C++ napisanej przez Björna Stroustrupa

1998

Ratyfikowano międzynarodowy standard dla języka C++: ISO/IEC 14882:1998 „Standard dla języka programowania C++”

2003
2005

Opublikowano Raport Techniczny Biblioteki 1 (TR1). Chociaż nie jest to oficjalnie część standardu, w raporcie opisano rozszerzenia biblioteka standardowa, który powinien znaleźć się w kolejnej wersji języka C++

2011

Wydanie nowego standardu – C++11 lub ISO/IEC 14882:2011; nowy standard obejmował dodatki do rdzenia języka i rozszerzenie biblioteki standardowej, obejmującej większość TR1

2014

Wydanie standardu C++14 („Międzynarodowa norma ISO/IEC 14882:2014(E) Język programowania C++”); C++ 14 można postrzegać jako małe rozszerzenie w stosunku do C++ 11, zawierające głównie poprawki błędów i drobne ulepszenia

2017

Wydanie nowego standardu – C++1z (C++17). Norma ta wprowadziła wiele zmian i uzupełnień. Przykładowo STD zawierał biblioteki standardu C11, system plików, oparty na boost::filesystem, dużej części eksperymentalnej biblioteki TS I.

2020

C++20 to nieoficjalna nazwa normy ISO/IEC dla języka programowania C++, który ma nastąpić po C++17. Projekt standardu N4800.

Filozofia C++

W swojej książce The Design and Evolution of C++ (2007) Björn Stroustrup opisuje zasady, którymi kierował się projektując C++ (w skrócie):

  • Zdobądź język ogólnego przeznaczenia ze statycznymi typami danych, wydajnością i przenośnością języka C.
  • Bezpośrednio i kompleksowo wspierają różnorodne style programowania.
  • Daj programiście swobodę wyboru, nawet jeśli daje mu to możliwość dokonania błędnego wyboru.
  • Zachowaj jak największą kompatybilność z C, umożliwiając w ten sposób łatwe przejście z programowania w C.
  • Unikaj rozbieżności pomiędzy C i C++: każda konstrukcja obowiązująca w obu językach musi oznaczać to samo w każdym z nich i prowadzić do tego samego zachowania programu.
  • Unikaj funkcji zależnych od platformy lub nieuniwersalnych.
  • „Nie płać za to, czego nie używasz” – żadna funkcja językowa nie powinna powodować spadku wydajności programów, które z niej nie korzystają.
  • Nie wymagają zbyt skomplikowanego środowiska programistycznego.

C i C++

Składnia języka C++ jest dziedziczona z języka C. Choć formalnie jedną z zasad C++ pozostaje zachowanie zgodności z językiem C, w rzeczywistości grupy normalizacyjne dla tych języków nie współdziałają, a zmiany, które wprowadzają, nie tylko nie korelują, ale często są sobie w zasadniczy sposób sprzeczne ideologicznie. Zatem elementy, które nowe standardy C dodają do jądra, znajdują się w standardowych elementach C++ standardowej biblioteki i w ogóle ich nie ma, na przykład tablice dynamiczne, tablice o stałych granicach, narzędzia do przetwarzania równoległego. Według Stroustrupa połączenie rozwoju tych dwóch języków byłoby bardzo korzystne, ale ze względów politycznych jest mało prawdopodobne. Zatem praktyczna kompatybilność między C i C++ będzie stopniowo tracona.
W w tym przykładzie, w zależności od użytego kompilatora, zostanie wyświetlone „C++” lub „C”:

Program 9.1

#włączać int main() ( printf("%s\n", (sizeof("a") == sizeof(char)) ? "C++": "C"); return 0; )

Wynika to z faktu, że stałe znakowe w C są typu int, a w C++ typu char, jednak rozmiary tych typów są różne.

Modele cyklu życia aplikacji

Koło życia oprogramowanie– to okres, który rozpoczyna się od chwili podjęcia decyzji o potrzebie tworzenia Produkt oprogramowania i kończy się z chwilą jego całkowitego wycofania z eksploatacji. Cykl ten to proces tworzenia i rozwijania oprogramowania. Istnieje kilka modeli koło życia.
Model kaskadowy cykl życia (angielski model wodospadu) został zaproponowany w 1970 roku przez Winstona Royce’a. Zapewnia sekwencyjną realizację wszystkich etapów projektu w ściśle ustalonej kolejności. Przejście do kolejnego etapu oznacza całkowite zakończenie prac z poprzedniego etapu. Wymagania zdefiniowane na etapie tworzenia wymagań są ściśle dokumentowane w formularzu zakres obowiązków i są rejestrowane przez cały okres realizacji projektu. Każdy etap kończy się wydaniem kompletnego zestawu dokumentacji wystarczającej do kontynuacji rozwoju przez inny zespół programistów.
Etapy projektu według modelu wodospadu:

  1. Tworzenie wymagań;
  2. Projekt;
  3. Realizacja;
  4. Testowanie;
  5. Realizacja;
  6. Obsługa i konserwacja.

W modelu kaskadowym przejście z jednej fazy projektu do drugiej zakłada, że ​​wynik poprzedniej fazy jest całkowicie poprawny. W dużych projektach jest to prawie niemożliwe do osiągnięcia. Dlatego ten model nadaje się tylko do opracowania małego projektu. (Sam W. Royce nie trzymał się tego modelu i posługiwał się modelem iteracyjnym).
Model iteracyjny
Alternatywą dla modelu kaskadowego jest model rozwoju iteracyjnego i przyrostowego (IID), który otrzymał od T. Gilba w latach 70. XX wieku. nazwa modelu ewolucyjnego. Model IID polega na rozbiciu cyklu życia projektu na sekwencję iteracji, z których każda przypomina „miniprojekt”, obejmujący wszystkie procesy rozwojowe stosowane w celu stworzenia mniejszych fragmentów funkcjonalności w porównaniu z projektem jako całością. Celem każdej iteracji jest uzyskanie działającej wersji systemu oprogramowania, w tym funkcjonalność zdefiniowaną przez zintegrowaną treść wszystkich poprzednich i bieżących iteracji. Wynik końcowej iteracji zawiera całą wymaganą funkcjonalność produktu. Zatem po zakończeniu każdej iteracji produkt otrzymuje przyrost - przyrost - swoich możliwości, które w związku z tym rozwijają się ewolucyjnie.


W większości nowoczesnych metodologii programowania wdrażane są różne warianty podejścia iteracyjnego:

Proces rozwoju — racjonalny ujednolicony proces (RUP)

Racjonalny ujednolicony proces (RUP)(racjonalny ujednolicony proces) to metodologia tworzenia oprogramowania utrzymywana przez firmę Rational Software (IBM). Metodologia dostarcza rekomendacji dla wszystkich etapów rozwoju: od modelowania biznesowego po testowanie i uruchomienie gotowego programu. Jako język modelowania używany jest Unified Modeling Language (UML).
Kompletny cykl życia produktu składa się z czterech faz, z których każda obejmuje jedną lub więcej iteracji.

  • Etap początkowy (Incepcja)
  • Określenie zakresu projektu i ilości wymaganych zasobów. Określane są podstawowe wymagania, ograniczenia i kluczowa funkcjonalność produktu. Ocenia się ryzyko. Planowanie działań. Na koniec fazy początkowej ocenia się osiągnięcie kamienia milowego celu cyklu życia, co zakłada zgodę pomiędzy interesariuszami na kontynuację projektu.

  • Wyjaśnienie
  • Dokumentowanie wymagań. Projektowanie, wdrażanie i testowanie architektury wykonywalnej. Wyjaśnienie warunków i kosztów. Redukcja kluczowych ryzyk. Pomyślne zakończenie fazy rozwojowej oznacza osiągnięcie kamienia milowego w zakresie architektury cyklu życia.

  • Budowa
  • W fazie „Budowania” wdrażana jest większość funkcjonalności produktu: gotowy jest projekt aplikacji, pisany jest kod źródłowy. Faza kompilacji kończy się wraz z wydaniem pierwszej zewnętrznej wersji systemu i osiągnięciem kamienia milowego w postaci początkowej zdolności operacyjnej.

  • Wstęp
  • W fazie „Wdrożenia” tworzona jest ostateczna wersja produktu, która jest przekazywana od dewelopera do klienta. Obejmuje to program testów beta, szkolenie użytkowników i określenie jakości produktu. W przypadku, gdy jakość nie spełnia oczekiwań użytkownika lub kryteriów postawionych w fazie Start, faza Wdrożenia jest powtarzana ponownie. Osiągnięcie wszystkich celów oznacza osiągnięcie kamienia milowego dotyczącego wydania produktu i ukończenie pełnego cyklu rozwoju.



« Technologia informacyjna. Inżynieria systemów i oprogramowania. Procesy cyklu życia oprogramowanie„. Norma ta została przyjęta przez Federalną Agencję Regulacji Technicznych i Metrologii Federacji Rosyjskiej i jest podobna do międzynarodowej normy ISO/IEC 12207:2008. Ta norma, ustanawia ogólne ramy procesów cyklu życia oprogramowania, które można wykorzystać do kierowania branżą oprogramowania. Standard nie oferuje konkretny model koło życia. Jej postanowienia są wspólne dla wszelkich modeli cyklu życia, metod i technologii tworzenia oprogramowania. Opisuje strukturę procesów cyklu życia bez określenia sposobu realizacji lub zakończenia działań i zadań wchodzących w skład tych procesów.

Prezentacja na lekcję
Tematy wiadomości
  • Fundacja Wolnego Oprogramowania (FSF)
  • Licencje wolnego oprogramowania
  • Wolne oprogramowanie i otwarte oprogramowanie
  • Historia rozwoju języków programowania
  • Historia języka C. C i C++
  • Fabuła
  • Krytyka C++
  • Historia UNIX-a
  • Spiralny model cyklu życia oprogramowania
  • UML (ujednolicony język modelowania)
  • Ramy rozwiązań firmy Microsoft
  • IDE do programowania C/C++ w systemie Windows
  • Kompilatory C/C++
  • Tworzenie aplikacji konsolowej w systemie Windows
pytania
  1. Dlaczego w dużych projektach nie stosuje się kaskadowego modelu wytwarzania oprogramowania?
  2. Jaka jest różnica między modelami programowania kaskadowego i iteracyjnego?
  3. Wymień etapy tworzenia oprogramowania w metodologii Rational Unified Process (RUP).

1. Wstęp

Programowanie wymaga nowych uniwersalnych modeli algorytmicznych, a sprzęt implementuje algorytmy nie tylko w innej postaci, ale także w oparciu o inny model algorytmiczny – automaty. Zapożyczanie technologii z rozwoju sprzętu jest kluczową ideą programowania automatów. Jednak synteza urządzeń cyfrowych różni się od programowania. Jednak pożyczając model, z jednej strony nie zaleca się jego znaczących zmian, z drugiej zaś nie można ignorować istniejącej już teorii i praktyki programowania.

Następnie przyjrzymy się technologii SWITCH do projektowania programów automatów, w których cały czas spotykamy się z podobnymi procesami. Z jednej strony zmieniło to model maszyny skończonej tak bardzo, że faktycznie wyniosło go poza zakres teorii automatów. Z drugiej strony wprowadza do programowania koncepcje, które programistom są trudne do dostrzeżenia, a czasami są po prostu zbędne, bo istnieją bardziej znane analogie z teorii programu i praktyki programowania.

Za podstawę do omówienia problemów programowania automatycznego przyjmiemy niedawny wykład Shalyto A.A. i jego artykuły o „programowaniu” w stronę definicji paradygmatu programowania automatycznego.

W tym artykule omówiono funkcję scanf() w sposób ogólny, bez odniesienia do konkretnego standardu, dlatego uwzględniono tutaj dane z dowolnych standardów C99, C11, C++11, C++14. Możliwe, że w niektórych standardach funkcja działa inaczej niż w materiale przedstawionym w artykule.

Funkcja scanf C - opis

scanf() to funkcja zlokalizowana w pliku nagłówkowym stdio.h(C) i cstdio(C++), nazywana jest także sformatowanym wejściem do programu. scanf odczytuje znaki ze standardowego wejścia (stdin) i konwertuje je zgodnie z formatem, a następnie zapisuje je do określonych zmiennych. Format oznacza, że ​​dane po otrzymaniu są redukowane do określonej formy. W ten sposób opisano funkcję scanf C:

scanf("%format", &zmienna1[, &zmienna2,[…]]),

gdzie zmienne są przekazywane jako adresy. Powód przekazywania zmiennych do funkcji w ten sposób jest oczywisty: w wyniku jej działania zwraca ona wartość wskazującą na obecność błędów, zatem jedynym sposobem na zmianę wartości zmiennych jest przekazanie przez adres. Ponadto dzięki tej metodzie funkcja może przetwarzać dane dowolnego typu.

Niektórzy programiści wywołują funkcje takie jak procedury scanf() lub printf() ze względu na analogie z innymi językami.

Scanf umożliwia wprowadzenie wszystkich podstawowych typów języków: char, int, float, string itp. W przypadku zmiennych typu string nie ma konieczności podawania znaku adresu - „&”, gdyż zmienna typu string jest tablicą, a jej nazwa jest adresem pierwszego elementu tablicy w pamięci komputera .

Format wprowadzania danych lub ciąg sterujący

Zacznijmy od przyjrzenia się przypadkowi użycia funkcje scanf C z opisu.

#włączać int main() ( int x; while (scanf("%d", &x) == 1) printf("%d\n", x); return 0; //wymaganie dla systemów Linux )

Format wejściowy składa się z następujących czterech parametrów: typ %[*][szerokość][modyfikatory]. W tym przypadku wymaganymi parametrami są znak „%” i typ. Oznacza to, że minimalny format wygląda następująco: „%s”, „%d” i tak dalej.

Ogólnie znaki tworzące ciąg formatujący dzielą się na:

  • specyfikatory formatu - wszystko, co zaczyna się od symbolu %;
  • znaki oddzielające lub białe znaki - są to spacja, tabulator (\t), nowa linia (\n);
  • znaki inne niż białe znaki.

Funkcja może być niebezpieczna.

Użyj scanf_s() zamiast scanf().

(wysłane przez Visual Studio)

Specyfikatory typu lub formatu, znaki konwersji lub znaki sterujące

Opis scanf C musi zawierać co najmniej specyfikator formatu, który jest wskazywany na końcu wyrażeń rozpoczynających się znakiem „%”. Informuje program, jakiego typu danych należy się spodziewać po ich wprowadzeniu, zwykle z klawiatury. Lista wszystkich specyfikatorów formatu znajduje się w poniższej tabeli.

Oznaczający

Program oczekuje na wprowadzenie znaku. Zmienna do zapisania musi być typu znakowego char.

Program oczekuje na wprowadzenie danych liczba dziesiętna cały typ. Zmienna musi być typu int.

Program oczekuje liczby zmiennoprzecinkowej w postaci wykładniczej. Zmienna musi być typu float.

Program oczekuje wprowadzenia liczby zmiennoprzecinkowej. Zmienna musi być typu float.

7

Program oczekuje wprowadzenia liczby zmiennoprzecinkowej. Zmienna musi być typu float.

Program oczekuje wprowadzenia liczby ósemkowej. Zmienna musi być typu int.

Program oczekuje na wprowadzenie ciągu znaków. Za ciąg znaków uważa się zbiór dowolnych znaków aż do pierwszego napotkanego znaku ogranicznika. Zmienna musi być typu string.

Program oczekuje wprowadzenia liczby szesnastkowej. Zmienna musi być typu int.

Zmienna oczekuje danych wejściowych wskaźnika. Zmienna musi być typem wskaźnika.

Zapisuje do zmiennej wartość całkowitą równą liczbie znaków odczytanych do tej pory przez funkcję scanf.

Program odczytuje liczbę całkowitą bez znaku. Typ zmiennej musi być liczbą całkowitą bez znaku.

Program oczekuje na wprowadzenie liczby binarnej. Zmienna musi być typu int.

Zestaw znaków możliwych do zeskanowania. Program czeka na wprowadzenie znaków z ograniczonej puli określonej pomiędzy scanf i będzie działać tak długo, jak długo w strumieniu wejściowym znajdują się znaki z określonego zestawu.

Znaki w ciągu formatującym

Gwiazdka (*)

Gwiazdka (*) to flaga wskazująca, że ​​operacja przypisania powinna zostać pominięta. Gwiazdka jest umieszczana bezpośrednio po znaku „%”. Na przykład,

Scanf("%d%*c%d", &x, &y); //ignoruj ​​znak pomiędzy dwiema liczbami całkowitymi. scanf("%s%*d%s", str, str2); //ignoruj ​​liczbę całkowitą pomiędzy dwoma ciągami znaków.

Oznacza to, że jeśli wpiszesz w konsoli wiersz „45-20”, program wykona następujące czynności:

  1. Zmiennej „x” zostanie przypisana wartość 45.
  2. Zmiennej „y” zostanie przypisana wartość 20.
  3. Znak minus (myślnik) „-” zostanie zignorowany dzięki „%*c”.

Szerokość (lub szerokość pola)

Jest to liczba całkowita zawarta między znakiem „%” a specyfikatorem formatu, który określa maksymalną liczbę znaków do odczytania podczas bieżącej operacji odczytu.

Jest kilka rzeczy, o których należy pamiętać ważne punkty:

  1. scanf przestanie działać, jeśli napotka znak ogranicznika, nawet jeśli nie naliczył 20 znaków.
  2. Jeżeli dane wejściowe zawierają więcej niż 20 znaków, do zmiennej str zostanie zapisanych tylko pierwszych 20 z nich.

Modyfikatory typu (lub precyzja)

Są to specjalne flagi modyfikujące typ danych oczekiwanych na wejściu. Flaga jest określona po lewej stronie specyfikatora typu:

  • L lub l (małe L) W przypadku użycia „l” ze specyfikatorami d, i, o, u, x, flaga informuje program, aby oczekiwał wprowadzenia danych typu long int. W przypadku użycia „l” ze specyfikatorem e lub f flaga informuje program, że powinien spodziewać się wprowadzenia podwójnej wartości. Użycie „L” informuje program, że oczekiwana jest wartość typu long double. Użycie „l” ze specyfikatorami „c” i „s” informuje program, że oczekiwane są znaki dwubajtowe typu wchar_t. Na przykład „%lc”, „%ls”, „%l”.
  • h jest flagą wskazującą typ short.
  • gg - wskazuje, że zmienna jest wskaźnikiem do wartości typu znak ze znakiem lub znak bez znaku. Flagi można używać ze specyfikatorami d, i, o, u, x, n.
  • ll (dwa małe L) - wskazuje, że zmienna jest wskaźnikiem do wartości typu Sign int lub unsigned long long int. Flaga jest używana ze specyfikatorami: d, i, o, u, x, n.
  • j - oznacza, że ​​zmienna jest wskaźnikiem do wpisania intmax_t lub uintmax_t z pliku nagłówkowego stdint.h. Używane ze specyfikatorami: d, i, o, u, x, n.
  • z - oznacza, że ​​zmienna jest wskaźnikiem do typu size_t, którego definicja znajduje się w stddef.h. Używane ze specyfikatorami: d, i, o, u, x, n.
  • t - oznacza, że ​​zmienna jest wskaźnikiem do typu ptrdiff_t. Definicja tego typu znajduje się w pliku stddef.h. Używane ze specyfikatorami: d, i, o, u, x, n.

Obraz z modyfikatorami można wyraźniej przedstawić w formie tabeli. Ten opis scanf C będzie bardziej przejrzysty dla programistów.

Inne postaci

Wszelkie znaki napotkane w formacie zostaną odrzucone. Warto zauważyć, że obecność białych znaków lub znaków ograniczających (nowej linii, spacji, tabulacji) w ciągu kontrolnym może powodować odmienne zachowanie funkcji. W jednej wersji funkcja scanf() będzie czytać bez zapisywania jakiejkolwiek liczby ograniczników, dopóki nie napotka znaku innego niż ogranicznik, a w innej wersji spacje (tylko one) nie mają znaczenia i wyrażenie „%d + %d” jest równoważne do „% d+%d”.

Przykłady

Przyjrzyjmy się kilku przykładom, które pomogą Ci przemyśleć i dokładniej zrozumieć, jak działa ta funkcja.

Scanf("%3s", str); //jeśli wpiszesz w konsoli wiersz „1d2s3d1;3”, do str scanf("%dminus%d", &x, &y" zostanie zapisane tylko "1d2"); //znaki minusowe między dwiema liczbami zostaną odrzucone scanf("%5", str); //znaki będą wprowadzane do str, dopóki nie będzie ich 5, a znaki będą liczbami od 0 do 9. scanf("%lf", &d); //oczekiwane wejście typu double scanf("%hd", &x); //oczekuj liczby typu short scanf("%hu", &y); //oczekuj liczby typu unsigned short scanf("lx", &z); //oczekiwana liczba typu long int

Z powyższych przykładów możesz zobaczyć, jak zmienia się oczekiwana liczba za pomocą różne postacie.

scanf C - opis dla początkujących

Ta sekcja będzie przydatna dla początkujących. Często trzeba mieć pod ręką nie tyle pełny opis scanf C, co raczej szczegóły działania tej funkcji.

  • Funkcja jest nieco przestarzała. Istnieje kilka różnych implementacji w bibliotekach różnych wersji. Przykładowo ulepszona funkcja scanf S C, której opis można znaleźć na stronie Microsoftu.
  • Liczba specyfikatorów w formacie musi odpowiadać liczbie argumentów przekazanych do funkcji.
  • Elementy strumienia wejściowego należy oddzielić jedynie znakami rozdzielającymi: spacją, tabulatorem, nową linią. Przecinek, średnik, kropka itp. - znaki te nie są ogranicznikami dla funkcji scanf().
  • Jeśli scanf napotka znak ogranicznika, wprowadzanie zostanie zatrzymane. Jeśli do odczytania jest więcej niż jedna zmienna, scanf przejdzie do odczytu następnej zmiennej.
  • Najmniejsza rozbieżność w formacie danych wejściowych prowadzi do nieprzewidywalnych wyników programu. Dobrze, jeśli program po prostu kończy się błędem. Ale często program nadal działa i robi to niepoprawnie.
  • scanf("%20s...", ...); Jeśli strumień wejściowy przekracza 20 znaków, scanf odczyta pierwsze 20 znaków i albo zakończy działanie, albo przejdzie dalej, aby odczytać następną zmienną, jeśli została określona. Następne wywołanie scanf będzie kontynuować odczytywanie strumienia wejściowego od miejsca, w którym poprzednie wywołanie scanf zostało przerwane. Jeśli podczas odczytu pierwszych 20 znaków napotkany zostanie znak ogranicznika, scanf przestanie działać lub przejdzie do odczytu następnej zmiennej, nawet jeśli nie odczytał 20 znaków dla pierwszej zmiennej. W takim przypadku wszystkie niezliczone znaki zostaną dołączone do kolejnej zmiennej.
  • Jeśli zestaw znaków do przeskanowania zaczyna się od znaku „^”, wówczas scanf będzie czytać dane, aż napotka znak ogranicznika lub znak z zestawu. Na przykład „%[^A-E1-5]” będzie odczytywać dane ze strumienia do momentu napotkania jednego z wielkich angielskich znaków od A do E lub jednej z cyfr od 1 do 5.
  • Jak opisano, funkcja scanf C zwraca liczbę równą pomyślnej liczbie wpisów do zmiennych. Jeśli scanf zapisze 3 zmienne, to wynikiem pomyślnego działania funkcji będzie powrót liczby 3. Jeśli scanf nie mógł zapisać żadnej zmiennej, to wynikiem będzie 0. I wreszcie, jeśli scanf nie mógł rozpocząć pracy w wszystko z jakiegoś powodu, wynikiem będzie EOF .
  • Jeśli funkcja scanf() nie zakończyła poprawnie swojej pracy. Na przykład scanf("%d", &x) — oczekiwano liczby, ale jako dane wejściowe otrzymano symbole. Następne wywołanie funkcji scanf() rozpocznie się od punktu w strumieniu wejściowym, w którym zakończyło się poprzednie wywołanie funkcji. Aby pokonać ten problem, musisz pozbyć się problematycznych postaci. Można to zrobić na przykład wywołując scanf("%*s"). Oznacza to, że funkcja odczyta ciąg znaków i wyrzuci go. W ten sprytny sposób możesz kontynuować wprowadzanie wymaganych danych.
  • Niektóre implementacje funkcji scanf() nie pozwalają na użycie „-” w skanowanym zestawie znaków.
  • Specyfikator „%c” odczytuje każdy znak ze strumienia. Oznacza to, że odczytuje także znak ogranicznika. Aby pominąć znak ogranicznika i kontynuować czytanie żądanego znaku, możesz użyć „%1s”.
  • Używając specyfikatora „c”, dopuszczalne jest użycie szerokości „%10c”, ale wówczas należy przekazać tablicę elementów typu char jako zmienną do funkcji scanf.
  • „%” oznacza „wszystkie małe litery alfabetu angielskiego”, a „%” oznacza po prostu 3 znaki: „z”, „a”, „-”. Innymi słowy, znak „-” oznacza zakres tylko wtedy, gdy pojawia się pomiędzy dwoma znakami ułożonymi we właściwej kolejności. Jeśli „-” znajduje się na końcu wyrażenia, na początku lub w niewłaściwej kolejności znaków po obu jego stronach, oznacza to po prostu znak łącznika, a nie zakres.

Wniosek

Na tym kończy się opis scanf C. Jest to dobra, wygodna funkcja do pracy w małych programach i podczas korzystania z proceduralnej metody programowania. Jednak główną wadą jest liczba nieprzewidywalnych błędów, które mogą wystąpić podczas korzystania ze scanf. Dlatego najlepiej jest mieć opis scanf C przed oczami podczas programowania. W dużych profesjonalnych projektach wykorzystuje się iostreamy ze względu na to, że mają możliwości wyższego rzędu, lepiej wyłapują i przetwarzają błędy, a także pracują ze znaczną ilością informacji. Należy również zauważyć, że opis scanf C w języku rosyjskim jest dostępny w wielu źródłach internetowych, a także przykłady jego użycia, ze względu na wiek funkcji. Dlatego w razie potrzeby zawsze możesz znaleźć odpowiedź na forach tematycznych.

Komputery są prawdopodobnie najbardziej wszechstronnymi narzędziami, jakie ludzkość ma do dyspozycji. Potrafią wykonywać niesamowite obliczenia, pozwalają przechowywać ogromną ilość informacji, zupełnie różnych części planety, a jednocześnie łatwo je wymieniać, niezależnie od lokalizacji. Komputery ułatwiają wiele codziennych zadań, umożliwiają automatyzację wielu rutynowych procesów, które dla człowieka byłyby bardzo żmudne i nudne. Jest tak wiele rzeczy, które komputery mogą zrobić, ale mimo to komputery nie mają inteligencji, w przeciwieństwie do ludzi. Aby zautomatyzować nawet najprostszy proces, trzeba jasno i jednoznacznie powiedzieć komputerowi, co dokładnie ma robić. Niestety, nasz język i język komputerowy są zupełnie inne. Zatem między maszyną a człowiekiem istnieje poważna bariera językowa, którą trzeba jakoś pokonać, w przeciwnym razie komputer nas nie zrozumie. I dopóki komputery nas nie rozumieją, same nic nie zrobią. Wynaleziono ogromną liczbę języków programowania jako środka komunikacji między człowiekiem a komputerem. Za pomocą języków programowania tworzymy programy, a komputer bezpośrednio z nimi współpracuje. Programy same w sobie są zbiorami instrukcji, które komputer może zrozumieć i wykonać.

Rodzaje programów

Aby skutecznie komunikować się z komputerem, a o to nam chodzi, istnieje szeroka gama języków programowania.

W zależności od rodzaju projektu, przy wyborze języka programowania należy wziąć pod uwagę wiele czynników. Oto lista najważniejszych czynników:

Kompilacja, interpretacja i kompilacja JIT

Proces kompilacji tłumaczy kod napisany w języku programowania na język natywny maszyny docelowej. Program wykonujący ten proces nazywa się kompilatorem. Kompilacja może sprawić, że kod będzie działał dość szybko, zwłaszcza jeśli kompilator skutecznie optymalizuje. Ale faktem jest, że powstały kod nie może działać na innych system operacyjny, a proces kompilacji zajmuje trochę czasu, a im więcej kodu, tym dłuższy proces kompilacji. Warto zaznaczyć, że wprowadzając jakiekolwiek zmiany w kodzie programu należy go skompilować i dopiero potem uruchomić.

Interpretowane języki programowania są odczytywane przez program zwany interpreterem i wykonywane przez ten sam program. Interpretowane języki programowania mogą działać na różnych systemach operacyjnych, podobnie jak interpreter i nie mają nawet długiego czasu kompilacji. Jednak programy napisane przy użyciu języków interpretowanych zwykle działają znacznie wolniej niż równoważne, skompilowane programy.

I wreszcie tak zwana kompilacja w locie (lub kompilacja JIT). Takie języki są szybko kompilowane w momencie uruchomienia programu. Programy pisane w językach JIT z reguły nie są optymalizowane, co przyspiesza proces kompilacji i przywraca równowagę pomiędzy wydajnością a kompatybilnością między platformami.

Wysoki lub niski poziom programowania

Języki niskiego poziomu przeważnie współpracują bezpośrednio ze sprzętem i dlatego najlepiej nadają się do pisania sterowników urządzeń. Sterowniki to programy sterujące sprzętem i mające do niego bezpośredni dostęp. Jednak program napisany w języku niskiego poziomu jest zwykle trudny do przeniesienia na inne platformy. Dlatego dla każdego systemu operacyjnego to samo urządzenie ma różne sterowniki. Języki programowania niskiego poziomu prawie zawsze się kompilują.

W językach wysokiego poziomu cała uwaga skupia się na pojęciu języka. Oznacza to, że taki język programowania powinien być łatwy do zrozumienia, na przykład powinien reprezentować dane w postaci tablic, ciągów znaków, obiektów itp. Język wysokiego poziomu jest zwykle łatwiejszy do zrozumienia niż język niskiego poziomu. Z reguły tworzenie programu w języku wysokiego poziomu jest znacznie łatwiejsze i szybsze niż w języku niskiego poziomu. Jak widać, różne poziomy programowania są zaprojektowane tak, aby całkowicie różne zadania i nie powinieneś porównywać funkcjonalności języków różnych poziomów, to nie ma sensu.

Systemy typów danych w języku programowania

Dla każdego języka programowania istnieje specyfikacja, która określa różne zasady, jakich muszą przestrzegać języki programowania. Niektóre języki nie mają typów danych, więc ich to nie dotyczy. Jednak większość języków (w tym C++) ma typy danych, więc te informacje będą dla Ciebie przydatne.

Silny lub słaby system typów danych

Słaby system wejściowy nie nakłada żadnych ograniczeń, programista musi to monitorować. Kiedy mówię „słaby system danych”, mam na myśli, że język z takim systemem danych nie reguluje ściśle dostępnych rzutowań typów danych. Na przykład, jeśli zamiast liczby przekażesz do funkcji mnożenia ciąg znaków lub symbol, języki programowania o nieścisłym typie wykonają taki kod, chociaż wynik mnożenia straci wszelkie znaczenie, ponieważ ciągu nie można pomnożyć przez numer. Co więcej, wynik wykonania tego bezsensownego mnożenia będzie nieprzewidywalny. Jeśli język programowania jest ściśle wpisany, to na etapie kompilacji tłumacz zgłosi błąd i zatrzyma proces budowania projektu. Na przykład,

// przykładowy program w C++ #include używając przestrzeni nazw std; int main())( char string = "przykład"; int liczba = 5; cout<< string * number << endl; // умножаем строку на число }

W rezultacie kompilator zgłosi błąd:

błąd: nieprawidłowe operandy typów „char” i „int” na binarny „operator*”

Spróbujemy zrobić to samo w języku programowania bez silnego typu - php. Pamiętaj, że nawet deklarując zmienne, nie musisz podawać typu danych.

Wynikiem wykonania tego kodu będzie zero. Nie wystąpi żaden błąd, chociaż wydaje się, że nie można pomnożyć ciągu przez liczbę. Ale w PHP wszystko jest możliwe. Kompilator języka PHP nie zgłosi błędu, skrypt zadziała i nawet wygeneruje wynik, a jeśli nasz program będzie składał się z 1000 linii kodu, to będzie nam trudno znaleźć ten błąd. Jest to żywy przykład języka programowania ze „słabym systemem typów danych”, to znaczy zapobieganie takim absurdalnym operacjom spoczywa wyłącznie na barkach programisty.

Zdefiniowany lub niezdefiniowany typ danych

Dotyczy to zarówno języków kompilowanych, jak i interpretowanych. Wiele języków wymaga jednoznacznego określenia rodzaju zmiennych, więc nie ma niepewności, kompilator i interpreter wyraźnie wiedzą, co robić. Niektóre języki programowania nie wymagają jednoznacznego określenia rodzaju zmiennych. Typ danych jest określany automatycznie na podstawie zawartości zmiennej.

Statyczny lub dynamiczny typ danych

Jeśli język jest pisany statycznie, kompilator/interpreter sprawdza typ raz przed procesem kompilacji/interpretacji. Jeśli typ danych jest dynamiczny, typy danych są sprawdzane w czasie wykonywania.

Bezpieczny lub niebezpieczny system typów danych

Mogą zaistnieć sytuacje, które mogą prowadzić do nieoczekiwanych wyników lub błędów. Bezpieczny język wprowadzi jak najwięcej ograniczeń, aby takie sytuacje nie miały miejsca. Podczas gdy niebezpieczny język nakłada całą odpowiedzialność na programistę.

Czynniki te mogą charakteryzować jeden lub kilka języków programowania.

Obsługiwane paradygmaty programowania

Paradygmaty programowania to metodologie lub sposoby programowania obsługiwane przez język programowania. Oto lista głównych paradygmatów:

Paradygmat deklaratywny

Deklaratywny język programowania będzie kładł większy nacisk na cel, a nie środki do osiągnięcia tego celu. Wystarczy wskazać, co należy osiągnąć, ale nie jest konieczne wskazanie, jakich środków użyć. Ten paradygmat zapobiega niepożądanym skutkom ubocznym, które mogą wystąpić podczas pisania własnego kodu.

Paradygmat funkcjonalny

Programowanie funkcjonalne jest podzbiorem programowania deklaratywnego, które próbuje rozwiązywać problemy za pomocą równań i funkcji matematycznych. Programowanie funkcjonalne traktuje zmienne i obiekty jako dane, które nie są współdzielone, w przeciwieństwie do języków imperatywnych.

Uogólniony paradygmat

Programowanie generyczne koncentruje się na pisaniu algorytmów pod względem typów danych, które należy zdefiniować. Oznacza to, że ten sam algorytm może pracować z różnymi typami danych. Takie podejście może być bardzo potężnym narzędziem, ale tylko jeśli zostanie dobrze wdrożone.

Paradygmat imperatywny

Języki imperatywne pozwalają programistom przekazać komputerowi uporządkowaną listę instrukcji potrzebnych do wykonania zadania. Imperatywne języki programowania kontrastują z deklaratywnymi językami programowania.

Paradygmat strukturalny

Języki programowania strukturalnego mają na celu zapewnienie jakiejś formy kodu — struktury hierarchicznej. Kiedy struktura kodu jest wyraźnie widoczna, kolejność wykonywania instrukcji staje się intuicyjnie jasna. Takie języki zazwyczaj zniechęcają do „przeskakiwania” z jednej części kodu do drugiej, np. znany nam wszystkim operator goto, który jest zdefiniowany w językach C i C++.

Paradygmat proceduralny

Proceduralny język programowania odnosi się do strukturalnych języków programowania, które wspierają koncepcję procedury lub podprogramu.

Paradygmat obiektowy

Programowanie obiektowe (czasami w skrócie OOP) to podzbiór programowania strukturalnego, który wyraża programy w kategoriach „obiektów”. Ten paradygmat pozwala na ponowne wykorzystanie kodu, a podejście to jest dość proste do zrozumienia.

Normalizacja

Czy języki mają oficjalny standard? Standaryzacja jest bardzo ważna, aby zapewnić bezkonfliktowe zrozumienie programu przez różnych kompilatorów/interpretatorów. Niektóre języki są standaryzowane przez Amerykański Narodowy Instytut Normalizacyjny (ANSI), inne są standaryzowane przez Międzynarodową Organizację Normalizacyjną (ISO). Wszystkie języki programowania muszą być ustandaryzowane, w przeciwnym razie nie będzie zgody co do tego, co jest poprawne, a co niepoprawne w składni.

Scharakteryzujmy język programowania C++

Teraz, gdy zbadaliśmy główne cechy języków programowania, ustalmy, które czynniki spełnia język programowania C++.

C++ jest językiem programowania zgodnym ze standardem ISO.

Przez pewien czas C++ nie miał oficjalnego standardu, jednak od 1998 roku C++ jest standaryzowany przez komitet ISO.

Język skompilowany C++.

C++ kompiluje się bezpośrednio do kodu maszynowego, co czyni go jednym z najszybszych języków na świecie.

C++ jest językiem silnie typowanym.

C++ zakłada, że ​​programista wie, co robi, i pozwala na niesamowitą liczbę możliwości, ograniczonych jedynie wyobraźnią.

C++ obsługuje statyczne i dynamiczne typy danych.

Zatem sprawdzanie typu danych można przeprowadzić w czasie kompilacji lub w czasie wykonywania. To po raz kolejny potwierdza elastyczność C++.

C++ obsługuje wiele paradygmatów.

C++ obsługuje paradygmaty programowania proceduralnego, generycznego i obiektowego oraz wiele innych paradygmatów.

C++ to przenośny język programowania.

Jako jeden z najczęściej używanych języków na świecie i jako język otwarty, C++ posiada szeroką gamę kompilatorów działających na różnych platformach. Kod biblioteki standardowej C++ będzie działał na wielu platformach.

C++ jest w pełni kompatybilny z językiem C

W C++ możesz używać bibliotek C i będą one działać poprawnie.

Powiązane publikacje