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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

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

Featured Replies

Курсовата задача е следната:

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

Поразгледах в интернет и открих програма, която е писана за същото задание като моето. Ето я и нея:

/*Daden e masiv ot zeli 4isla. Da se sastavi i izvede nov masiv, sadarja6t

indeksite na elementite, razli4ni ot nai-malkiq element v masiva, i tehnite

indeksi sa po-malko ot indeksta, na koito za pruv pat se sre6ta nai-malkiqt

element */

#include <iostream.h>

#include <conio.h>

void main()

{

int A[100], B[100], n, m=0, min=99999999999, ind=0;

cout<<"Vavedi ot kolko elementa se sastoi masivat: ";

cin>>n;

for (int i=0; i<n; i++)

{ cout<<"A["<<i<<"]=";

cin>>A;

}

for (int i=0; i<n; i++)

{ if (A<min)

{ min=A;

ind=i;

}

}

for (int i=0; i<n; i++)

{ if ( A!=min && i<ind )

B[m++]=i;

}

for (int i=0; i<m; i++)

cout<<B<<" ";

getch();

}

При пускането и обаче (Borland C++ 3.1, курсовата задача трябва да е правена на него) се оказа, че има 3 грешки и като цяло не е точно това, което правим в университета.

Ето една задачка правена в час:

#include<iostream.h>

const int Max=10;

int main()

{int m[Max];

cout<<"Vyvedete elementi na masiva:\n";

for (int i=0; i<Max; i++)

{cout<<"m["<<i<<"]=";

cin>>m;

}

int max_el=m[0];

for (i=1; i<Max; i++)

if(m>max_el)max_el=m;

cout<<"Maksimalen element="<<max_el;

return 0;

}

Моля хората, които разбират от програмиране да помогнат за евентуалното написаване на програмата или ако може горната с 3-те грешки да се оправи, но да има вид като тази в час (накрая да е с "return 0;", а не с "getch();", да е с по-простички функции (не с min=99999999999 и разни въвеждания на масиви).

БЛАГОДАРЯ НА ВСИЧКИ ОТГОВОРИЛИ!!!

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

Ами аз ти предлагам това - преработен вариант на това което ти си пратил, вече без грешки и пооптимизиран малко (така и не можах да разбера защо в твоя вариант имаше цял масив и един цикъл в повече, ама си е живо разточителство :yanim: ) мъничко по-четливо написан и с добавена проверка за грешен брой елементи. Функцията getch() е добавена за да може да се прочете резултата но ако не ти харесва просто я махаш - това няма да промени изпълнението на програмата.

/*Daden e masiv ot zeli 4isla. Da se sastavi i izvede nov masiv, sadarja6t

indeksite na elementite, razli4ni ot nai-malkiq element v masiva, i tehnite

indeksi sa po-malki ot indeksa, na koito za pruv pat se sre6ta nai-malkiqt

element */

#include <iostream.h>

#include <conio.h>

int main()

{

int A[100], n, min=0, ind=0;

do{

cout<<"Vavedi ot kolko elementa se sastoi masivat: ";

cin>>n;

if((n>100)||(n<1))

cout<<"Masivyt moje da ima mejdu 1 i 100 elementa\n";

}while ((n>100)||(n<1));

for (int i=0; i<n; i++)

{

cout<<"A["<<i<<"]=";

cin>>A;

}

min = A[0];

for (int i=0; i<n; i++)

{

if (A<min)

{

min=A;

ind=i;

}

}

for (int i=0; i<ind; i++)

{

cout<<i<<"\n";

}

getch();

return (0);

}

Ако все пак не ми вярваш много :) , ето ти оригиналния ти вариант с оправени грешки и би трябвало да се компилира навсякъде (при мен и двете вървят).

/*Daden e masiv ot zeli 4isla. Da se sastavi i izvede nov masiv, sadarja6t

indeksite na elementite, razli4ni ot nai-malkiq element v masiva, i tehnite

indeksi sa po-malko ot indeksta, na koito za pruv pat se sre6ta nai-malkiqt

element */

#include <iostream.h>

#include <conio.h>

int main()

{

int A[100], B[100], n, m=0, min=0, ind=0;

cout<<"Vavedi ot kolko elementa se sastoi masivat: ";

cin>>n;

for (int i=0; i<n; i++)

{ cout<<"A["<<i<<"]=";

cin>>A;

}

min = A[0];

for (int i=0; i<n; i++)

{ if (A<min)

{ min=A;

ind=i;

}

}

for (int i=0; i<n; i++)

{ if ( A!=min && i<ind )

B[m++]=i;

}

for (int i=0; i<m; i++)

cout<<B<<" ";

getch();

return (0);

}

Малка редакцийка че не бях допрочел това за getch-а :)

Ако нещо не ти хареса (напр. да съм разбрал погрешно условието) или имаш други питанки, само пиши ще направвя каквото мога :)

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

  • Автор

Ами аз ти предлагам това...

само пиши ще направвя каквото мога :P

flare мерси много за поста. Обаче възникна проблем при мен. Той е следния: като пусна програмата в Borland C++ 3.1 ми открива грешки, на твоята програма две грешки, а на преработемата - отново три. Пише ми това: "Multiple declaration for i". Ако можеш да прегледаш отново програмките за тези грешки и евентуално ако имаш Borland C++ 3.1, защото явно има разлика, ако си писал програмата на друга програма. Инъче много ми хареса творението ти, само дето не можах да го пусна да видя как работи. Но като за университета е идеално и ще успея да го обесня като хората (в смисъл, че разбирам написаното).

Ами то си пише какъв му е проблемът:

"Multiple declaration for i"

Проблемът е, че има няколко "for( int i...) " в една и съща функция. Което не е проблем според стандартния C++, но Borland 3.1 е правен преди доста време и има друго мнение за обхвата на видимостта на променливите от for... Може да оправиш грешката като за всеки for цикъл (което включва и кода в тялото) смениш името на променливата с някое ново.

Ето ти още един вариант (по същество е същото като предложението на flare):

#include <iostream>

using namespace std;

/**
 * Get the the first occurence index of the minimal element in the given array.
 * Return -1 if the array is empty (size <= 0).
 */
int get_min_elem_index( const int arr[], const int size )
{
		if ( size <= 0 )
		{
				return -1;
		}

		int min_pos = 0;
		for ( int i = 1; i < size; ++i )
		{
				if ( arr[i] < arr[min_pos] )
				{
						min_pos = i;
				}
		}

		return min_pos;
}

/**
 * Print the indexes < the first index of the min elem.
 */
int do_work( const int arr[], const int size )
{
		if ( size <= 0 )
		{
				return -1;
		}

		int min_pos = get_min_elem_index( arr, size );
		int * new_arr = new int[min_pos];
		for ( int i = 0; i < min_pos; ++i )
		{
				new_arr[i] = i;
				cout << new_arr[i] << endl;
		}

		delete [] new_arr;
}

int main( int argc, const char * argv[] )
{
		int demo[] = { 9, 3, 2, 2, 9, 6, 2 };

		do_work( demo, sizeof( demo ) / sizeof( int ) );

		return 0;
}
  • Автор

Ами то си пише какъв му е проблемът:

Проблемът е, че ...

...int main( int argc, const char * argv[] )

{

int demo[] = { 9, 3, 2, 2, 9, 6, 2 };

do_work( demo, sizeof( demo ) / sizeof( int ) );

return 0;

}

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

Като гледам ще е горната програма, предложена от flare, само дето неможах да я поправя както каза с други променливи. нешо все не става, пък доста букви сменях.

Ако можете само да ми кажете какво трябва да се смени, за да тръгне на Borland-а ще съм много благодарен.

Какви са грешките този път - пак ли същите? Ако нещо не ти е ясно по програмките може да питаш, щом ще трябва да обЕсняваш на даскалката :-) Какво точно правите в университета, щом програма с два цикъл не може да компилирате... Т.е. не сте ли имали някакви упражнения, на които да сте правили нещо подобно?

Вместо да преименуваш променливите може да направиш и следното:

1) Декларираш променливата i още в началото, където са другите:

int A[100], B[100], n, m=0, min=0, ind=0, i = 0;

2) Всички for цикли ги преправяш така:

for ( i=0; i<n; i++ )

3) Махни го това #include <conio.h> и функцията getch().

  • Автор

Какви са грешките този път - пак ли същите? Ако нещо не ти е ясно по програмките може да питаш, щом ще трябва да обЕсняваш на даскалката :-) Какво точно правите в университета, щом програма с два цикъл не може да компилирате... Т.е. не сте ли имали някакви упражнения, на които да сте правили нещо подобно?

Вместо да преименуваш променливите може да направиш и следното:

1) Декларираш променливата i още в началото, където са другите:

int A[100], B[100], n, m=0, min=0, ind=0, i = 0;

2) Всички for цикли ги преправяш така:

for ( i=0; i<n; i++ )

3) Махни го това #include <conio.h> и функцията getch().

Значи направих това, което каза и няма грешки, но като пусна програмата и примерно дам 5 елемента за масива, и като ги написа, след това нищо не става. Явно има някаква друга грешка. В университета сме правили подобни програми, но такава точно не (на упражненията правим предимно по-лесни задачи). А за обясненията щях да попитам по-късно след като тръгне програмата, но досега не става. Като цяло чаткам някои от работите, но напоследък нямам много време да се занимавам, пък и точно за моята задача нищо не ми идваше на ум, освен как да намеря най-големия елемент, пък от там-нататъка... нищо.

Как така нищо не става - увисва програмата, или прикючва без да извежда нищо? И кои числа точно си въвел (и в какъв ред), когато това се случва?

  • Автор

Как така нищо не става - увисва програмата, или прикючва без да извежда нищо? И кои числа точно си въвел (и в какъв ред), когато това се случва?

#include<iostream.h>

int main()

{

int A[100], B[100], n, m=0, min=0, ind=0,i=0;

cout<<"Vavedi ot kolko elementa se sastoi masivat: ";

cin>>n;

for (i=0; i<n; i++)

{ cout<<"A["<<i<<"]=";

cin>>A;

}

min = A[0];

for (i=0; i<n; i++)

{ if (A<min)

{ min=A;

ind=i;

}

}

for (i=0; i<n; i++)

{ if ( A!=min && i<ind )

B[m++]=i;

}

for (i=0; i<m; i++)

cout<<B<<" ";

return (0);

}

Това са промените. Като въведа числата за масива и нищо не ми извежда на екрана. Така става като нещо е объркано по-програмата. Явно има някаква грешка вътре, в някои от циклите. Примерно за масива давам 5 и след това вкарвам 2; 45; 5; 6; 56 и дотам...

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

1) Като гледам - спрял си се на най-сложния вариант... Бих ти препоръчал другия, с по-малкото цикли - този на flare или моето предложение (не знам защо ти се вижда сложно - на мен ми се струва точно обратното...).

Обяснението за варианта "с по-малкото цикли" е следното:

1. Намира се позицията на минималния елемент. Да кажем, че това е индексът k

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

2) Не виждам проблем с посочения от теб пример - програмата в случая си работи коректно. Пприпомни си условието на задачата - според теб какво трябва да изведе?

Има грешка, но тя е че програмата се дъни сериозно, ако въведеш за n число извън валидните граници (в случая не е зле да направиш проверката че е между 0 и 100).

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

  • Автор

Много се извинявам, но съм объркал програмките. Сега пробвах с програмката на flare и в крайна сметка тръгна, с промените, които каза divak. Ето и в крайна сметка програмата:

#include <iostream.h>
#include <conio.h> 
int main() 
{ 
int A[100], n, min=0, ind=0, i=0; 

do{
cout<<"Въведи от колко елемента ще се състои масивът: "; 
cin>>n; 
if((n>100)||(n<1))
cout<<"Масивът може да има между 1 и 100 елемента\n"; 
}while ((n>100)||(n<1));

for (i=0; i<n; i++) 
{ 
cout<<"A["<<i<<"]=";
cin>>A[i]; 
} 
min = A[0];
for (i=0; i<n; i++) 
{ 
if (A[i]<min) 
{ 
min=A[i]; 
ind=i; 
} 
} 

for (i=0; i<ind; i++) 
{ 
cout<<i<<"\n"; 
} 
return 0;
}

Ако може само да ми кажете малко разяснения за програмката, "int A[100], n, min=0, ind=0, i=0" - тези точно какво предназначение имат, както и за циклите - кой за какво е.

При въвеждане на 7 елементен масив с числа: 4; 2; 1; 3; 5; 8; 2 програмата извежда на екрана 0 и 1, което и е решението!!!

"int A[100], n, min=0, ind=0, i=0"

Декларират се променливи n, min, ind, i от тип int. А е масив от тип int с размер 100 елемента (т.е. заделят се в паметта 100 последователни int "парчета").

Сега като гледам името min по принцип не е много хубаво да се ползва, че може да има конфликт с разни съществуващи "стандартни" макроси (VC++ 6.0 и/или 5.0 май правеше проблеми с това). Т.ч. може да го смениш примерно на min_value или изобщо вместо тая променлива може да сложиш израза A[ind].

Частта "=0" означава инициализация на променливата с някаква стойност (в случая 0). Ако не се направи подобна инициализация не може да разчиташ на това каква стойност е присвоена на променливата. (Т.е. по-нататък в програмата се присвоява такава стойност). В случая е по-добре да инициализираш и променливата n, например n=-1, защото има начин по-надоло cin>>n да не направи нищо (напр, ако напишеш буква вместо число) и тогава n ще има случайна стойност... (напр. може да е 16000 и ще има бая да въвеждаш :-))

За циклите:

Първият: do-while - върти, докато потребителят не въведе числа в необходимите граници. В текущия вариант, ако се въведе нещо което не е валиден int - примерно буква, програмата ще изпадне в безкраен цикъл... Може да разшириш проверката вътре със следното:

do{
				cout<<"Въведи от колко елемента ще се състои масивът: ";
				cin >> n;
				if ( cin.bad() || cin.eof() )
				{
						cout << "Грешка при четене или край на файл!" << endl;
						return 1; // Прекратяваме изпълнението на програмата
				}

				if((n>100)||(n<1))
				{
						if ( cin.fail() ) // ако сме въвели "нечисло"
						{
								cout << "Невалидна стойност!" << endl;
								cin.clear(); // поправяме "счупения" cin
								cin.ignore( 10000, '\n' ); // прескачаме "лошата" стойност
						}
				}
		} while ((n>100)||(n<1));
Вместо това 10000 е по-добре да се ползва някоя от константите за максимална дължина на реда или максимален int, но не знам дали в Borland C++ 3.1 ги има декларирани.

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

С третия цикъл (for) се търси индексът на минималния елемент в масива. Обявява се първият елемент на масива за "текущ минимален" след това се рови по масива и ако се срещне по-малък от него - той е новият "минимален". По-добре го сложи да започва от 1 вместо от 0 (няма нужда първият елемент да го сравняваш със себе си).

Последният цикъл (for) печата елементите на резултата, който желаем. Виждам, че си махнал масива B, но за да спазиш условието на задачата се иска да направиш такъв нов масив. Което за текущия вид на програмата е излишно, защото за нищо не се ползва този нов масив, но това е друг въпрос... В някоя следваща версия може да ти потрябва :-).

Пфу, да бе, въобще не ми дойде на ума за това, че i-то се декларира на няколко места. А и моето C (ползвам Dev C++) не даваше грешки. А иначе обясненията на divak са като по учебник :) Дори по-добре Публикувано изображение

Още малко подробности...

Както споменах, проблемът с многото декларации на i-то не би трябвало да го има при по-новите реализации на C++ (вкл. и тези, които се базират на стандартите) - променливите са локални за самия цикъл и извън него не се виждат (нито може да се ползват). В по-стари версии, какъвто е конкретният случай - поведението е все едно, че променливата е декларирана преди цикъла (т.е. извън него), т.е. намира се едно ниво по-нагоре и съответно се вижда до края на съответния блок (в случая - до края на тялото на функцията).

Това #include <conio.h> е добре да се махне, защото не се ползва, пък не е стандартно и на някои компилатори няма да върви.

Друго остаряло нещо (вече не се препоръчва), което се вижда в тази програма е ползването на <iostream.h> вместо <iostream>. Но не съм сигурен дали Borland C++ 3.1 ще работи с <iostream> - може да пробваш дали ще се компилира (ще трябва да добавиш и using namespace std, както е в примера, който дадох).

Още нещо, което не е добър стил - използването на разни "магически числа" - в случая 100 (пък да си призная и моето 10000 :)). По-добре е тези числа да се дефинират като някакви параметри или за по-лесно като константи или като макроси (макросите също по възможност е добре да се избягват). Така ако решиш да сменяш максималния брой елементи по-трудно ще сбъркаш. Ето пример:

...
int main()
{
	 const int N = 100;
	 int A[N], ....
	 // и навсякъде вместо 100 - N
...
  • Автор

Благодаря много още веднъж divak. Благодаря и на теб flare. Мисля, че разясненията ще ми са достатъчни и ще успея да защитя курсовата си работа.

имам един въпрос, кой е университета ти пич?

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

не, просто, интересно ми е какъв е дявло да го вземе тоя, твоя, университет!? И кой курс сте също...!? А иначе аз следвам в МГУ-то...

  • Автор

При преглеждането на задачата възникна проблем: ако при въведените стойности на масива първото число е най-малко, програмата не изсписва нищо. Пример: ако въведа числата 2; 4; 5; 7; 9; програмата не извежда нищо на екрана, защото всъщност първия индекс е 0. Струва ми се, че ще трябва да се вмъкне още една функция, която да следи за това и да изкарва на екрана съобщение.

не, просто, интересно ми е какъв е дявло да го вземе тоя, твоя, университет!? И кой курс сте също...!?

А иначе аз следвам в МГУ-то...

Ами първи курс съм в Свободен Университет, няма да му споменавам името.

Ами къде е казано, че нещо трябва да се извежда?

В условието пише:

... съдържащ индексите на всички елементи, които са различни от най-малкия елемент на масива и техните индекси са по-малки от индекса, на който най-малкият елемент се среща за пръв път в масива."

Забележи, че пише по-малки, а не по-малки или равни. Т.е. за случая, който описваш, решението на задачата е празен масив с 0-брой елементи. Не е казано какво точно представлява "извеждане на масив на екрана" - ако искаш може при празен такъв да сложиш съобщение "масивът е празен" или нещо от сорта.
  • Автор

Ами къде е казано, че нещо трябва да се ...

... "извеждане на масив на екрана" - ако искаш може при празен такъв да сложиш съобщение "масивът е празен" или нещо от сорта.

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

Ако разбираш останалата част от програмата - поне такова нещо според мен би трябвало сам да можеш да се справиш. Намери някоя книжка (има и в Интернет) да попрочетеш поне малко... Ако преподавателката те накара да направиш нещо допълнитено как ще се справиш? Ето все пак примерче:

if ( ind == 0 )
{
		cout << "Масивът е празен" << endl;
}

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

  • Автор

Ако разбираш останалата част от програмата - поне такова нещо според мен би трябвало сам да можеш да се справиш. Намери някоя книжка (има и в Интернет) да попрочетеш поне малко... Ако преподавателката те накара да направиш нещо допълнитено как ще се справиш? Ето все пак примерче:

if ( ind == 0 )
{
		cout << "Масивът е празен" << endl;
}

Мерси много за допълнението!!!

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

За защитаването - ще гледам да се справя, имам доста книжки, свалени на компютъра за C++, но все не ми остава време да ги чета детайлно. Предполагам, че това ще стане през лятото.

Ами първи курс съм в Свободен Университет, няма да му споменавам името.

Похвално, поне са ви научили да използвате интернет.

offtopic: lol какъв фенски станал интерфейса на форума Браво!!

Похвално, поне са ви научили да използвате интернет.

offtopic: lol какъв фенски станал интерфейса на форума Браво!!

хаха, нау, ю ноу уот ай мийн! Публикувано изображение

:angry: тоя университет, май също трябва да бъде затворен

  • Автор
:clap: Няма какво да коментирам горните две мнения. Винаги се намират хора, които разбират от всичко, винаги са компетентни и винаги се изказват в най-правилният момент! :P

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

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

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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