Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Помощ за задачи на C/C++ (merged)


Препоръчан отговор

Дали?

Не обърнах внимание на това б. Но има и по-лесен начин. Сега като се замислих всичко различно от 1 и 3 като сума може да бъде представено като x*2+y*5 :) т.е. в началото правиш тази проверка и си ОК :)

Линк към коментара
Сподели в други сайтове

 

Втория цикъл е напълно излишен.

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int S,i2,i5,b=0;
   printf("MONETI : ");scanf("%d",&S);
   for(i5=0;i5<=S/5;i5++) {
      i2=S-i5*5;
      if (i2%2==0) {
          i2 /= 2;
          printf("%d. 2x %d | 5x %d\n",++b,i2,i5);
      }
   }
   if (b==0) printf("No\n");
   system("PAUSE");
}

Например: S=2;

for(i5=0;1<=2/5;i5++) [ отива на i2=S-i5*5] 

i2=2-0*5; (i2 = 2)

после -> if (i2%2==0) [вярно]

влиза в if и това i2 /= 2; това не го  разбрах малко, но както виждам брояч на монетите 2

не знам дали правилно съм разгадал алгоритъма, но работи без забележки  :)

Пак аз :) 

 

Да се състaви програма MOON, която прочита две числа а и
b(999<a<b<10000) и отпечатва всички лунни числа в интервала
от а до b. Едно число е лунно, ако сумата от цифрите на
единиците и хилядните е равна на сумата от цифрите на
десетиците и стотиците. Ако в зададения интервал няма лунни
числа програмата трябва да отпечатва NO.
Пример 1:
Вход:
1000 1300
Изход:
1001 1111 1221
Пример 2:
Вход:
1223 1310
Изход:
NO
 
ето сорс кода което работи с една малка забележка:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int A,B,i,moon,nomoon,a,b,c,d,temp=0;
	printf("Enter 1 number : ");scanf("%d",&A);scanf("%d",&B);
	printf("===========\n");
	for(i=A;i<B;i++)
	{
		a=i%10;
    	b=i/10%10;
    	c=i/100%10;
    	d=i/1000%10;
    	
    	moon=a+b;
    	nomoon=d+c;
    	if(moon==nomoon)
    	{
    		printf("%d\n",i);
    		temp++;
    	}	
	}
	if(temp==0)
	{
		printf("NO");
	}
	
	
	printf("\n\n");
	system("PAUSE");
}

при втория пример входа е - 1223 и 1310, но при пускане на програмата изписва 2 цифри: 1230 и 1304. Ако гледаме условието на задачата е вярно, но защо при примера е така ? :)

Линк към коментара
Сподели в други сайтове

 

Например: S=2;

for(i5=0;1<=2/5;i5++) [ отива на i2=S-i5*5] 

i2=2-0*5; (i2 = 2)

после -> if (i2%2==0) [вярно]

влиза в if и това i2 /= 2; това не го  разбрах малко, но както виждам брояч на монетите 2

не знам дали правилно съм разгадал алгоритъма, но работи без забележки   :)

Пак аз :)

 

Да се състaви програма MOON, която прочита две числа а и
b(999<a<b<10000) и отпечатва всички лунни числа в интервала
от а до b. Едно число е лунно, ако сумата от цифрите на
единиците и хилядните е равна на сумата от цифрите на
десетиците и стотиците. Ако в зададения интервал няма лунни
числа програмата трябва да отпечатва NO.
Пример 1:
Вход:
1000 1300
Изход:
1001 1111 1221
Пример 2:
Вход:
1223 1310
Изход:
NO
 
ето сорс кода което работи с една малка забележка:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int A,B,i,moon,nomoon,a,b,c,d,temp=0;
	printf("Enter 1 number : ");scanf("%d",&A);scanf("%d",&B);
	printf("===========\n");
	for(i=A;i<B;i++)
	{
		a=i%10;
    	b=i/10%10;
    	c=i/100%10;
    	d=i/1000%10;
    	
    	moon=a+b;
    	nomoon=d+c;
    	if(moon==nomoon)
    	{
    		printf("%d\n",i);
    		temp++;
    	}	
	}
	if(temp==0)
	{
		printf("NO");
	}
	
	
	printf("\n\n");
	system("PAUSE");
}

при втория пример входа е - 1223 и 1310, но при пускане на програмата изписва 2 цифри: 1230 и 1304. Ако гледаме условието на задачата е вярно, но защо при примера е така ? :)

 

a+d==b+c ? може би ? Освен това какво става ако се въведе А > В ?

Редактирано от Jonnie_ (преглед на промените)
Линк към коментара
Сподели в други сайтове

Отпечатва това, което си задал. Иначе всичко е правилно, но грешката ти е техническа. Ти го караш да отпечатва числа на които са равни сумите от единиците и десетиците на сумите от стотиците и хилядите.

 

И числата които си видял да се разпечатват са точно такива.


1230 - 1+2=3 и 3+0 = 3


1304 - 1+3=4 и 0+4=4


Така както си написал кода

 

a - единици

b- десетици

c- стотици

d- хиляди

 

Ти проверяваш дали a+b=c+d


 

при втория пример входа е - 1223 и 1310, но при пускане на програмата изписва 2 цифри: 1230 и 1304. Ако гледаме условието на задачата е вярно, но защо при примера е така ? :)

 

Редактирано от Реджеп Иведик (преглед на промените)
Линк към коментара
Сподели в други сайтове

 

Отпечатва това, което си задал. Иначе всичко е правилно, но грешката ти е техническа. Ти го караш да отпечатва числа на които са равни сумите от единиците и десетиците на сумите от стотиците и хилядите.

 

И числата които си видял да се разпечатват са точно такива.

1230 - 1+2=3 и 3+0 = 3

1304 - 1+3=4 и 0+4=4

Така както си написал кода

 

a - единици

b- десетици

c- стотици

d- хиляди

 

Ти проверяваш дали a+b=c+d

 

така написах щото при : moon=a+d; nomoon=b+c; изписва правилни отговори и грешни отговори.

например при вход : 1000 и 1300 изписва :

 

1010

1021

1032

1043... т.е. 1000 + 10 първия път после се увеличава с +11 докато стигне 1300

Линк към коментара
Сподели в други сайтове

Първия пример е грешен - числата не само три и 1221 няма как да е вярно според условието.

 

Това че са през 11 не е съвсем вярно, примерно лунни са 1098 и 1100  - разликата между тях е 2

Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

Имам няколко задачи.Моля някой да ми помогне ако може 

 

1. Даден е едномерен масивa[15] и интервал [p,q]. Да се напише програма, която включва следните функции:
Функция за запълване на елементите на масива със случайни числа в интервала [left,right];
Функция за отпечатване на елементи на масива на екрана;
Функция за намиране на(∏▒a_i )/k,където ∏▒〖a_i-произведението,k-броя〗 на елементите, разположени в интервала [p,q].

 

Всяка от изброените операции да се реализират посредством функции, които да се тестват в main() – функцията.а.

 

Задача 3: Даден е едномерен масивa[20]. Да се напише програма, която включва следните функции:

Функция за запълване на елементите на масива със случайни числа в интервала [left,right];

Функция за отпечатване на елементи на масива на екрана;

Функция за намиране на произведението от √(a_(i  ) ), къдетоi=1÷20,〖 a〗_i  са по-малки от средата на интервала [left,right].

Всяка от изброените операции да се реализират посредством функции, които да се тестват в main() – функцията.

 

Задача 4: Даден е едномерен масивa[20]. Да се напише програма, която включва следните функции:

Функция за запълване на елементите на масива със случайни числа в интервала [left,right];

Функция за отпечатване на елементи на масива на екрана;

Функция за намиране на произведението от елементите на масива.

Всяка от изброените операции да се реализират посредством функции, които да се тестват в main() – функцията.

 

Задача 5: Даден е едномерен масивD[n],n=50. Да се напише програма:

запълва елементите на масива със случайни числа в интервала [-300,200];

извежда елементи на масива на екрана;

определя дали дадено число q,което се въвежда от клавиатурата се среща в масива и ако това е така връща индекса на елемента, с който  q съвпада, иначе връща -1;

Линк към коментара
Сподели в други сайтове

  • 2 седмици по-късно...

Да се състави програма на С/С++, която създава два процеса, комуникиращи през обща памет с размер един символ. Първият процес чете от потребителя символен низ и го предава символ по символ на вторият процес, който го визуализира и изчислява неговата дължина./трябва да се направи на Linux/- Как става това с общата памет?

Линк към коментара
Сподели в други сайтове

Да се състави програма на С/С++, която създава два процеса, комуникиращи през обща памет с размер един символ. Първият процес чете от потребителя символен низ и го предава символ по символ на вторият процес, който го визуализира и изчислява неговата дължина./трябва да се направи на Linux/- Как става това с общата памет?

shared memory и евентуално семафор за да знае приемащия процес кога има символ в буфера и предаващия кога приемащия е взел символа от паметта

Линк към коментара
Сподели в други сайтове

  • 1 месец по-късно...

Момчета ( и момичета), моля за помощ... Задачата ми е следната: Да се състави програма за пресмятане на броя на различните начини, по които едно естествено число N може да бъде представено като сума, всяко от събираемите на която е по- малко от дадено естествено число K(K<N). Примерно изкарване на програмата: въвеждам програмата да раздроби числото 4 ( N ), но не искам при раздробяването да ми показва начин с числото 3 ( К ) --> 4=1+1+1+1 / 4=2+1+1 / 4=2+2. 

Написал съм  мой source code, но не знам как да сложа това "ограничение". Проблема ми е вмъкването на това K и да не ми показва начин с число, което аз избера. Моля за помощ.

 

Моят source code:

 

#include <iostream>
using namespace std;
 
int chislo, sumi[32];//syhranqwa porednoto chislo za razbiwane
//za da move da se osyshestwqt wsichki predstawqniq ot chisloto do 1
void pechat(int l)
{ int a;
  cout<<chislo<<" = ";
  for (a = 1; a < l; a++) cout<<sumi[a]<<"+";//pechat na cifra
    cout<<sumi[l]<<endl;
}
 
void predstav(int N, int pos)
//argumenti: y-chislo za razbiwane; pos - kolko pyti e razbiwano
{ int b;
  for (b = N; b >= 1; b--)
   {if (N != b)
    {  sumi[pos] = b;//chislo za razbiwane
      if (sumi[pos] <= sumi[pos - 1]) {predstav(N - b, pos + 1);}//rekursiq
      //!!!sumi[0] = chislo, za da ima izhod ot rekursiqta;
    }
    else
    { sumi[pos] = b;//chislo za razbiwane
      if (sumi[pos] <= sumi[pos - 1]) pechat(pos);//izwevda wid predstawqne
 //za da nqma powtorenie wsqko sledwasho sybiraemo e <= na predhodnoto
    }//else
  }//for
}//void
 
int main()
{ cout<<"Da se systawi programa, koqto izwevda wsichki wyzmovni razbiwaniq\n";
  cout<<"kato sumi na dadeno estestweno chislo ot interwala [5..10]\n";
  cout<<"Primer: 4 Izhod: 4; 3+1; 2+2; 2+1+1; 1+1+1+1;\n";
  cout<<"Wywedete chislo ot interwala [5..10]: ";cin>>chislo;
  sumi[0] = chislo;//za da ima kraj na rekursiq
  predstav(chislo, 1);
system("pause");
return 0;
}
 
 
Извинявам се ако бъда нахален, но може ли някой да ми вмъкне в кода това " ограничение с K " ?
Благодаря предварително! : )
Линк към коментара
Сподели в други сайтове

#include <iostream>
using namespace std;
 
int chislo, k, sumi[32];//syhranqwa porednoto chislo za razbiwane
//za da move da se osyshestwqt wsichki predstawqniq ot chisloto do 1
void pechat(int l)
{ int a;
  cout<<chislo<<" = ";
  for (a = 1; a < l; a++) cout<<sumi[a]<<"+";//pechat na cifra
    cout<<sumi[l]<<endl;
}
 
void predstav(int N, int K, int pos)
//argumenti: y-chislo za razbiwane; pos - kolko pyti e razbiwano
{ int b;
  if (K>N) K=N;
  for (b = K; b >= 1; b--)
   {if (N != b)
    {  sumi[pos] = b;//chislo za razbiwane
      if (sumi[pos] <= sumi[pos - 1]) {predstav(N - b, K, pos + 1);}//rekursiq
      //!!!sumi[0] = chislo, za da ima izhod ot rekursiqta;
    }
    else
    { sumi[pos] = b;//chislo za razbiwane
      if (sumi[pos] <= sumi[pos - 1]) pechat(pos);//izwevda wid predstawqne
 //za da nqma powtorenie wsqko sledwasho sybiraemo e <= na predhodnoto
    }//else
  }//for
}//void
 
int main()
{ cout<<"Da se systawi programa, koqto izwevda wsichki wyzmovni razbiwaniq\n";
  cout<<"kato sumi na dadeno estestweno chislo ot interwala [5..10]\n";
  cout<<"Primer: 4 Izhod: 4; 3+1; 2+2; 2+1+1; 1+1+1+1;\n";
  cout<<"Wywedete chislo ot interwala [5..10]: ";cin>>chislo;
  sumi[0] = chislo;//za da ima kraj na rekursiq
  do {  
     cout<<"K ( po malko ot "<<chislo<<" ) = "; 
     cin>>k;
  } while (k>=chislo);
  predstav(chislo, k-1, 1);
system("pause");
return 0;
}
Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

  • 2 седмици по-късно...

Здравейте !

 

Имам една задача с която ми е трудно да се справя. Задачата е следната: да се генерира символен низ с дължина N (N <= 100), образуван от буквите 'A', 'B' и 'C' и несъдържащ два идентични съседни подниза. пр. Въвеждате за N = 6 и програмата трябва да генерира такъв низ в който да няма един до друг повтарящи се поднизове: ABACAB, грешни са низовете: AABACA - понеже 'A' е до 'A'; ABCBCA - понеже 'BC' е до 'BC' и ABCABC също е грешен понеже 'ABC' е до 'ABC'.

 

Ето и малко до където съм стигнал, направил съм го само да може да проверява дали в даден стринг има идентични съседни поднизове, ако има ги извежда и на коя позиция са:

#include <iostream>
#include <stdio.h>
#include <string>
#include <ctime>

using namespace std;

#define SIZE 1000

static const char letters[] = "ABC";

int len;

/*
char generate_rand()
{

	return letters[rand() % 3];

}

void generate_string()
{

	srand(time(0));
	string str;
	int n;

	cout << "Enter n = ";
	cin >> n;
	cout << endl;
	
	for(int i = 0; i < n; i++)
	{

		str += generate_rand();

	}

	cout << "Generated string: " << str << endl << endl;

	len = str.length();

	cout << "String length: " << len << endl << endl;

}
*/

int main()
{
	char S[SIZE];
	char repeat[SIZE];
	int match = 0;
	
	cout << "Enter string: ";

	fgets(S, SIZE-1, stdin);

	int n = strlen(S);
	
	cout << "\nS = " << S; 
	cout << "length =  " << n << endl;

	for (int p = 1; p <= n/2; p++)
	{
		for (int i = 0; i < n-p; i++)
		{

			if (S[i] == S[i+p]) 
			{

				match++;
				if (match >= p)
				{
					
					strncpy(repeat, &S[i-p+1], 2*p);
					repeat[2*p]='\0';

					cout << "\nFound repeat of length " << 2*p << " at location " << i-p+1 << " is: " << repeat << endl;
		
				}
			}
			else match = 0;
		}
		
	}

	cout << endl;

	system("pause");
	return 0;
}
Редактирано от preslavmilev (преглед на промените)
Линк към коментара
Сподели в други сайтове

Имам една задача с която ми е трудно да се справя. Задачата е следната: да се генерира символен низ с дължина N (N <= 100), образуван от буквите 'A', 'B' и 'C' и несъдържащ два идентични съседни подниза. пр. Въвеждате за N = 6 и програмата трябва да генерира такъв низ в който да няма един до друг повтарящи се поднизове: ABACAB, грешни са низовете: AABACA - понеже 'A' е до 'A'; ABCBCA - понеже 'BC' е до 'BC' и ABCABC също е грешен понеже 'ABC' е до 'ABC'.

Едно уточнение към условието: низът трябва да е произволен, т.е. всеки път да е различен или просто трябва да няма повтарящи субнизове?
Линк към коментара
Сподели в други сайтове

Едно уточнение към условието: низът трябва да е произволен, т.е. всеки път да е различен или просто трябва да няма повтарящи субнизове?

Аз го разбирам така, че просто трябва да се генерира низ от буквите A,B,C без повтарящи се поднизове, тоест може и да е различен всеки път, но не трябва да има идентични поднизове.

Линк към коментара
Сподели в други сайтове

Аз го разбирам така, че просто трябва да се генерира низ от буквите A,B,C без повтарящи се поднизове, тоест може и да е различен всеки път, но не трябва да има идентични поднизове.

Питах, защото ако не трябва да е различен всеки път, можеш да го генерираш много лесно, чрез добавяне на буква към края - тогава проверката за повтарящи се поднизове ще бъде много по-лека, защото ако добавиш буква към низ без повтарящи се поднизове, ще трябва да провериш само поднизове с нейно участие, т.е. последните две букви, последните два низа с по две букви, последните два низа с по 3 букви и така нататък. Така плюс връщания назад при неуспешните опити (= каквато и буква да сложиш се получава повторение) ще можеш да генерираш много лесно низ итеративно. Иначе така ако всеки път проверяваш целия низ за всички възможни поднизове е тегава работа.

Линк към коментара
Сподели в други сайтове

Със случайни генерирани букви нещо не успявам да направя стринг от 100 букви по тези правила.

Програмата спира доста по-рано защото с никоя от трите букви не може да се продължи.

#include <iostream>
#include <ctime>

using namespace std;

static const char letters[] = "ABC";

char generate_rand()
{

	return letters[rand() % 3];

}

int check(char *s, int pos) {
    for (int i=1; i<=(pos+1)/2; i++) {
       int flag=1;
       for (int j=0; j<i; j++)
           if (s[pos-j]!=s[pos-i-j]) {
               flag=0; 
               break;
           }
       if (flag) return 1;
    }
    return 0;
}
 
int main() {
    char s[100];
    int n=100;
    
    srand(time(NULL));
    for (int i=0; i<n; i++) {
        do 
           s[i]=generate_rand(); 
        while (check(s, i));
        cout<<s[i]<<" ";
    }
    cout<<" ok"<<endl;
    cin.ignore(); 
    cin.get();
}
[edit]

всъщност след десетина стартирания успя:

A B A C A B C B A C B C A B C B A B C A B A C A B C B A C A B A C B A B C B A C

B C A B C B A B C A C B C A B C B A C B C A B A C A B C A C B A B C A B A C B A

B C A C B A C A B A C B C A B A C A B C ok

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

от само две - ако предната е А да се избира или B или C и ако не стане с последната останала

ако и с нея не става да се върне стринга с една буква назад и да се пробва с друга буква.

Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

Със случайни генерирани букви нещо не успявам да направя стринг от 100 букви по тези правила.

Програмата спира доста по-рано защото с никоя от трите букви не може да се продължи.

#include <iostream>
#include <ctime>

using namespace std;

static const char letters[] = "ABC";

char generate_rand()
{

	return letters[rand() % 3];

}

int check(char *s, int pos) {
    for (int i=1; i<=(pos+1)/2; i++) {
       int flag=1;
       for (int j=0; j<i; j++)
           if (s[pos-j]!=s[pos-i-j]) {
               flag=0; 
               continue;
           }
       if (flag) return 1;
    }
    return 0;
}
 
int main() {
    char s[100];
    int n=100;
    
    srand(time(NULL));
    for (int i=0; i<n; i++) {
        do 
           s[i]=generate_rand(); 
        while (check(s, i));
        cout<<s[i]<<" ";
    }
    cout<<" ok"<<endl;
    cin.ignore(); 
    cin.get();
}
[edit]

всъщност след десетина стартирания успя:

A B A C A B C B A C B C A B C B A B C A B A C A B C B A C A B A C B A B C B A C

B C A B C B A B C A C B C A B C B A C B C A B A C A B C A C B A B C A B A C B A

B C A C B A C A B A C B C A B A C A B C ok

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

от само две - ако предната е А да се избира или B или C и ако не стане с последната останала

ако и с нея не става да се върне стринга с една буква назад и да се пробва с друга буква.

 

Благодаря, колега. Тя понякога се мъчи и на 8 символа, сега мисля, че ще мога да я направя и по рекурсивен начин. 

Линк към коментара
Сподели в други сайтове

Благодаря, колега. Тя понякога се мъчи и на 8 символа, сега мисля, че ще мога да я направя и по рекурсивен начин.

Моя начин. Няма "мъчене". Преписах check от ined. Може да се оптимизира, ама ме мързи

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

static const char letters[6][3] = {{'A','B','C'}, {'A','C','B'}, {'B','A','C'}, {'B','C','A'}, {'C','A','B'}, {'C','B','A'}};

int check(char *s, int pos) {
    for (int i=1; i<=(pos+1)/2; i++) {
       int flag=1;
       for (int j=0; j<i; j++)
           if (s[pos-j]!=s[pos-i-j]) {
               flag=0;
               break;
           }
       if (flag) return 1;
    }
    return 0;
}

class letter
{
private:
    int seq, cval;
public:
    letter()
    {
        seq = rand()%6;
        cval = 0;
    }
    char get()
    {
        return(letters[seq][cval]);
    }
    int next()
    {
        cval++;
        cval %= 3;
        return (cval);
    }
};

int main()
{
    char string[101];
    letter  *seq;
    int clen = 0, req_len = 99;
    int i;

    srand(time(NULL));
    seq = new letter[req_len];

    string[req_len] = 0;

    while(clen < req_len) {
        string[clen] = seq[clen].get();
        if (!check(string, clen))
            clen++;
        else
            while(!seq[clen].next())
                clen--;
    }
    
    delete[] seq;
    cout << "The string is:" << endl;
    cout << string << endl;
}

че ще мога да я направя и по рекурсивен начин.

Не виждам що ти е да я правиш рекурсивно, като се прави идеално и с итерация. Редактирано от flare (преглед на промените)
Линк към коментара
Сподели в други сайтове

Моя начин. Няма "мъчене". Преписах check от ined. Може да се оптимизира, ама ме мързи

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

static const char letters[6][3] = {{'A','B','C'}, {'A','C','B'}, {'B','A','C'}, {'B','C','A'}, {'C','A','B'}, {'C','B','A'}};

int check(char *s, int pos) {
    for (int i=1; i<=(pos+1)/2; i++) {
       int flag=1;
       for (int j=0; j<i; j++)
           if (s[pos-j]!=s[pos-i-j]) {
               flag=0;
               continue;
           }
       if (flag) return 1;
    }
    return 0;
}

class letter
{
private:
    int seq, cval;
public:
    letter()
    {
        seq = rand()%6;
        cval = 0;
    }
    char get()
    {
        return(letters[seq][cval]);
    }
    int next()
    {
        cval++;
        cval %= 3;
        return (cval);
    }
};

int main()
{
    char string[101];
    letter  *seq;
    int clen = 0, req_len = 99;
    int i;

    srand(time(NULL));
    seq = new letter[req_len];

    string[req_len] = 0;

    while(clen < req_len) {
        string[clen] = seq[clen].get();
        if (!check(string, clen))
            clen++;
        else
            while(!seq[clen].next())
                clen--;
    }
    
    delete[] seq;
    cout << "The string is:" << endl;
    cout << string << endl;
}
Не виждам що ти е да я правиш рекурсивно, като се прави идеално и с итерация.

 

Благодаря и за този вариант. По принцип задачата ми я искаха със рекурсия, но понеже ми малко по-непознат начина и започнах с итерация.

Линк към коментара
Сподели в други сайтове

във функцията check() цикъла трябва да се прекъсва с break, поправил съм го но сте го копирали варианта от преди това.

Линк към коментара
Сподели в други сайтове

Здравейте, моля за малко помощ относно една задача:

Да се състави рекурсивна функция за изчисляване на стойностите на полиномите на Ермит:
Н(n, х)=1, n=0
Н(n, х)=2*х, n=1

2*X*H(n-1, х) - 2*(n-1)*H(n-2, х), n>1

 

Ето това съм направил аз, но нещо не е както трябва...

#include <iostream>
using namespace std;
int ermit(int x, int n)
{ 
	if(n=0)
		return 1;
	else if(n=1)
		return 2*x;
	else
		return 2*x*ermit(n-1,x)-2*(n-1)*ermit(n-2,x);
}
int main()
{
	int x,n;
	cout<<"x=";
	cin>>x;
	do{
	  cout<<"n=";
	  cin>>n;
	  }while(n<0);
	cout<<"Rezultat:"<<ermit(x,n)<<endl;
}
Линк към коментара
Сподели в други сайтове

Според мене типа на X и на функцията трябва да е double а не int.

и това:

        if(n=0)
		return 1;
	else if(n=1)

трябва да е с ==

        if(n==0)
		return 1;
	else if(n==1) 
Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

#include <iostream>
using namespace std;
long long H[21][21]={};
double ermit(int n, double x)
{ 
    if(n==0) {
        H[0][0]=1;
	return 1;
    } else if(n==1) {
        H[1][1]=2;
	return 2*x;
    }
    double t=2*x*ermit(n-1,x)-2*(n-1)*ermit(n-2,x);
    if (H[n][n]==0) {
       for (int i=n; i>0; i--) 
           H[n][i]=2*H[n-1][i-1];
       for (int i=n-2; i>=0; i--)
           H[n][i]-=2*(n-1)*H[n-2][i];
    }
    return t;
}

void print(int i, long long h) {
     if (h==0) return;
     if (h>0) cout<<"+";
     cout<<h;
     if (i>1) cout<<"*X^"<<i;
     else if (i==1) cout<<"*X";
}
     
int main()
{
    int n;
    double x, r;
    cout<<"x = ";
    cin>>x;
    do {
        cout<<"n = ";
        cin>>n;
    } while ((n<0)||(n>20));
    r=ermit(n, x);
    cout<<"Polinom : ";
    for (int i=n; i>=0; i--) 
        print(i,H[n][i]);
    
    cout<<"\nRezultat:"<<r<<endl;
}

Редактирано от ined (преглед на промените)
Линк към коментара
Сподели в други сайтове

  • 3 седмици по-късно...

Може ли малко помощ, имам да напиша две програми на C++, но незнам как да започна.Благодаря предварително !

 

1. Да се състави програма на С за въвеждане на Х, изчисляване и извеждане на стойността на функцията У:

 

          2x+5                    при       X < -4

  Y=   2x2                       при   -4 <= X <= 5

           x2-6                    при        X > 5

 

 

Използвайте вложени оператори за разклонение if.

 

 

 

2. Да се състави програма на С, която по въведени  страни на правоъгълник от клавиатурата изчислява:

      1. Лице на правоъгълник

      2. Периметър на правоъгълник

      3. Диагонал на правоъгълник

 

  4bcd79324bddb04e.JPG

 

  Използвайте оператора switch – case.

 

  Формула за диагонал на правоъгълник:

 

  0855569c4f545b42.JPG

 

Линк към коментара
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

  • Разглеждащи това в момента   0 потребители

    • Няма регистрирани потребители разглеждащи тази страница.
×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване