4 ШАРТТЫ ЦИКЛ ОПЕРАТОРЛАРЫ
4.1 While циклінің операторы
While циклінің операторы «шартты цикл» деп жиі аталады, өйткені цикл жұмысының аяқталуы кейбір шарттардың орындалмауымен байланысты. Циклді жазу пішімі:
while (шарт)
{ операторлар; },
мұндағы,
шарт – логикалық өрнек, екі мәнді қабылдай алады: жалған немесе ақиқат.
Егер «шарт» ақиқат болса, онда while циклінің «операторлары» орындалады, әйтпесе цикл орындалмайды (аяқталады) және бағдарламаны басқару циклден кейінгі операторға көшеді.
Есептердің шешімдері бойынша алгоритмдердің құрылымдық схемасындағы while циклі келесі суретте көрсетілген.
4.1-суреті – while циклінің графикалық көрінісі
while циклі операторларына арналған мысалдары:
1) while (a/x >= 0.0001) { операторлар;}
Бұл мысалда цикл a/x қатынасы 0.0001 шамасынан кіші болғанға дейін орындалады.
2) while ((x > 0) && (x <= 100)) { операторлар;}
Бұл мысалда цикл x айнымалысының мәні 0-ден 100 дейінгі аралықта болғанға дейін орындалады.
4.1-есеп. Емтихан алушының столында 50 емтихан сұрақтары бар. Студент жетінші билетті тәуекелдеп алуға тырысады (алынған билет нөмері 1-ден 50 дейінгі аралықта кездейсоқ түрде құрылуы керек). Сәтсіз алынған билет емтихан алушының столына қайта қайтарылатын болса, студент билетті неше рет алады? Осыдан кейін билеттерді араластырады.
Есепте шартты циклдік процесті ұйымдастыру керек. Цикл жұмысының шарты – жетіге тең емес санды кездейсоқ түрде құру. Цикл жұмысын іске қосу алдында 1-ден 50 дейінгі аралықта орналасқан, кездейсоқ бірінші a санын құру және талпыныстар санауышына бір санын жазу керек (с=1). Цикл денесінде a айнымалысы үшін кездейсоқ санның функциясы және талпыныстар санауышына (c айнымалысы) арналған инкремент операциясы болуы керек.
Цикл жұмысы аяқталғаннан кейін экран мониторына санауыш мәнін - талпыныстар санын шығаруды ұйымдастыру керек.
Бағдарлама коды мынандай:
using System;
namespace ConsoleCiklWhile
{
class Program
{
static void Main()
{
int a, c;
Random rnd = new Random();
vvod:
a = rnd.Next() % 50 + 1;
c = 1;
while (a != 7)
{
a = rnd.Next() % 50 + 1;
c++;
}
Console.WriteLine("Билет {0}-rette tabildi", c);
Console.WriteLine("Zhalgastiry(Y/N)?");
char cim = (char)Console.Read();
Console.ReadLine();
if (cim == 'Y') goto vvod;
Console.WriteLine("Enter pernesin basiniz");
Console.ReadLine();
}
}
}
Бағдарлама жұмысы:
Билет 34-rette tabildi
Zhalgastiry(Y/N)?
Y
Билет 35-rette tabildi
Zhalgastiry(Y/N)?
Y
Билет 54-rette tabildi
Zhalgastiry(Y/N)?
N
Enter pernesin basiniz
while циклінің операторы алғыш артты цикл операторы деп аталады. Яғни, циклдің жұмыс шартын оны іске қосқанға дейін тексеру керек. Сондықтан, қарастырылған есепті шешу алгоритмінде шартты тексеруді ұйымдастыру үшін, цикл іске қосылғанға дейін бірінші сан құрылуы керек. Бұл цикл денесінің екі рет жазылуына алып келеді – цикл іске қосылғанға дейін және оның ішінде. Егер цикл денесінде екі оператор болса, онда бұл қолайсыздық онша білінбейді, бірақ көптеген операторлардың қайталануы дұрыс емес және бағдарламаның көрнекілігін бұзады (оқулықтың келесі бөлімін қараңыз).
Әдетте шартты циклдер шексіз қатарлармен берілген өрнектерді есептеу үшін қолданылады, мысалы sin(x) функциясын (мысал [5] алынған)
Шеткі және шексіз қосындыларды есептеу алгоритмі әдетте жоғарғы деңгейдегі тілдегі бағдарламалауды оқытатын көптеген пәндерде қарастырылады. Сондықтан дәстүр бойынша sin(x) функциясын есептеу бағдарламасының коды мен алгоритімін қарастырайық.
sin(x) функциясын есептеу формуласы шексіз қосындылардан тұрады.
Математика үшін шексіздік ұғымын қолдану - әдеттегі құбылыс – бүтін және нақты сандар жиынтығы шексіз. Бағдарламалауда барлық бүтін және нақты сандардың мәндері компьютер мүмкіндігімен шектелген. Сондықтан бағдарламалауда шексіз қосындыларды есептеулер орындалмайды. Алайда қосындыны берілген дәлдікте есептеуге болады. Сонымен, шексіз қосындылар берілген дәлдіктегі қосындыларға айналдырылады.
Берілген дәлдіктегі ақырғы қосындыны есептеу алгоритмін функционалды түрде келесі әрекеттер ретімен көрсетуге болады:
бастапқы шарттарды беру;
while( кезекті қосылғыш модулі берілген дәлдіктен үлкен )
{
қосынды = қосынды + кезекті қосылғыш;
жаңа мәндерді қолданып кезекті қосылғышты есептеу;
}
Бастапқы шарт мыналардан тұруға тиісті: цикл денесінің жұмысын қамтамасыз ететін қосынды және кейбір айнымалыларды инициализациялау, бірінші қосылғышты есептеу. Мысалы, кезекті қосылғыштың нөмеріне жауап беретін айнымалы.
Рекуррентті формулалар арқылы кезекті қосылғышты есептеуге кеңес беріледі. Кезекті қосылғышты есептеуді алдынғы мәнді қолданып және ak+1=f(ak) рекуррентті формуласын құрып жеңілдетуге болады.
Осы тәсіл 1.1 формуласы бойынша sin(x) функциясын және басқа да көптеген математикалық функцияларды есептегенде қолданылады.
1.1 формуласы бойынша керекті рекуррентті қатынастардың құрылуын көрсетейік.
қатынасын есептеп керекті рекуррентті арақатынасын аламыз:
Рекуррентті арақатынасты енгізу нәтижесінде циклдің әрбір қадамында санның дәрежесін және факториалдарды табудың қажеті жоқ.
4.2-есеп. sin(x)-тің мәнін есепте, x диалог режімінде беріледі. Есептеуді екі жолмен орындау керек: стандартты sin() функциясымен және берілген t дәлдігіне сәйкес (1.1) қатар көмегімен, t мәні диалог режімінде беріледі.
Шыққан рекуррентті арақатынастарды ескере отырып келесі бағдарлама кодын жазуға болады:
using System;
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
double sym, x, t, y;
string buf;
int i;
vvod:
Console.WriteLine("sin(x) ornegin eseptey");
Console.Write("x= ");
buf = Console.ReadLine();
x = Convert.ToDouble(buf);
Console.Write("Eseptey daldigin engizy, micali, 0,0001 ");
buf = Console.ReadLine();
t = Convert.ToDouble(buf);
sym = 0; y = x; i = 0;
while (Math.Abs(y) > t)
{
sym = sym + y;
y = y * (-x * x) / ((2 * i + 2) * (2 * i + 3));
i++;
}
Console.WriteLine("sin(x) = {0} ", Math.Sin(x));
Console.WriteLine("sym = {0} ", sym);
Console.WriteLine("Zhalgastiry (Y/N)?");
char cim = (char)Console.Read();
Console.ReadLine();
if (cim == 'Y') goto vvod;
Console.WriteLine("Enter pernesin basiniz");
Console.ReadLine();
}
}
}
Бағдарлама жұмысы:
sin(x) ornegin eseptey
x= 0,35
Eseptey laldigin engizy, micali, 0,0001 0,00001
sin(x) = 0,342897807455451
sym = 0,342897934895833
Zhalgastiry (Y/N)?
Y
sin(x) ornegin eseptey
x= 1
Eseptey laldigin engizy, micali, 0,0001 0,000001
sin(x) = 0,841470984807897
sym = 0,841471009700176
Zhalgastiry (Y/N)?
Диалог режимінде әр есептеу үшін әр түрлі дәлдіктер берілген, ол есептеу нәтижелерінің ұқсас разрядтар санын анықтайды.
Қарастырылған алгоритмді құру әдістемесін көптеген есептердің (рекуррентті арақатынастарын есептеуге болатын) ақырғы қосындысын есептеуде қолдануға болады.
Кейбір математикалық есептерде күрделі алгебралық өрнектер бірнеше қарапайым өрнектерге бөлінеді. Әрбір қарапайым өрнектек үшін өз рекуррентті арақатынасын есептеуге болады. Алгебралық өрнектерді бөліктерге бөлу (декомпозиция) және рекуррентті қатынастарды қолдану күрделі математикалық есептерді шешуге арналған алгоритмдерді құруға мүмкіндік береді.
Достарыңызбен бөлісу: |