Триъгълник от знаци - рекурсия и цикъл
триъгълник от знаци с цикъл - ляв низходящ
триъгълник от знаци с рекурсия - ляв низходящ
триъгълник от знаци с цикъл - ляв възходящ
триъгълник от знаци с рекурсия - ляв възходящ
триъгълник от знаци с цикъл - десен възходящ
триъгълник от знаци с рекурсия - десен възходящ
триъгълник от знаци с цикъл - десен низходящ
триъгълник от знаци с рекурсия - десен низходящ
Алгоритмите за съставяне и извеждане на триъгълник от знаци наричан още
триъгълник от числа, числов триъгълник често се падат като задачи за проверка и оценка.
Причината е, че еднозначно и ясно илюстрират знанията и уменията за
работа с вложен цикъл и/или съставна рекурсия.
Най-често условието на задачата налага извежда на правоъгълен триъгълник от знаци,
представени като възходяща или низходяща последователност.
Нека разгледаме общото в такива задачи:
Извежданата последователност винаги е наредена, т.е. редицата е монотонна (твърдението се отнася за правоъгълни триъгълници).
Дали ще се извеждат цифри или знаци не е от съществено значение – използва се наредбата в ASCII стандарта.
Всеки от правоъгълните триъгълници се извежда с два итеративни цикъла или със съставна рекурсия, или с комбинация от итерация и рекурсия.
Външният цикъл / рекурсия извежда триъгълника по редове.
Вътрешният цикъл / рекурсия извежда знаците за текущия ред.
Правоъгълните триъгълници в общия вид са 4: върхът нагоре, хипотенузата надясно; върхът нагоре, хипотенузата наляво; върхът надолу, хипотенузата надясно; върхът надолу, хипотенузата наляво. Когато хипотенузата е отляво се налага използване на допълнителен цикъл за реализиране на отместването. Чрез този допълнителен вложен цикъл се извеждат само интервали – празен символ.
Следват примерни решения за всеки от споменатите триъгълници от знаци. За всеки от видовете числови триъгълници са дадени итеративен и рекурсивен варинат.
Начало на страницата
триъгълник от знаци с цикъл - ляв низходящ
#include <iostream>
using namespace std;
int main()//nachalo na programata
{char n,c,d,m='A';//deklarirat se promenliwi ot tipa char
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa izwevda"<<endl;
cout<<"rawnobedren prawoygylen triygylnik s bukwi, kato pri towa na pyrwiq red"<<endl;
cout<<"sa izwedeni wsichki bukwi ot A do wywedenata, na posledniq samo A."<<endl;
cout<<"Primer D Izhod:\n"<<endl;
cout<<"ABCD"<<endl;
cout<<"ABC"<<endl;
cout<<"AB"<<endl;
cout<<"A"<<endl;
cout<<"Wywedete glavna bukva w ineterwala E-Z: ";
cin>>n;//wywevda se krajnata bukwa
// pri deklarirane m='A';
for (c=m; c<=n; c++) //otpechatwane na wsichki redowe
{//cikyl s dwa wloveni cikyla:1) poredna - wywedena i 2) "A"- poredna-1
for (d=m; d<=n-c+m; d++)
{ cout<<d; }//pechat ot dostignatata bukwa do wywedenata bukwa
cout<<"\n";//now red
}//kraj na wynshniq cikyl
system("pause");
return 0;
} //kraj na programa triygylnik ot znaci
Начало на страницата
триъгълник от знаци с рекурсия - ляв низходящ
#include <iostream>
using namespace std;
void pechat_red(char n, char m)
{if(n>=m)
{ cout<<m;
m++;
pechat_red(n,m);//rekursiwno izwikwane na reda
}//if
}// pechat red ot triygylnik
void triygylnik (char n, char m)
{ if(n>=m)
{ pechat_red(n,m);
cout<<endl;
triygylnik (n-1,m);// rekursiq - izwikwane
}//if
}//pechat triygylnik
int main () //nachalo na programata
{ char n,m='A';
cout<<"Da se systawi programa, chrez koqto se izwevda triygylnik ot\n";
cout<<"znaci. Pyrwiqt red na trigylnika zapochwa s A i zawyrshwa s \n";
cout<<"wywedeniq znak.Wseki sledwash red krajniq znak e s 1 po-malyk.\n";
cout<<"Da se izpolzwa rekursiwna funkciq.\n";
cout<<"Primer D Izhod:\n";
cout<<"ABCD\n";
cout<<"ABC\n";
cout<<"AB\n";
cout<<"A\n";
do {
cout<<"Wywedete bukwa [B..Z]: ";cin>>n;
} while (n<'B' || n>'Z');
//pri deklarirane m='A';
triygylnik (n,m);//izwevda triygylnik
system("pause");
return 0;
}//kraj na programa triygylnik ot znaci
Начало на страницата
триъгълник от знаци с цикъл - ляв възходящ
#include <iostream>
using namespace std;
int main()//nachalo na programata
{char n,c,d,m='A';//deklarirat se promenliwi ot tipa char
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na posledniq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot A do wywedenata."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<"A"<<endl;
cout<<"AB"<<endl;
cout<<"ABC"<<endl;
cout<<"ABCD"<<endl;
cout<<"Wywedete glavna bukva w interwala E-Z: ";
cin>>n;//wywevda se krajnata bukwa
//pri deklarirane m='A';
for (c=m; c<=n; c++) //otpechatwane na wyzmovnite warianti /permutacii
{//cikyl s dwa wloveni cikyla:1) poredna - wywedena i 2) "A"- poredna-1
for (d=m; d<=c; d++)
{cout<<d; }//pechat ot dostignatata bukwa do wywedenata bukwa
cout<<"\n";//now red
}//kraj na wynshniq cikyl
system("pause");
return 0;
} //kraj na programa triygylnik ot znaci
Начало на страницата
триъгълник от знаци с рекурсия - ляв възходящ
#include <iostream>
using namespace std;
void pechat_red(char n, char m)
{ if(n>=m)
{ cout<<m;
m++;
pechat_red(n,m);//rekursiq - izwikwane red
}//if
}// rekusiq pechat red
void triygylnik (char n, char m, char p)
{ if(p<=n)
{ pechat_red(p,m);
cout<<endl;
triygylnik (n,m,p+1);// rekutsiq - izwikwane
}//if
}// rekursiq triygylnik
int main ()
{char n,p,m='A';
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na posledniq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot A do wywedenata."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<"A"<<endl;
cout<<"AB"<<endl;
cout<<"ABC"<<endl;
cout<<"ABCD"<<endl;
cout<<"Da se izpolzwa rekursiwna funkciq.\n";
do {
cout<<"Wywedete bukwa [B..Z]: ";cin>>n;
} while (n<'B' || n>'Z');
p=m; //pri deklarirane m='A';
triygylnik (n,m,p );
system("pause");
return 0;
}//kraj na programa triygylnik ot znaci
Начало на страницата
триъгълник от знаци с цикъл - десен възходящ
#include<iostream>
using namespace std;
int main()
{ char a,b,n,m='A'; //deklarirane na promenliwite
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na posledniq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot wywedenata do A."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<" A\n";
cout<<" BA\n";
cout<<" CBA\n";
cout<<"DCBA\n";
//pri deklarirane m='A';// cout<<"Wywedete nachalen simwol: ";cin>>m;
cout<<"Wywedete kraen simwol: ";cin>>n;
for (a=m;a<=n;a++)
{//nachalo na cikyl a namalqwa ot krajniq kym nachalniq
for (b=n;b>=m;b--)
{//nachalo na cikyl b namalqwa ot krajniq do znachenieto na a
if (b>=a+1) {cout<<" ";}
else {cout<<b;}//pechata po 2 interwala
}//kraj na cikyl b
cout<<endl;//otiwa na sledwashiq red
}//kraj na cikyl a
system("pause");
return 0;
} //kraj na programa triygylnik znaci
Начало на страницата
триъгълник от знаци с рекурсия - десен възходящ
#include <iostream>
using namespace std;
void pechat_prazno(char n, char p)
{ if(n>p)
{ cout<<" ";
n--;
pechat_prazno (n,p);//rekursiq - izwikwane na reda
}//if
}// rekursiq pechat interwali
void pechat_red(char n, char m)
{ if(n>=m)
{ cout<<n;
n--;
pechat_red(n,m);// rekursiq izwikwane na reda
}//if
}// rekursiq pechat red
void triygylnik (char n, char m, char p)
{ if(p<=n)
{ pechat_prazno(n,p);//rekusiq za interwali w tekushiq red
pechat_red(p,m);//rekursiq za znaci w tekushiq red
cout<<endl;
p++;
triygylnik (n,m,p);//rekutsiq - izwikwane za sledwash red
}//if
}// rekursiq - triygylnik
int main ()
{ char n,p,m='A';
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na posledniq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot wywedenata do A."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<" A\n";
cout<<" BA\n";
cout<<" CBA\n";
cout<<"DCBA\n";
//pri deklarirane m='A';// cout<<"Wywedete nachalen simwol: ";cin>>m;
cout<<"Da se izpolzwa rekursiwna funkciq.\n";
do {
cout<<"Wywedete bukwa [B..Z]: ";cin>>n;
} while (n<'B' || n>'Z');
p=m='A';
triygylnik (n,m,p );
system("pause");
return 0;
}//kraj na programa triygylnik rekursiq
Начало на страницата
триъгълник от знаци с цикъл - десен низходящ
#include<iostream>
using namespace std;
int main()
{ char a,b,n,m='A'; //deklarirane na promenliwite
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na pyrwiq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot wywedenata do A."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<"DCBA\n";
cout<<" CBA\n";
cout<<" BA\n";
cout<<" A\n";
cout<<endl;
//pri deklarirane m='A';// cout<<"Wywedete nachalen simwol: ";cin>>m;
cout<<"Wywedete kraen znak: ";cin>>n;
for (a=n;a>=m;a--)
{//nachalo na cikyl a namalqwa ot posledniq kym pyrwiq
for (b=n;b>=m;b--)
{//nachalo na cikyl b namalqwa ot posledniq do znachenieto na a
if (b<=a) {cout<<b;}
else {cout<<" ";}//po 2 broq lewite interwali
}//kraj na cikyl b
cout<<endl;//otiwa na sledwashiq red
}//kraj na cikyl a
system("pause");
return 0;
} //kraj na programa triygylnik ot znaci
Начало на страницата
триъгълник от знаци с рекурсия - десен низходящ
#include <iostream>
using namespace std;
void pechat_prazno(char n, char p)
{ if(n<p)
{ cout<<" ";
n++;
pechat_prazno(n,p);//rekursiq - izwikwane na reda
}//if
}// rekursiq pechat interwal
void pechat_red(char n, char m)
{ if(m<=n)
{ cout<<n;
n--;
pechat_red(n,m);//rekursiwno izwikwane na reda
}//if
}// pechat red ot triygylnik
void triygylnik (char n, char m, char p)
{ if(n>=m)
{ pechat_prazno(n,p);
pechat_red(n,m);
cout<<endl;
n--;
triygylnik (n,m,p);//rekutsiq izwikwane
}//if
}// rekursiq triygylnik
int main () //nachalo na programata
{ char n,p,m='A';
//w gorniq red e priswoena stojnost na m='A'- winagi se zapochwa ot bukwa A
cout<<"Da se systawi programa, koqto po wywedena glawna bukwa se izwevda"<<endl;
cout<<"prawoygylen triygylnik s bukwi, kato pri towa na pyrwiq red"<<endl;
cout<<"sa izwevdat wsichki bukwi ot wywedenata do A."<<endl;
cout<<"Pri wywedena bukwa D rezultatyt she byde: "<<endl;
cout<<"DCBA\n";
cout<<" CBA\n";
cout<<" BA\n";
cout<<" A\n";
cout<<"Da se izpolzwa rekursiwna funkciq.\n";
//pri deklarirane m='A';// cout<<"Wywedete nachalen simwol: ";cin>>m;
do {
cout<<"Wywedete bukwa [B..Z]: ";cin>>n;
} while (n<'B' || n>'Z');
p=n;
triygylnik (n,m,p);
system("pause");
return 0;
}//kraj na programa triygylnik ot znaci
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.