lektsii_po_infe
.pdf61
17.6.Операторыперехода
Операторыпереходавыполняютбезусловнуюпередупр.ачувления
• break – операторерыванияцикла.
{
оператор; ifвыражение(<условие>) break; оператор;
}
Т.е.оператор break целесообразноиспользовать,когдаусловиепродолжения итерацийнадопрвсерединеверятьцикла.
//Найтисуммуч,числаселвводятсяклавиатурыдотех пор,поканебудетвведено// 100чиселили0.
for(s=0, i=1; i<100;i++)
{
cin>>x;
if( x==0)есливвелитосуммирование0,break; // заканчивается
s+=x;
}
• continue – переходкследующейитерациицикла.Ониспользуется,когда телоцикласодвержиттвления.
//Найтиколичествосуммуположительныхчисел
for( k=0,s=0,x=1;x!=0;)
{
cin>>x;
if (x<=0) continue; k++; s+=x;
}
• goto <метка> – передупроператоруетвление,котсодержитрыйметку. Втелетойжефункцдолжнаприисутствоватьконструкция:
<метка>:оператор;
Метка – этообычныйидентификат,областьювидимкотявляетсярогости
функция.Оператор |
goto |
|
передупроператетвления,стоящемуп меткислеру. |
Испоператоральзование |
|
goto оправдано,еслинеобходвыполнитьереходизмо |
|
нескольвложенныхцикловилиих |
|
|
переключателейвнизпотекступрограммыили |
перейтиводноместофункциипослевыполненияразличныхдействий. |
|
|
|
Применение |
goto |
нарушаетпринцструктурногоимодульнпы го |
|
программир,покоторымвсеблоки,из сванияопрстрыхо,должныитграммаиметь |
|
|
|
толькоодвхитольконодинвыход. |
|
|
if, switch ициклов.Нельзя |
Нельзяпередававнутрьуправлопениераторов |
|
рьблоков,содержащихинициализацию,наоперакоторые, стоят
62
. . .
{
int a=3,b=4; k=a+b;
m: int c=k+1;
. . .
}
Вэтомпримерепереходенаметку |
m небудетвыполнятьсяинициализация |
переменных a , b и k. |
|
• return – операторвозвратаизфункции.Онвсегдазавершаетвыполнение функциипередточкуупрваеевленоператоравызова.Вид:
return [выражение];
18.Примерырешениязадачсиспользованиемосновных операторовС++
18.1Программирование. ветвлений
Задача№1 .Определи,попадетточкаскоординатамиьх,у(в)
заштрихованнуюобласть.
|
Исходдан:,уные |
|
|
|
|
Результат: |
даилинет |
|
|
|
Математическаямодель: |
|
||
|
Ok=I || II || III || VI,где I, II, III, IV – услпопаданиявияточкизаштрихованную |
|||
областьдля |
каждогоквадранта. |
|
||
|
Квадрант I: ОбластьформируетсяпрямымиХ0У,0прямой,проходящейчерез |
|
||
точки(0,1)(1,0) |
прямойпроходящейчерезточки(0,3)(2,0) |
. |
|
|
|
Необхоопределитьуравненияимопрямых= |
ax+b.Решаемдвесистемы |
||
уравнений: |
|
|
|
1)1=a*0+b; 0=a*1+b;
2)2=a*0+b; 0=a*3+b;
Изэтсиполучаемхстемследующиеуравненияпрямых: y=-1x+1; y=-2/3x+1;
Тогдауслп паданиявиеточки I квадрантбудетвыгслеяобразомдующиметь: y>=-x+1&&y<=-2/3x+2&&y>=0&&x>=0.
63
Квадранты II и III: ОбластьформируетсяпрямымиХ0У0двумяокружностями,
|
|
x2+y2=1, x2+y2=9. |
описываемыформулами |
||
Тогдауслп паданиявиеточкиво |
II и III квадрантыбудетвыгслеядующиметь |
|
образом: |
|
x2+y2>=1&& x2+y2<=9&&&&x<=0.
Квадрант IV:
Областьформируетсядвумяп рямоугольн.Точкаможетпопадатьлибов ками первыйпрямоуг,либововт.оройльник
Условиепопаданияточки IV квадрантбудетвыгслеяобразомдующиметь: (x>=0&&x<=1&&y<=-1&&y>=-3)|| (x>=1&&x<=3&&y<=0&&y>=-3) .
Программа:
#include <iostream.h> #include <math.h>
void main()
{
float x,y; cout<<"\nEnter x,y"; cin>>x>>y;
bool Ok=(y>=-x+1&&y<=2/3*x+2&&x>=0&&y>=0)|| (pow(x,2)+pow(y,2)>=1&&pow(x,2)+pow(y,2)<=9&&x<=0)||
(x>=0&&x<=1&&y<=-1&&y>=-3)||(x>=1&&x<=2&&y<=0&&y>=-3); cout<<"\n"<<Ok;
}
Тесты:
Квадрант |
|
(X,Y) |
Исходданные |
Результат( |
Ok) |
|
|
|
|
|
|
I |
|
|
0.2,0.2 |
0 |
|
I |
|
|
0.7,0.5 |
1 |
|
II |
|
|
-0.5, 0.5 |
0 |
|
II |
|
|
-2,0 |
1 |
|
III |
|
|
-0.5,-0,5 |
0 |
|
III |
|
|
-2,-1 |
1 |
|
IV |
|
|
0,5,-0.5 |
0 |
|
IV |
|
|
1.5, -1 |
1 |
|
Центрсистемы |
|
|
0,0 |
0 |
|
координат |
|
|
|
|
|
18.2Программ. арифметическихц рованиеклов |
|
|
|
||
Дляарифметическогоцикла |
заранизвсколькоеразстноевыптецикла.няетсяо |
|
|
||
Задача№2 |
. Данапоследовательностьцелыхчизсел |
n элемен.Найсреднеетиов |
|
арифметическоеэтойпоследовательности.
#include <iostream.h> #include <math.h> void main()
{
int a,n,i;
double s=0; //иници ализируемпеременнуюначальным
значением
cout<<"\nEnter n";
64
cin>>n; //вводимколичествоэлементов последовательности
for(i=1;i<=n;i++)//циклвыполняется n раз
{
cout<<"\nEnter a";
cin>>a; // вводим переменную
s+=a;//добавляемзначение |
переменнойксумме |
|
} |
|
|
s=s/n;//находимсреднееарифметическое |
="<<s<<"\n"; |
|
cout<<"\nсреднееарифметическоеравно |
||
} |
|
|
Задача №3 . Найтизначение |
S=1+2+3+4+. . . +N |
|
#include <iostream.h> #include <math.h> void main()
{
//описываемпеременныеинициализируем s начальным значением
int n,i,s=0; cout<<"\nEnter n"; cin>>n; //вводимколичествоэлементов
последовательности
for(i=1; i<=n; i++)++)// цикл выполняется n раз s+=i; //добавляемзначениеперемксумменной
cout<<"\nS="<<s<<"\n";
}
18.3Программ. итерацициклрованиенных
Дляитерационцикдобытьлизвестнож условиевыполнениягоцикла.При
использованиициклапредусловием( |
while) телоцикламожетневыполнятьсяниразу, |
|
еслиразуженевыпоусловиецикланяется.Прииспользованиициклапостусловием |
||
телоциклабудетвыпхобыодилнетомтяраз.Ивн,ивдругомслучаеиспользуется |
||
условиевыполненияцикла. |
|
|
Задача№5 |
. Данапос |
ледовательностьцелыхчисел,закоторойследуетНай0. и |
минимальныйэлементэтойпоследовательности. |
|
|
Длярешенияэтойзадачииспользуемциклпредус,т.к.нольневходитовием |
||
последовательностьиегоненадообрабатыватьприпоискеминимальногозначе |
ния. |
#include <iostream.h> #include <math.h> void main()
{
int a,min; cout<<"\nEnter a";
cin>>a; //вводим первое число min=a;//присваиваемпеременной min начальноезначение while(a!=0)//цикл с предусловием
{
cout<<"\nEnter a";
65
cin>>a;//вводим следующее число /*сравниванулем,т.к.невходит0 мпоследовательность инеможетбытьминисминимальзна*/ымчельниемым
if (a!=0&&a<min)
min=a; //запоминаемв min новоезначение
}
cout<<"\nmin="<<min<<"\n";//выводрезультата
}
66
Тесты:
5 3 10
in 10
2 |
5 |
|
7 |
|
in
|
|
6 |
|
43 |
15 |
10 |
|
|
|
in |
10 |
|
|
|
|
|
|
||
|
|
|
Длярешенияэтойжезадачиможнонапирограммусиспользованиематьцикла |
|
|||||
|
постусловием. |
|
|
|
|
|
|||
|
|
|
|
|
|||||
|
|
|
#include <iostream.h> |
|
|||||
|
|
|
#include <math.h> |
|
|||||
|
|
|
void main() |
|
|||||
|
|
|
{ |
|
|
|
|
|
|
|
|
|
int a,min; |
|
|||||
|
|
|
cout<<"\nEnter a"; |
|
|||||
|
|
|
cin>>a; //вводим первое число |
min начальноезначение |
|||||
|
|
|
min=a;//присваиваемпеременной |
||||||
|
|
|
do //цикл с постусловием |
|
|||||
|
|
|
{ |
|
|
|
|
|
|
|
|
|
cout<<"\nEnter a"; |
|
cin>>a;//вводим следующее число if (a==0)break;//выходизцикла,есливвели0
if (a<min)//сравниваемтекущим |
min |
min=a; //запоминаемв |
min новоезначение |
} |
|
//бесконечныйци,т..выходлосуществляетсяпомощью break
while(1); cout<<"\nmin="<<min<<"\n";//выводрезультата
}
Этужезадачуможнорешитьсп мощьюцикла |
for: |
|
|
#include <iostream.h> |
|
#include <math.h> |
|
void main() |
|
{ |
|
int a,min; |
|
cout<<"\nEnter a"; |
|
cin>>a; //вводим первое число |
|
|
|
|
67 |
min=a;//присваиваемпеременной |
min начальноезначение |
||
for(;a!=0;)//цикл используетсякакцикл |
с предусловием |
||
{ |
|
|
|
cout<<"\nEnter a"; |
|
|
|
cin>>a;//вводим следующее число |
|
||
/*сравниваемнулем,т. |
к.невходит0 последовательность |
||
инеможетбытьминисминимальзна*/ымчельниемым |
|
|
|
if (a!=0&&a<min) |
min новоезначение |
|
|
min=a; //запоминаемв |
|
||
} |
|
|
|
cout<<"\nmin="<<min<<"\n";//выводрезультата |
|
||
} |
|
|
|
Задача№6 |
.НайтисуммучиселФибо,мезаданноаччиьших |
|
гочисла Q.Числа |
Фибоначчи – этоп следовательностьчисел: 1, 1, .2,.каждое3,следующее5, 8, 13, …., число – этосуммадвухпредыдущих.
#include<iostream.h> void main()
{
int a=1,//первоечисло b=1,//второечисло s=2,//суммачиселФибоначчи
Q, c;//следующеечисло
cout<<"\nEnter Q"; cin>>Q;//вводим число Q if(Q<=0)cout<<"Error in Q"; else
//если Q=1,тосумматожебудп1ечислотрвое() if(Q==1)s=1;
else
{
c=a+b;//вычисляемследующеечисло while(c<Q)
{
s+=c;//вычисляемсумму a=b;//меняемпервоечислонавт рое b=c;//меняемвтороечислона кущее c=a+b;//вычисляемтекущеечислоФибоначчи
}
}
cout<<"\nS="<<s<<"\n";//выводимрезультат
}
68
Тесты:
S
Er 1 ror in Q
Er ror in Q
1
2
20
0
18.4П. рограммирование вложенныхциклов
Телоцикламожетсодержатьлюбыеоператоры,втомчидругиеслециклы. Операцикла,котсодержитсявтелеыйдругогоцикла,называетсявложенным.
Задача№7 :Напечатать N простыхчисел. Разделимэтузадндвеподзадачичу:
1.определитьявлчислояетсяпростым;
2.напечатать n чисел,удовлетворяющихзаданномуусловию.
Простымназываетсячисло,котороеделиттолькосамнаебяинаединицу |
|
|
(самаединицапростымчисломнеявляе)Тогда. ,чтопределитьобысяявляетсячисло |
|
|
простымилинет,нужнопроверитьестьлиунегодругиедели.Дляэтбудемогоели |
|
|
делитьчислоКна |
всечислаотдо2К,используяциклпостусловием.ЕслиК |
|
разделитсяна |
d безостолькоатка,когда |
d станетравК,з ,числоачитпростое: |
d=1;//начальноезначениеделит ля
do
{
d++;//увеличделительваем
} |
|
енияКна |
d неравен0 |
/*циклвыполняекастаотделтсяок |
|
||
(неделится)*/ |
|
|
|
while(К%d!=0); |
|
|
|
if(К==d)//делиравК,т.е.числольнпростое |
|
|
|
cout<<a<<" "; |
|
|
|
Длярешениявторойподзадачи,намнужноперебирвсечисла,начи2,тьная |
|
|
|
печататьтолькоте,которыеявляютсяпрос.Приэ,нужыоми |
|
|
ноподсчитывать |
напечатчисла.Выполнцикланныезако,когданбудетчитсяиен печатано |
|
n чисел. |
|
K=1;//присваиваначальноезначениечислум |
|
n чисел |
|
//выполциклпоканбудетяемнапечатано |
|
||
for(int i=0;i<n;) |
|
|
|
{ |
|
|
|
K++;//беремследующеечисло |
|
|
|
ifпростое(K |
число) |
|
|
i++;//увеличиваемсчетпростыхселк
}
Объединивэтидвафрагментавместе,получимрешениепостзадачивленной
69
#include<iostream.h> void main()
{
int K=1,n,d; cout<<"\nEnter N"; cin>>n;
//неправильно задано число n if(n<1) {
cout<<”\nerror in data”; return;//завершениепрограммы
}
for(intвнешнийциклi=0;i<n;)//
{
K++;d=1; doвнутренний//цикл
{
d++;
}
while(K%d!=0);//конецвнутреннегоцикла if(K==d){
|
|
|
cout<<K<<" "; |
|
|
|
i++;} |
|
} |
}//конецвнешнегоцикла |
|
|
|
|
|
|
Тесты |
|
|
|
n=0 |
|
Error in data |
|
n=1 |
|
2 |
|
n=5 |
|
10 |
19.Массивы
ВязыC/C++,кромебазовыхтиповразрешеновводитьиспользовать производныетипы,полученныенаосновебазовых.Стандартязыкаопределяеттри способаполученияпроизвтип: вдных
•массивэлементовзаданноготипа;
•указательнаобъектзаданноготипа;
•функция,возвращающаязначениезаданноготипа.
Массив – этоупорядоченнпоследовпеременныходногоатипая. льность Каждомуэлементумассиваотводитсяоднаячейкапамяти.Элементыодногомассива занимают последовательрасположенныеячейкипамяти.Всеэлеимеютодноентыимя
– имассиваяотлиндексамичаются – порядковыномассивеера.Количествоми элевмассивеентовназываеегоразмером.Чотобысявпамятиестинужное количячедляразмествок щениямассива,надозаранеезнатьегоразмер.Резервирование памятидлямассивавыполняетсянаэтапекомпиляциипрограммы.
19.1Определение. массиваC/C++
Массивыопредслеобразомдуля:ющимтся
70
int a[100];//массивизэлементовцелоготипа
Операция sizeof(a) дастрезультат400,.. 100элеменпобай4. това Элемемассивавсегдантыумеруются0.
|
4 |
|
3 |
6 |
|
|
1 |
значэлемассиванияментов |
5 |
|
52 |
|
3 |
|
|
24 |
индексыэлементовмассива |
|
0 |
|
1 |
2 |
|
… |
9 |
|
|
|
|
|
.. |
|
9 |
|
Рис. 1.Размассиваещениепамяти
Чтобы обратитькэлементумас,надосуказяивамаяитьномссиваэлементар
вмассивеиндекс( ):
a[0] – индезадккаетсяонстантак, a[55] – индезадккаетсяонстантак, a[i] – индексзадпа тсяременная, a[2*i] – индексзадвыражениеется.
Элементымассиваможнозадприегоопределениивать:
int a[10]={1,2,3,4,5,6,7,8,9,10};
Операция sizeof(a) дастрезультат40,.. элемен10побай4. това |
|
int a[10]={1,2,3,4,5}; |
|
Операция sizeof(a) дастрезультат40,.. элементов10побайта4.Если |
|
количествоначальныхзначенийменьше,чемобъявледлинамассива,тоначальныеная |
|
элементымассиваполучаттолькопервыеэлементы. |
|
int a[]={1,2,3,4,5}; |
|
Операция sizeof(a) дастрезультат20,.. 5 |
элементовпобайта4.Длина |
массивавычисляетсякомпколичествузначенийятором,перечисленныхпри |
|
инициализации. |
|
19.2Примеры. решениязадач |
использованиеммассивов |
|
|
Задача1. |
Формассиваиропомощьюдатчикаслучнчиселйных |
. |
|
Длятогочтсформироватьбымассивнеобходимоорганизциклдляпереборавать |
|
||
элементмассива.Дляформированиякаждогоэлементавызываетсяфункци |
|
|
|
rand(),котвозвращаетрая |
псевдослучайное чиздиапазонаслодот032767 |
. Чтобы |
|
получитьзначени |
я издиа пазонаотдо0100испоперацияльзуетсяполученияостаткаот |
|
|
деления%. |
Еслинужполучитьнтолькое,ножительныетрицательныечисла |
|
|
вычитаетсясло |
k равноеполовинеоттребуемогодиапазона. |
-50..49. |
|
|
a[I]=rand()%100-50;//числаизди пазона |
||
Чтобы использоватьфункцию |
rand(), надоподключибиблиофайлтьечный |
||
<stdlib.h> |
|
|
#include <iostream.h>