Оператор goto – дава възможност да се промени реда на изпълнение на операторите в програмата; не се препоръчва използването му – води до неясни програми; операторът goto е приложим в системното програмиране на C, той е доста ефективен, но се използва най-вече на ниво асемблер;
Синтаксис: goto етикет;
Тук етикет е идентификатор; той се поставя пред някой от операторите в програмата;
етикет: оператор
goto предава управлението на оператора със съответния етикет;
Пример: реализация на цикъл while чрез goto;
do
оператор
while (израз);
ET: оператор
if (израз) goto ET;
Предаването на управлението може да се извършва в рамките на една функция;
Внимание: трябва да се внимава, ако с goto се навлиза в тялото на цикъл без инициализация;
Оператор switch – оператор за избор на вариант, чрез него се избира една от няколко взаимноизключващи се алтернативи;
синтаксис (общ вид)
switch (израз-селектор)
{ case израз1:
оператори
[ break; ]
case израз2:
оператори
[ break; ]
…
[ default:
оператори
[ break; ]
}
switch, case, default са ключови (запазени) думи;
израз-селектор – израз от тип int;
израз1, израз2, … - константни изрази от тип int, които трябва да имат различни стойности;
Изпълнение:
-
Пресмята се израз-селектор;
-
Измежду израз1, израз2, ... се търси изразk, стойността на който е равна на стойността на израз-селектор; ако такова k съществува, тогава ще се изпълнят операторите с етикет изразk; ако такова k не съществува, тогава ще се изпълнят операторите с етикет default, ако default липсва, тогава нищо няма да се изпълни; ако пропуснем break, изпълнението ще продължи и през следващите оператори до достигане на break или до края на оператора; възможно е група оператори да имат няколко етикета:
case израз1:
case израз2:
case израз3:
оператори
break;
В езика C не е фиксирана последователност в която израз-селектор се сравнява с израз1, израз2, ...;
Да разгледаме следната конструкция:
if (израз-селектор == израз1)
{ оператори }
else if (израз-селектор == израз2)
{ оператори }
…
Тази конструкция на практика функционира като оператор switch, но тук ние знаем наредбата на сравненията; предимството на switch е по-ясната структура;
Вместо break може да се използва оператор return, с който се прекратява изпълнението на функцията или оператор exit, който завършва изпълнението на програмата; в блока на switch можем да дефинираме променливи; оператори switch могат да се влагат един в друг;
#include
#include //прототип на фукнцията exit
void main ()
{ char sys;
float r, x;
printf (“Въведете кода на фигурата: “);
sys = getchar ();
switch (sys)
{ case ‘c’:
x = 2 * 3.14 * r;
break;
case ‘s’:
x = 4 * r;
break;
case ‘t’:
x = 3 * r;
break;
default:
printf(“Грешен код!”);
exit (1);
}
printf (“Периметърът = %f\n”, x);
}
Ако програмата завърши с оператор exit, операционната система смята, че изпълнението е приключило нормално;
exit ( c ); Ако c = 1 – изпълнението е безуспешно, ако c = 0, изпълнението е успешно; вместо 0 и 1 могат да се използват макроси
EXIT_SUCCESS и EXIT_FAILURE; макросът е понятие на препроцесора; той е по-ефективен от именуваните константи, тъй като стойността му се замества от препроцесора, а не по време на изпълнение;
12 ноември
15. Форматиран изход. Функция prinf.
Форматиран изход – преобразуване на поле от оперативната памет и извеждане на полученото върху външен носител;
Функция printf
Синтаксис:
printf (“форматиращи параметри”, списък от аргументи);
форматиращи параметри – константа от тип символи; те са два вида:
-
последователност от символи, които се извеждат на екрана; графичните символи се изобразяват, а управляващите символи се изпълняват;
-
последователност от форматиращи символи, които не се извеждат, но управляват показването на съответния аргумент от списъка; в общия случай аргументите са произволни изрази;
Форматиращите параметри от втори тип имат следния синтаксис:
%[модификатор]форматна спецификация
В общия случай броят на форматиращите параметри е равен на броя на аргументите; изключение прави параметъра %%, който отпечатва %; форматиращите параметри определят очаквания тип на аргументите, те определят вида на показване на съответния аргумент;
Модификатори
|
Форматна спецификация
|
Интерпретация на аргумента
|
Изобразяване на аргумента
|
p, l
|
d
|
int, long int
|
цяло десетично число със знак
|
p, l
|
u
|
unsigned int,
unsigned long int
|
цяло десетично число без знак
|
p, l, #
|
o
|
unsigned int,
unsigned long int
|
осмично число
|
p, l, #
|
x (X)
|
unsigned int,
unsigned long int
|
шестнадесетично число
|
p, .t, l, L
|
f
|
float,
double,
long double
|
дробно десетично число
|
p, .t, l, L
|
e (E)
|
float,
double,
long double
|
число с мантиса и порядък
|
p
|
c
|
char
|
единичен символ
|
p, .t
|
s
|
указател към низ
|
последователност от символи
|
|
%
|
|
извежда символ %
|
За всяка форматна спецификация модификатор p е константно цяло число със знак; то задава минималната дължина на полето, в което ще се запише резултата; ако p<0, резултатът ще е подравнен отляво, ако p>0, резултатът ще е подравнен отдясно; p се поставя непосредствено след знака %;
Модификатор .t може да се използва при дробно-десетичните типове и при низовете от символи (t е константно цяло число); при дробно-десетичните типове той задава броя на цифрите след десетичната точка (ако е пропуснат по подразбиране е 6), а при низовете от символи – броят на символите, които ще се изведат, започвайки от началото на низа; модификатор .t се поставя непосредствено след p, или ако той липсва, непосредствено след %;
Модификатор l влияе на интерпретацията на аргумента – при d тя се променя на longint, при u – на unsigned long int; при o и x(X) – на unsigned long int, при f – на double, при е(Е) – на double; модификатор l се записва непосредствено преди форматната спецификация;
Модификатор L влияе на интерпретацията на аргумента – при f тя се променя на long double, при e(E) също се променя на long double; модификатор L се записва непосредствено преди форматната спецификация;
Модификатор # променя начина на извеждане на осмични или шестнадесетични; ако той присъства при форматна спецификация o, осмичното число се извежда с 0 отпред, ако той присъства при форматна спецификация x(X), шестнадесетичното число се извежда с 0x (0X) отпред; модификатор # се поставя непосредствено след %;
Забележка: при форматна спецификация e(E) мантисата се извежда нормализирана, а порядъкът е разделен от нея със символа e(E); тук модификатор .t се отнася за цифрите след десетичната точка на мантисата;
Внимание: при отпечатване едно дробно десетично число се закръгля, ако се отрежат цифрите му;
Внимание: ако при форматна спецификация c като аргумент се зададе променлива от тип int, на екрана се отпечатва символът, чийто ASCII код е записан в най-младшия байт на променливата;
При форматна спецификация s: името на един едномерен масив от char се разглежда като указател към първия елемент на масива; ако указател към низ е име на масив, тогава на екрана започва да се извеждат елементите на масива, започвайки от първия; извеждането продължава до попадане на нулев байт или след извеждане на t символа, ако е използван модификатор .t; константа от тип низ от символи също се разглежда като указател към началния символ на низа;
При задаване на минимален размер на полето (модификатор p), в някои компилатори се допуска използването на променлива, която се записва в списъка непосредствено преди аргумента, за който се отнася; за целта трябва на мястото на числото p да се запише символ ‘*’;
Примери: Незаетите позиции означаваме с _ ; на практика на тяхно място се изпечатват интервали;
Команда
|
Изобразяване
|
printf (“%x”, 255);
|
ff
|
printf(“%o”, 62);
|
76
|
printf(“%#o”, 62);
|
076
|
printf(“%#X”, 255);
|
0XFF
|
printf(“%d”, 336);
|
336
|
printf(“%2d”, 336);
|
336
|
printf(“%10d”, 336);
|
_ _ _ _ _ _ _ 336
|
printf(“%-10d”, 336);
|
336 _ _ _ _ _ _ _
|
printf(“%f”, 1234.56);
|
1234.560000
|
printf(“%.2f”, 1234.56);
|
1234.56
|
printf(“%3.1f”, 1234.56);
|
1234.6
|
printf(“%10.3f”, 1234.56);
|
_ _ 1234.560
|
printf(“%-10.3f”, 1234.56);
|
1234.560 _ _
|
printf(“%E”, 1234.56);
|
1.234560E+03
|
printf(“%15.7E”, 1234.56);
|
_ _ 1.2345600E+03
|
printf(“%c”, ‘A’);
|
A
|
printf(“%s”, “GOOD”);
|
GOOD
|
printf(“%.4s”, “GOOD OR BAD”);
|
GOOD
|
printf(“%8.4s”, “GOOD OR BAD”);
|
_ _ _ _ GOOD
|
printf(“%4.1f%%”, 25.9);
|
25.9%
|
int i=4; printf(“%*d”, i, 25);
|
_ _ 25
|
printf е функция от тип int (тя връща резултат от тип int); резултатът е броя на изведените символи; ако има грешка по време на извеждането, printf връща EOF;
Обобщение: printf е прекалено усложнена функция и води до удобства за потребителя, но не и до по-бързи и ефективни програми; съществуват и други по-прости функции, които са свързани с точно определен входен поток от данни; за предпочитане е потребителят да използва тях, ако може да ги приложи в съответната програма;
Сподели с приятели: |