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



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

Логически операции
И” (конюнкция)

Синтаксис:

(Условие_1) && (Условие_2)



Семантика:

Операцията връща стойност истина, само когато и двата операнда имат стойност истина. В противен случай операцията връща стойност лъжа.


ИЛИ” (дизюнкция)

Синтаксис:

(Условие_1) || (Условие_2)



Семантика:

Операцията връща стойност истина, когато поне един от двата операнда има стойност истина. В противен случай операцията връща стойност лъжа.


НЕ” (логическо отрицание)

Синтаксис:

!(Условие)



Семантика:

Операцията е унарна и връща стойност истина, когато операндът има стойност лъжа, и лъжа – в противен случай.


Примери:

  1. 7 = = 5  лъжа

  2. 7 != 5  истина

  3. 8 >= 8  истина

  4. 8 < 8  лъжа

  5. (3 < 5) && (20 > 0)  истина

  6. (а < b) && (b <= a)  лъжа

  7. (а < b) || (b <= a)  истина

  8. ( 7 % 3 =0) || (7 / 3 = 0)  лъжа

  9. !(3 > 10)  истина

  10. !((а < b) || (b <= a))  лъжа



За да се определи правилно стойността на един сложен логически израз (състоящ се от няколко операции), трябва да се знае реда, в който се изпълняват тези операции. Този ред може да бъде променен чрез кръглите скоби “(” и “)”.
Приоритет на операциите

(1) изразите в скоби: ( );

(2) унарни операции: +, -, ! ;

(3) умножение, деление: * , /, %, &&;

(4) събиране, изваждане: +, - , || ;

(5) сравнение: <, <=, >, >=, = =, !=



Внимание!

Замяна на операция “= =” с “=”
При такава замяна компилаторът няма да издаде съобщение за грешка. Напротив – ще изпълни операторът. Резултат обаче едва ли ще бъде очакваният от програмиста.

Пример:


int a, x = -5;

if (x = 10) a = -1;

else a = 1;
След изпълнението на този фрагмент променливата а ще има стойност -1, а не 1, както се очаква. Това се получава, защото логическата константа лъжа се представя в паметта на компютъра чрез числото 0, а константата истина – чрез произволно друго число. Т.е. когато компилаторът проверява дали условието на if оператора е изпълнено (вярно), той всъщност проверява дали стойността му е различна от 0. В нашия случай условието представлява оператор за присвояване.След изпълнението му променливата х има стойност 10, която става стойност и на условието на оператора if. За компилатора това означава, че условието е изпълнено и той преминава към оператора a = -1;, а не към алтернативния оператор.
Внимание!

Използване на двойно неравенство
Пример:

if (0 < x < 1)

cout<< “Не бива да се пише така \n”;
При използване на такъв запис програмата отново ще бъде скомпилирана и ще работи, но няма да дава верен резултат. Двойните неравенства се записват като две единични, обединени с операцията “И”. Напр. (0 < х ) && (х < 1).

6.4.Вложени условни оператори

Да разгледаме следния

Пример: Да се напише програма, която намира решенията на линейното неравенство ax+b>0. Коефициентите a и b се въвеждат от клавиатурата.

Решение:

Тъй като решенията на неравенството зависят от стойностите на коефициентите a и b, трябва да се разгледат общо четири случая:



За да се реши задачата трябва да се разгледат две алтернативи – а=0 и а0, и за всяка от тях – още по две алтернативи. Това може да постигне като на местата на Да_оператора и Не_оператора в условния оператор се поставят нови два условни оператора. Такова вмъкване на един условен оператор в друг условен оператор се нарича влагане на условни оператори.

#include
int main()

{

double a, b;


cout<<"Въведете коефициентите a и b \n";

cin>>a>>b;


if (a==0)

if (b>0)


cout<<"Всяко число е решение на неравенството "<0\n";

else


cout<<"Неравенството "<0 няма решения\n";

else


if (a>0)

cout<<"Решения на неравенството "



<0 са всички числа, по-големи от "

<<-b/a<

else

cout<<"Решения на неравенството "



<0 са всички числа, по-малки от "

<<-b/a<
return 0;

}

Обърнете внимание на начина, по който е записана програмата: всеки else е записан точно под съответния if.



Понякога при влагане на условни оператори не е ясно кой else чия алтернатива представя. Например във фрагмента
if (age<18) if (age<16) cout<<”Научи си уроците \n”; else cout<<”Можеш да излезеш с приятели \n ”;
не е ясно кога ще се изведе съобщението ”Можеш да излезеш с приятели” – дали когато стойността на променливата age е между 16 и 18, или когато е по-голяма от 18. Правилото гласи, че

всяко else се свързва с последния преди него несвързан if

Т.е. в случая текстът ”Можеш да излезеш с приятели” ще се изведе, когато 16age18. Препоръчва се в такива случаи за по-голяма яснота да се използва съставен оператор. С помощта на същия оператор може да се промени реда на свързване на if и else.

Например, ако искаме изречението ”Можеш да излезеш с приятели” да се извежда, когато age>18 горния фрагмент трябва да се редактира по следния начин:
if (age<18) {if (age<16) cout<<”Научи си уроците \n”;} else cout<<”Можеш да излезеш с приятели \n ”;
Сега, ако условието age<18 е вярно ще се изпълни съставния оператор {if (age<16) cout<<”Научи си уроците \n”;}, а ако то не е вярно – операторът cout<<”Можеш да излезеш с приятели \n ”;

Препоръка: При работа с вложени условни оператори, те да се влагат в съставен оператор

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


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

int x=10, y;

if (x>0) y=1;

else

if (x<0) y=-1;



else

if (x = =10) y=10;

else y=0;

Отговор: Тъй като x>10 y ще приеме стойност 1.




                  1. Да се напише фрагмент от програма, който извежда изразът “Честито!”, ако стойността на променливата exam е не по-малка от 4.50, и съобщава “Ще се видим отново през поправителната сесия”, в противен случай.



                  1. Да се редактира фрагмента от Зад.2, така че да

    а) извежда “Честито!”, ако стойността на променливата exam е не по-малка от 4.50, а стойността на променливата programs_num – по-голяма от 20;

    б) извежда “Опитай отново следващата седмица”, ако стойността на променливата exam е не по-малка от 4.50, а стойността на променливата programs_num – не по-голяма от 20;

    в) извежда “Ще се видим отново през поправителната сесия”, ако стойността на променливата exam е по-малка от 4.50



                  1. Да се напише програма. която проверява дали числата a, b и c могат да бъдат дължини на страни на триъгълник.

Упътване:

Числата a, b и c числа могат да бъдат дължини на страни на триъгълник, ако е изпълнена системата неравенства:






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



                  1. Да се напише програма, която намира и извежда най-голямото от числата a, b и c.



Решение:

#include


int main()

{

int a, b, c, max;


cout<<"Въведете числата a,b и c\n";

cin>>a>>b>>c;


max=a;

if (b>max)max=b;

if (c>max)max=c;

cout<

return 0;

}


Решение:

#include


int main()

{

int a, b, c, max;



int x;

cout<<"Въведете числата a,b и c\n";

cin>>a>>b>>c;

if (b


{

x=a; a=b; b=x; //разменят се стойностите на а и b

}

if (c


{

x=a; a=c; c=x;

}

if (c


{

x=b; b=c; c=x;

}

cout<
return 0;

}


                  1. Да се напише програма, която проверява дали точка P(x,y) е вътрешна за квадрат с дължина на страната а и център – началото на координатната система.

Решение:

#include


int main()

{

double x, y, a;



cout<<"Въведете координатите на т.Р\n";

cin>>x>>y;

cout<<"Въведете дължината на страната на квадрата\n";

cin>>a;
a=a/2;

if (a>0)

if ((x>=-a)&&(x<=a)&&(y>=-a)&&(y<=a))

cout<<"Точка Р е вътрешна за квадрата\n";

else


cout<<"Точка Р не е вътрешна за квадрата\n";

else


cout<<"Не съществува квадрат със страна "<<2*a<return 0;

}


                  1. Да се напише програма, която проверява дали т.Р(x,y) е вътрешна за всяка от следните фигури:

    фиг. 3




Упътване:

Използвайте следните условия за if-операторите:

а) x*x + y*y <= 25

б) (x*x + y*y <= 64) && (x*x + y*y >= 25)

в) (x >= -5) && (x <= 5) && (y >= -2) && (y <= 2)

г) (x>=0) && (y >= 0) && (y<= -0.5*x+2)

Изразът в последните скоби се определя след като се реши системата и се прецени в коя полуравнина спрямо правата с уравнение y=kx+n се намира защрихованата област

д) (y>=0) && (y<=5) && (x>=-5) && (x<=5) || (y<0) && (x*x + y*y <= 25)

е) (y>=0) && (y<= x +5) && (y<= -x +5) || (y<0) && (x*x + y*y <=25)


                  1. На кой от следните оператори е еквивалентен условния оператор

if (ac) a=b-c;

else a=b+c;


а) if (a{

if (a>c) a=b-c;



else a=b+c;

}
б) if (a

{

if (a>c) a=b-c;



}

else a=b+c;


в) if ((ac)) a=b-c;

else a= b+c;


Отговор: а)


                  1. Съставете програма за пресмятане на стойността на функцията



                  1. Как трябва да се възприемат операторите

а) if (a = = b) if (a = = c) x = a; else if (b > c) x = c; else x = a;

б) if (x != 1) if (x > 0) z = 1 – x;

в) if (x – y > 0) ; else if (x –y <0) x = y;

Напишете ги така, че да се разбира кой оператор къде се влага.



Решение:

а)

if (a = = b)

{

if (a = = c)



x = a;

else


{

if (b > c)

x = c;

else


x = a;

}

}





б)

if (x != 1)

if (x > 0)

z = 1 – x ;



в)

if (x – y >0)

{

}

else



if (x – y <0)

x = y;




                  1. Да се напише програма, която намира корените на уравнението:

    а) ax + b = 0

    б) ax2 + bx +c =0



Решение:

б)

#include



#include
int main()

{

double a,b,c;



double D,x1,x2;
cout<<"Въведете коефициентите a, b и c\n";

cin>>a>>b>>c;


if (a==0)

{

if (b==0)



{

if (c==0)

{

cout<<"Всяко число е решение\n";



}

else


{

cout<<"Уравнението няма решение\n";

}

}

else



{

x1=-c/b;


cout<<"Решение на уравнението е х="<}

}



else

{

D=b*b-4*a*c;



if (D>=0)

{

x1=(-b+sqrt(D))/(2*a);



x2=(-b-sqrt(D))/(2*a);

cout<<"Решения на уравнението са х1="<

}

}
return 0;



}

Забележка:

Програмата използва функцията sqrt(double х), която връща квадратен корен от х. Тъй като функцията е описана в библиотека със заглавен файл math.h, тази библиотека е включена чрез директивата #include.



7.Оператори за цикъл с условие

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

7.1.Цикъл с предусловие – while

Оператор за цикъл while

Синтаксис:

while (Условие) Оператор


Семантика:

Пресмята се стойността на логическият израз Условие.

Ако тази стойност е истина, изпълнява се тялото на цикъла (Оператор) и отново се пресмята стойността на Условие. Този процес продължава, докато стойността на Условие стане лъжа.

Ако изразът Условие има стойност лъжа, изпълнението на оператора while завършва и се преминава към следващия оператор.


Пример: Да се напише програма, която пресмята сумата на първите десет естествени числа.

Решение:

#include

#include
int main()

{

int count, sum;


sum=0; count=1;

while (count<=10)

{

sum+=count;



count++;

}
cout<<"Сумата на първите 10 естествени числа е равна на "<
return 0;

}
Изпълнението на оператора while се осъществява по следния начин:

Първо се пресмята стойността на израза 1<=10 (count има стойност 1). Тъй като тя е истина, изпълнява се тялото на цикъла – sum приема стойност 1, а count – 2.

След това отново се проверява условието, което сега е 2<=10. То отново е изпълнено. Sum се увеличава с 2 и приема стойност 3, а count – с 1. Т.е. след две итерации в sum се съхранява сумата на първите две естествени числа , а стойността на count е равна на 3.

След 9 изпълнения на тялото стойността на променливата sum ще бъде 45 (сбора на целите числа от 1 до 9), а на count – 10. Тъй като условието 10<=10 и сега е вярно, тялото ще се изпълни за десети път. Към sum се прибавя 10, а стойността на count става 11.

Сега вече условието 11<=10 не е вярно и цикълът завършва. Преминава се към оператора cout.


Забележки:

1. Стойността на условието трябва да е напълно определена преди оператора за цикъл;

2. Тялото на цикъла представлява точно един оператор. Ако трябва да се изпълнят няколко оператора, те се обединяват в съставен оператор;

3. Тялото на цикъла може да не се изпълни нито веднъж (ако условието още в началото не е вярно)

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

7.2.Цикъл с постусловие do-while

Цикълът е аналогичен на while, но условието се проверява след изпълнението на тялото.


Оператор за цикъл do-while

Синтаксис:

do

Оператор



while (Условие);
Семантика:

Първо се изпълнява тялото на цикъла и след това се проверява стойността на Условие.

Ако тя е истина, тялото се изпълнява отново и отново се пресмята стойността на Условие. Процесът се повтаря, докато Условие приеме стойност лъжа.

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


Пример: Да се напише програма, която пресмята произведението на първите десет естествени числа (10!).

Решение:

#include

#include
int main()

{

int count;



long product;
product=1; count=1;

do

{



product*=count;

count++;


}

while (count<=10);


cout<<"Произведението на първите 10 естествени числа е равна на "<
return 0;

}

Променливата product е обявена от тип long, тъй като произведението много бързо нараства и излиза извън обхвата на тип int.



Задача: Проследете самостоятелно как се изпълнява цикълът do-while в примерната програма.
Забележки:

1. Тялото на цикъла се изпълнява поне веднъж;

2. Операторът do-while завършва задължително с “;”.

3. Поне един оператор в тялото на цикъла трябва да влияе върху условието. В противен случай може да се стигне до зацикляне.
При всички оператори за цикъл съществува опасност от дефиниране на безкраен цикъл, т.е. цикъл, чието тяло се изпълнява безброй много пъти. При подобна ситуация програмата не може да завърши изпълнението си сама. Тя трябва да бъде спряна по време на изпълнение. Повечето операционни системи позволяват работата на програмата да прекъсне чрез натискане на клавишната комбинация Ctrl + C или CTRL + Break. При някои операционни системи обаче единственият начин да се спре цикълът е рестартирането на компютъра.

7.3.Вложени цикли

В тялото на всеки оператор за цикъл може да се извиква произволен оператор, включително и друг оператор за цикъл. В такъв случай казваме, че вторият оператор за цикъл е вложен в първия.

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


1

2

3



n-1

n

2

3

4



n

n+1

3

4

5



n+1

n+2
















n-1

n

n+1



2n-3

2n-2

n

n+1

n+2



2n-2

2n-1


Решение:

Таблицата се състои n на брой реда. Тъй като числото n не е предварително известно, не се знае колко реда трябва да се изведат. Затова е удачно чрез група оператори да се опише извеждането на един такъв ред и чрез последователното n-кратно извикване на тези оператори (цикъл) да се изведе цялата таблица. От друга страна, за извеждането на един ред също трябва да се използва цикъл, защото не е известно колко пъти ще се изпълни действието “извеждане на число”.


#include

#include


int main()

{

int n;



int i,j; //Помощни променливи: i – пореден номер на реда

// j – извеждан елемент

cout<<"n= ";

cin>>n;
i=1;

while (i<=n)

{

j=i;



while (j<=i+n-1) // Извеждане на един ред

{

cout<

j++;

}

cout<

i++;

}
return 0;

}

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


  1. Сравнете операторите while и do-while

  2. Да се напише програма, която намира сумата и произведението на първите n естествени числа.

  3. Колко пъти ще се изпълни тялото на цикъла и кое ще бъде последното отпечатано число?



      а)

      int n=5, i=0;

      while i

      {

      cout<

      i++;

      }


      б)

      int n=5, i=0;

      while i

      {

      i++;


      cout<

      }




                  1. Да се състави програма, която пресмята сумата на няколко цели неотрицателни числа, въведени от клавиатурата. Въвеждането продължава до прочитане на първото отрицателно число (то не участва в сумата).

Упътване:

Използвайте фрагмента:

sum=0;

cin>>a;


while (a>=0)

{

sum+=a;



cin>>a;

}


                  1. Съставете програма, която въвежда естествено число N и:

    а) определя броя на цифрите му;

    б) намира и извежда числото М, образувано от цифрите на числото N, но записани в обратен ред (напр. N=4567, М=7654).



Решение а)

#include


int main()

{

int n,count=0;


do

{

cout<<"n= ";



cin>>n;

}

while (n<=0);


while (n>0)

{

n=n/10;



count++;

}
cout<<"count= "<

return 0;

}


                  1. Като използвате, че , пресметнете приблизителната стойност на ех, за която абсолютната стойност на последното добавено събираемо е по-малка от положителното реално число eps ( x и eps се въвеждат от клавиатурата)

Решение:

Нека аi (i=0,1,2…) е поредното (i-то) събираемо. Сравнявайки две последователни събираеми, забелязваме, че , т.е.



Последното събираемо трябва да отговаря на условието (-1)eps < ai < eps.

#include
int main()

{

double x, eps;



double ex=1, a=1, i=0;
cout<<"x= ";

cin>>x;


do

{

cout<<"eps= ";



cin>>eps;

}

while (eps<=0);


do

{

i++;



a=a*x/i;

ex+=a;


}

while (!((a>-1*eps)&&(a
cout<<"ex= "<return 0;

}


    и

    ,n=0,1,2...

    пресметнете приблизителната стойност на:

    а) sin x, за която абсолютната стойност на последното добавено събираемо е по-малка от положителното реално число eps ( x и eps се въвеждат от клавиатурата)

    б) cos x, за която абсолютната стойност на разликата от последните две добавени събираеми е не по-голяма от положителното реално число eps ( x и eps се въвеждат от клавиатурата)



Упътване:

За намиране на абсолютната стойност на дадено реално число х можете да използвате функцията fabs(x), която е включена в библиотеката със заглавен файл math.h



                  1. Като използвате, че редицата

    е сходяща и , пресметнете приблизително стойността на а>0. Пресмятането се преустановява, когато . Числата a и (реално, положително) се въвеждат от клавиатурата.



                  1. Да се напише програма, която пресмята сумите:

    1. 1! + 2! + 3! +...+ n!

    2. б) 1 + 1.3 + 1.3.5 + 1.3.5.7 + ... + 1.3.5...(2n-1)

    3. в) 1.2 + 2.3.4 + 3.4.5.6 + ... + n(n+1)(n+2)…(n+n)

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



    а)

    1











    б)









    1



    1

    2

















    2

    1



    1

    2

    3













    3

    2

    1



    ...

















    1

    2

    ...

    n-1









    n-1



    2

    1



    1

    2

    ...

    n-1

    n





    n

    n-1

    3

    2

    1




Алгоритъм на Евклид чрез изваждане:

  1. Ако а = b  НОД(а,b) = а  край; в противен случай  2);

  2. Ако а > b  НОД(а,b) = НОД(а-b,b)  1); в противен случай  НОД(а,b) = НОД(а,b-а)  1)

Пример:

НОД(36,84) = НОД(36,48) = НОД(36,12) = НОД(24,12) = НОД(12,12) = 12




                  1. Да се състави програма, която намира НОД(а,b) по “Алгоритъм на Евклид чрез деление

Алгоритъм на Евклид чрез деление:

Нека а > b и r е остатъкът от делението на a с b



  1. Ако r = 0  = b  край; в противен случай  2);

  2. НОД(а,b) = НОД(b,r)  1)

Пример:

НОД(36,84) = НОД(84,36) = НОД(36,12) = 12



Решение:

#include


int main()

{

int a,b,r,c;



cout<<"a= ";

cin>>a;


cout<<"b= ";

cin>>b;
if (a < b)

{

c=a;a=b;b=c; //размяна на стойностите на a и b



}
r=a%b;

while (r>0)

{

a=b;


b=r;

r=a%b;


}
cout<<"HOD(a,b)= "<return 0;

}


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

Решение:

#include


int main()

{

char ch;



do

{

cin.get(ch);



if (ch==' ')

{

cout<

while (ch==' ')cin.get(ch);

}

cout<

}

while (ch!='.');

return 0;

}

Забележка: Въвеждането на символ става с оператора cin.get(ch); (по-късно ще бъде разгледан подробно), тъй като cin>>ch автоматично пропуска всички интервали.





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

Решение:

#include


int main()

{

char ch;



long number=0;

cin.get(ch);

while ((ch>='0')&&(ch<='9'))

{

number=number*10+(ch-'0'); //Въведеният символ се преобразува в число



cin.get(ch);

}

cout<<"Number is: "<
return 0;


Този учебен материал е публикуван от потребител в www.referati.org


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




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

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