Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lektsii_po_infe

.pdf
Скачиваний:
8
Добавлен:
29.03.2015
Размер:
2.2 Mб
Скачать
переходитьвнут послеинициализации.
int k; goto m;

61

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>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]