C/C++

  • Креатор на темата Креатор на темата Драган
  • Време на започнување Време на започнување


--- надополнето ---

ПОМОШ
Ве молам решение за задачава во c++ т.е. код итно ми треба
file:///C:/Documents%20and%20Settings/kate/Desktop/zadaca.bmp

Благодарам однапред

--- надополнето ---

http://img823.imageshack.us/i/zadaca.png/
Ти треба математичка или програмерска помош, т.е. алгоритам или готов код?
 
Ми треба голема помош. Ќе може ли некој да ја открие и корегира грешката во задачава?


Код:
#include <stdio.h>
#include <stdlib.h>

#define MAX_ELEMENTI 100
#define NEW(t) (t *)malloc(sizeof(t))

typedef struct element2 { 
	int info;
	struct element2 *left, *right;
	char rtag, ltag;
} nanizano;

int main()
{
	nanizano *v, *kreirajNizanoLeksi(int[], int);
	int i = 0, n, niza[MAX_ELEMENTI], scanOK;
	void inorderNanizano (nanizano *);
	while((i<MAX_ELEMENTI)&&((scanOK=(scanf("%d",&n)))||1)&&(getchar()!='`'))
	if(scanOK) niza[i++]=n;
	v = kreirajNizanoLeksi(niza, i);
	printf("\nInorder nanizano:\n");
	inorderNanizano(v);
	system("pause");
	return 0;
}

nanizano *sledbenik (nanizano *t)
{
	if(t->rtag=='+')
	{
		t=t->right;
		while(t->ltag=='+')
			t=t->left;
		return t;
	}
	else return t->right;
}

void inorderNanizano (nanizano *v)
{
	nanizano *temp=v->right;
	while(temp->ltag=='+')
		temp=temp->left;
	while(temp!=v)
	{
		printf("%d ", temp->info);
		temp=sledbenik(temp);
	}
}

void insert (nanizano **n, int x)
{
	nanizano *p=NEW(nanizano);
	nanizano *temp=(*n)->right;
	for(;;)
	{
		if(temp==NULL)
		{
			p->info=x;
			p->right=*n;
			p->rtag='-';
			p->left=*n;
			p->ltag='-';
			break;
		}
		else if(x<temp->info)
		{
			if(temp->ltag!='-')
				temp=temp->left;
			else
			{
				p->info=x;
				p->right=temp;
				p->rtag='-';
				p->left=temp->left;
				p->ltag=temp->ltag;
				temp->left=p;
				temp->ltag='+';
				break;
			}
		}
		else if(x>temp->info)
		{
			if(temp->rtag!='-')
				temp=temp->right;
			else
			{
				p->info=x;
				p->right=temp->right;
				p->rtag=temp->rtag;
				p->left=temp;
				p->ltag='-';
				temp->right=p;
				temp->rtag='+';
				break;
			}
		}
		else break;
	}
}

nanizano *kreirajNizanoLeksi (int a[], int n)
{
	nanizano *v=NEW(nanizano);
	v->right=NULL;
	v->rtag='+';
	v->left=v;
	v->ltag='-';
	for(int i=0; i<n; i++)
		insert(&v, a[i]);
	return v;
}

Еве и paste2.org код.
Anyone?
 
Код:
int nzd(int a, int b) 
{  
   return (b!=0 ? nzd(b, a%b) : a);  
}  
  
int nzs(int a, int b) 
{  
   return (a*b)/nzd(a,b);  
}

Зошто е така, не е битно :)
Тоа нзд-то ако не го разбираш, еве малку појасен код:
Код:
int nzd(int a, int b) 
{
    if(b==0) 
        return a;
    else 
        return nzd(b, a%b);
}
....

Инаку нзс функцијава не е рекурзија.
Само нзд ти е рекурзија што си ја напишал.
Ја најдов како може со рекурзија да се направи нзс функција

Код:
int nzs(int x, int y)
{
    int i=2;
    if(x==1)
        return y;
    if(y==1)
        return x;
    while(x%i && y%i)
        i++;
    if(x%i)
        x/=i;
    if(y%i)
        y/=i;
return i*nzs(x,y);
}
 
Инаку нзс функцијава не е рекурзија.
Само нзд ти е рекурзија што си ја напишал.
Ја најдов како може со рекурзија да се направи нзс функција

Код:
int nzs(int x, int y)
{
    [B]int i=2;[/B]  // при рекурзија не се користат бројачи
    if(x==1)
        return y;
    if(y==1)
        return x;
    [B]while(x%i && y%i) // ова НЕ!
        i++;[/B]
    if(x%i)
        x/=i;
    if(y%i)
        y/=i;
return i*nzs(x,y);
}
Баш напротив, ова твоето не е рекурзија. Т.е. Е (вака на прв поглед), ама и НЕ Е. Ова твоето е присилна рекурзија. Значи ти овдека имаш бројач, кој што проверува за секој број посебно се додека не се исполни некој услов (while циклусот). Во рекурзија ова не се прави. Мојот код е составен од 2 функции, од кои едната е СИГУРНО рекурзија (НЗД кодот), а другата само ја повикува првата. Баш прашај асистент/професор ко ќе имаш вежби за мојот и твојот код, и види што ќе ти кажат :).
 
Баш напротив, ова твоето не е рекурзија. Т.е. Е (вака на прв поглед), ама и НЕ Е. Ова твоето е присилна рекурзија. Значи ти овдека имаш бројач, кој што проверува за секој број посебно се додека не се исполни некој услов (while циклусот). Во рекурзија ова не се прави. Мојот код е составен од 2 функции, од кои едната е СИГУРНО рекурзија (НЗД кодот), а другата само ја повикува првата. Баш прашај асистент/професор ко ќе имаш вежби за мојот и твојот код, и види што ќе ти кажат :).
Баш прашав и тоа твоето не е рекурзија на функцијата нзс, само на нзд.
Моето е затоа што по дефиниција рекурзивна функција треба самата да се повикува себеси и треба да има услов за прекин тоа ако х==1 и y==1.
А тоа што брои циклусот само проверува кој броеви се делители на x и y нели. Инаку како би нашол кои се делители на x и y?
 
Баш прашав и тоа твоето не е рекурзија на функцијата нзс, само на нзд.
Моето е затоа што по дефиниција рекурзивна функција треба самата да се повикува себеси и треба да има услов за прекин тоа ако х==1 и y==1.
А тоа што брои циклусот само проверува кој броеви се делители на x и y нели. Инаку како би нашол кои се делители на x и y?
Аххх... добро, нека биде така.
 
Баш напротив, ова твоето не е рекурзија. Т.е. Е (вака на прв поглед), ама и НЕ Е. Ова твоето е присилна рекурзија. Значи ти овдека имаш бројач, кој што проверува за секој број посебно се додека не се исполни некој услов (while циклусот). Во рекурзија ова не се прави. Мојот код е составен од 2 функции, од кои едната е СИГУРНО рекурзија (НЗД кодот), а другата само ја повикува првата. Баш прашај асистент/професор ко ќе имаш вежби за мојот и твојот код, и види што ќе ти кажат :).

Како бе така. Секоја функција која се повикува самата себе е рекурзивна. Па ти ако сакаш и 10 циклуси стави внатре.
 
Баш прашав и тоа твоето не е рекурзија на функцијата нзс, само на нзд.
Моето е затоа што по дефиниција рекурзивна функција треба самата да се повикува себеси и треба да има услов за прекин тоа ако х==1 и y==1.
А тоа што брои циклусот само проверува кој броеви се делители на x и y нели. Инаку како би нашол кои се делители на x и y?
Проверувате ли вие дали работи програмата, или само си внесувате кодови?

--- надополнето ---

Тоа што сака Олд Скул со кодот може да се напише и вака (со една функција), и е оправдано:
Код:
#include <stdio.h>
#include <stdlib.h>

int spaski(int x, int y)
{
    if(y==0) return x;
    return spaski(y,x%y);
}

int main()
{
    int x,y;
    printf("Vnesi 2 broja: ");
    scanf("%d%d", &x,&y);
    printf("NZS (%d,%d) = %d\n", x,y,(x*y)/spaski(x,y));
    system("pause");
    return 0;
}

А таа функцијата на Spaski, всушност не е рекурзија, туку итерација. Во што е разликата?
Прекин на повторувањето:
Итерација: условот за повторување повеќе не важи
Рекурзија: се препознава основниот случај
Значи кај рекурзијата нема бројачи и циклуси, или го исполнува условот, или не.
Се надевам бев појасен.
 
Проверувате ли вие дали работи програмата, или само си внесувате кодови?

--- надополнето ---

Тоа што сака Олд Скул со кодот може да се напише и вака (со една функција), и е оправдано:
Код:
#include <stdio.h>
#include <stdlib.h>

int spaski(int x, int y)
{
    if(y==0) return x;
    return spaski(y,x%y);
}

int main()
{
    int x,y;
    printf("Vnesi 2 broja: ");
    scanf("%d%d", &x,&y);
    printf("NZS (%d,%d) = %d\n", x,y,(x*y)/spaski(x,y));
    system("pause");
    return 0;
}

А таа функцијата на Spaski, всушност не е рекурзија, туку итерација. Во што е разликата?
Прекин на повторувањето:
Итерација: условот за повторување повеќе не важи
Рекурзија: се препознава основниот случај
Значи кај рекурзијата нема бројачи и циклуси, или го исполнува условот, или не.
Се надевам бев појасен.
Инаку да проверена е програмата и работи супер.
А за тоа дека мојата функција е итерација, да можеби е.
На крај поентата беше функцијата да се реши со рекурзија или, штом ти така викаш, со итерација.
 
Инаку да проверена е програмата и работи супер.
А за тоа дека мојата функција е итерација, да можеби е.
На крај поентата беше функцијата да се реши со рекурзија или, штом ти така викаш, со итерација.
А може еве да објасниш како работи таа твоја функција? Не ми е јасна. Btw кај мене не ги дава очекуваните резултати.
 

Kajgana Shop

Back
На врв Bottom