Общи характеристики c. Scanf C Описание на функцията

Тази статия обсъжда функцията scanf() в общ изгледбез препратка към конкретен стандарт, следователно тук са включени данни от всички стандарти C99, C11, C++11, C++14. Може би в някои стандарти функцията работи с разлики от материала, представен в статията.

scanf C функция - описание

scanf() е функция, намираща се в заглавните файлове stdio.h(C) и cstdio(C++), известна също като форматиран програмен вход. scanf чете символи от стандартния входен поток (stdin) и ги преобразува според формата, след което ги записва в посочените променливи. Формат – означава, че данните се преобразуват в определен вид при получаване. Така функцията scanf C е описана:

scanf("%format", &променлива1[, &променлива2,[…]]),

където променливите се предават като адреси. Причината за този начин на предаване на променливи към функция е очевидна: в резултат на работа тя връща стойност, показваща наличието на грешки, така че единственият начин да промените стойностите на променливите е да преминете по адрес. Също така, благодарение на този метод, функцията може да обработва данни от всякакъв тип.

Някои програмисти наричат ​​функции като scanf() или printf() като процедури поради аналогията с други езици.

Scanf ви позволява да въвеждате всички основни типове на езика: char, int, float, string и др. При променливи от тип string не е необходимо да се посочва знакът за адрес - "&", тъй като променливата от тип string е масив, а името й е адресът на първия елемент от масива в паметта на компютъра .

Формат на въвеждане или контролен низ

Нека започнем, като разгледаме пример за използване на функцията scanf C от описанието.

#включи int main() ( int x; while (scanf("%d", &x) == 1) printf("%d\n", x); return 0; //изискване за Linux системи )

Форматът на въвеждане се състои от следните четири параметъра: тип %[*][width][modifiers]. В този случай знакът "%" и типът са задължителни параметри. Тоест минималната форма на формата изглежда така: „%s“, „%d“ и т.н.

Най-общо символите, съставляващи форматния низ, се разделят на:

  • форматни спецификатори - всичко, което започва със знака %;
  • разделител или интервал - те са интервал, табулация (\t), нов ред (\n);
  • символи, различни от интервал.

Функцията може да не е безопасна.

Използвайте функцията scanf_s() вместо scanf().

(съобщение от визуално студио)

Тип, или спецификатори на формат, или знаци за преобразуване, или контролни знаци

Scanf C декларацията трябва да съдържа най-малко спецификатор на формат, който е посочен в края на изрази, започващи със знака "%". Той казва на програмата типа данни, които да очаква при въвеждане, обикновено от клавиатурата. Списък на всички спецификатори на формати в таблицата по-долу.

Значение

Програмата чака въвеждане на знак. Променливата, която ще се записва, трябва да е от тип char.

Програмата очаква въвеждане на десетично цяло число. Променливата трябва да е от тип int.

Програмата очаква въвеждане на число с плаваща запетая (запетая) в експоненциална форма. Променливата трябва да е от тип float.

Програмата очаква въвеждането на число с плаваща запетая (запетая). Променливата трябва да е от тип float.

7

Програмата очаква въвеждането на число с плаваща запетая (запетая). Променливата трябва да е от тип float.

Програмата очаква да бъде въведено осмично число. Променливата трябва да е от тип int.

Програмата чака въвеждане на низ. Низът е набор от всякакви знаци до първия срещнат разделителен знак. Променливата трябва да е от тип string.

Програмата очаква да бъде въведено шестнадесетично число. Променливата трябва да е от тип int.

Променливата очаква въвеждане на указател. Променливата трябва да е от тип указател.

Записва в променливата цяло число, равно на броя знаци, прочетени до момента от функцията scanf.

Програмата чете цяло число без знак. Типът на променливата трябва да е цяло число без знак.

Програмата очаква да бъде въведено двоично число. Променливата трябва да е от тип int.

Наборът от знаци за сканиране. Програмата изчаква въвеждане на знаци, от ограничения пул, посочен между scanf, ще работи, докато във входния поток има знаци от посочения набор.

Символи във форматния низ

Символ звездичка (*)

Звездицата (*) е флаг, показващ, че операцията по присвояване трябва да бъде потисната. Непосредствено след знака "%" се поставя звездичка. Например,

Scanf("%d%*c%d", &x, &y); //игнорира знак между две цели числа. scanf("%s%*d%s", str, str2); //игнорира цяло число между два низа.

Тоест, ако въведете реда "45-20" в конзолата, програмата ще направи следното:

  1. На променливата "x" ще бъде присвоена стойност 45.
  2. На променливата "y" ще бъде присвоена стойност 20.
  3. А знакът минус (тире) "-" ще бъде игнориран благодарение на "%*c".

Ширина (или ширина на полето)

Това е цяло число между знака "%" и спецификатора на формата, който указва максимална сумазнаци за четене за текущата операция за четене.

Има няколко важни момента, които трябва да имате предвид:

  1. scanf ще прекъсне, ако срещне разделителен знак, дори и да не е преброил 20 знака.
  2. Ако са въведени повече от 20 знака, само първите 20 знака ще бъдат записани в str.

Модификатори на типа (или точност)

Това са специални флагове, които променят типа данни, очаквани за въвеждане. Флагът е посочен вляво от спецификатора на типа:

  • L или l (малък L) Когато "l" се използва със спецификаторите d, i, o, u, x, флагът указва на програмата, че се очаква дълго int въвеждане. Когато използвате "l" със спецификатора e или f, флагът казва на програмата, че трябва да очаква двойна стойност. Използването на "L" казва на програмата, че се очаква дълго двойно. Използването на "l" със спецификаторите "c" и "s" казва на програмата, че се очакват двубайтови знаци като wchar_t. Например "%lc", "%ls", "%l".
  • h е флаг, указващ краткия тип.
  • hh - показва, че променливата е указател към стойност от тип signed char или unsigned char. Флагът може да се използва със спецификаторите d, i, o, u, x, n.
  • ll (две малки L) показва, че променливата е указател към стойност от тип signed int или unsigned long long int. Флагът се използва със спецификатори: d, i, o, u, x, n.
  • j - показва, че променливата е указател към типа intmax_t или uintmax_t от заглавния файл stdint.h. Използва се със спецификатори: d, i, o, u, x, n.
  • z - показва, че променливата е указател към типа size_t, чиято дефиниция е в stddef.h. Използва се със спецификатори: d, i, o, u, x, n.
  • t - показва, че променливата е указател към типа ptrdiff_t. Дефиницията за този тип е в stddef.h. Използва се със спецификатори: d, i, o, u, x, n.

По-ясно, картината с модификатори може да бъде представена под формата на таблица. Такова описание на scanf C за програмисти ще бъде по-ясно.

Други герои

Всички знаци, срещани във формата, ще бъдат отхвърлени. Трябва да се отбележи, че наличието на интервали или разделителни знаци (нов ред, интервал, табулация) в контролния низ може да доведе до различно поведение на функцията. В една версия scanf() ще чете, без да запазва произволен брой разделители, докато не срещне символ, различен от разделителя, а в друга версия интервалите (само те) не играят роля и изразът "%d + %d" е еквивалентно на "% d+%d".

Примери

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

scanf("%3s", str); //ако въведете низа "1d2s3d1;3" в конзолата, само "1d2" ще бъде записано в str scanf("%dminus%d", &x, &y); //знаците минус между две числа ще бъдат отхвърлени scanf("%5", str); // знаците ще бъдат въведени в str, докато има 5 знака и знаците са числа от 0 до 9. scanf("%lf", &d); //очаквайте двойно въвеждане scanf("%hd", &x); //очакван номер от типа short scanf("%hu", &y); //очаква неподписано число short scanf("lx", &z); //очаквано число тип long int

От дадените примери можете да видите как се променя очакваното число, използвайки различни символи.

scanf C - описание за начинаещи

Този раздел ще бъде полезен за начинаещи. Често трябва да имате под ръка не толкова много Пълно описание scanf C колко подробности за това как работи функцията.

  • Функцията е донякъде остаряла. Има няколко различни реализации в библиотеките различни версии. Например подобрената функция scanf SC, чието описание може да бъде намерено в Microsoft.
  • Броят на спецификаторите във формата трябва да съответства на броя на аргументите, предадени на функцията.
  • Елементите на входния поток трябва да бъдат разделени само с разделителни знаци: интервал, табулация, нов ред. Запетая, точка и запетая, точка и т.н. - тези знаци не са разделители за функцията scanf().
  • Ако scanf срещне разделителен знак, въвеждането ще бъде спряно. Ако има повече от една променлива за четене, тогава scanf ще премине към четене на следващата променлива.
  • Най-малкото несъответствие във формата на входните данни води до непредвидими резултати на програмата. Е, ако програмата просто завърши с грешка. Но често програмата продължава да работи и го прави погрешно.
  • scanf("%20s...",...); Ако входният поток надвишава 20 знака, тогава scanf ще прочете първите 20 знака и или ще прекрати, или ще премине към четене на следващата променлива, ако е зададена такава. В този случай следващото извикване на scanf ще продължи да чете входния поток от точката, където работата на предишното извикване на scanf е спряла. Ако се срещне разделителен знак при четене на първите 20 знака, scanf ще прекрати или ще премине към четене на следващата променлива, дори ако не е прочел 20 знака за първата променлива. В този случай всички непрочетени символи ще бъдат прикрепени към следващата променлива.
  • Ако наборът от сканирани знаци започва със знак "^", тогава scanf ще прочете данните, докато не срещне символ за разделител или знак от набора. Например "%[^A-E1-5]" ще чете данни от потока, докато не се срещне един от главните английски букви от A до E или едно от числата от 1 до 5.
  • Функцията scanf C по дефиниция връща число, равно на броя на успешните записи на променливи. Ако scanf запише 3 променливи, тогава резултатът от успеха на функцията ще върне числото 3. Ако scanf не може да запише никакви променливи, тогава резултатът ще бъде 0. И накрая, ако scanf изобщо не може да стартира по някаква причина, резултатът ще бъде EOF.
  • Ако функцията scanf() е завършила работата си неправилно. Например, scanf("%d", &x) - очакваше се число, но входът получи знаци. Следващото извикване на scanf() ще започне от точката във входния поток, където е спряло предишното извикване на функция. За да се преодолее този проблем, е необходимо да се отървете от проблемните герои. Това може да стане например чрез извикване на scanf("%*s"). Тоест, функцията ще прочете низ от знаци и ще го изхвърли. По този труден начин можете да продължите да въвеждате необходимите данни.
  • Някои реализации на scanf() не позволяват "-" в набора от знаци да бъде сканиран.
  • Спецификаторът "%c" чете всеки символ от потока. Тоест чете и разделителния знак. За да пропуснете знака за разделител и да продължите да четете желания знак, може да се използва "%1s".
  • Когато използвате спецификатора "c", е приемливо да използвате ширината "%10c", но след това във формата функционална променлива scanf трябва да предаде масив от елементи от тип char.
  • „%“ означава „всички малки букви от английската азбука“, а „%“ означава само 3 знака: „z“, „a“, „-“. С други думи, символът "-" означава диапазон само ако е между два знака, които са в правилния ред. Ако "-" е в края на израза, в началото или в грешен ред на знаците от двете им страни, тогава това е просто знак за тире, а не диапазон.

Заключение

Това завършва описанието на scanf C. Това е хубава удобна функция за работа малки програмии при използване на процедурния метод на програмиране. Основният недостатък обаче е броят на непредсказуемите грешки, които могат да възникнат при използване на scanf. Следователно описанието на scanf C при програмиране е най-добре да се държи пред очите ви. В големите професионални проекти се използват iostreams, поради факта, че имат възможности на по-високо ниво, по-добре улавят и обработват грешки, както и работят със значителни количества информация. Трябва също да се отбележи, че описанието на scanf C на руски е достъпно в много онлайн източници, както и примери за използването му, поради възрастта на функцията. Ето защо, ако е необходимо, винаги можете да намерите отговор на тематични форуми.

C/C++ Standard Library включва редица функции за четене и запис в конзолата (клавиатура и монитор). Тези функции четат и записват данни като обикновен поток от знаци.

Концепцията за поток (поток), използвана в програмирането, е тясно свързана с обичайното, ежедневно разбиране на тази дума. Входящият поток може да се сравни с тръба, през която водата (информацията) влиза в басейна (паметта на компютъра), изходящият поток - с тръба, през която водата напуска басейна. Важна характеристикаТози канал е, че данните могат да се движат само в една посока в даден момент. Дори ако една и съща тръба се използва за вход и изход, това не може да се случи едновременно: за да превключите посоката на потока, трябва да го спрете, да извършите някакво действие и едва след това да насочите потока в обратна посока. Друга особеност на потока е, че почти никога не пресъхва. Понякога изсъхва, но този период не може да бъде дълъг, ако системата функционира нормално.

printf() стандартна изходна функция

Функцията printf() е стандартна изходна функция. С тази функция можете да изведете символен низ, число, променлива стойност на екрана на монитора ...

Функцията printf() има прототип във файла stdio.h
int printf(char *контролен низ, ...);

Ако е успешна, функцията printf() връща броя на отпечатаните знаци.

Контролният низ съдържа два типа информация: знаци, които се показват директно на екрана, и спецификатори на формат, които определят как да се извеждат аргументите.

Функцията printf() е форматирана изходна функция. Това означава, че в параметрите на функцията е необходимо да посочите формата на данните, които да бъдат изведени. Форматът на данните се определя от спецификатори на формат. Спецификаторът на формата започва с %, последван от код на формат.

Спецификатори на формат:

символ
цяло десетично число
%i цяло десетично число
%e десетично число във формата x.xx e+xx
%E десетично число във формата x.xx E+xx
%f
%F десетична плаваща запетая xx.xxxx
%g %f или %e, което е по-кратко
%G %F или %E, което е по-кратко
%o осмично число
символен низ
%u десетично число без знак
шестнадесетично число
шестнадесетично число
%% символ %
%p показалец
показалец

Освен това модификаторите l и h могат да се прилагат към команди за форматиране.

%ld печат дълго вътр
%hu печат кратко без знак
%Lf печат дълго двойно

В спецификатора на формата след символа % може да се укаже точността (броят цифри след десетичната запетая). Точността се задава, както следва: %.n<код формата>. Където n е броят на цифрите след десетичната запетая и<код формата>- един от кодовете по-горе.

Например, ако имаме променлива x=10.3563 от тип float и искаме да покажем нейната стойност с точност до 3 знака след десетичната запетая, тогава трябва да напишем:

printf("Променлива x = %.3f",x);

Резултат:
Променлива x = 10,356

Можете също така да посочите минималната ширина на полето, което да се отпечата. Ако низът или числото са по-големи от зададената ширина на полето, тогава низът или числото се отпечатват изцяло.

Например, ако напишете:

printf("%5d",20);

тогава резултатът ще бъде:
20

Имайте предвид, че числото 20 не е отпечатано от самото начало на реда. Ако желаете неизползваните места на полето да бъдат запълнени с нули, тогава трябва да поставите знака 0 пред ширината на полето.

Например:

printf("%05d",20);

Резултат:
00020

В допълнение към спецификаторите на формата на данните, контролният низ може да съдържа контролни знаци:

\b BS, дънна дупка
\f Нова страница, превод на страница
Нов ред, подаване на ред
\r Връщане на каретка
\T Хоризонтален раздел
\v Вертикален раздел
\" двойни кавички
\" апостроф
\\ Наклонена черта
\0 Нулев знак, нулев байт
\a Сигнал
Осмична константа
\xN Шестнадесетична константа
\? Въпросителен знак

Най-често ще използвате знака \n. С този контролен символ ще можете да прескачате на нов ред. Вижте примерите за програми и ще разберете всичко.

Примери за програми.

/* Пример 1 */
#включи

void main(void)
{
int a,b,c; // Съобщение променливи a,b,c
а=5;
b=6;
c=9;
printf("a=%d, b=%d, c=%d",a,b,c);
}

Резултатът от програмата:
a=5, b=6, c=9

/* Пример 2 */
#включи

void main(void)
{
float x,y,z;

X=10,5;
y=130.67;
z=54;

Printf("Координати на обект: x:%.2f, y:%.2f, z:%.2f", x, y, z);
}

Резултатът от програмата:
Координати на обекта: x:10.50, y:130.67, z:54.00

/* Пример 3 */
#включи

void main()
{
intx;

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

Резултатът от програмата:
х=10

/* Пример 4 */
#включи

void main(void)
{
printf("\"Текст в кавички\"");
printf("\nСъдържание на кислород: 100%%");
}

Резултатът от програмата:
"Текст в кавички"
Съдържание на кислород: 100%

/* Пример 5 */
#включи

void main(void)
{
int a;

А=11; // 11 в десетичен е равен на b в шестнадесетичен
printf("a-dec=%d, a-hex=%X",a,a);
}

Резултатът от програмата:
a-dec=11, a-hex=b

/* Пример 6 */
#включи

void main(void)
{
char ch1,ch2,ch3;

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

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

Резултатът от програмата:
ABC

/* Пример 7 */
#включи

void main(void)
{
char *str="Моят низ.";

Printf("Това е %s",str);
}

Резултатът от програмата:
Това е моята линия.

/* Пример 8 */
#включи

void main(void)
{
printf("Здравей!\n"); // След отпечатването ще има нов ред - \n
printf("Казвам се Пол."); // Това ще бъде отпечатано на нов ред
}

Резултатът от програмата:
Здравейте!
Казвам се Павел.

scanf() стандартна функция за въвеждане

Функцията scanf() е форматирана функция за въвеждане. С него можете да въвеждате данни от стандартното устройство за въвеждане (клавиатура). Входните данни могат да бъдат цели числа, числа с плаваща запетая, знаци, низове и указатели.

Функцията scanf() има следния прототип в stdio.h:
int scanf(char *контролен низ);

Функцията връща броя променливи, на които е присвоена стойност.

Контролният низ съдържа три вида знаци: спецификатори на формат, интервали и други знаци. Спецификаторите на формата започват със знака %.

Спецификатори на формат:

При въвеждане на низ чрез функцията scanf() (спецификатор на формат %s), низът се въвежда до първия интервал!! тези. ако въведете низа "Hello world!" с помощта на функцията scanf().


scanf("%s",str);

тогава след въвеждане на получения низ, който ще се съхранява в масива str, ще се състои от една дума "Hello". ФУНКЦИЯ ВЪВЕЖДА В НИЗ ДО ПЪРВОТО ИНТЕРВАЛО! Ако искате да въведете низове с интервали, използвайте функцията

char *получава (char *buf);

С функцията gets() можете да въвеждате цели низове. Функцията gets() чете знаци от клавиатурата, докато не се появи знак нова линия(\н). Самият символ за нов ред се появява, когато натиснете клавиша enter. Функцията връща указател към buf. buf - буфер (памет) за входния низ.

Въпреки че gets() е извън обхвата на тази статия, нека напишем примерна програма, която ви позволява да въведете цял ред от клавиатурата и да го изведете на екрана.

#включи

void main(void)
{
charbuffer; // масив (буфер) за входния низ

Получава (буфер); // въведете низ и натиснете enter
printf("%s",буфер); // изведе въведения низ на екрана
}

Друга важна забележка! За да въведете данни с помощта на функцията scanf(), трябва да подадете адресите на променливите като параметри, а не самите променливи. За да получите адреса на променлива, предхождайте името на променливата с & (амперсанд). Знакът & означава вземане на адреса.

Какво означава адрес? Ще се опитам да обясня. В програмата имаме променлива. Променливата съхранява стойността си в паметта на компютъра. Така че адресът, който получаваме с &, е адресът в паметта на компютъра, където се съхранява стойността на променливата.

Нека да разгледаме примерна програма, която ни показва как да използваме &

#включи

void main(void)
{
intx;

Printf("Въведете променлива x:");
scanf("%d",&x);
printf("Променлива x=%d",x);
}

Сега нека се върнем към контролния ред на функцията scanf(). Отново:

int scanf(char *контролен низ);

Знакът за интервал в контролния ред указва да се пропуснат един или повече интервали във входния поток. В допълнение към интервал може да се приеме табулатор или знак за нов ред. Ненулев знак показва да се прочете и отхвърли този знак.

Разделителите между две въведени числа са знаци за интервал, разделяне или нов ред. * след % и преди кода на формат (спецификатор на формат) указва да се четат данни от посочения тип, но не и да се присвои тази стойност.

Например:

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

въвеждането на 50+20 ще зададе i на 50, j на 20, а + ще бъде прочетен и игнориран.

Командата за форматиране може да укаже най-голямата ширина на полето за четене.

Например:

scanf("%5s",str);

указва да се прочетат първите 5 знака от входния поток. Ако въведете 1234567890ABC, масивът str ще съдържа само 12345, останалите знаци ще бъдат игнорирани. Разделители: интервал, табулация и нов ред - при въвеждане на символ те се третират като всички останали знаци.

Ако в контролния низ се срещнат други знаци, те са предназначени да определят и пропуснат съответния знак. 10plus20 символен поток по оператор

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

ще присвои x на 10, y на 20 и ще пропусне знаците плюс, защото се появяват на контролния ред.

Един от мощни функциифункцията scanf() е способността да зададете набора за търсене (scanset). Наборът за търсене дефинира набора от знаци, спрямо които ще се сравняват знаците, прочетени от scanf(). Функцията scanf() чете символи, стига да се срещат в набора за търсене. След като въведеният знак не бъде намерен в набора за търсене, функцията scanf() преминава към следващия спецификатор на формат. Наборът за търсене се определя от списък със знаци, затворени в квадратни скоби. Отварящата скоба се предхожда от знак %. Нека да разгледаме това с пример.

#включи

void main(void)
{
char str1, str2;
scanf("%%s", str1, str2);
printf("\n%s\n%s",str1,str2);
}
Нека въведем набор от знаци:
12345abcdefg456

На екрана програмата ще покаже:
12345
abcdefg456

Когато задавате набор за търсене, можете също да използвате знака за тире, за да посочите интервали, както и максималната ширина на полето за въвеждане.

scanf("%10", str1);

Можете също така да дефинирате знаци, които не са в набора за търсене. Първият от тези знаци се предхожда от знак ^. Наборът от символи прави разлика между малки и главни букви.

Позволете ми да ви напомня, че когато използвате функцията scanf (), трябва да предадете адресите на променливите като параметри към нея. Горният код беше написан:

charstr; // масив от 80 знака
scanf("%s",str);

Имайте предвид, че str не се предхожда от &. Това е така, защото str е масив и името на масива, str, е указател към първия елемент на масива. Следователно знакът & не се поставя. Вече предаваме адреса на функцията scanf(). Е, просто казано, str е адресът в паметта на компютъра, където ще се съхранява стойността на първия елемент от масива.

Примери за програми.

Пример 1
Тази програма показва заявката „На колко години си?:“ и чака въвеждане. Ако например въведете числото 20, програмата ще изведе низа "Вие сте на 20 години.". Когато извикахме функцията scanf(), поставихме пред променливата възраст &, тъй като функцията scanf() се нуждае от адресите на променливите. Функцията scanf() ще запише въведената стойност на посочения адрес. В нашия случай въведената стойност 20 ще бъде записана на адреса на променливата възраст.

/* Пример 1 */

#включи

void main(void)
{
int възраст;

Printf("\nНа колко години си?:");
scanf("%d",&възраст);
printf("Вие сте на %d години.", възраст);
}

Пример 2
Програма калкулатор. Този калкулатор може да събира само числа. Ако въведете 100+34, програмата ще върне резултата: 100+34=134.

/* Пример 2 */

#включи

void main(void)
{
int x, y;

Printf("\nКалкулатор:");
scanf("%d+%d", &x, &y);
printf("\n%d+%d=%d", x, y, x+y);
}

Пример 3
Този пример показва как да зададете ширината на полето за четене. В нашия пример ширината на полето е пет знака. Ако въведете низ с повече знаци, всички знаци след 5-ия ще бъдат отхвърлени. Обърнете внимание на извикването на функцията scanf(). Знакът & не предхожда името на името на масива, тъй като името на името на масива е адресът на първия елемент от масива.

/* Пример 3 */

#включи

void main(void)
{
charname;

Printf("\nВъведете вашето потребителско име (максимум 5 знака):");
scanf("%5s", име);
printf("\nВъведохте %s", име);
}

Пример 4
Последният пример в тази статия показва как можете да използвате набора за справка. След стартиране на програмата въведете число от 2 до 5.

/* Пример 4 */

#включи

void main(void)
{
чарбал;

Printf("Вашият резултат е 2,3,4,5:");
scanf("%", &bal);
printf("\nРезултат %c", bal);
}

Език за програмиране C++

Последна актуализация: 28.08.2017

Езикът за програмиране C++ е компилиран език за програмиране с общо предназначение на високо ниво с статично въвеждане, който е подходящ за създаване на голямо разнообразие от приложения. C++ е един от най-популярните и широко разпространени езици днес.

Той има своите корени в езика C, който е разработен през 1969-1973 г. в Bell Labs от програмиста Денис Ричи. В началото на 80-те години датският програмист Bjarne Stroustrup, тогава в Bell Labs, разработи C++ като разширение на езика C. Всъщност в началото C++ просто допълва езика C с някои характеристики на обектно-ориентираното програмиране. И така, самият Страуструп отначало го нарича "С с класове" ("С с класове").

В последствие нов езикзапочна да набира популярност. Към него бяха добавени нови функции, които го направиха не просто допълнение към C, а напълно нов език за програмиране. В резултат на това "C с класове" беше преименуван на C++. И оттогава и двата езика започнаха да се развиват независимо един от друг.

C++ е мощен език, наследяващ богати възможности за памет от C. Следователно C++ често намира своето приложение в системното програмиране, по-специално при създаването операционна система, драйвери, различни помощни програми, антивируси и др. Между другото, Windows е написан предимно на C++. Но само приложение за системно програмиране даден езикне е ограничено. C++ може да се използва в програми от всяко ниво, където скоростта и производителността са важни. Често се използва за създаване графични приложения, различни приложни програми. Също така се използва особено често за създаване на игри с богати богати визуализации. Освен това мобилната посока напоследък набира скорост, където C ++ също намери своето приложение. И дори в уеб разработката можете също да използвате C++ за създаване на уеб приложения или някакъв вид спомагателни услуги, които обслужват уеб приложения. Като цяло C++ е широко използван език, на който можете да напишете почти всякакъв вид програма.

C++ е компилиран език, което означава, че компилаторът превежда източникв C++ в изпълним файл, който съдържа набор от машинни инструкции. Но различните платформи имат свои собствени характеристики, така че компилираните програми не могат просто да бъдат прехвърлени от една платформа на друга и да се изпълняват там. Въпреки това, на ниво изходен код, C++ програмите са предимно преносими, освен ако не се използват някои специфични за ОС функции. А наличието на компилатори, библиотеки и инструменти за разработка за почти всички често срещани платформи прави възможно компилирането на същия изходен код на C++ в приложения за тези платформи.

За разлика от C, езикът C++ ви позволява да пишете приложения в обектно-ориентиран стил, представяйки програма като колекция от класове и обекти, взаимодействащи един с друг. Това опростява създаването на големи приложения.

Основни етапи на развитие

През 1979-80 г. Bjarne Stroustrup разработва разширение на езика C - "C с класове". През 1983 г. езикът е преименуван на C++.

През 1985 г. излиза първата комерсиална версия на езика C++, както и първото издание на книгата „Езикът за програмиране C++“, което представлява първото описание на този език при липса на официален стандарт.

Издадена през 1989 г нова версия C++ 2.0, който включва редица нови функции. След това езикът се развива относително бавно до 2011 г. Но в същото време през 1998 г. е направен първият опит за стандартизиране на езика от ISO (Международна организация за стандартизация). Първият стандарт се нарича ISO/IEC 14882:1998 или накратко C++98. По-късно през 2003 г. беше публикувана нова версия на стандарта C++03.

През 2011 г. беше публикуван новият стандарт C++11, който съдържа много допълнения и обогати езика C++. Голям бройнова функционалност. Това беше последвано през 2014 г. от незначително допълнение към стандарта, известно още като C++14. Друго ключово издание на езика е планирано за 2017 г.

Компилатори и среди за разработка

За да разработвате програми на C++, имате нужда от компилатор - той превежда изходния код на C++ в изпълним файл, който след това може да бъде стартиран. Но в момента има много различни компилатори. Те могат да се различават в различни аспекти, по-специално в прилагането на стандартите. Основен списък с компилатори за C++ може да се намери в wikipedia. Препоръчително е за разработка да изберете тези компилатори, които разработват и прилагат всички най-нови стандарти. Например, в този урок ще се използва предимно свободно достъпният g++ компилатор, разработен от проекта GNU.

Можете също да използвате IDE като Visual Studio, Netbeans, Eclipse, Qt и т.н., за да създавате програми.

Изучаване на основите и тънкостите на езика за програмиране C++. Учебник с практически задачи и тестове. Искате ли да се научите да програмирате? Тогава сте на правилното място - тук безплатно образованиепрограмиране. Независимо дали имате опит или не, тези уроци по програмиране ще ви помогнат да започнете да създавате, компилирате и отстранявате грешки в C++ програми в различни среди за разработка: Visual Studio, Code::Blocks, Xcode или Eclipse.

Много примери и подробни обяснения. Перфектен както за начинаещи (манекени), така и за по-напреднали. Всичко е обяснено от нулата до най-малкия детайл. Тези уроци (200+) ще ви осигурят добра основа за разбиране на програмирането не само на C++, но и на други езици за програмиране. И то абсолютно безплатно!

Също така взети предвид създаване стъпка по стъпка c++ игри, графична библиотека SFML и повече от 50 задачи за тестване на вашите умения и знания по C++. Допълнителен бонус е.

За репост +20 към кармата и моята благодарност!

Глава номер 0. Въведение. Начало на работа

Глава номер 1. Основи на C++

Глава номер 2. Променливи и основни типове данни в C++

Глава номер 3. Оператори в C++

Глава номер 4. Обхват и други типове променливи в C++

Глава номер 5. Редът, в който кодът се изпълнява в програмата. Цикли, разклонения в C++

Тези уроци са за всеки, независимо дали сте нов в програмирането или вече имате богат опит в програмирането на други езици! Този материал е за тези, които искат да научат езиците C / C ++ от самите им основи до най-сложните структури.

C++ е език за програмиране, познаването на този език за програмиране ще ви позволи да управлявате компютъра си най-високо ниво. В идеалния случай можете да накарате компютъра да прави каквото искате. Нашият сайт ще ви помогне да научите езика за програмиране C++.

Инсталиране на /IDE

Първото нещо, което трябва да направите, преди да започнете да изучавате C++, е да се уверите, че имате IDE - интегрирана среда за разработка (програмата, в която ще програмирате). Ако нямате IDE, значи сте тук. Когато решите IDE, инсталирайте го и практикувайте създаването на прости проекти.

Въведение в C++

Езикът C++ е набор от команди, които казват на компютъра какво да прави. Този набор от команди обикновено се нарича изходен код или просто код. Командите са или "функции", или " ключови думи". Ключовите думи (запазени думи в C/C++) са основните градивни елементи на езика. Функциите са сложни градивни елементи, защото са написани от гледна точка на по-прости функции, както ще видите в първата ни програма по-долу. Тази структура от функции наподобява съдържанието на книга. Съдържанието може да показва главите на книгата, всяка глава в книгата може да има собствено съдържание, състоящо се от параграфи, всеки параграф може да има свои собствени подпараграфи. Въпреки че C++ предоставя много общи функциии запазени думи, които можете да използвате, все още има нужда да напишете свои собствени функции.

В коя част от програмата започна? Всяка програма в C++ има една функция, тя се нарича основна или основна функция, изпълнението на програмата започва с тази функция. от Главна функция, можете също така да извиквате всякакви други функции, независимо дали са написани от нас или, както споменахме по-рано, предоставени от компилатора.

И така, как да получите достъп до тези стандартни функции? Влизам стандартни функциикоито идват с компилатора, трябва да включите заглавния файл, като използвате директивата за препроцесор — #include. Защо е ефективен? Нека разгледаме един пример работна програма:

#включи << "Моя первая программа на С++\n"; cin.get(); }

Нека разгледаме по-подробно елементите на програмата. #include е директива за "препроцесор", която казва на компилатора да постави кода от заглавния файл на iostream в нашата програма, преди да създаде изпълнимия файл. Като включите заглавен файл във вашата програма, вие получавате достъп до много различни функции, които можете да използвате във вашата програма. Например операторът cout изисква iostream. Редът, използващ пространство от имена std; казва на компилатора да използва група функции, които са част от стандартната библиотека std. Този ред също позволява на програмата да използва оператори като cout. Точката и запетая е част от синтаксиса на C++. Той казва на компилатора, че това е краят на командата. Малко по-късно ще видите, че точката и запетая се използва за прекратяване на повечето команди в C++.

Следващият важен ред на програмата е int main(). Този ред казва на компилатора, че има функция с име main и че функцията връща цяло число от тип int. Къдрави скоби ( и ) означават началото ( и края ) на функция. Къдравите скоби се използват и в други блокове код, но винаги означават едно и също нещо - съответно началото и края на блока.

В C++ обектът cout се използва за показване на текст (произнася се "cout"). Той използва герои<< , известные как «оператор сдвига», чтобы указать, что отправляется к выводу на экран. Результатом вызова функции cout << является отображение текста на экране. Последовательность \n фактически рассматривается как единый символ, который обозначает новую строку (мы поговорим об этом позже более подробно). Символ \n перемещает курсор на экране на следующую строку. Опять же, обратите внимание на точку с запятой, её добавляют в конец, после каждого оператора С++.

Следващата команда е cin.get(). Това е друго извикване на функция, което чете данни от входния поток от данни и чака да бъде натиснат клавишът ENTER. Тази команда предпазва прозореца на конзолата от затваряне, докато не бъде натиснат клавишът ENTER. Това ви дава време да разгледате резултата от програмата.

При достигане на края на основната функция (затварящата фигурна скоба), нашата програма ще върне стойността 0 за операционната система. Тази върната стойност е важна, защото чрез анализирането й ОС може да прецени дали нашата програма е завършила успешно или не. Върната стойност 0 означава успех и се връща автоматично (но само за типа данни int, други функции изискват да върнете стойността ръчно), но ако искаме да върнем нещо друго, като 1, ще трябва да го направим ръчно .

#включи използване на пространство от имена std; int main() ( cout<<"Моя первая программа на С++\n"; cin.get(); return 1; }

За да консолидирате материала, въведете програмния код във вашата IDE и го стартирайте. След като програмата се изпълни и сте видели резултата, експериментирайте малко с израза cout. Това ще ви помогне да свикнете с езика.

Не пропускайте да коментирате вашите програми!

Добавете коментари към кода, за да го направите по-ясен не само за себе си, но и за другите. Компилаторът игнорира коментарите при изпълнение на код, което позволява произволен брой коментари да се използват за описание на действителния код. За да създадете коментар, използвайте или // , което казва на компилатора, че останалата част от реда е коментар, или /* последвано от */ . Когато се учите да програмирате, е полезно да можете да коментирате определени части от кода, за да видите как се променя резултатът от програмата. Можете да прочетете подробно за техниката на коментиране.

Какво да правим с всички тези типове променливи?

Понякога може да е объркващо да имате множество типове променливи, когато изглежда, че някои типове променливи са излишни. Много е важно да използвате правилния тип променлива, тъй като някои променливи изискват повече памет от други. Също така, поради начина, по който числата с плаваща запетая се съхраняват в паметта, типовете данни float и double са "неточни" и не трябва да се използват, когато трябва да се съхранява точна целочислена стойност.

Деклариране на променливи в C++

За да декларирате променлива, използвайте типа синтаксис<имя>; . Ето някои примери за декларации на променливи:

int номер; характер; float num_float;

Позволено е да се декларират няколко променливи от един и същи тип в един ред, като за това всяка от тях трябва да бъде разделена със запетая.

int x, y, z, d;

Ако сте се вгледали внимателно, може да сте видели, че декларацията на променлива винаги е последвана от точка и запетая. Можете да прочетете повече за конвенцията - "за именуване на променливи".

Често срещани грешки при деклариране на променливи в C++

Ако се опитате да използвате променлива, която не е декларирана, вашата програма няма да се компилира и ще получите грешка. В C++ всички ключови думи на езика, всички функции и всички променливи са чувствителни към главни и малки букви.

Използване на променливи

Така че сега знаете как да декларирате променлива. Ето примерна програма, демонстрираща използването на променлива:

#включи използване на пространство от имена std; int main() ( int число; cout<< "Введите число: "; cin >>номер; cin.ignore(); cout<< "Вы ввели: "<< number <<"\n"; cin.get(); }

Нека да разгледаме тази програма и да проучим нейния код ред по ред. Ключовата дума int казва, че това число е цяло число. Функцията cin >> чете стойността в число, потребителят трябва да натисне enter след въведеното число. cin.ignore() е функция, която чете знак и го игнорира. Организирали сме въвеждането си в програмата, след въвеждане на число натискаме клавиша ENTER, знакът, който също се предава на входния поток. Не ни трябва, затова го изхвърляме. Имайте предвид, че променливата е декларирана като цяло число, ако потребителят се опита да въведе десетично число, то ще бъде съкратено (т.е. десетичната част от числото ще бъде игнорирана). Опитайте да въведете десетично число или последователност от знаци, когато стартирате примерната програма, отговорът ще зависи от въведената стойност.

Имайте предвид, че кавички не се използват при отпечатване от променлива. Липсата на кавички казва на компилатора, че има променлива и следователно, че програмата трябва да провери стойността на променливата, за да замени името на променливата с нейната стойност, когато се изпълни. Множество оператори за смяна на един и същ ред са напълно приемливи и изходът ще бъде направен в същия ред. Трябва да разделите низови литерали (низове в кавички) и променливи, давайки на всеки различен оператор за смяна<< . Попытка поставить две переменные вместе с одним оператором сдвига << выдаст сообщение об ошибке . Не забудьте поставить точку с запятой. Если вы забыли про точку с запятой, компилятор выдаст вам сообщение об ошибке при попытке скомпилировать программу.

Промяна и сравняване на стойности

Разбира се, без значение какъв тип данни използвате, променливите не са от голям интерес, освен ако стойността им не може да бъде променена. По-долу са показани някои от операторите, използвани във връзка с променливи:

  • * умножение,
  • - изваждане,
  • + допълнение,
  • / деление,
  • = задание,
  • == равенство,
  • > повече
  • < меньше.
  • != не е равно
  • >= по-голямо или равно
  • <= меньше или равно

Операторите, които изпълняват математически функции, трябва да се използват отдясно на знака за присвояване, за да се присвои резултатът на променливата отляво.

Ето няколко примера:

A = 4 * 6; // използвайте коментар на ред и точка и запетая, a е 24 a = a + 5; // е равно на сумата от първоначалната стойност и пет a == 5 // не е присвоено пет, проверете и е равно на 5 или не

Често ще използвате == в конструкции като условни изрази и цикли.

А< 5 // Проверка, a менее пяти? a >5 // Проверка дали a е по-голямо от пет? a == 5 // Проверете дали a е пет? a != 5 // Проверка дали a не е равно на пет? a >= 5 // Проверка дали a е по-голямо или равно на пет? а<= 5 // Проверка, a меньше или равно пяти?

Тези примери не показват много ясно използването на знаци за сравнение, но когато започнем да изучаваме операторите за избор, ще разберете защо това е необходимо.



Зареждане...
Връх