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

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

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

     

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


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


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

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

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

/*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
  • Създадено
  • Последен отговор

Потребители с най-много отговори

Потребители с най-много отговори

Популярни публикации

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

Ами външния цикъл е while(1), кога според вас ще спре?

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

Ами аз ти предлагам това - преработен вариант на това което ти си пратил, вече без грешки и пооптимизиран малко (така и не можах да разбера защо в твоя вариант имаше цял масив и един цикъл в повече, ама си е живо разточителство :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
Линк към този отговор
Сподели в други сайтове

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

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

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

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

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

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

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

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

×
×
  • Добави ново...

Информация

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