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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

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

Featured Replies

inc(dec(p)) изобщо не е равно на --p++ Някой програмист на Паскал може да си мисли, че --p++ не прави нищо и не е функционален, това си е негов проблем. Операцията има смисъл, дори да е малък.

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

Всъщност, ако "--p++" се употреби в израз, например: "g=--p++;" тогава се получава интересно. Чудя се дали се изпълнява по-бързо, от "g=p-1;", защото като изключим "g=", "--p++" съдържа две операции, а "p-1" -- три; goto edit; edit: Всъщност това не е предимсто/недостатък на езика, а на компилатора. Какво ми пречи да си предефинирам няколко оператора които да извършват същото като "++", "--", "+=", ... По-съществена е културата на писане и да не забравяме четимостта на кода. Отстъпите са хубаво нещо и "smart tab" е такава хубава функция.

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

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

Условие:

За нуждите на декана на всеки университет се съхранява следната информация: факултетен номер, специалност, курс и среден успех. От клавиатурата се въвежда цяло число N и след това данните за N студента. Данните за студентите се разпределят при тяхното въвеждане в четири различни списъка - за I, II, III и IV куРз. ДСПК:

а) Конструира четирите списъка;

б) По даден факултетен номер и специалност, отпечатва в кой курс е студентът;

в) По даден факултетен номер, записва студентът в по-горен курс, като го изтрива в този който е (ако е IV курЗ, го изтрива от списъка, съответно);

г) Отпечатва броя на студентите във всеки курЗ;

д) създава нов списък, чиито елементи съдържат следната информация: име на специалност и брой студенти в нея (като данните се взимат от предходните четири списъка);

е) като се използва списъка от подточка д), по дадена специалност да се отпечата броя на студентите от нея.

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

След встъпителната част, малко разяснения до къде съм стигнал (искам само насока не готов изходен код). Използвам STL списък, като първо въвеждам данните за студентът в една временна структура. След като се уверя от кой курЗ е студентът, го вкарвам в съответния списък. С това подточка а) е изчерпана. След това пиша функция, която приема като аргумент списък от тип структурата студент. Съответно проверява за всеки един курз (списък) дали намира търсеният факултетен номер и специалност, и ако ги намери извежда на стандартният изход от кой курЗ е студентът. С това изглежда подточка б) да е изчерпана също. За в) подточка отново въвеждам търсеният факултетен номер. Съответно пиша функция, която приема като аргумент списък и търсеният факултетен номер.

Тук възниква големият проблем! Ако търсеният факултетен номер е намерен, временна структура от тип студент се инициализира с елементите от списъка. Така, обаче намерените елементи от структурата са сочени от итератор, съответно как да присвоя на променлива - указател. Не става. Може би подходът ми не е правилен. Забравих да кажа - пиша на лист хартия, така че само гадая за тази грешка. Както и да е присвоявам на структурата елементите намерени от итератора (някак си) и след това вмъквам в края на списъка за горен курЗ, данните за намереният студент. След това го изтривам от текущият курЗ (списък). Естествено следя с една булева променлива дали съм намерил търсеният факултетен номер.

С това изглежда подточка в) да е изчерпана, макар и не правилно написана, и тук очаквам вашата помощ.

Отпечатването на броя на студентите във всеки курЗ изглежда да е тривиална задача. Извиквам метод сайз (размер) за всеки курЗ (списък), и с това подточка г) приключва.

Подточка д) така и не можах да измисля. Ако някой има свежа идея да си каже. Аз я написах, така че уж се търси определена специалност, която се въвежда от клавиатурата. След това един брояч се инкрементира при всяко намерено съответствие на "търсената" специалност, в кой да е от курСовете (списъци). Съответно новият списък поддържа структура, в която се въвеждат "търсената" специалност и броя на студентите в нея. Подточка д) е история. В подточка е), просто търсим специалност в списъка, след което извеждаме броя на студентите в нея.

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

P.S. Днес датата е: 06.06.06.

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

След встъпителната част, малко разяснения до къде съм стигнал (искам само насока не готов изходен код). Използвам STL списък, като първо въвеждам данните за студентът в една временна структура. След като се уверя от кой курЗ е студентът, го вкарвам в съответния списък. С това подточка а) е изчерпана. След това пиша функция, която приема като аргумент списък от тип структурата студент. Съответно проверява за всеки един курз (списък) дали намира търсеният факултетен номер и специалност, и ако ги намери извежда на стандартният изход от кой курЗ е студентът. С това изглежда подточка б) да е изчерпана също. За в) подточка отново въвеждам търсеният факултетен номер. Съответно пиша функция, която приема като аргумент списък и търсеният факултетен номер.

Първо, не съм писал на С++, но искаш алгоритмична помощ, така, че ще се включа.

За точка в): Функцията има за вход факултетен номер, изход - указател към търсения факутетен номер или NULL, ако не е намерен. И понеже на виждам условие за сортиране, ако намериш записа, слагаш го като последен в съответния списък, като не забравиш да инициализираш той да сочи NULL, Но запазваш иказателя, от този търсен запис към следващия.

В същото време, когато търсиш записа пазиш и указателя към записа, чиито указател сочи към търсения запис, и след като поставиш търсения запис в новия списък, заместваш указателя в записа, който те е насочил към търсения към запис, към записа, който сочи търсения. Ако търсения запис е пирви в списък, просто го изтриваш и инициализираш указатела към началото на списъка към втория запис.

Или: Ако A,B,C,D са записи в списък, то А сочи B, Б сочи С, С dочи D. Ако В е търсения, запазваш указатела на В, който сочи С и указатела на А, който сочи В. Правиш А да сочи С, а в записа, където трябва да поставиш В в последниа запис, кото сочи NULL правиш да сочи В, а В да сочи NULL. Или другия вариант за поставянето е В да стане пъурви в списъка, като пак не забравиш да обновиш указаттеля за началото на списъка. А ако търсения е А, то при поставянето в другия действаш пак така, а на иказатела за началото на списъка от който махаш А присвояваш стоноста на указателя към В.

За точка Д: Създаваш съответната структура с две пшолета - текстово Специалност и целочислено - брой студенти още в началото. При въвеждането на данните за студентите проверяваш специалността, ако я има в тази структура - просто увеличаваш целочисленото поле с единица. ако я нямва, създаваш нов запис с тази специалност и целочислена стойноост 1. ( Ако специалностите са предварително зададени, можеш да създадеш цялата структура за т. Д като на целочислените стойности зададеш нула.

За т. Е: Вече е ясно, намираш съответния запис в стръктурата и отпечатваш суответнаат стойност

П.С. Извинявам се за печатните грешки.

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

Първо една забележка - аз бих си направил един клас (да речем FacultyInfo), който да съдържа като атрибути списъците от студенти и каквото друго е полезно; а различните подусловия бих реализирал като методи на този клас. Така си спестяваш писането на аргумент "списък (или списъци) от студенти" към всяка от функциите ти. (Това не значи, че въпросният чисто C вариант е грешен).

Сега по същество:

Относно (в) - не можах да схвана какъв точно е проблемът тук. Каква е тази временна структура от тип студент, която се инициализира с елементите от списъка (от кой списък и с какво съдържание...)? Без да съм задълбочавал да чета обяснението на Ned_Drag по този въпрос - не ми изглежда приложимо в твоя случай. Т.е. споменал си, че ползваш STL списък (предполагам <b>list</b>), където добавянето и изтриването от списък вече си е реализирано. Методът erase може да изтрие елемент по зададен итератор. Другият нужен метод е добавяне на елемент към списък, с който би трябвало да нямаш проблем щом си успял с точка (а). При това положение ти трябва (1) - да намериш списъка (курса) в който е студента и итератор към конкретния студент; (2) Да добавиш студента в по-горния курс; (3) да махнеш студента от по-долния курс. Т.е. нещо като следното:

list<Student> kursove[N]; // N = 4
	int n;
	list<Student>::iterator iter;

	// n - тук се връща номера на списъка (съответства на текущия курс -1) на намерения студент.
	//	 при ненамерен студент се връща -1.
	// iter - връща итератор към съответния студент с номер facNum
	findMyStudent( facNum, &tekushtKurs, &iter );

	if ( n >= 0 && n < N - 1 )
	{
		kursove[n+1].add( *iter );
	}

	kursove[n].erase( iter );

Относно (д) - доколкото виждам, иска се да се да се направи списък от всички специалности, а не от една специално търсена. Тук може би ще е удобно да използваш STL структурата map. По принцип може да поддържаш информацията за специалностите при всяка промяна в данните (добавяне; премахване; преместване на студент. По същество Ned_Drag ти е предложил точно това); а може и да я генерираш изцяло при пискване (в крайна сметка няма особена разлика в реализацията). Идеята ми е следната:

map<string, int> specialtiesStats;
	foreach ( Student s: allStudents ) // не е точно такъв синтаксисът в C++, но идеята е да се цикли по всички студенти
	{
		++specialtiesStats[s.specialnost];
	}

По нататък не е проблем да се изведе резултатът за (е) - итерира се по въпросния map-резултат и се извеждат iter->first + ": " iter->next...

Това е засега

Първо една забележка - аз бих си направил един клас (да речем FacultyInfo), който да съдържа като атрибути списъците от студенти и каквото друго е полезно; а различните подусловия бих реализирал като методи на този клас. Така си спестяваш писането на аргумент "списък (или списъци) от студенти" към всяка от функциите ти. (Това не значи, че въпросният чисто C вариант е грешен).

Сега по същество:

Относно (в) - не можах да схвана какъв точно е проблемът тук. Каква е тази временна структура от тип студент, която се инициализира с елементите от списъка (от кой списък и с какво съдържание...)? Без да съм задълбочавал да чета обяснението на Ned_Drag по този въпрос - не ми изглежда приложимо в твоя случай. Т.е. споменал си, че ползваш STL списък (предполагам <b>list</b>), където добавянето и изтриването от списък вече си е реализирано. Методът erase може да изтрие елемент по зададен итератор. Другият нужен метод е добавяне на елемент към списък, с който би трябвало да нямаш проблем щом си успял с точка (а). При това положение ти трябва (1) - да намериш списъка (курса) в който е студента и итератор към конкретния студент; (2) Да добавиш студента в по-горния курс; (3) да махнеш студента от по-долния курс. Т.е. нещо като следното:

list<Student> kursove[N]; // N = 4
	int n;
	list<Student>::iterator iter;

	// n - тук се връща номера на списъка (съответства на текущия курс -1) на намерения студент.
	//	 при ненамерен студент се връща -1.
	// iter - връща итератор към съответния студент с номер facNum
	findMyStudent( facNum, &tekushtKurs, &iter );

	if ( n >= 0 && n < N - 1 )
	{
		kursove[n+1].add( *iter );
	}

	kursove[n].erase( iter );

Относно (д) - доколкото виждам, иска се да се да се направи списък от всички специалности, а не от една специално търсена. Тук може би ще е удобно да използваш STL структурата map. По принцип може да поддържаш информацията за специалностите при всяка промяна в данните (добавяне; премахване; преместване на студент. По същество Ned_Drag ти е предложил точно това); а може и да я генерираш изцяло при пискване (в крайна сметка няма особена разлика в реализацията). Идеята ми е следната:

map<string, int> specialtiesStats;
	foreach ( Student s: allStudents ) // не е точно такъв синтаксисът в C++, но идеята е да се цикли по всички студенти
	{
		++specialtiesStats[s.specialnost];
	}

По нататък не е проблем да се изведе резултатът за (е) - итерира се по въпросния map-резултат и се извеждат iter->first + ": " iter->next...

Това е засега

Идеята е почти същата. Но понеже аз пиша на PASCAL и Delphi, там сам си се грижиш за създаването и целоста на такива структури от данни посредством указатели.

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

Мерси много за подсказването. Ned_Drag, от твоите разяснения почти нищо не разбрах, но това е разбираемо при положение че не съм писал реализация на списък.

divak, естествено идеята за класа е добра, просто пиша контролното на лист хартия и става голяма каша като започна да дописвам и поправям .. това е друга тема. Идеята да декларирам масив от списъци за всички специалности я реализирах, не се бях сетил (:

"Временната структура от тип студент" ми е нужна тъй като мога да вкарам елемент в списък посредством метода push_back(елемент) или push_front(елемент), или insert(позиция, елемент). Поне на мен тези са ми известни, метод add(iterator) няма, но идеята ти е същата. Ако някой все пак се интересува от развръзката, ето примерен код на програмата.

P.S. anfy2002us, не го приемай лично. А и никой в този форум не ми е виновен за нещо, просто имах лош ден, предшестван от по-лош ден и тн .. ;)

MR_DUDE,

Разгледах набързо програмката от линка, който си дал. Ето някои препоръки:

* Класът Dean - по добре го прекръсти на Student, защото Dean (в превод английски - декан) не отговаря на съдържанието на класа и създава объркване.

* Относно (в) - става и така, както си го направил, с временната структура при добавянето в горния курс. Но моята идея беше, че може да ползваш оператора * пред получения итератор, това ще ти върне стойността на елемента зад итератора (виждам, че си ползвал * при метода Print - идеята тук е същата). Само трябва да внимаваш добавянето в горния курс преди изтриването му от долния, защото след изтриването, въпросният итератор вече е невалиден:

++( p->course );
	course[i+1].push_back ( *p );
	course[i].erase ( p );

* Не е зле да се добави проверка, т.ч. да не е възможно да има двама студента с еднакъв факултетен номер.

* Не е подходящо да декларираш като член-променлива list<specInfo>::iterator sp. Понеже се ползва само "временно" при различните обработки, по-добре да си я декларираш отделно и възможно най-близо до мястото на използването. Остави като public само методите, които се ползват "външно" - т.е. от други ("чужди") класове и функции.

* Не е хубаво да се ползват многократно в кода литерални константи като 4 и т.н. (и 1,2,3 при switch-а при Insert). По-добре ползвай предварително декларирани константи или променливи. В случая ми се струва подходящо да заместиш масива [4] с vector и където е нужно методът .size() ще ти върне размера. vector си има оператор за индексиране [], т.ч. няма да ти се налага да променяш много неща. Т.е. нещо като следното:

#include <vector>
...

class Students
{
public:
	static const int NUM_COURSES = 4;
private:
	vector<list<Dean> > course;
...
	Student() : course( NUM_COURSES ) {}
...
	void Insert (Dean & X)
	{
		if ( X.course >= 1 && X.course <= course.size() )
		{
			course[X.course - 1].push_back( X );
		}
	}
...

* Не е хубаво член-променливите ти да са public - по-добре, където е възможно да ги направиш private или protected. Само, че след това, за да ги виждат операторите, които си дефинирал (<,>,<<) може би ще трябва да декларираш операторите като friend функции.

* Ако с метода ConstructSpecList се опитваш да реализираш (д) - струва ми се твърде сложен за това, което би трябвало да върши (и се съмнявам дали работи вярно). Ето вариант с използването на класа map. (Дори и без този клас нещата може да се реализират по-просто).

#include <map>
...
	void ConstructSpecList2()
	{
		map<string, int> specMap;
		for ( vector<list<Dean> >::iterator ci = course.begin(); ci != course.end(); ++ci )
		{
		for ( list<Dean>::iterator si = ci->begin(); si != ci->end(); ++si )
			{
				++specMap[si->spec];
			}
		}

		for( map<string, int>::iterator mi = specMap.begin(); mi != specMap.end(); ++mi )
		{
			// В specInfo трябва да се добави съответният конструктор(string, int), за да работи следното
			specList.push_back( specInfo( mi->first, mi->second ) );
		}
	}

Точка

divak, нанесох корекциите по звездичка * от 1 до 6 (без проверката за факултетните номера). Промените.. По звездичка 7 не мога да дам мнение, защото не съм разучил map все още.

Мерси много за съветите беше полезно наистина.

П.С. Забравих да кажа за функцията ConstructSpecList, че работи противно на всички очаквания :). За по-голям обем от данни би харчила много ресурси, но така се сетих да я напиша ..

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

OK - сега нещата изглеждат подобрени :), време е за следваща рецензия.

Някои коментари относно типовете:

1) Вместо bool isFind =0; - по-добре isFind = false;

2) Вместо float m=0.0 - m = 0.0f;

3) (тук малко се повтарям) list<Student>::iterator p; - декларирай си го локално във функциите, а не като member променлива. Също все още важи забележката за "твърдата" константа 4 в метода UpperCourse.

4) Може да ползваш typedef, за да съкратиш тия усложнени имена на типовете-итератори - виж в примера по-долу

5) Ето още една реализация (без map) на броенето на студентите в отделните специалности. Твоят вариант наистина май работи вярно, но е е малко по-сложен и по-труден за разбиране. Доколкото виждам, броиш специалностите една по една, т.е. не започваш със следващата, без да си приключил с предишната. Моята идея е всеки студент по веднъж да "пусне една бройка в своята специалност" (без да се повтаря):

class Uni
{
	struct specInfo; // forward declaration
	// за малко по-четим вид вместо "изчанчените" имена на итераторите
	typedef list<Student>::iterator StudentListIterator;
	typedef vector<list<Student> >::iterator CoursesListIterator;
	typedef list<specInfo>::iterator SpecListIterator;
...
	struct specInfo
	{
		string name;
		int count;
		specInfo( const string& aName = "", int aCount = 0 ): name( aName ), count( aCount ) {}
	};
...
	// "преброява" дадения студент като увеличава броя на съответната му специалност
	// (ако е първият намерен в нея - добавя съответната специалност в списъка)
	void countStudent( const Student& s )
	{
		for ( SpecListIterator i = specList.begin(); i != specList.end(); ++i )
		{
			if ( s.spec == i->name )
			{
				++( i->count );
				return;
			}
		}

		specList.push_back( specInfo( s.spec, 1 ) );
	}
...
	// попълва specList, "преброявайки" всеки студент
	void ConstructSpecList3 ()
	{
		specList.clear();
		for( CoursesListIterator ci = course.begin(); ci != course.end(); ++ci )
		{
			for ( list<Student>::iterator si = ci->begin(); si != ci->end(); ++si )
			{
				countStudent( *si );
			}
		}
	}
...
};

6) Още едно козметично предложение - струва ми се по-естествено името на списъка от курсове да е от множествено число: vector<list<Student> > course;, т.е. courses; или пък да е courseList...

7) Аргументите, които не ги променяш в даден метод може да ги декларираш като const. Mетодите, които не променят member променливите може да ги декларираш като const. Методите, които не зависят от конкретното състояние на обекта (а напр. само от аргументите си) - може да се декларират като static:

static void Print (const list<Student> & x);

Поздрави Публикувано изображение

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

Мерси много за подсказването. Ned_Drag, от твоите разяснения почти нищо не разбрах, но това е разбираемо при положение че не съм писал реализация на списък.

divak, естествено идеята за класа е добра, просто пиша контролното на лист хартия и става голяма каша като започна да дописвам и поправям .. това е друга тема. Идеята да декларирам масив от списъци за всички специалности я реализирах, не се бях сетил (:

"Временната структура от тип студент" ми е нужна тъй като мога да вкарам елемент в списък посредством метода push_back(елемент) или push_front(елемент), или insert(позиция, елемент). Поне на мен тези са ми известни, метод add(iterator) няма, но идеята ти е същата. Ако някой все пак се интересува от развръзката, ето примерен код на програмата.

P.S. anfy2002us, не го приемай лично. А и никой в този форум не ми е виновен за нещо, просто имах лош ден, предшестван от по-лош ден и тн .. :snowballfight:

OK! Няма проблем. Това е динамична структура от данни, интересното при нея, че е неограрничена по размер като едномерния масив, но иначе има прилика с него. Разликата между списък и масив е и в това, че масива има индекс, а в списъка всеки елемент на на списъка има един указател към следващичт елемент за едносвързан списък или два указатела един към следващ и един към предишен, за двусвързан списък.

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

Моля някой да ми помогне със следната задача:

Дадена е таблица от m реда и n стълба в клетките на която са записани дробни числа . Получете нова таблица чрез делене на числата с 
наи-голямото по абсолютна стоиност число от първоначалната таблица.

Моля някой да ми помогне със следната задача:

Дадена е таблица от m реда и n стълба в клетките на която са записани дробни числа . Получете нова таблица чрез делене на числата с 
наи-голямото по абсолютна стоиност число от първоначалната таблица.

Ето ти едно бегло примерче - комантарите от теб.

#include "stdafx.h"
#include "stdlib.h"
#include "math.h"

int main(int argc, char* argv[])
{
	const int n = 5;
	const int m = 11;

	double absMax = 0;

	double sourceTable[n][m];
	double targetTable[n][m];

	for (int i = 0; i < (n - 1); i++)
	{
		for (int j = 0; j < (m - 1); j++)
		{
			sourceTable[i][j] = ((((double)rand()) / (i - j)) * (i + j));

			if (absMax < fabs(sourceTable[i][j]))
			{
				absMax = fabs(sourceTable[i][j]);
			}
		}
	}

	if (absMax == 0)
	{
		return 1;
	}

	for (i = 0; i < (n - 1); i++)
	{
		for (int j = 0; j < (m - 1); j++)
		{
			targetTable[i][j] = (sourceTable[i][j] / absMax);
		}
	}

	return 0;
}

Успех!

хора направете ми тая задача ако можете плс. Направете програма за събиране на две квадратни матрици.Да се отпечати резултатната матрица.-двумерен масив. ако някой може направете я

#include<iostream.h>

int i,j;

int main()
{
	int a[10][10],b[10][10],c[10][10],n;
	cin>>n;

	for(i=0;i<=n-1;i++)
		for(j=0;j<=n-1;j++)
			  cin>>a[i][j]; // въвеждаме матрица 1;
	
	for(i=0;i<=n-1;i++)
		 for(j=0;j<=n-1;j++)
			  cin>>b[i][j]; // въвеждаме матрица 2;

	for(i=0;i<=n-1;i++)
		 for(j=0;j<=n-1;j++)
			  c[i][j]=a[i][j]+b[i][j]; // конструираме матрица 3 = матрица 1 + матрица 2;

	for(i=0;i<=n-1;i++)
		 for(j=0;j<=n-1;j++)
			  cout << c[i][j]; // извеждаме новата матрица;

	return 0;
}
Uroci.net

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

  • Администратор

to4i Решението има два недостатъка 1) Не отговаря на стандартите 2) С фиксиран размер на матриците е Поздрави

poisk 1) Кои стандарти? 2) Кой е казал, че трябва да са с не фиксиран размер Като имаш забележки напиши кода, както ти мислиш че трябва да е...

  • Администратор

1) ISO C++ 2) никой, но поне го направи с define че да можеш да го смениш само на 1 място, а не 6, + това какво ще се получи ако въведа за n число по-голямо от 10? Съжалявам, но нямам време да пиша училищни задачи За стандарта подсказвам - cin и cout са дефиниран в namespace std За n - сам си прецени как най-добре да имплементираш проверката :) P.S. Това го пиша не като забележка към теб лично, а към всеки, който чете кода и се учи да пише подобни неща. Имайте предвид че ако в университета ползвате по-стар компилатор, както е популярно например Borland C++ 3.x, то той си няма понятие от std и от тази гледна точка cout и cin са написани чудесно. Но пък Visual C++ 2005 ще откаже да компилира кода :whist:

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

Здравейте, имам проблем със следната задача: Write a program that reads a positive number n and prints out a list of all perfect numbers (are equal to the sum of all of their factors), less than n. Your program must contain at least two functions: the main function for input and output and the second function for solving the problem. прочетох в уикипедиа всичко по въпроса, но съм нов в с++, липсва ми опит и просто не мога да сглобя какъвто и да е алгоритъм. Няма нужда да крия, че ми е за домашно...проблема е, че малко ни се обяснява, а се изисква много и то за кратко време...в един момент човек блокира и е до там.... Благодаря предварително!

Мога да ти я реша, но е по-добре сам да се помъчиш, задачата е много лесна и мога да ти кажа само как да го направиш: първо "m=n" след което отваряш цикъл "for (m=1;m<=n;m++)" в този цикъл проверяваш дали числото е перфектно и ако е го присвояваш на място "брояч" в някакъв масив и после увеличаваш брояча. и готово. А и в началото присвояваш на брояча стойност 1.

perfect numbers е съвършенно число

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

P.S.: ddimkin, справи ли се чрез указанията на nikolay6_pl ( :) )?

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

съвършени числа, всъщност - демек такива, които са получени от умноженито на сборовете на степените на 2-ката, които са прости числа с последното събирателно от степените biggrin.gif . Ама в задачата пише друго - тези, които са равни на сбора от всичките си делители...

Благодаря за бързите отговори :) точно това искат от нас...тези числа, които са равни на сбора от всичките си делители...в дата.бг също съм получил отговори, дори и цялото решение :) но сега се чудя, дали това е каквото ми трябва...на пръв поглед задачката не е трудна, а като прочетох решението тук , си казах супер, сега ще я прочета и ще я схвана...като видях какво ми е писал Shuurfak rai Shedler обаче се зачудих дали това е същото, което ме питат мене в задачата и по-точно, това, което ми е написал nemabatenick в дата.бг. Не разбирам и следния синтаксис- s+=i; досега не съм го срещал. Нашите преподаватели често не знаят какво искат от нас, още едно момче има същата задача, и като мен е в недоумение...как така да напишем програма която да изкарва всички перфектни числа по-малки от n, като до момента гениите са открили само 44 такива, не са сигурни между тях има ли нечетни и т.н. факти които на повечето от вас сигурно са известни...да си помисли човек, че е сгрешено условието, задачата обаче е качена в нета и към нея има линкове към wikipedia и става въпрос точно за тези 44те, които забимават умовете на математиците откакто има математика...а ние да въвеждаме n и хоп...алгоритъмчето да ни изкарва всички перфектни числа < n...меко казано странно, особено за човек като мен, който от три месеца се бори с програмирането, никога преди това не се е занимавал и просто му се ще да го разбере.... надявам се решението на nemabatenick да е вярно и просто аз да не разбирам проверката:

if(n%i==0)

s+=i; // това е, което не ми е ясно..

if(s==n)

return 1;

else

return 0

как това доказва, че дадено число е перфектно?

Още веднъж thanx на всички и особено на nemabatenick и Shuurfak rai Shedler

s+=i; е s=s+i; Значи тоя пич проверява дали всички точни делители на n - if(n%i==0) сумата им е идентична с n - if(s==n) и ако е го печата. Друг в въпроса, че има алгоритъм, който харчи много по-малко ресурси. Достатъчно е да провериш до i<sqrt(n) :)

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

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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