• c. opis. Wpisany język programowania

    Poznanie podstaw i subtelności języka programowania C++. Podręcznik z zadaniami praktycznymi i testami. Chcesz nauczyć się programować? W takim razie dobrze trafiłeś – tutaj znajdziesz bezpłatne szkolenie z programowania. 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: Visual Studio, Code::Blocks, Xcode lub Eclipse.

    Mnóstwo przykładów i szczegółowych wyjaśnień. Idealny zarówno dla początkujących (manekiny), jak i bardziej zaawansowanych. Wszystko wyjaśnione od podstaw w najdrobniejszych szczegółach. Te lekcje (ponad 200) dadzą ci dobrą bazę/fundament w zrozumieniu programowania nie tylko w C++, ale także w innych językach programowania. I to całkowicie za darmo!

    Obejmuje także krok po kroku tworzenie 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ł numer 2. Zmienne i podstawowe typy danych w C++

    Rozdział numer 3. Operatory w C++

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

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

    W tym artykule funkcja scanf() jest rozpatrywana 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. Być może w niektórych standardach funkcja działa z różnicami w stosunku do materiału przedstawionego w artykule.

    Funkcja scanf C - opis

    scanf() to funkcja znajdująca się w plikach nagłówkowych stdio.h(C) i cstdio(C++), znana również jako sformatowane wejście programu. scanf odczytuje znaki ze standardowego strumienia wejściowego (stdin) i konwertuje je zgodnie z formatem, a następnie zapisuje je do określonych zmiennych. Format – oznacza, że ​​po otrzymaniu dane są konwertowane do określonej postaci. Zatem funkcja scanf C jest opisana:

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

    gdzie zmienne są przekazywane jako adresy. Powód takiego sposobu przekazywania zmiennych do funkcji jest oczywisty: w wyniku pracy 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 nazywają funkcje takie jak scanf() lub printf() procedurami ze względu na analogię z innymi językami.

    Scanf umożliwia wprowadzanie wszystkich podstawowych typów języka: 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 wejściowy lub ciąg kontrolny

    Zacznijmy od przyjrzenia się przykładowi wykorzystania funkcji 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 znak „%” i typ są parametrami obowiązkowymi. Oznacza to, że minimalna forma formatu 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 znaku %;
    • znaki separatora lub spacji - są to spacja, tabulator (\t), nowa linia (\n);
    • znaki inne niż białe znaki.

    Funkcja może nie być bezpieczna.

    Użyj funkcji scanf_s() zamiast scanf().

    (post z Visual Studio)

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

    Deklaracja scanf C musi zawierać co najmniej specyfikator formatu, który jest podawany na końcu wyrażeń rozpoczynających się znakiem „%”. Mówi programowi, jakiego typu danych należy się spodziewać podczas wprowadzania, zwykle z klawiatury. Lista wszystkich specyfikatorów formatu w poniższej tabeli.

    Oznaczający

    Program oczekuje na wprowadzenie znaku. Zmienna, która ma zostać zapisana, musi być typu char.

    Program oczekuje na wejście dziesiętnej liczby całkowitej. Zmienna musi być typu int.

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

    Program oczekuje na wprowadzenie liczby zmiennoprzecinkowej (przecinek). Zmienna musi być typu float.

    7

    Program oczekuje na wprowadzenie liczby zmiennoprzecinkowej (przecinek). Zmienna musi być typu float.

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

    Program oczekuje na wprowadzenie ciągu znaków. Łańcuch to zbiór dowolnych znaków aż do pierwszego napotkanego znaku oddzielającego. Zmienna musi być typu string.

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

    Zmienna oczekuje danych wejściowych wskaźnika. Zmienna musi mieć typ wskaźnika.

    Zapisuje do zmiennej wartość całkowitą równą liczbie znaków odczytanych dotychczas 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 do przeskanowania. Program czeka na wprowadzenie znaków z ograniczonej puli określonej pomiędzy scanf, będzie działać tak długo, jak w strumieniu wejściowym znajdują się znaki z określonego zestawu.

    Znaki w ciągu formatującym

    Symbol gwiazdki (*)

    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. A znak minus (myślnik) „-” zostanie zignorowany dzięki „%*c”.

    Szerokość (lub szerokość marginesu)

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

    Należy pamiętać o kilku ważnych kwestiach:

    1. scanf przerwie działanie, jeśli napotka znak separatora, nawet jeśli nie liczy 20 znaków.
    2. Jeśli wprowadzonych zostanie więcej niż 20 znaków, tylko pierwsze 20 znaków zostanie zapisanych w str.

    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) Gdy „l” jest użyte ze specyfikatorami d, i, o, u, x, flaga informuje program, że oczekiwane jest wejście typu long int. W przypadku użycia „l” ze specyfikatorem e lub f flaga informuje program, że powinien spodziewać się podwójnej wartości. Użycie „L” informuje program, że oczekiwany jest długi dublet. Użycie „l” ze specyfikatorami „c” i „s” informuje program, że oczekiwane są znaki dwubajtowe, takie jak wchar_t. Na przykład „%lc”, „%ls”, „%l”.
    • h jest flagą wskazującą typ krótki.
    • 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 - wskazuje, że zmienna jest wskaźnikiem do typu intmax_t lub uintmax_t z pliku nagłówkowego stdint.h. Używane ze specyfikatorami: d, i, o, u, x, n.
    • z - wskazuje, ż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 - wskazuje, ż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.

    Mówiąc jaśniej, obraz z modyfikatorami można przedstawić w formie tabeli. Taki opis scanf C dla programistów będzie bardziej przejrzysty.

    Inne postaci

    Wszelkie znaki napotkane w formacie zostaną odrzucone. Należy zauważyć, że obecność białych znaków lub znaków oddzielających (nowa linia, spacja, tabulator) w ciągu kontrolnym może prowadzić do innego zachowania funkcji. W jednej wersji funkcja scanf() będzie czytać bez zapisywania jakiejkolwiek liczby separatorów, dopóki nie napotka znaku innego niż separator, a w innej wersji spacje (tylko one) nie odgrywają roli i wyrażenie „%d + %d” jest równoważne „% d+%d”.

    Przykłady

    Rozważmy kilka przykładów, które pozwalają pomyśleć i dokładniej zrozumieć działanie funkcji.

    scanf("%3s", str); //jeśli wpiszesz w konsoli ciąg "1d2s3d1;3", tylko "1d2" zostanie zapisane do str scanf("%dminus%d", &x, &y); //znaki minusowe między dwiema liczbami zostaną odrzucone scanf("%5", str); // znaki będą wprowadzane do str, aż będzie 5 znaków i będą to cyfry od 0 do 9. scanf("%lf", &d); //oczekuj podwójnego wejścia scanf("%hd", &x); //oczekiwana liczba typów short scanf("%hu", &y); //oczekuj numeru bez znaku short scanf("lx", &z); //oczekiwana liczba typu long int

    Z podanych przykładów można zobaczyć, jak zmienia się oczekiwana liczba, używając różnych symboli.

    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, ile szczegóły działania tej funkcji.

    • Ta 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 znajdziesz na stronie microsoftu.
    • Liczba specyfikatorów w formacie musi odpowiadać liczbie argumentów przekazanych do funkcji.
    • Elementy strumienia wejściowego muszą być oddzielone jedynie znakami oddzielającymi: spacją, tabulatorem, nową linią. Przecinek, średnik, kropka itp. - te znaki nie są separatorami dla funkcji scanf().
    • Jeśli scanf napotka znak separatora, wprowadzanie zostanie zatrzymane. Jeżeli do odczytania jest więcej niż jedna zmienna, scanf przejdzie do odczytania kolejnej zmiennej.
    • Najmniejsza niespójność w formacie danych wejściowych prowadzi do nieprzewidywalnych wyników programu. Cóż, jeśli program po prostu zakończy się błędem. Ale często program nadal działa i robi to źle.
    • scanf("%20s...",...); Jeśli strumień wejściowy przekracza 20 znaków, scanf odczyta pierwsze 20 znaków i albo przerwie, albo przejdzie do odczytu następnej zmiennej, jeśli została określona. W takim przypadku kolejne wywołanie scanf będzie kontynuować odczytywanie strumienia wejściowego od momentu, w którym zatrzymała się praca poprzedniego wywołania scanf. Jeśli podczas odczytu pierwszych 20 znaków napotkany zostanie znak separatora, scanf przerwie lub przejdzie do odczytu kolejnej zmiennej, nawet jeśli nie odczytał 20 znaków dla pierwszej zmiennej. W takim przypadku wszystkie nieprzeczytane znaki zostaną dołączone do kolejnej zmiennej.
    • Jeśli zestaw skanowanych znaków 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 czytać dane ze strumienia do momentu napotkania jednego z wielkich angielskich znaków od A do E lub jednej z cyfr od 1 do 5.
    • Funkcja scanf C z definicji zwraca liczbę równą liczbie pomyślnych zapisów do zmiennych. Jeśli scanf zapisze 3 zmienne, to w wyniku powodzenia funkcji zostanie zwrócona liczba 3. Jeżeli scanf nie mógł zapisać żadnych zmiennych, wynikiem będzie 0. I na koniec, jeśli z jakiegoś powodu scanf nie mógł się w ogóle uruchomić, funkcja Scanf wynikiem będzie EOF.
    • Jeśli funkcja scanf() zakończyła swoją pracę niepoprawnie. Na przykład scanf("%d", &x) - oczekiwano liczby, ale na wejściu pojawiły się znaki. Następne wywołanie funkcji scanf() rozpocznie się w tym miejscu strumienia wejściowego, w którym zostało przerwane poprzednie wywołanie funkcji. Aby pokonać ten problem, konieczne jest pozbycie 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 podstępny sposób możesz kontynuować wprowadzanie niezbędnych danych.
    • Niektóre implementacje funkcji scanf() nie pozwalają na skanowanie znaku „-” w zestawie znaków.
    • Specyfikator „%c” odczytuje każdy znak ze strumienia. Oznacza to, że odczytuje także znak separatora. Aby pominąć znak ogranicznika i kontynuować czytanie żądanego znaku, można użyć „%1s”.
    • W przypadku użycia specyfikatora „c” dopuszczalne jest użycie szerokości „%10c”, jednak w tym przypadku tablica elementów typu char musi zostać przekazana jako zmienna do funkcji scanf.
    • „%” oznacza „wszystkie małe litery alfabetu angielskiego”, a „%” oznacza tylko 3 znaki: „z”, „a”, „-”. Innymi słowy, znak „-” oznacza zakres tylko wtedy, gdy znajduje się pomiędzy dwoma znakami ułożonymi we właściwej kolejności. Jeśli „-” znajduje się na końcu wyrażenia, na jego początku lub w niewłaściwej kolejności znaków po obu jego stronach, wówczas jest to po prostu znak łącznika, a nie zakres.

    Wniosek

    Na tym kończy się opis scanf C. Jest to miła, przydatna funkcja do pracy w małych programach i podczas korzystania z metody programowania proceduralnego. Jednak główną wadą jest liczba nieprzewidywalnych błędów, które mogą wystąpić podczas korzystania ze scanf. Dlatego opis scanf C podczas programowania najlepiej mieć przed oczami. W dużych profesjonalnych projektach wykorzystuje się iostreamy, gdyż posiadają one możliwości wyższego rzędu, lepiej potrafią wychwytywać i obsługiwać błędy, a także pracować ze znaczną ilością informacji. Należy również zaznaczyć, ż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.

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

    Pojęcie strumienia (strumień), stosowane w programowaniu, jest ściśle powiązane z potocznym, 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 opuszcza basen. Ważną cechą tego potoku jest to, że dane mogą przemieszczać się tylko w jednym kierunku na raz. Nawet jeśli ta sama rura jest wlotem i wylotem, 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. Kolejną cechą strumienia jest to, że prawie nigdy nie wysycha. Czasami wysycha, ale okres ten nie może być długi, jeśli system działa normalnie.

    printf() standardowa funkcja wyjściowa

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

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

    Jeśli się powiedzie, funkcja printf() zwraca liczbę wydrukowanych 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 wyświetlania argumentów.

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

    Specyfikatory formatu:

    %Z symbol
    %D liczba całkowita dziesiętna
    %I liczba całkowita 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, który jest krótszy
    %G %F lub %E, w zależności od tego, który jest krótszy
    % 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ługie wew
    %hu drukuj krótko bez znaku
    %Lf wydrukuj długi podwójny

    W specyfikatorze formatu, po symbolu %, można określić precyzję (liczbę cyfr po przecinku). Dokładność jest ustawiana w następujący sposób: %.n<код формата>. Gdzie n jest liczbą cyfr po przecinku, oraz<код формата>- 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 powinniśmy napisać:

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

    Wynik:
    Zmienna x = 10,356

    Można także określić minimalną szerokość drukowanego marginesu. Jeśli ciąg lub liczba jest większa niż określona szerokość pola, wówczas ciąg lub liczba zostaną wydrukowane w całości.

    Na przykład, jeśli napiszesz:

    printf("%5d",20);

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

    Należy zwrócić uwagę, że cyfra 20 nie została wydrukowana od samego początku wiersza. Jeśli chcesz, aby niewykorzystane miejsca pola zostały wypełnione zerami, to przed szerokością pola musisz umieścić znak 0.

    Na przykład:

    printf("%05d",20);

    Wynik:
    00020

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

    \B BS, dno
    \F Nowa strona, tłumaczenie strony
    \N Nowa linia, nowy wiersz
    \R Powrót karetki
    \T Zakładka pozioma
    \v Zakładka pionowa
    \" cudzysłów
    \" Apostrof
    \\ Ukośnik wsteczny
    \0 Znak null, bajt zerowy
    \A Sygnał
    \N Stała ósemkowa
    \xN Stała szesnastkowa
    \? Znak zapytania

    Najczęściej będziesz używać znaku \n. Za pomocą tego znaku kontrolnego 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ć

    puste główne (puste)
    {
    int a,b,c; // Deklaracja zmiennych 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ć

    puste główne (puste)
    {
    pływak 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ć

    puste główne()
    {
    intx;

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

    Wynik programu:
    x=10

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

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

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

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

    puste główne (puste)
    {
    int a;

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

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

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

    puste główne (puste)
    {
    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ć

    puste główne (puste)
    {
    char *str="Mój ciąg znaków.";

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

    Wynik programu:
    To jest moja linia.

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

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

    Wynik programu:
    Cześć!
    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, ciągami znaków 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 znaków jest wprowadzany z dokładnością do pierwszej spacji!! te. jeśli wpiszesz ciąg „Hello world!” za pomocą funkcji scanf().


    scanf("%s",str);

    wówczas po wpisaniu wynikowy ciąg znaków, który zostanie zapisany w tablicy str, będzie się składał z jednego słowa „Hello”. FUNKCJA WPROWADZA ŁAŃCUCH DO PIERWSZEJ SPACJA! Jeśli chcesz wprowadzić ciągi znaków ze spacjami, użyj funkcji

    char *gets(char *buf);

    Za pomocą funkcji gets() można wprowadzać pełne ciągi znaków. Funkcja gets() odczytuje znaki z klawiatury do momentu pojawienia się znaku nowej linii (\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ż funkcja gets() wykracza poza zakres tego artykułu, napiszmy przykładowy program, który umożliwia wprowadzenie całej linii z klawiatury i wyświetlenie jej na ekranie.

    #włączać

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

    Pobiera(bufor); // wprowadź ciąg i naciśnij klawisz Enter
    printf("%s",bufor); // wyświetlenie wprowadzonego ciągu na ekranie
    }

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

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

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

    #włączać

    puste główne (puste)
    {
    intx;

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

    Wróćmy teraz do linii sterującej funkcji scanf(). Ponownie:

    int scanf(char *ciąg kontrolny);

    Znak spacji w linii sterującej nakazuje pominąć jedną lub więcej spacji w strumieniu wejściowym. Oprócz spacji akceptowany jest znak tabulacji lub znak nowej linii. Znak inny niż null oznacza przeczytanie i odrzucenie tego znaku.

    Separatorami pomiędzy dwoma liczbami wejściowymi są spacja, tabulator lub znaki nowej linii. Znak * po % i przed kodem formatu (specyfikator formatu) instruuje 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 odczytane i zignorowane.

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

    Na przykład:

    scanf("%5s",str);

    określa odczytanie 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 nowa linia - przy wprowadzaniu znaku traktowane są jak wszystkie inne znaki.

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

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

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

    Jedną z potężnych właściwości funkcji scanf() jest możliwość określenia zestawu skanowania (zestawu skanowania). Zestaw wyszukiwania definiuje zestaw znaków, z którym będą porównywane znaki odczytane przez funkcję 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ć

    puste główne (puste)
    {
    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 także użyć znaku łącznika do określenia spacji, a także maksymalnej szerokości pola wejściowego.

    scanf("%10", str1);

    Można także zdefiniować znaki, które nie znajdują się 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 zawierająca 80 znaków
    scanf("%s",str);

    Należy pamiętać, że str nie jest poprzedzony &. Dzieje się tak, ponieważ str jest tablicą, a nazwa tablicy str jest wskaźnikiem do pierwszego elementu tablicy. Dlatego znak & nie jest wstawiany. Już przekazujemy adres do funkcji scanf(). Mówiąc najproś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 wprowadzenie danych. Jeśli na przykład wpiszesz liczbę 20, program wyświetli ciąg „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ść pod podany adres. W naszym przypadku wprowadzona wartość 20 zostanie zapisana pod adres zmiennej wiek.

    /* Przykład 1 */

    #włączać

    puste główne (puste)
    {
    wiek całkowity;

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

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

    /* Przykład 2 */

    #włączać

    puste główne (puste)
    {
    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 wynosi pięć znaków. Jeśli wpiszesz ciąg zawierający więcej znaków, wszystkie znaki po piątym 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ć

    puste główne (puste)
    {
    imię;

    Printf("\nWpisz 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 można użyć zestawu odnośników. Po uruchomieniu programu należy wpisać liczbę od 2 do 5.

    /* Przykład 4 */

    #włączać

    puste główne (puste)
    {
    węgiel drzewny;

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

    1. Wstęp

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

    Następnie rozważymy technologię SWITCH do projektowania programów automatycznych, w których cały czas spotykamy się z podobnymi procesami. Z jednej strony zmieniło to model automatu skończonego w taki sposób, że faktycznie wyjęło go z ram teorii automatów. Z drugiej strony wprowadza do programowania pojęcia, które dla programistów są ledwo dostrzegalne, a czasem po prostu zbędne, bo istnieją bardziej znane analogie z teorii programów i praktyki programowania.

    Za podstawę do omówienia problemów programowania automatycznego przyjmujemy niedawny wykład Shalyto A.A. i jego artykuły dotyczące oprogramowania dotyczące definicji paradygmatu programowania automatów.

    Komputery to prawdopodobnie najbardziej wszechstronne narzędzia, jakimi dysponuje ludzkość. Potrafią dokonywać niesamowitych obliczeń, pozwalają na przechowywanie ogromnej ilości informacji, zupełnie w różnych częściach planety, a jednocześnie łatwo jest je wymieniać, niezależnie od lokalizacji. Komputery upraszczają wiele codziennych zadań i pozwalają zautomatyzować wiele rutynowych procesów, których wykonanie byłoby dla człowieka bardzo żmudne i nudne. Komputery mogą zrobić tak wiele, a mimo to nie są tak inteligentne jak ludzie. 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 pomiędzy maszyną a człowiekiem istnieje poważna bariera językowa, którą trzeba w jakiś sposób pokonać, w przeciwnym razie 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. Programy same w sobie są zbiorami instrukcji, które komputer może zrozumieć i wykonać.

    Typy programów

    Aby skutecznie komunikować się z komputerem, a o to nam właśnie 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 różnych systemach operacyjnych, 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 nawet nie mają długiego czasu kompilacji. Jednak programy napisane w językach interpretowanych są zwykle znacznie wolniejsze niż równoważne programy skompilowane.

    I wreszcie tak zwana kompilacja w locie (lub kompilacja JIT). Takie języki szybko się kompilują po uruchomieniu 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 wieloplatformowością.

    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 nacisk kładziony jest na koncepcję 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. I z reguły znacznie łatwiej i szybciej jest opracować program w języku wysokiego poziomu niż w języku niskiego poziomu. Jak widać różne poziomy programowania są przeznaczone do zupełnie innych zadań i nie należy porównywać funkcjonalności różnych poziomów języków, to nie ma sensu.

    Systemy typów danych języków 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 się tego trzymać. Kiedy mówię „słaby system danych”, mam na myśli, że język z takim systemem danych nie reguluje ściśle dostępnych konwersji typów danych. Na przykład, jeśli do funkcji mnożenia zamiast liczby zostanie przekazany ciąg znaków lub znak, języki programowania o niesilnym typie wykonają taki kod, chociaż wynik mnożenia traci 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 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 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. Należy pamiętać, że nawet przy deklarowaniu zmiennych nie jest konieczne określanie typu danych.

    Wynikiem wykonania tego kodu będzie zero. Nie wystąpi żaden błąd, chociaż 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 będzie 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 z „systemem słabych typów danych”, czyli 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ą 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 typu statycznego, 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

    Istnieją sytuacje, które mogą prowadzić do nieprzewidywalnego wyniku lub błędu. 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ć 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 będzie skupiał się bardziej na celu niż na środkach do tego celu. Wystarczy wskazać, co należy osiągnąć, nie trzeba wskazywać, 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 wtedy, gdy 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 są przeciwieństwem deklaratywnych języków 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ę intuicyjna. Takie języki zwykle nie lubią „przeskakiwania” z jednego fragmentu kodu na drugi, jak na przykład dobrze znany operator goto zdefiniowany w C i C++.

    paradygmat proceduralny

    Proceduralny język programowania odnosi się do strukturalnego języka programowania, który obsługuje 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 i jest łatwy 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 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, ustalmy, jakie 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++ oznacza, że ​​programista wie, co robi i pozwala na niesamowitą ilość 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. A 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 standardowej biblioteki 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.