C/C++

Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
Чудно ви е дека бројачот се апдејтира во индексите на матрицата? Па добро една задача има милион начини како да се реши. На тој начин можеш многу манипулации да направиш во матрицата.

Еве на пример направив и збирот на споредната дијагонала, друг начин за споредната дијагонала бар сега во моментот не ми текнува.

Код:
total=0;
    for (i=n-1;i>=0;)
    for (j=0;j<m;) {
    
    total=total+matrica[i--][j++];
}
Финтава е ефикасно решение. Во твојот код за главна дијагонала се добива линеарно изминување ама имаш два фора, два услови и две променливи (плус променливите за големината на матрицата кои се задолжителни). Тоа е многу поефикасно од квадратно изминување со проверка i==j, ама уште поефикасно е со еден фор, еден услов и една променлива.

За споредна дијагонала најефикасно би било решение со еден фор, еден услов и две променливи. А можи да се реши и со една променлива.
Код:
for (int i=0, j=n-1; i<n; i++, j--)
{
...
matrica[i][j]
}
Со една променлива
Код:
for (int i=0; i<n; i++)
{
...
matrica[i][n-i-1]
}
За вакви едноставни работи уште од прва (или втора понекогаш) треба да се напиши ефикасно решение. За посложени проблеми важи она „направи го да работи, па оптимизирај го“.
 
Член од
16 јануари 2011
Мислења
11
Поени од реакции
0
Немора да се тепаш :)) ако си ти профи немора да значи дека и другите се ;)
Код:
#include <iostream>
using namespace std;

#include <string>

int main ()
{
    int n;
	cout<<"Vnesi broj: ";
	cin>>n;

    do
    {
        int x = n % 10;
        n /= 10;
        switch(x)
        {
            case 0 : cout<<"nula";
				break;
            case 1 : cout<<"eden";
				break;
            case 2 : cout<<"dva"; 
				break;
			case 3: cout<<"tri"; 
				break;
			case 4: cout<<"chetiri";
				break;
			case 5: cout<<"pet";
				break;
			case 6: cout<<"shest";
				break;
			case 7: cout<<"sedum";
				break;
			case 8: cout<<"osum";
				break;
			case 9: cout<<"devet";
				break;
            default: cout<<"Ne vnesovte validen broj"; 
        }
        cout << " ";

    }while (n != 0);

    
	cin.get(); cin.get();

}
од премногу збунка и бројот наопаку ми го печати :))
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Направи првин reverse на внесениот број па потоа изврши го кодот погоре.

Код:
int reverse( int n ) {
int tmp = 0;
while(n) { tmp*=10; tmp += n%10; n/=10; }
return tmp;
}
 
Член од
16 јануари 2011
Мислења
11
Поени од реакции
0
Среѓено :D
Код:
#include <iostream>
using namespace std;

int main ()
{

	int broj;
	int sprotiven;
	int cifra;


	cout<<"Vnesi broj: ";
	cin>>broj;
	sprotiven=0;
while(broj>0){
cifra=broj%10;
sprotiven=10*sprotiven+cifra;
broj/=10;
}

while (sprotiven>0)
{
cifra=sprotiven%10;
switch (cifra)
{
case 1: cout<<" eden"; 
	break;
case 2: cout<<" dva";
	break;
case 3: cout<<" tri";
	break;
case 4: cout<<" chetiri";
	break;
case 5: cout<<" pet";
	break;
case 6: cout<<" shest";
	break;
case 7: cout<<" sedum";
	break;
case 9: cout<<" devet";
	break;


}
sprotiven/=10;
}

cin.get(); cin.get();
return 0;
}
 
Член од
17 јануари 2011
Мислења
7
Поени од реакции
1
Бидејќи денес за прв пат се ставам на некој форум и малце може каснам со главниот одговор на темава кој може е веќе кажан но како што имав прилика да видам не успеав да ја видам главната разлика меѓу C и C++. Историски најпрвин се има појавено C во кој еден бројач може да се зголемува на следниов начин пример int i = i + 1; за разлика од ваквиот начин на зголемување или намалување на некои бројачи ( декремент ), во C++ се креирани скратени операции за зголемување или намалување на некој бројач ( инкремент ) ... Јас работам C++ така да ќе ви напишам некои инкременти за x променлива.

++x - се зголемува x па се извршува дадената функција
x++ - се извршува некоја финкција па после се згоолемува x
.
.
.
истото е со намелување (со минус ).

s += x е исто со s = s+x;
.
.
.
истото е и со останатите основни операции.
 
Член од
17 јануари 2011
Мислења
7
Поени од реакции
1
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main()
{
int s,p,c,a,b,l=0;
char n[10],k,x;
const char *pok;
fstream dat1,dat2;

cout << "Vnesi go imeto na datotekata: ";
cin >> n;

dat1.open(n, ios::in);
dat2.open("Krajno reshenie.txt", ios::eek:ut);

if (!dat1)
{
cout << "Nemozam da najdam datoteka so takvo ime!!!";
return 0;
}

s = 0;

while (!dat1.eof())
{
dat1 >> x;
pok = &x;

if (isdigit(x) && s == 1)
{
b = atoi(pok);
s = 0;
p = 1;
}
else
if (isdigit(x))
{
a = atoi(pok);
s +=1;
}
if (p == 1)
{
cout << "------------------------------------------" << endl;
if (l == 0)
cout << "Prvite dva broja od datotekata se: " << a << " i " << b << endl;
else
cout << "Slednite dva broja od datotekata se: " << a << " i " << b << endl;

cout << "Vnesi eden od osnovnite aritmetichki operacii : + , - , / , * " << endl;
cin >> k;

if ( k == '+' )
{
c = a+b;
dat2 << a << " + " << b << " = " << c << endl;
}
else
if (k == '-')
{
c = a-b;
dat2 << a << " - " << b << " = " << c << endl;
}
else
if (k == '*')
{
c = a*b;
dat2 << a << " * " << b << " = " << c << endl;
}
else
if (k == '/')
{
c = a/b;
dat2 << a << " / " << b << " = " << c << endl;
}
p = 0;
l += 1;
}
}

dat1.close();
dat2.close();
}
 
Член од
5 јуни 2008
Мислења
3.632
Поени од реакции
5.724
Рекурзија е функција која се повикува самата себе. Во итеративна функција се употребуваат циклуси (while, for). Е сега, задачата гласи вака: Во рекурзивна функција да се пресмета обратниот број на внесен број. И кодот:
Код:
int prevrten(int n){
 int i=1;
 if(n==0) return 0;
 else 
 {
 [COLOR="#ff0000"]while(i<=n) i=i*10[/COLOR];
 i=i/10;
 return [COLOR="#ff0000"]((n%10)*i+prevrten(n/10))[/COLOR];}
}
Дали функцијата останува рекурзивна ако покрај повикувањето има и while циклус? Или се додека циклусот во функцијта не е директно поврзан со промена на влезната вредност станува збор за рекурзија?
 
A

apidrone

Гостин
Дали функцијата останува рекурзивна ако покрај повикувањето има и while циклус?
За ова се расправавме со еден форумџија (или со неколку, не ми текнуе). Ако ти е за испит или слично, боље прашај асистент. Според мене, во рекурзивна функција нема такви циклуси, туку само if-else.
 
Член од
5 јуни 2008
Мислења
3.632
Поени од реакции
5.724
Код:
#include <stdio.h>

int prevrten(int n,int p){
if(n==0) return 0;
else 
{
return ((n%10)*p+prevrten(n/10,p/10));}
}

int broj(int n)
{
if (n<10) return 1;
return (10*broj(n/10));
}

int main ()
{
int n, a=10;
printf("n = ");   scanf("%d",&n);
int p;
p=broj(n);
printf("%d\n\n",prevrten(n,p));
return 0;
}
Еве како би се решила истата задача доколку во првата функција се тргне while циклусот. Целата потреба на циклус беше за да се одреди првиот множител со кој ќе се помножи поледната цифра од бројот за да стане прва во превртениот... Истата задача решена со 2 рекурзивни функции... Во broj (n) се пресметува 10^n, n - број на цифри. Така ќе се добие првиот множител кој со секое рекурзивно повикување во prevrten (n,p) ќе се намалува за /=10. И сето ова само за да нема while циклус во ист `простор` со рекурзијата.
 
Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
Рекурзија е функција која се повикува самата себе. Во итеративна функција се употребуваат циклуси (while, for). Е сега, задачата гласи вака: Во рекурзивна функција да се пресмета обратниот број на внесен број. И кодот:
Код:
int prevrten(int n){
 int i=1;
 if(n==0) return 0;
 else 
 {
 [COLOR="#ff0000"]while(i<=n) i=i*10[/COLOR];
 i=i/10;
 return [COLOR="#ff0000"]((n%10)*i+prevrten(n/10))[/COLOR];}
}
Дали функцијата останува рекурзивна ако покрај повикувањето има и while циклус? Или се додека циклусот во функцијта не е директно поврзан со промена на влезната вредност станува збор за рекурзија?
Код:
#include <iostream>
using namespace std;

int prevrti(int n, int prev)
{
	prev += n%10;
	n /= 10;
	if (n != 0)
		prev = prevrti (n, prev*10);

	return prev;
}

int main()
{
	int a;
	cin >> a;
	cout << prevrti(a, 0);
	return 0;
}
Додаваме еден екстра параметар а го намалуваме забележително процесорското време. На тој параметар се праќа аргумент кој го содржи делумно превртениот број, а во последниот повик се комлетира и само си го враќаме наназад комлетно превртениот број.
За почетен аргумент на тој параметар се става 0.

ПС. Во вистинска апликација ќе имаш две функции, една ова и една int prevrti(int n) и оваа вторава ќе ја повикува првата со 0 и ќе виде јавна, а првата ќе биде скриена (во C нема да ја има во хедерот, во C++ ќе биде означена за приватна).

За ова се расправавме со еден форумџија (или со неколку, не ми текнуе). Ако ти е за испит или слично, боље прашај асистент. Според мене, во рекурзивна функција нема такви циклуси, туку само if-else.
Рекурзивна е ако има повик самата кон себе, без врска дали има циклус во нејзе. Чист пример, функција за пермутации.
 
A

apidrone

Гостин
Рекурзивна е ако има повик самата кон себе, без врска дали има циклус во нејзе. Чист пример, функција за пермутации.
За разликата помеѓу итерација и рекурзија, стоп условите и слично. Како што кажав, подобро нека се консултира со асистентот, затоа што може да не му ја признаат како точна функцијата (ако му е за испит).
 
Член од
14 јануари 2008
Мислења
1.341
Поени од реакции
162
За разликата помеѓу итерација и рекурзија, стоп условите и слично. Како што кажав, подобро нека се консултира со асистентот, затоа што може да не му ја признаат како точна функцијата (ако му е за испит).
Мислам дека имаше дискусија на оваа тема веќе :)

Рекурзивна е ако се повикува самата себе, без разлика дали е математичка или програмска функција. Тоа е по дефиниција.
 

kokta

Search Pretty Girls in your city for night
Член од
18 јануари 2011
Мислења
6
Поени од реакции
1
Задачата гласи вака:
Да се напише програма со битови и оператори,од тастатура се внесува некој број и бројот да се претвори во бинарен и да се изброи на кое место се наоѓа првиот кец (1) броејќи од десно на лево!

Пр: 632=1001111000 првиот 1 од десно кон лево е на 4-та позиција !!!

И на крај во задачата да се употреби рекурзија!

Ако може некој да ја напише да видам како треба!
Фала однапред!
 
Член од
13 јуни 2008
Мислења
92
Поени од реакции
0
aj ако може некој да ја реши задачава со покажувачи во Ц.. да се напише функција која прима две текстуални низи како аргументи. низите да се споредат така што знаците кои се совпаѓаат во двете низи да се заменат со * .
пример:
прва низа: Jas sum prva niza
втора низа: Zadaca2 po programiranje..
да се добие:
J*s sum**rva niz*
Z*daca2**o progr*miranje
 
Член од
9 август 2007
Мислења
261
Поени од реакции
56
Fix int pos=1, while (!(0x01&(broj>>pos++))) ; printf ("%d", pos);
Okay?
 

Kajgana Shop

На врв Bottom