1. Wstęp

Programowanie wymaga nowych uniwersalnych modeli algorytmicznych, a sprzęt implementuje algorytmy nie tylko w innej postaci, ale także na podstawie innego modelu algorytmicznego - automatu. Pożyczanie technologii z rozwoju sprzętu jest kluczową ideą automatycznego programowania. Jednak synteza urządzenia cyfrowe różni się od programowania. Ale zapożyczając model z jednej strony nie jest pożądana jego istotna zmiana, az drugiej nie można nie brać pod uwagę istniejącej teorii i praktyki programowania.

Następnie rozważymy technologię SWITCH do projektowania automatycznych programów, w których cały czas spotykasz się z podobnymi procesami. Z jednej strony tak bardzo zmieniła model maszyna stanowa, co faktycznie wyniosło to poza zakres teorii automatów. A z drugiej strony wprowadza do programowania koncepcje, które programiści nie dostrzegają, a czasami są po prostu zbędne, ponieważ są bardziej znane analogie z teorii programów i praktyki programowania.

Jako podstawę do omówienia problemów automatycznego programowania przyjmujemy niedawny wykład Shalyto A.A. i jego "oprogramowania" do definicji paradygmatu programowania automatów.

C++ (wymawiane c-plus-plus) to skompilowany, statycznie typowany język programowania ogólnego przeznaczenia, którego można używać do tworzenia programów o dowolnym poziomie złożoności.
Od ponad 20 lat język ten znajduje się w pierwszej trójce najpopularniejszych i najbardziej pożądanych języków programowania. (Można to zweryfikować na stronie TIOBE).
Język powstał na początku lat 80., kiedy pracownik Bell Labs Björn Stroustrup wymyślił szereg ulepszeń języka C na własne potrzeby.

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

Stroustrup postanowił rozszerzyć język C o funkcje dostępne w języku Simula. Język C, będący podstawowym językiem systemu UNIX, na którym działały komputery Bell, jest szybki, bogaty w funkcje i przenośny. Stroustrup dodał do tego możliwość pracy z klasami i obiektami. W rezultacie praktyczne problemy modelowania okazały się dostępne zarówno pod względem czasu opracowania (dzięki wykorzystaniu klas typu Simula), jak i czasu obliczeń (ze względu na prędkość C).
Oto jak sam twórca języka mówi to:



W 1998 roku pierwszy standard językowy, znany jako C++98, został opublikowany przez komitet normalizacyjny. C++ wciąż ewoluuje, aby sprostać współczesnym wymaganiom. Jedną z grup, która rozwija język C++ i wysyła sugestie do komitetu normalizacyjnego C++, aby go ulepszyć, jest zwiększyć, który zajmuje się między innymi ulepszaniem możliwości języka poprzez dodawanie do niego funkcji metaprogramowania. Najnowszy standard został wydany w 2017 roku i nosi nazwę C++17. Kolejny standard nie potrwa długo i ma pojawić się w 2020 roku.
Nikt nie posiada praw do języka C++, jest bezpłatny. W marcu 2016 r. Rosja ustanowiła Grupa robocza WG21 C++. Grupa została zorganizowana w celu zebrania propozycji standardu C++, przedłożenia ich komitetowi i obrony ich na walnych zebraniach Międzynarodowej Organizacji Normalizacyjnej.
C++ to język wieloparadygmatyczny (od słowa paradygmat - styl pisania programy komputerowe), która obejmuje szeroką gamę różnych stylów i technologii programowania. Często mówi się o nim jako o języku obiektowym, ale ściśle rzecz biorąc, tak nie jest. W trakcie pracy programista uzyskuje absolutną swobodę w doborze narzędzi, aby problem rozwiązany przy użyciu takiego lub innego podejścia został rozwiązany tak skutecznie, jak to możliwe. Innymi słowy, C++ nie zmusza programisty do trzymania się tylko jednego stylu tworzenia programu (na przykład zorientowanego obiektowo).
C++ posiada bogatą bibliotekę standardową, która zawiera popularne kontenery i algorytmy, I/O, wyrażenia regularne, obsługa wielowątkowości i inne funkcje. C++ wpłynął na wiele języków programowania, w tym: Java, C#, D. Ponieważ C++ należy do rodziny języków opartych na składni języka C, inne języki programowania z tej rodziny można łatwo opanować: JavaScript , PHP, Perl, Objective-C i wiele innych. itp., w tym sam język ojczysty - C. ()
W czasie jego istnienia w języku C++ utrwaliły się stabilne mity, które łatwo można obalić (patrz tutaj: Część 1 i Część 2)

Historia języka i wydanie standardów

1983

Kreator języka - Bjorn Stroustrup, w Bell Labs, wprowadził wczesną wersję C++ („C z klasami”)

1985

Pierwsza komercyjna wersja C++, język nabiera nowoczesnej nazwy

1986

Wydanie pierwszego wydania The C++ Programming Language, książki C++ napisanej przez Bjorna Stroustrupa

1998

Ratyfikowano międzynarodowy standard języka C++: ISO/IEC 14882:1998 „Standard for the C++ Programming Language”

2003
2005

Publikacja Bibliotecznego Raportu Technicznego 1 (TR1). Chociaż nie jest oficjalnie częścią standardu, raport opisuje rozszerzenia standardowej biblioteki, które powinny być zawarte w następna wersja Język C++

2011

Wydanie nowego standardu - C++11 lub ISO/IEC 14882:2011; nowy standard zawierał dodatki do rdzenia języka i rozszerzenie do standardowej biblioteki, w tym wiele TR1

2014

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

2017

Wydanie nowego standardu to C++1z (C++17). Ten standard wprowadził wiele zmian i uzupełnień. Na przykład STD zawierał standardowe biblioteki C11, system plików, oparty na boost::filesystem, dużej części eksperymentalnej biblioteki TS I.

2020

C++20 to nieformalna nazwa standardu ISO/IEC dla języka programowania C++, który jest oczekiwany po C++17. Projekt normy N4800.

Filozofia C++

W The Design and Evolution of C++ (2007) Bjorn Stroustrup opisuje zasady, którymi kierował się przy projektowaniu C++ (podane w skróconej formie):

  • Uzyskaj uniwersalny język ze statycznymi typami danych, wydajnością i przenośnością C.
  • Bezpośrednio i kompleksowo wspieraj różnorodne style programowania.
  • Daj programiście wolność wyboru, nawet jeśli daje mu to możliwość dokonania błędnego wyboru.
  • Zachowaj kompatybilność z C tak bardzo, jak to możliwe, umożliwiając w ten sposób łatwe przejście z programowania do C.
  • Unikaj pomyłek między C i C++: każda konstrukcja dozwolona w obu językach musi oznaczać to samo w każdym z nich i prowadzić do tego samego zachowania programu.
  • Unikaj funkcji, które są zależne od platformy lub nie są uniwersalne.
  • „Nie płać za to, czego nie używasz” — żadna funkcja języka nie powinna powodować obniżenia wydajności programów, które jej nie używają.
  • Nie wymagają zbyt skomplikowanego środowiska programistycznego.

C i C++

Składnia C++ jest dziedziczona z języka C. Chociaż formalnie jedną z zasad C++ pozostaje zachowanie kompatybilności z językiem C, w rzeczywistości grupy standaryzacyjne tych języków nie wchodzą w interakcje, a zmiany sprawiają, że nie tylko nie korelują, ale często fundamentalnie zaprzeczają sobie nawzajem ideologicznie. Tak więc elementy, które nowe standardy C dodają do jądra są elementami standardowej biblioteki w standardzie C++ i są całkowicie nieobecne w jądrze, na przykład tablice dynamiczne, tablice ze stałymi granicami, możliwości przetwarzania równoległego. Stroustrup uważa, że ​​połączenie rozwoju tych dwóch języków przyniosłoby wielkie korzyści, ale jest to mało możliwe ze względów politycznych. Tak więc praktyczna kompatybilność między C i C++ będzie stopniowo tracona.
W ten przykład, w zależności od użytego kompilatora, wyprowadzone zostanie „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++ są typu char , ale rozmiary tych typów są różne.

Modele cyklu życia aplikacji

Koło życia oprogramowanie to czas, który zaczyna się od momentu podjęcia decyzji o potrzebie tworzenia Produkt oprogramowania i kończy się w momencie jej całkowitego wycofania z eksploatacji. Cykl ten to proces budowania i rozwijania oprogramowania (SW). Istnieje kilka modeli koło życia.
Model kaskadowy cykl życia (angielski model wodospadu) zaproponował w 1970 roku Winston Royce. Zapewnia sekwencyjną realizację wszystkich etapów projektu w ściśle określonej kolejności. Przejście do kolejnego etapu oznacza całkowite zakończenie prac na poprzednim etapie. Wymagania określone na etapie generowania wymagań są ściśle udokumentowane w postaci zakres zadań i są ustalane na czas trwania projektu. Każdy etap kończy się wydaniem kompletny zestaw wystarczającą dokumentację, aby rozwój mógł być kontynuowany przez inny zespół programistów.
Etapy projektu według modelu wodospadu:

  1. Formowanie 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 całkowitą poprawność wyniku z poprzedniej fazy. W dużych projektach jest to prawie niemożliwe do osiągnięcia. Dlatego taki model nadaje się tylko do opracowania małego projektu. (Sam W. Royce nie stosował się do tego modelu i stosował model iteracyjny).
Model iteracyjny
Alternatywą dla modelu kaskadowego jest model rozwoju iteracyjnego i przyrostowego (IID), który otrzymał od T. Gilba w latach 70-tych. nazwa modelu ewolucyjnego. Model IID rozbija cykl życia projektu na sekwencję iteracji, z których każda przypomina „mini-projekt”, w tym wszystkie procesy rozwoju zastosowane do tworzenia 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ści zdefiniowanej przez zintegrowaną zawartość wszystkich poprzednich i bieżących iteracji. Wynik końcowej iteracji zawiera wszystkie wymagane funkcjonalności produktu. Tym samym, wraz z zakończeniem każdej iteracji, produkt otrzymuje przyrost – przyrost – swoich możliwości, które w związku z tym rozwijają się ewolucyjnie.


Różne warianty podejścia iteracyjnego są zaimplementowane w większości nowoczesnych metodologii programistycznych:

Proces rozwoju - Rational Unified Process (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).
Pełny cykl życia rozwoju produktu składa się z czterech faz, z których każda obejmuje jedną lub więcej iteracji.

  • Etap początkowy (Incepcja)
  • Ustalenie zakresu projektu i ilości wymaganych zasobów. Określane są główne wymagania, ograniczenia i kluczowa funkcjonalność produktu. Ryzyka są oceniane. Planowanie działań. Pod koniec fazy początkowej ocenia się osiągnięcie kamienia milowego celu cyklu życia, co oznacza zgodę między interesariuszami na kontynuowanie projektu.

  • Opracowanie
  • Dokumentacja wymagań. Projektowanie, implementacja i testowanie architektury wykonywalnej. Specyfikacja terminów i kosztów. Redukcja głównych zagrożeń. Pomyślne zakończenie fazy rozwoju oznacza osiągnięcie Kamienia Milowego Architektury Cyklu Życia.

  • Budowa
  • W fazie „Budowania” wdrażana jest większość funkcjonalności produktu: projekt aplikacji jest zakończony, źródło pisemny. Faza kompilacji kończy się pierwszą zewnętrzną wersją systemu i kamieniem milowym początkowej zdolności operacyjnej.

  • Wdrożenie (przejście)
  • W fazie „Wdrożenia” tworzona jest ostateczna wersja produktu i przekazywana od dewelopera do klienta. Obejmuje to program testów beta, edukację użytkowników i zapewnienie jakości produktów. W przypadku, gdy jakość nie spełnia oczekiwań użytkowników lub kryteriów ustalonych w fazie Start, faza Wdrożenia jest powtarzana. Spełnienie wszystkich celów oznacza osiągnięcie kamienia milowego gotowego produktu (Product Release) i ukończenie pełnego cyklu rozwoju.



« Technologia informacyjna. Inżynieria systemów i oprogramowania. Procesy cyklu życia narzędzia programowe» . 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. Ten standard, ustanawia ogólne ramy dla procesów cyklu życia oprogramowania, które można wykorzystać jako wytyczne w branży oprogramowania. Standard nie oferuje konkretny model koło życia. Jej postanowienia są wspólne dla wszystkich modeli cyklu życia, metod i technologii tworzenia oprogramowania. Opisuje strukturę procesów cyklu życia, nie precyzując, jak wdrożyć lub wykonać czynności i zadania zawarte w tych procesach.

Prezentacja na lekcję
Tematy wiadomości
  • Fundacja Wolnego Oprogramowania (FSF)
  • Darmowe licencje na oprogramowanie
  • Wolne oprogramowanie i Open Source
  • Historia rozwoju języków programowania
  • Historia języka C. C i C++
  • Fabuła
  • Krytyka C++
  • Historia UNIX
  • Model cyklu życia oprogramowania spiralnego
  • UML (English Unified Modeling Language - zunifikowany język modelowania)
  • Microsoft Solutions Framework
  • IDE do programowania w C/C++ w systemie Windows
  • Kompilatory C/C++
  • Tworzenie aplikacji konsoli w systemie Windows
pytania
  1. Dlaczego kaskadowy model rozwoju oprogramowania nie jest używany w dużych projektach?
  2. Jaka jest różnica między kaskadowymi a iteracyjnymi modelami rozwoju?
  3. Wymień etapy tworzenia oprogramowania w metodologii Rational Unified Process (RUP)

Poznanie podstaw i subtelności języka programowania C++. Samouczek z zadania praktyczne i testy. Chcesz nauczyć się programować? Jesteś we właściwym miejscu - tutaj Darmowa edukacja programowanie. Niezależnie od tego, czy masz doświadczenie, czy nie, te lekcje programowania pomogą Ci rozpocząć tworzenie, kompilowanie i debugowanie programów w języku C++ w różnych środowiskach programistycznych: studio wizualne, Code::Blocks, Xcode lub Eclipse.

Wiele przykładów i szczegółowych wyjaśnień. Idealny zarówno dla początkujących (manekinów), jak i bardziej zaawansowanych. Wszystko jest wyjaśnione od podstaw do najdrobniejszego szczegółu. Te lekcje (200+) dadzą ci dobrą podstawę/podstawę do zrozumienia programowania nie tylko w C++, ale także w innych językach programowania. I to całkowicie za darmo!

Obejmuje również tworzenie krok po kroku gry w C ++, bibliotekę graficzną SFML i ponad 50 zadań sprawdzających twoje umiejętności i wiedzę w C ++. Dodatkowym bonusem jest .

Za repost +20 do karmy i moją wdzięczność!

Rozdział numer 0. Wstęp. Początek pracy

Rozdział numer 1. Podstawy C++

Rozdział nr 2. Zmienne i podstawowe typy danych w C++

Rozdział nr 3. Operatory w C++

Rozdział 4. Zakres i inne typy zmiennych w C++

Rozdział nr 5. Kolejność wykonywania kodu w programie. Pętle, gałęzie w C++

Biblioteka standardowa C/C++ zawiera szereg funkcji do odczytu i zapisu na konsoli (klawiatura i monitor). Te funkcje odczytują i zapisują dane jako prosty strumień znaków.

Pojęcie strumienia (strumienia), używane w programowaniu, jest ściśle związane ze zwykłym, codziennym rozumieniem tego słowa. Strumień wejściowy można porównać z rurą, przez którą woda (informacja) wpływa do basenu (pamięć komputera), strumień wyjściowy - z rurą, przez którą woda wypływa z basenu. Ważną cechą tego potoku jest to, że dane mogą poruszać się tylko w jednym kierunku na raz. Nawet jeśli ta sama rura jest używana do wlotu i wylotu, nie może się to zdarzyć w tym samym czasie: aby zmienić kierunek przepływu, należy go zatrzymać, wykonać jakąś czynność, a dopiero potem skierować przepływ w przeciwnym kierunku. Inną cechą strumienia jest to, że prawie nigdy nie wysycha. Czasami wysycha, ale ten okres nie może być długi, jeśli system działa normalnie.

printf() standardowa funkcja wyjściowa

Funkcja printf() jest standardową funkcją wyjściową. Za pomocą tej funkcji można wyświetlić na ekranie monitora ciąg znaków, liczbę, wartość zmiennej...

Funkcja printf() ma prototyp w pliku stdio.h
int printf(char *ciąg kontrolny, ...);

Jeśli się powiedzie, funkcja printf() zwraca liczbę drukowanych znaków.

Ciąg kontrolny zawiera dwa typy informacji: znaki wyświetlane bezpośrednio na ekranie oraz specyfikatory formatu, które określają sposób wyprowadzania argumentów.

Funkcja printf() jest sformatowaną funkcją wyjściową. Oznacza to, że w parametrach funkcji należy określić format danych do wyprowadzenia. Format danych jest określony przez specyfikatory formatu. Specyfikator formatu zaczyna się od %, po którym następuje kod formatu.

Specyfikatory formatu:

%Z symbol
%d liczba całkowita liczba dziesiętna
%i liczba całkowita liczba dziesiętna
%mi liczba dziesiętna w postaci x.xx e+xx
%MI liczba dziesiętna w postaci x.xx E+xx
%f
%F dziesiętny zmiennoprzecinkowy xx.xxxx
%g %f lub %e, w zależności od tego, co jest krótsze
%G %F lub %E, w zależności od tego, co jest krótsze
%o liczba ósemkowa
%s łańcuch znaków
% u liczba dziesiętna bez znaku
%x liczba szesnastkowa
%X liczba szesnastkowa
%% symbol %
%p wskaźnik
%n wskaźnik

Ponadto modyfikatory l i h można zastosować do poleceń formatowania.

%ld drukuj długi wewn
%hu drukuj krótki bez znaku
%Lf drukuj długi podwójny

W specyfikatorze formatu, po symbolu %, można określić precyzję (liczbę cyfr po przecinku). Dokładność jest ustawiona w następujący sposób: %.n<код формата>. Gdzie n to liczba cyfr po przecinku, a<код формата>- jeden z powyższych kodów.

Przykładowo, jeśli mamy zmienną x=10.3563 typu float i chcemy wyświetlić jej wartość z dokładnością do 3 miejsc po przecinku, to należy napisać:

printf("Zmienna x = %.3f",x);

Wynik:
Zmienna x = 10,356

Możesz także określić minimalną szerokość marginesu do wydrukowania. Jeśli ciąg lub liczba jest większa niż określona szerokość pola, to ciąg lub liczba jest wypisywana w całości.

Na przykład, jeśli napiszesz:

printf("%5d",20);

wtedy wynik będzie następujący:
20

Zauważ, że liczba 20 nie została wydrukowana od samego początku linii. Jeśli chcesz, aby nieużywane miejsca pola były wypełnione zerami, musisz umieścić znak 0 przed szerokością pola.

Na przykład:

printf("%05d",20);

Wynik:
00020

Oprócz specyfikatorów formatu danych ciąg kontrolny może zawierać znaki kontrolne:

\b BS, odwiert
\f Nowa strona, tłumaczenie strony
\n Nowa linia, wysuw linii
\r Zwrot karetki
\t Zakładka pozioma
\v Zakładka pionowa
\" cudzysłów
\" Apostrof
\\ Ukośnik wsteczny
\0 Znak null, bajt null
\a Sygnał
\N Stała ósemkowa
\xN Stała szesnastkowa
\? Znak zapytania

Najczęściej będziesz używał znaku \n. Dzięki tej postaci sterującej będziesz mógł przeskoczyć do nowej linii. Spójrz na przykłady programów, a wszystko zrozumiesz.

Przykłady programów.

/* Przykład 1 */
#włączać

nieważne główne (nieważne)
{
int a,b,c; // reklama zmienne a,b,c
a=5;
b=6;
c=9;
printf("a=%d, b=%d, c=%d",a,b,c);
}

Wynik programu:
a=5, b=6, c=9

/* Przykład 2 */
#włączać

nieważne główne (nieważne)
{
liczba zmiennoprzecinkowa x,y,z;

X=10,5;
y=130,67;
z=54;

Printf("Współrzędne obiektu: x:%.2f, y:%.2f, z:%.2f", x, y, z);
}

Wynik programu:
Współrzędne obiektu: x:10,50, y:130,67, z:54,00

/* Przykład 3 */
#włączać

nieważne główne ()
{
intx;

X=5;
printf("x=%d", x*2);
}

Wynik programu:
x=10

/* Przykład 4 */
#włączać

nieważne główne (nieważne)
{
printf("\"Tekst w cudzysłowie\"");
printf("\nZawartość tlenu: 100%%");
}

Wynik programu:
"Tekst w cudzysłowie"
Zawartość tlenu: 100%

/* Przykład 5 */
#włączać

nieważne główne (nieważne)
{
int;

A=11; // 11 dziesiętnie równa się b w hex
printf("a-dec=%d, a-hex=%X",a,a);
}

Wynik programu:
a-dec=11, a-hex=b

/* Przykład 6 */
#włączać

nieważne główne (nieważne)
{
znak ch1,ch2,ch3;

Ch1="A";
ch2="B";
ch3="C";

Printf("%c%c%c",ch1,ch2,ch3);
}

Wynik programu:
ABC

/* Przykład 7 */
#włączać

nieważne główne (nieważne)
{
char *str="Mój ciąg.";

Printf("To jest %s",str);
}

Wynik programu:
To jest moja linia.

/* Przykład 8 */
#włączać

nieważne główne (nieważne)
{
printf("Witaj!\n"); // Po wydrukowaniu pojawi się nowa linia - \n
printf("Nazywam się Paweł."); // To zostanie wydrukowane w nowej linii
}

Wynik programu:
Witam!
Nazywam się Paweł.

scanf() standardowa funkcja wejściowa

Funkcja scanf() jest sformatowaną funkcją wejściową. Dzięki niemu możesz wprowadzać dane ze standardowego urządzenia wejściowego (klawiatury). Dane wejściowe mogą być liczbami całkowitymi, liczbami zmiennoprzecinkowymi, znakami, łańcuchami i wskaźnikami.

Funkcja scanf() ma następujący prototyp w stdio.h:
int scanf(char *ciąg kontrolny);

Funkcja zwraca liczbę zmiennych, którym przypisano wartość.

Ciąg kontrolny zawiera trzy rodzaje znaków: specyfikatory formatu, spacje i inne znaki. Specyfikatory formatu zaczynają się od znaku %.

Specyfikatory formatu:

Podczas wprowadzania ciągu znaków za pomocą funkcji scanf() (specyfikator formatu %s), ciąg jest wprowadzany do pierwszej spacji!! tych. jeśli wpiszesz ciąg "Witaj świecie!" za pomocą funkcji scanf()


scanf("%s",str);

następnie po wpisaniu wynikowy ciąg, który zostanie zapisany w tablicy str, będzie składał się z jednego słowa "Hello". FUNKCJA WCHODZI NA PIERWSZĄ PRZESTRZEŃ! Jeśli chcesz wprowadzić ciągi ze spacjami, użyj funkcji

char *gets(char *buf);

Za pomocą funkcji gets() możesz wprowadzić pełne ciągi. Funkcja gets() odczytuje znaki z klawiatury, dopóki nie pojawi się znak Nowa linia(\n). Sam znak nowej linii pojawia się po naciśnięciu klawisza Enter. Funkcja zwraca wskaźnik do buf. buf - bufor (pamięć) dla ciągu wejściowego.

Chociaż gets() jest poza zakresem tego artykułu, napiszmy przykładowy program, który pozwala wprowadzić całą linię z klawiatury i wyświetlić ją na ekranie.

#włączać

nieważne główne (nieważne)
{
bufor węgla; // tablica (bufor) dla ciągu wejściowego

Pobiera(bufor); // wpisz ciąg i naciśnij enter
printf("%s",bufor); // wyślij wprowadzony ciąg na ekran
}

Kolejna ważna uwaga! Aby wprowadzić dane za pomocą funkcji scanf(), jako parametry należy podać adresy zmiennych, a nie same zmienne. Aby uzyskać adres zmiennej, poprzedź nazwę zmiennej znakiem & (ampersand). Znak & oznacza zabranie adresu.

Co oznacza adres? Spróbuję wyjaśnić. W programie mamy zmienną. Zmienna przechowuje swoją wartość w pamięci komputera. Tak więc adres, który otrzymujemy za pomocą &, jest adresem w pamięci komputera, gdzie przechowywana jest wartość zmiennej.

Spójrzmy na przykładowy program, który pokazuje nam, jak używać &

#włączać

nieważne główne (nieważne)
{
intx;

Printf("Wprowadź zmienną x:");
scanf("%d",&x);
printf("Zmienna x=%d",x);
}

Wróćmy teraz do wiersza kontrolnego funkcji scanf(). Ponownie:

int scanf(char *ciąg kontrolny);

Znak spacji w wierszu sterującym nakazuje pominąć jedną lub więcej spacji w strumieniu wejściowym. Oprócz spacji można zaakceptować znak tabulacji lub nowej linii. Znak inny niż null wskazuje, że należy przeczytać i odrzucić ten znak.

Separatorami między dwiema liczbami wejściowymi są spacje, tabulatory lub znaki nowego wiersza. Znak * po %, a przed kodem formatu (specyfikator formatu) nakazuje odczytywanie danych określonego typu, ale nie przypisywanie tej wartości.

Na przykład:

scanf("%d%*c%d",&i,&j);

wpisanie 50+20 ustawi i na 50, j na 20, a + zostanie odczytany i zignorowany.

Polecenie format może określić największą szerokość pola do odczytania.

Na przykład:

scanf("%5s",str);

określa odczytywanie pierwszych 5 znaków ze strumienia wejściowego. Jeśli wpiszesz 1234567890ABC, tablica str będzie zawierać tylko 12345, reszta znaków zostanie zignorowana. Separatory: spacja, tabulator i znak nowej linii - przy wprowadzaniu znaku są traktowane jak wszystkie inne znaki.

Jeśli w ciągu kontrolnym zostaną napotkane jakiekolwiek inne znaki, mają one na celu określenie i pominięcie odpowiedniego znaku. Strumień znaków 10plus20 przez operatora

scanf("%dplus%d",&x,&y);

przypisze x do 10, y do 20 i pominie znaki plus, ponieważ występują w linii kontrolnej.

Jedną z potężnych funkcji funkcji scanf() jest możliwość określenia zestawu skanowania (scanset). Zbiór wyszukiwania definiuje zestaw znaków, z którym będą porównywane znaki odczytywane przez scanf(). Funkcja scanf() odczytuje znaki, o ile występują w zbiorze wyszukiwania. Gdy wprowadzony znak nie zostanie znaleziony w zestawie wyszukiwania, funkcja scanf() przechodzi do następnego specyfikatora formatu. Zbiór wyszukiwania jest zdefiniowany przez listę znaków ujętą w nawiasy kwadratowe. Nawias otwierający jest poprzedzony znakiem %. Spójrzmy na to na przykładzie.

#włączać

nieważne główne (nieważne)
{
znak str1, str2;
scanf("%%s", str1, str2);
printf("\n%s\n%s",str1,str2);
}
Wprowadźmy zestaw znaków:
12345abcdefg456

Na ekranie program wyświetli:
12345
abcdefg456

Podczas określania zestawu wyszukiwania można również użyć znaku łącznika do określenia spacji, a także maksymalnej szerokości pola wejściowego.

scanf("%10", str1);

Możesz także zdefiniować znaki, których nie ma w zestawie wyszukiwania. Pierwszy z tych znaków jest poprzedzony znakiem ^. Zestaw znaków rozróżnia małe i wielkie litery.

Przypomnę, że korzystając z funkcji scanf() należy przekazać do niej adresy zmiennych jako parametry. Powyższy kod został napisany:

znak str; // tablica na 80 znaków
scanf("%s",str);

Zauważ, że str nie jest poprzedzony znakiem &. Dzieje się tak, ponieważ str jest tablicą, a nazwa tablicy, str, jest wskaźnikiem do pierwszego elementu tablicy. Dlatego znak & nie jest umieszczany. Już przekazujemy adres do funkcji scanf(). Mówiąc prościej, str to adres w pamięci komputera, pod którym będzie przechowywana wartość pierwszego elementu tablicy.

Przykłady programów.

Przykład 1
Ten program wyświetla zapytanie „Ile masz lat?” i czeka na dane wejściowe. Jeśli np. wpiszesz liczbę 20, program wyświetli napis „Masz 20 lat”. Kiedy wywołaliśmy funkcję scanf(), poprzedziliśmy zmienną wiek znakiem &, ponieważ funkcja scanf() potrzebuje adresów zmiennych. Funkcja scanf() zapisze wprowadzoną wartość zgodnie z podany adres. W naszym przypadku pod adres zmiennej wiek zostanie zapisana wpisana wartość 20.

/* Przykład 1 */

#włączać

nieważne główne (nieważne)
{
wiek;

Printf("\nIle masz lat?:");
scanf("%d",&wiek);
printf("Masz %d lat.", wiek);
}

Przykład 2
Program kalkulatora. Ten kalkulator może tylko dodawać liczby. Jeśli wpiszesz 100+34, program zwróci wynik: 100+34=134.

/* Przykład 2 */

#włączać

nieważne główne (nieważne)
{
int x, y;

Printf("\nKalkulator:");
scanf("%d+%d", &x, &y);
printf("\n%d+%d=%d", x, y, x+y);
}

Przykład 3
Ten przykład pokazuje, jak ustawić szerokość pola odczytu. W naszym przykładzie szerokość pola to pięć znaków. Jeśli wprowadzisz ciąg zawierający więcej znaków, wszystkie znaki po 5 zostaną odrzucone. Zwróć uwagę na wywołanie funkcji scanf(). Znak & nie poprzedza nazwy nazwy tablicy, ponieważ nazwa nazwy tablicy jest adresem pierwszego elementu tablicy.

/* Przykład 3 */

#włączać

nieważne główne (nieważne)
{
nazwisko;

Printf("\nWprowadź swoją nazwę użytkownika (maksymalnie 5 znaków):");
scanf("%5s", nazwa);
printf("\nWpisałeś %s", nazwa);
}

Przykład 4
Ostatni przykład w tym artykule pokazuje, jak korzystać z zestawu odnośników. Po uruchomieniu programu wprowadź liczbę od 2 do 5.

/* Przykład 4 */

#włączać

nieważne główne (nieważne)
{
charbal;

Printf("Twój wynik to 2,3,4,5:");
scanf("%", &bal);
printf("\nWynik %c", bal);
}

Komputery to prawdopodobnie najbardziej wszechstronne narzędzia, jakimi dysponuje ludzkość. Są w stanie wykonać niesamowite obliczenia, pozwalają na przechowywanie duża ilość informacje, całkowicie w różnych częściach planety, a jednocześnie łatwo je wymieniać, niezależnie od lokalizacji. Komputery ułatwiają pracę codzienne zadania, i pozwalają zautomatyzować wiele rutynowych procesów, które byłyby bardzo żmudne i nudne dla osoby. Jest tak wiele rzeczy, które mogą zrobić komputery, ale komputery nie są tak inteligentne jak ludzie. Aby zautomatyzować nawet najprostszy proces, musisz jasno i jednoznacznie powiedzieć komputerowi, co dokładnie ma robić. Niestety nasz język i język komputerowy są zupełnie inne. Istnieje więc poważna bariera językowa między maszyną a człowiekiem, którą trzeba jakoś pokonać, inaczej komputer nas nie zrozumie. I choć komputery nas nie rozumieją, same nic nie zrobią. Jako środek komunikacji między człowiekiem a komputerem wynaleziono ogromną liczbę języków programowania. Za pomocą języków programowania tworzymy programy, a komputer już bezpośrednio współpracuje z programami. Same programy to zestawy instrukcji, które komputer może zrozumieć i wykonać.

Rodzaje programów

Aby skutecznie komunikować się z komputerem, a dokładnie tego chcemy, 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 nazywany jest kompilatorem. Kompilacja może sprawić, że kod będzie działał dość szybko, zwłaszcza jeśli kompilator skutecznie optymalizuje. Ale faktem jest, że wynikowy kod nie może działać na różnych system operacyjny, a proces kompilacji zajmuje trochę czasu, a im więcej kodu, tym dłuższy proces kompilacji. Warto zauważyć, że przy dokonywaniu jakichkolwiek zmian w kodzie programu należy go skompilować, a 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ć w różnych systemach operacyjnych, takich jak interpreter, i nie mają nawet długich czasów kompilacji. Ale programy napisane w językach interpretowanych są zwykle znacznie wolniejsze niż równoważne, skompilowane programy.

I wreszcie tak zwana kompilacja w locie (lub kompilacja JIT). Takie języki szybko się kompilują po uruchomieniu programu. Programy napisane w językach JIT z reguły nie są zoptymalizowane, co przyspiesza proces kompilacji i przywraca równowagę między wydajnością a wieloplatformowością.

Wysoki lub niski poziom programowania

Języki niskiego poziomu działają głównie bezpośrednio ze sprzętem i dlatego najlepiej nadają się do pisania sterowników urządzeń. Sterowniki to programy kontrolujące sprzęt 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 nacisk kładziony jest na pojęcie języka. Oznacza to, że taki język programowania powinien być łatwy do zrozumienia, na przykład reprezentujący dane jako tablice, ciągi, obiekty itp. Język wysokiego poziomu jest zwykle łatwiejszy do zrozumienia niż język niskiego poziomu. I z reguły dużo łatwiej i szybciej napisać program w języku wysokiego poziomu niż w języku niskiego poziomu. Jak widzisz różne poziomy języki programowania są przeznaczone do zupełnie innych zadań i nie warto porównywać funkcjonalności języków wielopoziomowych, jest to bez znaczenia.

Systemy typów danych języków programowania

Dla każdego języka programowania istnieje specyfikacja, która definiuje różne zasady, których muszą przestrzegać języki programowania. Niektóre języki nie mają typów danych, więc ich 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 typu danych

Słaby system wprowadzania nie nakłada żadnych ograniczeń, programista musi się do tego stosować. Mówiąc „ słaby system data” mam na myśli, że język z takim systemem danych nie reguluje ściśle dostępnych rzutów typów danych. Na przykład, jeśli do funkcji mnożenia zostanie przekazany ciąg znaków lub znak zamiast liczby, języki programowania bez silnego typu wykonają taki kod, chociaż wynik mnożenia traci znaczenie, ponieważ ciąg nie może być pomnożony przez numer. Co więcej, wynik wykonania tego bezsensownego mnożenia będzie nieprzewidywalny. Jeśli język programowania jest mocno wpisany, to na etapie kompilacji kompilator zgłosi błąd i zatrzyma proces budowania projektu. Na przykład,

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

W rezultacie kompilator zgłosi błąd:

błąd: nieprawidłowe operandy typu 'char' i 'int' do binarnego 'operator*'

Postaramy się zrobić to samo w języku programowania bez silnego typowania - php. Należy zauważyć, że nawet podczas deklarowania zmiennych nie trzeba określać typu danych.

Wynik wykonania tego kodu wyniesie zero. Nie wystąpi błąd, choć wydawałoby się, że nie da się 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 da wynik, a jeśli nasz program składa się z 1000 linii kodu, to będzie nam trudno znaleźć ten błąd. Jest to doskonały przykład języka programowania ze „słabym systemem typów danych”, co oznacza, że ​​zapobieganie takim absurdalnym operacjom spoczywa całkowicie 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 zdefiniowania rodzaju zmiennych, więc nie ma niepewności, kompilator i interpreter wyraźnie wiedzą, co robić. Niektóre języki programowania nie wymagają jawnego definiowania typu zmiennych. Typ danych jest określany automatycznie na podstawie zawartości zmiennej.

Statyczny lub dynamiczny typ danych

Jeśli język jest statycznie wpisany, 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 typu danych

Istnieją sytuacje, które mogą prowadzić do nieprzewidywalnego wyniku lub błędu. Bezpieczny język wprowadzi jak najwięcej ograniczeń, aby zapewnić, że takie sytuacje nie wystąpią. Podczas gdy niebezpieczny język nakłada całą odpowiedzialność na programistę.

Czynniki te mogą charakteryzować zarówno jeden, jak i 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 skupi się bardziej na celu niż na środkach do osiągnięcia tego celu. Wystarczy wskazać, co należy osiągnąć, nie trzeba wskazywać, jakich środków użyć. Ten paradygmat zapobiega niepożądanym efektom ubocznym, które mogą wystąpić podczas pisania własnego kodu.

Paradygmat funkcjonalny

Programowanie funkcjonalne to podzbiór programowania deklaratywnego, który próbuje rozwiązywać problemy za pomocą równań matematycznych i funkcji. Programowanie funkcjonalne traktuje zmienne i obiekty jako dane, które nie są udostępniane, w przeciwieństwie do języków imperatywnych.

Uogólniony paradygmat

Programowanie generyczne koncentruje się na pisaniu algorytmów pod kątem definiowanych typów danych. Oznacza to, że ten sam algorytm może działać z różnymi typami danych. Takie podejście może być bardzo potężnym narzędziem, ale tylko wtedy, gdy jest dobrze zaimplementowane.

imperatywny paradygmat

Języki imperatywne pozwalają programistom przekazać komputerowi uporządkowaną listę instrukcji potrzebnych do wykonania zadania. Imperatywne języki programowania są przeciwne do deklaratywnych języków programowania.

paradygmat strukturalny

Języki programowania strukturalnego mają na celu dostarczenie pewnej formy kodu - struktury hierarchicznej. Gdy struktura kodu jest wyraźnie widoczna, kolejność wykonywania instrukcji staje się intuicyjna. Takie języki zwykle marszczą brwi na „przeskakiwanie” z jednego kawałka kodu do drugiego, jak na przykład dobrze znany operator goto zdefiniowany w C i C++.

paradygmat proceduralny

Język programowania proceduralnego odnosi się do strukturalnego języka programowania, który obsługuje koncepcję procedury lub podprogramu.

Paradygmat zorientowany obiektowo

Programowanie obiektowe (czasami w skrócie OOP) to podzbiór programowania strukturalnego, który wyraża programy w kategoriach „obiektów”. Ten paradygmat umożliwia ponowne wykorzystanie kodu i jest łatwy do zrozumienia.

Normalizacja

Czy języki mają oficjalny standard? Standaryzacja jest bardzo ważna, aby zapewnić bezkonfliktowe zrozumienie programu przez różne kompilatory/interpretatory. Niektóre języki są standaryzowane przez American National Standards Institute (ANSI), inne są standaryzowane przez Międzynarodową Organizację Normalizacyjną (ISO). Wszystkie języki programowania muszą być ustandaryzowane, w przeciwnym razie nie będzie możliwe uzgodnienie, co jest dobre, a co złe w składni.

Scharakteryzujmy język programowania C++

Teraz, gdy przyjrzeliśmy się głównym cechom języków programowania, określmy, jakie czynniki spełnia język programowania C++.

C++ to standardowy język programowania ISO.

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

Skompilowany język 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 typizowanym.

C++ implikuje, że programista wie, co robi i daje niesamowitą ilość możliwości, ograniczonych jedynie wyobraźnią.

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

W ten sposób sprawdzanie typu danych można wykonać w czasie kompilacji lub w czasie wykonywania. I to po raz kolejny dowodzi elastyczności C++.

C++ obsługuje wiele paradygmatów.

C++ obsługuje między innymi paradygmaty programowania proceduralnego, ogólnego i obiektowego.

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++ ma szeroką gamę kompilatorów, które działają 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żna używać bibliotek C i będą one działać poprawnie.