Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

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

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

 

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

Featured Replies

MR_DUDE е прав - нито един делител на дадено число не може да е по-голям от корен квадратен на числото... nemabatenick просто не се е осетил за това.

По тази причина можеш да замениш

for(int i=1;i<n;i++)
с
for(int i=1;i<sqrt(n);i++)
, но тогава трябва да пишеш горе и
#include<math.h>
освен
#include<iostream.h>

А за това:

if(n%i==0)
s+=i; // това е, което не ми е ясно..
if(s==n)
return 1;
else
return 0
то доказва, че числото е перфектно като проверява дали сумата (s, която пък се прави с
if(n%i==0)
s+=i;
- това значи, че ако остатъка при деление на n със i е 0, да се прибави i към сумата на делителите s) на всички делители на n е равна на самото n, а пък
if(s==n)
return 1;
казва на главната функция (което също присъства в условието на задачата - да има две функции - една за вход/изход и една за решаването на задачата), че това i, което главната функция проверява е "перфектно" число.

Освен това в условието е дадено само, че n е положително, а не естествено число, затова ще е по-точно, ако не е int, а double или float с проверка дали не е отрицателно, т.е.:

double n;
  cout<<"Vyvedi n:"; 
  cin>>n; 
  if(!cin or n<=0) 
  { cout<<"Bad Input"<<endl; 
	return 1; 
  }

Така че крайният вариант на решението е:

#include<iostream.h> 
#include<math.h> 
int perfect(int n) 
{ int s=0; 
  for(int i=1;i<=sqrt(n);i++) 
  if(n%i==0) 
  s+=i; 
  if(s==n) 
  return 1; 
  else 
  return 0; 
  
} 
int main() 
{ int br=0;
  double n;
  cout<<"Vyvedi n:"; 
  cin>>n; 
  if(!cin or n<=0) 
  { cout<<"Bad Input"<<endl; 
	return 1; 
  } 
  int i=1; 
  while(i<n) 
 { 
  if(perfect(i)) 
  {cout<<i<<" ";
   br++;
  } 
  i++;
 } 
  if(br==0) 
  cout<<"nqma perfektni 4isla"<<endl;
  else
  {if(br==1)
  cout<<"e edinstvenoto perfektno 4islo"<<endl;
  else
  cout<<"sa perfektnite 4isla"<<endl;
  }
  system("pause"); 
  return 0; 
}
:) .

P.S.: Осетих се, че делителя може да е корен квадратен, а аз бях писал по-малко от него...

Редактирано от Shuurfak rai Shedler (преглед на промените)

  • Отговори 941
  • Прегледи 235,9k
  • Създадено
  • Последен отговор

MR_DUDE е прав - нито един делител на дадено число не може да е по-голям от корен квадратен на числото... nemabatenick просто не се е осетил за това.

По тази причина можеш да замениш

for(int i=1;i<n;i++)
с
for(int i=1;i<sqrt(n);i++)
, но тогава трябва да пишеш горе и
#include<math.h>
освен
#include<iostream.h>

Само да кажа, че ако сметнеш sqrt(n) извън цикъла задачката ще се ускори доста.

В грешка сте за това че няма по голям делител от квадратният корен на числото. Една проста проверка. sqrt(16)=4; 16%8=0; По скоро няма по-голям делител от n/2 :clap:

Скоро правих подобно нещо на Паскал. Накрая разбрах, че единственото съвършено число е 6...

Скоро правих подобно нещо на Паскал. Накрая разбрах, че единственото съвършено число е 6...

Не е само 6 аз стигнах до:

28

496

8128

Но явно трябва да се направи по бърз алгоритъм за да се намерят още перфектни числа.

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

Здравейте, мъча се с една задачка, в която трябва да се използва рекурсия :)

Ето го условието:

Да се напише програма за генериране на всички възможни 6-цифрени телефонни номера, в които всяка цифра участва точно по веднъж и общата сума на цифрите не надвишава 20 (използвайте рекурсия).

Ето докъде съм я докарал:

#include <iostream.h>
//nai-malkoto e 102345
//nai-golqmoto e 953210

void rekursiq(long int i);													
																			 
int main() {
rekursiq(102345);
return 0;
}

void rekursiq(long int i) {
  int ostatak[6],flag, a, b, suma;
  long int j;

  suma=0; j=i; ostatak[0]=j%10; j/=10;

   for(a=1;a<5;a++) { ostatak[a]=j%10; j/=10; }
	 
   ostatak[5]=j;
	
   flag=0;

   for(a=0;a<5;a++) {
		for(b=a+1;b<6;b++)
			if(ostatak[a]==ostatak[b]) { flag=1; break; } 
		if(flag==1) break; }

	for(a=0;a<6;a++) suma+=ostatak[a];
	  
	if(flag==0 && suma<=20) cout<<" "<<i<<" ";

 if(i<=953210) rekursiq(i+1);
 }

Преди това я подкарах с цикъл за променливата i - for(i=102345;i<=953210;i++) в main(), но изискването е да се ползва рекурсивна функция.

В този вид програмата пак бачка, но спира много рано - някъде към 109000, а комбинациите са до 953210.

Редактирано от myd (преглед на промените)

void rekursiq(int i, int s);

int nomer[6];
                                                                            
int main()
{
  // init
  int i;
  for(i=0;i<5;i++) { nomer = 0; }

  rekursiq(0, 0);
  return 0;
}

voif printNomer()
{
  int i;
  for(i=0;i<5;i++)
  {
    cout << nomer;
  }
  cout << "\r\n";
}

void rekursiq(int n, int s)
{
  if(n == 6)
  {
    printNomer();
    return;
  }
  
  int i, j, m = 0;
  
  if(n == 0) m = 1;
  
  for(i=m;i<10;i++)
  {
    if(s + i > 20) continue;
    for(j=0;j<n;j++)
    {
      if(nomer[j] == i) break;
    }
    if(j<n) continue;
    nomer[n] = i;
    reqursia(n+1, s+i);
  }

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

Здравейте!

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

Условието е следното:

Improve the appointment book program by letting the user save the appointment data to a file

and reload the data from a file. The saving part is straightforward: Make a virtual function

save. Save out the type, description, date, and time. The loading part is not so easy. You

must first determine the type of the appointment to be loaded, create an object of that type

with its default constructor, and then call a virtual load function to load the remainder.

Това е soure code -ът:

#include <iostream> 
#include <string> 
#include <vector> 
#include <fstream> 
#include "ccc_time.h" 

using namespace std; 

class Date 
{ 
public: 
   Date(); 
   Date(int y, int m, int d); 
   void print() const; 
   bool equals(Date other) const; 
private: 
   int day; 
   int month; 
   int year; 
}; 

Date::Date() 
{ 
   day = 1; 
   month = 1; 
   year = 1; 
} 

Date::Date(int y, int m, int d) 
{ 
   day = d; 
   month = m; 
   year = y; 
} 

void Date::print() const 
{ 
   cout << year << "/" << month << "/" << day; 
} 

bool Date::equals(Date other) const 
{ 
   return day == other.day && month == other.month 
      && year == other.year; 
} 

class Appointment 
{ 
public: 
   Appointment(); 
   Appointment(string desc, Time s, Time e); 
   void print() const; 
   void read(); 
   virtual bool occurs_on(int year, int month, int day) const; 
private: 
   string description; 
   Time start; 
   Time end; 
}; 

Appointment::Appointment() 
{ 
} 

Appointment::Appointment(string desc, Time s, Time e) 
{ 
   description = desc; 
   start = s; 
   end = e; 
} 

void Appointment::print() const 
{ 
   cout << " " << start.get_hours() << ":"; 
   if (start.get_minutes() < 10) cout << "0"; 
   cout << start.get_minutes() 
      << " - " << end.get_hours() << ":"; 
   if (end.get_minutes() < 10) cout << "0"; 
   cout << end.get_minutes() << " " << description << "\n"; 
} 

void Appointment::read() 
{ 
   int sh; 
   int sm; 
   int eh; 
   int em; 
   cout << "Enter start_hours start_minutes end_hours end_minutes description:\n"; 
   cin >> sh >> sm >> eh >> em; 
   getline(cin, description); 
   start = Time(sh, sm, 0); 
   end = Time(eh, em, 0); 
} 



bool Appointment::occurs_on(int year, int month, int day) const 
{ 
   return false; 
} 

class Onetime : public Appointment 
{ 
public: 
   Onetime(); 
   Onetime(string desc, Date d, Time s, Time e); 
   void read(); 
   virtual bool occurs_on(int year, int month, int day) const; 
private: 
   Date when; 
}; 

Onetime::Onetime() 
{ 
} 

Onetime::Onetime(string desc, Date d, Time s, Time e) 
:  Appointment(desc, s, e) 
{ 
   when = d; 
} 

void Onetime::read() 
{ 
   Appointment::read(); 
   cout << "Enter year month day: "; 
   int year; 
   int month; 
   int day; 
   cin >> year >> month >> day; 
   when = Date(year, month, day);    
} 



bool Onetime::occurs_on(int year, int month, int day) const 
{ 
   return when.equals(Date(year, month, day)); 
} 

class Daily : public Appointment 
{ 
public: 
   Daily(); 
   Daily(string desc, Time s, Time e); 
   virtual bool occurs_on(int year, int month, int day) const; 
}; 

Daily::Daily() 
{ 
} 

Daily::Daily(string desc, Time s, Time e) 
: Appointment(desc, s, e) 
{ 
} 



bool Daily::occurs_on(int year, int month, int day) const 
{ 
   return true; 
} 

class Monthly : public Appointment 
{ 
public: 
   Monthly(); 
   Monthly(string desc, int d, Time s, Time e); 
   void read(); 
   virtual bool occurs_on(int year, int month, int day) const; 
private: 
   int day; 
}; 

Monthly::Monthly() 
{ 
} 

Monthly::Monthly(string desc, int d, Time s, Time e) 
:  Appointment(desc, s, e) 
{ 
   day = d; 
} 

void Monthly::read() 
{ 
   Appointment::read(); 
   cout << "Enter day: "; 
   int d; 
   cin >> d; 
   day = d; 
} 

bool Monthly::occurs_on(int year, int month, int d) const 



{ 
   return day == d; 
} 

int main() 
{ 
   vector<Appointment*> schedule; 
   bool more = true; 

   while (more) 
   { 
      string input; 
      cout << "Daily  Monthly  Onetime  Check  Quit (d/m/o/c/q): "; 
      cin >> input; 
      if (input == "d") 
      { 
         Daily* a = new Daily(); 
         a->read(); 
         schedule.push_back(a); 
      } 
      else if (input == "m") 
      { 
         Monthly* a = new Monthly(); 
         a->read(); 
         schedule.push_back(a); 
      } 
      else if (input == "o") 
      { 
         Onetime* a = new Onetime(); 
         a->read(); 
         schedule.push_back(a); 
      } 
      else if (input == "c") 
      { 
         cout << "Enter year month day: "; 
         int year; 
         int month; 
         int day; 
         cin >> year >> month >> day; 
    
         cout << "You have these appointments: \n"; 
         for (int i = 0; i < schedule.size(); i++) 
            if (schedule->occurs_on(year, month, day)) 
               schedule->print(); 
      } 
      else if (input == "q") 
         more = false; 
   } 
   return 0; 
}
Въпросът ми е как да направя "virtual function save и virtual load function"(казаха ми, че трябва да направя допълнителен class за тях)? За самия save и load мисля, че като добавя това:

else if (input == "s") 
      { 
         string filename; 
         cout << "Please enter the output data file name: "; 
         cin >> filename; 
    
         ofstream outfile; 
         outfile.open(filename.c_str()); 
         if (outfile.fail()) 
          {  cout << "Error opening " << filename << "\n"; 
             return 1;            
          } 
         outfile.close(); 
              
      }
и едно подобно с ifstream, е достатъчно, но си нямам никаква идея как да стане тази функция, уча C++ за последна година(идва му края :angry: ), а съм страшно много назад и както казах в началото - ако може някой да ми помогне ще съм му много благодарен..

Редактирано от Krayel (преглед на промените)

Здравейте!Нямам кого да питам и се надявам вие да ми помогнете!

Имам една задачка за конвертиране на бройни системи! От 2 към 8 към 16 и всичките към 10тична!

Имам едни две функцийки които уж се справят,но нещо не мога да ги разбера изцяло как го правят Публикувано изображение

Нещо все ми бяга разбирам до цикъла и запецвам до там!

Ето какво не ми е ясно:

Код:

char *int2str(int a, char *str, int base) { 
	char *start; 

	if(a == 0) { 
		*str++ = '0'; 
		*str++ = '\'; 
	} 
	else { 
		if(a < 0) { 
			*str++ = '-'; 
			a = -a; 
		} 
		for(start = str; a != 0; a /= base) 
  
//ot tuk po4vam da ne razbiram!Tova zashto se pravi??! 
			
		  *str++ = "0123456789ABCDEF"[a % base]; 
		*str = '\'; 
		for(str--; start < str; start++, str--) { 
			char c = *start; 
			*start = *str; 
			*str = c; 
		} 
	} 
	return str; 
} 

int str2int(const char *str, int base) { 
	int retval, dig; 

//I tuk mi kuca neshto!!! 
	
 for(retval = 0; *str; str++) { 
		retval *= base; 
		dig = *str - '0'; 
		if(0 <= dig && dig <= 9 && dig < base) 
			retval += dig; 
		else { 
			dig = *str - 'A' + 10; 
			if(10 <= dig && dig <= 16 && dig < base) 
				retval += dig; 
			else 
				break; 
		} 
	} 
	return retval; 
}

Моля ви помогнете ми!

Да се опитам да помогна малко (само за първата фукниця, за сега)

char *int2str(int a, char *str, int base) { 
	char *start; 

	if(a == 0) { 
		*str++ = '0'; 
		*str++ = '\'; 
	} 
	else { 
		if(a < 0) { 
			*str++ = '-'; 
			a = -a; 
		} 
		
		for(start = str; a != 0; a /= base) 
		  *str++ = "0123456789ABCDEF"[a % base]; // Това връща символа на съответната позиция (а % base)
		// Например, ако системата ни е 16-тична, а към момента (а % base) е 12 това ще върне "C";
		// ако системата ни е 16-тична, а към момента (а % base) е 7 това ще върне "7";
		// ако системата ни е 8-ична, а към момента (а % base) е 7 това ще върне "7".
		// С този цикъл конвертирането се извършва, но от младшият разряд към старшия
		
		*str = '\'; Завършваме низа

		// С долния цикъл просто се обръща огледално получения низ
		for(str--; start < str; start++, str--) { 
			char c = *start; 
			*start = *str; 
			*str = c; 
		} 
	} 
	return str; 
} 

}

Да се опитам да помогна малко (само за първата фукниця, за сега)

char *int2str(int a, char *str, int base) { 
	char *start; 

	if(a == 0) { 
		*str++ = '0'; 
		*str++ = '\'; 
	} 
	else { 
		if(a < 0) { 
			*str++ = '-'; 
			a = -a; 
		} 
		
		for(start = str; a != 0; a /= base) 
		  *str++ = "0123456789ABCDEF"[a % base]; // Това връща символа на съответната позиция (а % base)
		// Например, ако системата ни е 16-тична, а към момента (а % base) е 12 това ще върне "C";
		// ако системата ни е 16-тична, а към момента (а % base) е 7 това ще върне "7";
		// ако системата ни е 8-ична, а към момента (а % base) е 7 това ще върне "7".
		// С този цикъл конвертирането се извършва, но от младшият разряд към старшия
		
		*str = '\'; Завършваме низа

		// С долния цикъл просто се обръща огледално получения низ
		for(str--; start < str; start++, str--) { 
			char c = *start; 
			*start = *str; 
			*str = c; 
		} 
	} 
	return str; 
} 

}
Мерси много :P сега ми е по-ясно въпреки ,че това с '123456789ABCDEF'[a%base] не го бях виждала!Можеш ли да ми дадеш като общо правило нещо за него?Това е низ[число] така ли?В смисъл можем да си изредим каквото искаме и като напишем някоя позиция на мястотона числото ни дава символът съответсващ на числто ли?Аз така си обяснявам нещата ама...не знам така ли е ?Какво е ... :)

p.s.Някой има ли идея за втората функцийка?!! Много БЛАГОДАРЯ предварително! ;)

Редактирано от mimisoffice (преглед на промените)

Мерси много :hush: сега ми е по-ясно въпреки ,че това с '123456789ABCDEF'[a%base] не го бях виждала!Можеш ли да ми дадеш като общо правило нещо за него?Това е низ[число] така ли?В смисъл можем да си изредим каквото искаме и като напишем някоя позиция на мястотона числото ни дава символът съответсващ на числто ли?Аз така си обяснявам нещата ама...не знам така ли е ?Какво е ... :ph34r:

p.s.Някой има ли идея за втората функцийка?!! Много БЛАГОДАРЯ предварително! :P

За втората функция всъщност може да се ползва и стандартна такава (strtol). Ето все пак някакви разяснения:

int str2int(const char *str, int base) {
	int retval, dig;

//I tuk mi kuca neshto!!!
/**
 * Просто се прилага формулата за позиционни бройни системи:
 * [url]"http://en.wikipedia.org/wiki/Numeral_system"[/url]
 *
 * Пример (за 10-тична; за останалите - просто вместо 10 се ползва съответната база)
 * "5129" (10):
 *  0   * 10 + 5 = 5
 *  5   * 10 + 1 = 51
 *  51  * 10 + 2 = 512
 *  512 * 10 + 9 = 5129
 *
 * "Усукванията" в кода са заради преобразуването на цифрата 
 * от символ '0' - 'F' в число 0 - 15. И проверката дали цифрата е валидна за съответната
 * база ( трябва да е в интервала [0, base -1 ].
 *
 */	
for(retval = 0; *str; str++) {
		retval *= base;
		dig = *str - '0'; // конвертира се символът до число: '0' - '9' -> 0 - 9 (за 16-тичната всъщност излиза извън 0-9)
		if(0 <= dig && dig <= 9 && dig < base) // за символи '0' - '9' няма нужда от допълнителни изчисления на цифрата; ако dig >=base пък е грешка
			retval += dig;
		else {
			dig = *str - 'A' + 10; // в нормалния случай се конвертира 'A' - 'F' -> 10 - 15
			if(10 <= dig && dig <= 15 && dig < base) // тук имаше бъг (16 -> 15). Проверява се дали наистина цифрата е валидна за съответната база.
				retval += dig;
			else
				break; // това значи грешка. По-добре да се върне някакъв error код или поне да се изведе съобщение за грешка.
		}
	}
	return retval;
}
}

В първата функция също видях малки грешки - трябва да се смени това '\' със '\' (на няколко места).

Относно израза: "123456789ABCDEF"[a%base] - това е индексиране на масив с число (стринговете се разглеждат като char масиви); дава един елемент от масива (т.е. един символ от низа).

Редактирано от divak (преглед на промените)

В този ред на мисли, някой може ли да каже как се ескейпват симвули от imput poле :)

Мерси много :sobbing: сега ми е по-ясно въпреки ,че това с '123456789ABCDEF'[a%base] не го бях виждала!Можеш ли да ми дадеш като общо правило нещо за него?

"0123456789ABCDEF" е просто безименен масив от 16 елемента, а [a % base] е неговия индекс. Това е равносилно на:

arDigits = "0123456789ABCDEF";
index = a % base;
*str++ = arDigits[index];

Само е записано по-опростено.

Успех!

// редакция

Сега видях, че @divak го е обяснил същото в края на post-а си

Редактирано от dmanov (преглед на промените)

Здравейте пак!Имам още един въпрос... някой да може да ми даде код за преврещане от арабско в римско число или нещо свързанос математически проблем или задача??? :ph34r:

Здравейте!Нямам кого да питам и се надявам вие да ми помогнете!

Ето какво не ми е ясно:

Код:

.................
Моля ви помогнете ми!

Така може :clap:

Здравейте пак!Имам още един въпрос... някой да може да ми даде код за преврЪщане от арабско в римско число или нещо свързано С математически проблем или задача??? :rolleyes:

Така - не!

Поне според мен.

Или опиши алгоритъм и поискай помощ да се кодира или поискай идея за алгоритъм и се опитай да го кодираш самостоятелно!

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

Ако някой може да я направи ще съм му мн благодарен а задачата е :Да се преброят главните букви във файл,чието име е зададено като аргумент и броят им да се изведе ...

Редактирано от stanley56 (преглед на промените)

Хехе -да ти я направи - брей колега от ТУ - да ти помогнем малко може, ама да се направи цялата - за това се плаща. Когато бях 1-ви курс за такова подобно се взимаше между 10 и 20 левчета. Ако свършиш нещо, може да ти помогна безплатно, иначе за 10-15 лева бих я написал цялата :angry:

Редактирано от azimov (преглед на промените)

Не е калин и за задачата и идея си нямам как трябва да стане сигурно мога да напиша само първите два реда и тази задача ми я дадоха на контролно..Поне ми даиде някакви насоки как да я направя

Ами ето насоки:

1) Отваряш файла в текстов режим (клас ifstream; #include <fstream>)

2) Четеш (get) и проверяваш всеки символ дали е главна буква или не (функция isupper; #include <cctype>). Ако е главна - увеличаваш някакъв брояч.

3) Затваряш файла (close) и извеждаш стойността на брояча (обект cout; #include <iostream>).

Ако някъде стане грешка при отварянето/четенето от файла извеждаш съобщение за грешка и връщаш примерно -1 за резултат от броенето.

Това е - проучи функциите и класовете, които съм посочил и би трябвало да се справиш.

Дадени са два масива от числа (A1, A2, …,An) и (B1, B2, …, Bn). Числата в първия масив са

сортирани по големина, а във втория отговарят на условието: B1=A0+A1, Bk=Ak1+ak, k=2, …, n. Да

се получи сортиран масив (C0, C1, …, C2n), състоящ се от елементите на масивите А и В.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.