I. Основи на езика C++ Въведение Произход на езика C++



страница2/4
Дата17.09.2016
Размер0.63 Mb.
#9840
1   2   3   4

4.2.Форматиран изход

Да предположим, че трябва да се изведе следната таблица:





Ученик

Оценка

Петър

6

Мими

5

Пепа

4

Гого

6

Ако за решаване на проблема използваме програмата

(1)
#include
int main()

{

cout <<” Ученик"<<"Оценка"<

<<"Петър"<<6<
<<"Мими"<<5<
<<"Пепа"<<4<
<<"Гого"<<6<

return 0;

}

, резултатът едва ли ще отговаря на очакванията ни:




УченикОценка

Петър6

Мими5

Пепа4

Гого6

Един от начините да се подреди информацията в колони е да се зададе ширина на полетата, в които се извеждат данните “Ученик”, “Петър”, “Мими”, “Пепа” и “Гого”. Това става чрез манипулатора setw(int). Манипулаторът се извиква непосредствено след оператора за изход “<<” като в скобите се записва число от тип int, задаващо ширината на полето в брой символи. Тъй като setw(int) важи само за следващата го данна, той трябва да се изписва всеки път, когато е необходимо такъв вид форматиране:

(2)
#include

#include


int main()

{

cout <

<
<
<
<

return 0;

}

Във втората версия на програмата са определени полета с ширина 20 символа. Тъй като манипулатора setw(int) е дефиниран в библиотеката iomanip, тя е включена чрез директивата #include. За съжаление и този път резултатът не е задоволителен:




Ученик

Оценка

Петър

6

Мими

5

Пепа

4

Гого

6

Проблемът е в това, че компютърът автоматично подравнява данните в дясната част на полето. Можем да ги подравним вляво чрез член-функцията setf (от set flag – установяване на флаг)



cout.setf(ios::left);
Засега под член-функция ще разбираме група от команди, свързана с даден поток. Такава функция се извиква като първо напишем името на потока, следвано от символа “.” и непосредствено след това – името и параметрите на функцията. Параметрите се задават в скоби. В случая параметъра ios::left означава, че функцията setf трябва да подравни изходната информация вляво. За разлика от манипулатора setw(int) член-функцията е в сила до нейното самоотменяне:

cout.setf(ios::right);
Окончаталният вариант на програмата ще изглежда така:

(3)
#include

#include
int main()

{

cout.setf (ios::left);



cout <
<
<
<
<

return 0;

}

Задачи:


  1. Да се изведе редицата от числа:

    2 4 6 9 10

    като числото 2 е в началото на екрана и между всеки две числа има по 4 интервала.



                  1. Да се изведе числовата пирамида









    1







    1

    2





    1

    2

    3



    1

    2

    3

    4

    1

    2

    3

    4

    5

4.3.Форматиран изход на числа с десетична точка

При извеждане на данни от тип double форматът на числата може да не отговаря на очакванията. Например при изпълнението на следния оператор

cout << “Цена $ ” << price << endl;

при стойност на променливата price = 78.5 може да бъде изведен някой от следните редове:

Цена $ 78.500000 или

Цена $ 78.5 или

Цена $ 7.850000е01 и т.н.
Знакът “е” в последния запис означава, че числото преди него е умножено по 10 на степен – числото след него, т.е. 7.850000е01  7.85000 * 101. Този начин на записване се нарича запис с плаваща точка.

Да се изведе число от тип double с фиксирана десетична точка и точно определен брой цифри след нея може чрез следната “вълшебна формула”:


Вълшебна формула
cout.setf (ios :: fixed);

cout.setf (ios :: showpoint);

cout.precision (int);
Вече знаем, че setf е член-функция на потока cout. Параметъра ios::fixed означава, че десетичната точка е фиксирана, а не плаваща, а параметъра ios::showpoint – че тя трябва да се изписва винаги, дори когато след нея следва само цифрата 0. Думата precision в последния ред също е име на член-функция. В скобите се записа число от тип int, което указва колко цифри след десетичната точка трябва да се извеждат. Например cout.precision(2) указва, че след десетичната точка ще се извеждат точно две цифри.

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

Пример:

cout.precision(5);


4.4.Вход на данни с помощта на потока cin

Потокът сin с използва почти аналогично на потока cout. Синтаксисът на cin-оператора се отличава само по името на потока и оператора “>>”. Сега информацията се движи в обратна посока – от стандартното входно устройство (клавиатурата ) – към програмата. Когато програмата достигне този оператор, тя преустановява своята работа, докато се въведа стойности на съответните променливи. Самото “прочитане” на тези стойности става едва, когато бъде натиснат клавиша Enter. Ако с един cin-оператор трябва да се въведат стойности на няколко променливи, то тези стойности трябва да се отделят с поне един интервал или чрез пренасяне на нов ред. В противен случай програмата няма да знае къде свършва записът на едната стойност и започва новата.


Cin-оператор

Синтаксис:

cin >> Променлива_1 >> Променлива_2 >>... >> Променлива_N;


Примери:

cin >> speed >> time;

cin >> YourName

>> YourAges;


Препоръка:

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



Въпроси и задачи:

  1. Да се напише програма, която извежда следното съобщение:

    Вие може да учите С++, а може и да не учите.

    Но сте длъжни да го знаете!


                  1. Посочете резултата от изпълнението на следния фрагмент:



int a=1234, b=56789;
cout << a << b;

cout << endl;

cout << setw(4) << a << setw(5) << b;

cout << setw(8) << a << setw(7) << b << endl;

cout << setw(2) << b

<< setw(10) << a << endl;

cout << setw(5) << (a+b) << endl;



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





Отговор:

123456789

123456789....1234..56789

56789......1234

58023
Когато ширината на полето не е достатъчна, се извежда цялото число. (С точки са означени празните позиции)


                  1. Напишете програма и проверете какво ще се изведе след изпълнението на следния фрагмент:



double c = 123.456789;
cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(6);
cout << c << endl;
cout.precision(10);

cout << setw(20) << c << endl;


cout.precision(6);

cout << setw(12) << c<

<< setw(10) << c << endl

<cout.precision(4);

cout << setw(12) << endl;





Отговор:

123.456789

......123.45567890000

..123.456789

123.456789

123.456789



Забележка: Обърнете внимание, десетичната точка също е знак от записа на числото и за нея също трябва да се “направи място”, когато се определя ширина на полето.


                  1. Да се напише програма, която извежда следните числови фигури:



      а)

      1











      б)









      1



      в)

















      1

      2

















      2

      1











      0









      1

      2

      3













      3

      2

      1









      1



      2







      1

      2

      3

      4









      4

      3

      2

      1







      3



      4



      5





      1

      2

      3

      4

      5





      5

      4

      3

      2

      1





      6



      7



      8



      9



                  1. Каква ще бъде стойността на променливата а след изпълнение на следния фрагмент



int a;

cin >> a >>a;



    , ако от клавиатурата се въведе

    12 34Enter

    a) 12 б) 34 в) грешка г) 12034 д)нито един от посочените



Отговор:

б) а = 34




                  1. Какъв ще бъде резултата от изпълнението на следния фрагмент:



cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(4);
cout << -1.2531 << 15 << endl;

cout << 800;

cout << 001 << endl;




    а)

    -1.2531 15 800001

    б)

    -1.2531 15

    в)

    -1.253115

    г)

    -1.2531







    800 001



    800001



    8001


Отговор: г)


                  1. Какъв ще бъде резултатът от изпълнението на следния фрагмент:



int i, j, k, l, m;

double a,b,c,n;


cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(2);
cin >> i >> j >> a;

cout << setw(8) << (i*j);

cin >> k>> l >> b;

cout << setw(8) << (k*l);

cin >> c >> m >> n;

cout << c << endl;


, ако от клавиатурата се въведе

16 –5 31.2 3 102 7.34 -43.5 5 -0.187Enter


Отговор:

.....-90.....306-43.50



5.Прости типове данни. Изрази.
Всеки тип данни се характеризира с множество от стойности и операции и вградени функции над това множество. Типовете данни се делят на прости, съставни и тип указател.

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

Реални се наричат данните, които представят числа с дробна част (float, double и др.).

Дискретни са данните, които могат да приемат конкретни, предварително известни стойности (целочислените типове данни, char и др.).

Съставни типове данни се наричат онези типове, чиито компоненти са редици от елементи (масив, структура, символен низ).

5.1.Типовете int и double

В ежедневието записите 2 и 2.0 представят едно и също число. Но езиците за програмиране, в това число и С++, ги възприемат като числа от различни типове данни. Числото 2 е от целочислен тип int, а числото 2.0 – от реален тип double (съдържа дробна част). Докато компютърът борави с целите числа по познатия ни начин, нещата при реалните числа са по-различни. Математическото понятие реално число няма място в програмирането, тъй като не е възможно да се представят в паметта числа като или  например. Съхраняват се само техни приближения. В такъв смисъл чрез реалните типове данни се представят рационални числа. Тъй като броят на знаците след десетичната запетая, които могат да се съхранят, е ограничен, компютърът запомня само приближени стойности на числата от тип double. Въпреки, че за различните компилатори този брой е различен, възможно е даже в съвсем прости програми да се появят грешки, дължащи се на загуба на точност (закръгляване).

Съществуват два формата за записване на числата от реални типове данни:

- с десетична точка



Примери:

3.68


-46.8934

- с плаваща запетая (експоненциална форма)



Примери:

3.68e17


5.612е-6

-34.5473е8

Символа е в последните записи означава, че числото преди него е умножено по 10 на степен – числото след него (т.е. –34.5473е8 = -3454730000 = -34.5473 * 108).

Tъй като паметта на компютъра е ограничена, за всяка данна се отделя определено количество памет, зависещо от типа на данната. За данните от тип int това количество е 2 байта (за 16-битовите компилатори) или 4 байта (за 32-битовите компилатори), а за данните от тип double – 8 байта. Тези ограничения предполагат, че множеството от стойности на всеки тип също ще бъде ограничено. Максималната стойност от тип double, която може да се съхрани е 1.7 * 10308, а най-малката положителна – 1.7 * 10 –308. Тип double поддържа и отрицателни числа от интервала [-1.7 *10308 ; -1.7 * 10 –308 ].


Защо double ( или какво се удвоява)?

Защо числата с дробна част се наричат double (двойни) и съществува ли тип single (единичен), който да е по-малък от предишния?

В много езици за програмиране се използват основно два формата за числата с дробна част. За запазването на числата от първия тип се отделя по-малко памет, защото те са по-малко точни (съхраняват се по-малко цифри след десетичната точка). Другият тип ползва двойно повече памет и това позволява числата да се представят с по-голяма точност. Този втори тип е наречен тип с двойна точност (double precision), а първия тип – единична точност (single precision). От тук в С++ възниква името double за числата с двойна точност. За първия тип в С++ се е закрепило името float (с плаваща точка). В С++ съществува също и трети тип числа с дробна част, който се нарича long double.



Сподели с приятели:
1   2   3   4




©obuch.info 2024
отнасят до администрацията

    Начална страница