Премини към съдържанието

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


Здравейте, ще напиша коментарите си по кода inline:

...
double mean_a(double a[], unsigned elems)
{
double mean = 0;
for (int i = 0; i < elems; mean += a[i++]); // Сравняваме unsigned int (elems) със нормален int (i). Тука компилатора се кара ...
if (elems)
mean /= elems; //Защо правим тази гимнастика тука ?! Проверката за elems е по-добре да е преди цикъла и директно да прекратява метода, ако е 0. 
return mean;
}
unsigned mean_c(double a[], double mean_a, unsigned elems)
{
unsigned count = 0;
for (int i = 0; i < elems; i++)  // Сравняваме unsigned int (count) със нормален int (i). Тука компилатора се кара ...
if (a < mean_a)
count++;
return count;
}
double *set_b(double a[], unsigned size_a, double mean_a, unsigned count)
{
double *b = new double [count];
unsigned j = 0;
for (int i = 0; i < size_a; i++)  // Сравняваме unsigned int (size_a) със нормален int (i). Тука компилатора се кара ...
if (a < mean_a)
b[j++] = a;
return b;
}
main() //Метода трябва да се додекларира, че връща int, както е записано в return клаузата.
{
double mean = mean_a(a, M);
cout << "Mean of a[" << M << "] is " << mean << endl;
unsigned count = mean_c(a, mean, M);
cout << "Count of elems < mean of a[" << M << "] is " << count << endl;
double *b = set_b(a, M, mean, count);
for (int i = 0; i < count; i++)  // Сравняваме unsigned int (count) със нормален int (i). Тука компилатора се кара ...
cout << "b[" << (i + 1) << "] = " << b << endl;

//Като добра препоръка е, въпреки, че излизаме от метода да ударим едно delete b ... просто да ни стане като навик :)
return 0;
}

Попреправих Вашия код, и добавих коментираните модификации:

#include <iostream>using namespace std;#define M 15double a[M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };double *b;double mean_a(double a[], unsigned elems){	if (!elems) 	{		return 0;	}	double sum = 0;	for (unsigned int i = 0; i < elems; sum += a[i++]);	return sum/elems;}unsigned mean_c(double a[], double mean, unsigned elems){	unsigned count = 0;	for (unsigned int i = 0; i < elems; i++)	{		if (a[i] < mean)		{			count++;		}	}	return count;}double *set_b(double a[], unsigned size_a, double mean, unsigned count){	double *b = new double [count];	unsigned j = 0;	for (unsigned int i = 0; i < size_a; i++)	{		if (a[i] < mean)		{			b[j++] = a[i];		}	}	return b;}int main(){	double meanValue = mean_a(a, M);	cout << "Mean of a[" << M << "] is " << meanValue << endl;	unsigned count = mean_c(a, meanValue, M);	cout << "Count of elems < mean of a[" << M << "] is " << count << endl;	double *b = set_b(a, M, meanValue, count);	for (unsigned int i = 0; i < count; i++)	{		cout << "b[" << (i + 1) << "] = " << b[i] << endl;	}	delete b;	return 0;}

Не съм добавял логика за динамично попълване на стартовия масив  (а), но това мисля, че не е голям проблем да се направи и от Вас. 

 

Поздрави !

 

P.S. Можете за по-добра четимост на кода да ползвате таговете [сode][/сode] на форума :).

  • Харесва ми 1

Сподели този отговор


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

Здравейте, ще напиша коментарите си по кода inline:

Попреправих Вашия код, и добавих коментираните модификации:

#include <iostream>using namespace std;#define M 15double a[M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };double *b;double mean_a(double a[], unsigned elems){	if (!elems) 	{		return 0;	}	double sum = 0;	for (unsigned int i = 0; i < elems; sum += a[i++]);	return sum/elems;}unsigned mean_c(double a[], double mean, unsigned elems){	unsigned count = 0;	for (unsigned int i = 0; i < elems; i++)	{		if (a[i] < mean)		{			count++;		}	}	return count;}double *set_b(double a[], unsigned size_a, double mean, unsigned count){	double *b = new double [count];	unsigned j = 0;	for (unsigned int i = 0; i < size_a; i++)	{		if (a[i] < mean)		{			b[j++] = a[i];		}	}	return b;}int main(){	double meanValue = mean_a(a, M);	cout << "Mean of a[" << M << "] is " << meanValue << endl;	unsigned count = mean_c(a, meanValue, M);	cout << "Count of elems < mean of a[" << M << "] is " << count << endl;	double *b = set_b(a, M, meanValue, count);	for (unsigned int i = 0; i < count; i++)	{		cout << "b[" << (i + 1) << "] = " << b[i] << endl;	}	delete b;	return 0;}

Не съм добавял логика за динамично попълване на стартовия масив  (а), но това мисля, че не е голям проблем да се направи и от Вас. 

 

Поздрави !

 

P.S. Можете за по-добра четимост на кода да ползвате таговете [сode][/сode] на форума :).

Благодаря ти безкрайно много.Незнам какво щеше да правя.Понеже съм 1 курс и несъм много наясно с нещата.Много се радвам че ми помогна.Още веднъж много ти благодаря, и дано един ден да стана като теб, за да мога да помагам и аз,защото е много трудно да се нуждаеш от помощ, а да няма кои да ти помогне. Благодаря!

  • Харесва ми 1

Сподели този отговор


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

Благодаря ти безкрайно много.Незнам какво щеше да правя.Понеже съм 1 курс и несъм много наясно с нещата.Много се радвам че ми помогна.Още веднъж много ти благодаря, и дано един ден да стана като теб, за да мога да помагам и аз,защото е много трудно да се нуждаеш от помощ, а да няма кои да ти помогне. Благодаря!

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

Сподели този отговор


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

Да се състави програма,която съдържа следните функции:
-Съставяне на два динамично представени стека с целочислени данни, съдържащи се във външен файл.
-Сортиране на елементите в стековете по метода чрез прост избор/селекция.
-Запис на изходните резултати във външен файл.
Главна функция main()-с меню за избор на функции и проверка за състоянието на данните

Някви насоки и разяснение? Не трябва да използвам масиви

Сподели този отговор


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

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

-Съставяне на два динамично представени стека с целочислени данни, съдържащи се във външен файл.

-Сортиране на елементите в стековете по метода чрез прост избор/селекция.

-Запис на изходните резултати във външен файл.

Главна функция main()-с меню за избор на функции и проверка за състоянието на данните

Някви насоки и разяснение? Не трябва да използвам масиви

Е, ако има структура от данни по-неподходяща за сортиране от стек... Значи не мога да разбера от условието, дали четеш два стека с данни от файла или е подсказка за решение т.е. един стек с данни и един за сортирането. Все тая.

Ей ти насоки:

а) кво е тва проста селекция? да не е пряка селекция (selection sort)

б) ако зависеше от мен и ако не е хитруване, "изпомпвам" стека в един списък, сортирам списъка и обратно в стека.

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

пример. ("върха" на стека е отляво)

итерация 1: Начален Стек: 5, 7, 2, 11, 4, 3 Работен Стек: Празен Максимална стойност: Неизвестна Брой елементи за вадене: Неизвестен

итерация 2: НачаленСтек: Празен Работен Стек: 5, 7, 2, 4, 3   Максимална стойност: 11 Брой елементи за вадене: 5

итерация 3(слагаме 11 "отдолу" в началния стек): НачаленСтек:  5, 7, 4, 3, 11   Работен Стек:  Празен Минимална стойност: 2 Брой елементи за вадене: 4

итерация 4(слагаме 2 "отдолу" в работния стек): НачаленСтек:  11   Работен Стек: 5, 4, 3, 2 Максимална стойност: 7 Брой елементи за вадене: 3

итерация 5(слагаме 7 "отдолу" в началния стек): НачаленСтек:  5, 4, 7, 11   Работен Стек: 2  Минимална стойност: 3 Брой елементи за вадене: 2

итерация 6(слагаме 3 "отдолу" в работния стек): НачаленСтек:  7, 11   Работен Стек:  4, 3, 2 Максимална стойност: 5, Брой елементи за вадене: 1

итерация 6(слагаме 5 "отдолу" в началния стек): НачаленСтек: 5,7, 11   Работен Стек:  4, 3, 2 Минимална стойност: 4, Брой елементи за вадене: 0

и сега (елементи за вадене 0) издърпваме работния в началния стек и е сортиран.

 

Добавка: Тук случайно видях че се е случило да са сортирани елементите още в итерация 4 - та може да се проверява дали не са сортирани елементите в нужния ред при преместването за избягване на излишни итерации.

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

Сподели този отговор


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

Е, ако има структура от данни по-неподходяща за сортиране от стек... 

Съгласен ... Стека е супер за един куп работи, но не и за сортиране ... Просто природата/хората не са го създали за това. 

P.S. Това, че някои алгоритми ползват стековата памет за да си подпомогнат сортирането (чрез рекурсия) е отделен въпрос :).

 

@flare Колега, сега се замислям дали не би било възможно да ползваме рекурсия, вместо работния стек ? Алгоритъма, който сте предложил е достатъчно разбираем и ще работи както се очаква, но ако задачата наистина е написана в този си текст - с умисъла за стекове, може би самата тя загатва евентуално за идеята се ползва рекурсия ? Малко стрелям в тъмното тук ...

 

@gig93 Колега, в задачата изисква ли се имплементацията на самия стек или приемаме, че просто имаме някаква конкретна такава, за който знаем, че имплементира методите за стек - pop, push и т.н. или трябва да се помисли и за собствена такава ?

 

Поздрави !

  • Харесва ми 1

Сподели този отговор


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

P.S. Това, че някои алгоритми ползват стековата памет за да си подпомогнат сортирането (чрез рекурсия) е отделен въпрос :).

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

@flare Колега, сега се замислям дали не би било възможно да ползваме рекурсия, вместо работния стек ? Алгоритъма, който сте предложил е достатъчно разбираем и ще работи както се очаква, но ако задачата наистина е написана в този си текст - с умисъла за стекове, може би самата тя загатва евентуално за идеята се ползва рекурсия ? Малко стрелям в тъмното тук ...

Дали може - може. Дали ще е по-кратки и разбираемо - сигурно може да се напише така. Обаче има солидно ако: ако 1. не знаем колко са елементите и 2. не може да се направи с "tail recursion" или компилатора не може да оптимизира "tail recursion", няма как да гарантираш, че ще работи във всеки възможен случай. Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


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

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

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

 

Дали може - може. Дали ще е по-кратки и разбираемо - сигурно може да се напише така. Обаче има солидно ако: ако 1. не знаем колко са елементите и 2. не може да се направи с "tail recursion" или компилатора не може да оптимизира "tail recursion", няма как да гарантираш, че ще работи във всеки възможен случай.

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

  • Харесва ми 1

Сподели този отговор


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

Здравейте.Имам задача да  направя една програма,ето самото условие:

триъгълници се задават с размерите на 2 ъгъла и радиус на описаната окръжност.

Броят на триъгълниците М се въвежда от клавиатурата и трябва да отговаря на условието М<25.Въведете подходящи данни за М на брой съществуващи триъгълника.Данните за

триъгълниците да се съхранят в едномерни масиви.

пресметнете и съхранете в нови масиви трите страни и трите височини на всеки триъгълник

и ги отпечатайте в подходящ вид заедно с входните данни.

Намерете кой триъгълник има най-голям радиус на описаната окръжност.

Изведете всички негови данни и пресметнете средно аритметичната стойност на неговите страни.

 

това е!

ПОЧНАЛ СЪМ ДА ПИША И ЧЕТА  ОТ 3 ДЕНА ,затова моля не ме винете и все още почти нищо незнам...моля за някакви насоки и помощ по програмата ето какво съм направил досега...незнам дали е вярно написаното до момента:

 

 

#include <stdio.h>
int main ()
{
float M,a,b,r,i;
printf("Vavedi broi triagalnici");
scanf("%f",&M);
if (M>0&&M<25)

for (i=0;i<M;i++)
{
printf("alfa=");
scanf("%f",&a);
printf("beta=");
scanf("%f",&b);
printf("radius=");
scanf("%f",&r);
}

Сподели този отговор


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

 

 

@gig93 Колега, в задачата изисква ли се имплементацията на самия стек или приемаме, че просто имаме някаква конкретна такава, за който знаем, че имплементира методите за стек - pop, push и т.н. или трябва да се помисли и за собствена такава ?

 

 

   

Да трябва да се напраят всички функции на стека там, но не тряя да са в масив, а тряя стека да е динамичен и данните от него да са в файл и самия алгоритъм за сортиране също тряя да е целия написан не да се използват готови работи, то е целта на самата дисциплина са алгоритмите и структурите от данни, и ни казаха така като тестват как работи алгоритъма с различни числа(+,-,големи, малки и тнт) и дали е ефективен, тоест аз тряя да го модифицирам алгоритъма за сортиране чрез пряка селекция така, че да е може да работи добри с динамичен стек, казаха ни, че не тряя да използваме масиви и STL, може само вектори или други неща, аз знам структурата на стека и функциите и знам алгоритъма за пряка селекция, но кво ще рече тва динамичен стек,то нали там квото влезе тряя да стои така както си е и после да излезе същото от там, поне така мисля, не мога да навържа нещо нещата :D

Сподели този отговор


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

@gig93, динамичният стек няма предварително фиксиран размер, какъвто има статичният (когато е използван статичен масив с определен брой елементи като начин за реализиране на стека). Динамичен стек може да реализираш чрез свързан списък или динамичен масив - помисли какви плюсове и минуси има всеки от подходите. Възможен е и комбиниран подход чрез списък от блокове, например.

  • Харесва ми 1

Сподели този отговор


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

Да трябва да се напраят всички функции на стека там, но не тряя да са в масив, а тряя стека да е динамичен и данните от него да са в файл и самия алгоритъм за сортиране също тряя да е целия написан не да се използват готови работи, то е целта на самата дисциплина са алгоритмите и структурите от данни, и ни казаха така като тестват как работи алгоритъма с различни числа(+,-,големи, малки и тнт) и дали е ефективен, тоест аз тряя да го модифицирам алгоритъма за сортиране чрез пряка селекция така, че да е може да работи добри с динамичен стек, казаха ни, че не тряя да използваме масиви и STL, може само вектори или други неща, аз знам структурата на стека и функциите и знам алгоритъма за пряка селекция, но кво ще рече тва динамичен стек,то нали там квото влезе тряя да стои така както си е и после да излезе същото от там, поне така мисля, не мога да навържа нещо нещата :D

Както колегата @arcane спомена, най-вероятно ще трябва да боравите със свързан списък (от отговора Ви, си мисля, че дори динамичен масив не е опция - поправете ме, ако греша ). Това означава, че ще трябва да си дефинираме една структура/клас например Node, която да е градивния елемент за списъка. А стека директно ще представлява една инстанция на такъв списък, върху който ще дефинираме pop, push и т.н. методите. Модифицирането на алгоритъма за пряка селекция върху стека го беше дал колегата @flare в по-предните постове и мисля, че е достатъчно добър - все пак пряката селекция в основния случай си е O(n^2) време, а колегата е дал модификация, която се справя и за толкова в най-лошия случай. Тук може би е добра идея да спомена и друго - има значение каква наредба целим - низходяща или възходяща, за да можем да спестим допълнително O(n) време за едно ненужно обръщане на стека. Започнете, ако желаете с реализацията, а после в движение ще оправим изникналите проблеми и казуси :).

 

 

Здравейте.Имам задача да  направя една програма,ето самото условие:

триъгълници се задават с размерите на 2 ъгъла и радиус на описаната окръжност.

Броят на триъгълниците М се въвежда от клавиатурата и трябва да отговаря на условието М<25.Въведете подходящи данни за М на брой съществуващи триъгълника.Данните за

триъгълниците да се съхранят в едномерни масиви.

пресметнете и съхранете в нови масиви трите страни и трите височини на всеки триъгълник

и ги отпечатайте в подходящ вид заедно с входните данни.

Намерете кой триъгълник има най-голям радиус на описаната окръжност.

Изведете всички негови данни и пресметнете средно аритметичната стойност на неговите страни.

 

това е!

ПОЧНАЛ СЪМ ДА ПИША И ЧЕТА  ОТ 3 ДЕНА ,затова моля не ме винете и все още почти нищо незнам...моля за някакви насоки и помощ по програмата ето какво съм направил досега...незнам дали е вярно написаното до момента:

 

 

#include <stdio.h>

int main ()

{

float M,a,b,r,i; // Компилатора ще изгърми !

// Първо, дефинираме a, b, c преди да сме дефинирали и инициализирали i. Освен това, създаването масив по този начин е възможно, ако i е дефинирана като

//константа или ако директно се замества с число ... Моля, запознайте се как точно се борави с масиви. Това е базисно изискване в случая ! 

//Каква е логиката броя на триъгълници да е float ?! Как можем да имаме 3.14 триъгълника ?!

printf("Vavedi broi triagalnici");

scanf("%f",&M); 

if (M>0&&M<25)

for (i=0;i<M;i++) // Абсолютно безсмислено ! Променливата i ще смисъл само ако има някакво отношение спрямо M.

//В кода, i е зададена като брой елементи на масив - какво е отношението ѝ спрямо М ? И ползването на float променливи в конструкцията на циклите е много опасно ! Ето защо: ЦЪК

{

printf("alfa=");

scanf("%f",&a); //Тука сигурни ли сме, че сме в правилната памет за писане ? Мисля, че не сме ...

printf("beta=");

scanf("%f",&b);// Като горното

printf("radius=");

scanf("%f",&r);// Като горното

}

Привет,

 

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

 

Сега върху насоките:

За целите на насоките, приемаме, че имаме известни:

R - радиус на описана окръжност; alpha, beta - известните ъгли.

 

1) Използвайте формулата за радиус на описана около триъгълник окръжност:

R = a/sin(alpha) => a = R*sin(alpha)R = b/sin(beta) => b = R*sin(beta)R = c/sin(gamma) = c/sin(180-(alpha+beta)) = c/sin(alpha+beta) => c = R*sin(alpha+beta)

където a, b и c са търсените страни и gamma е третия ъгъл в триъгълника. Референция: тук

S = a*ha/2 = b*hb/2 = c*hc/2 = a*b*sin(gamma)/2

Където ha, hb и hc са височините към съответните страни. Референция: тук

2) Ползвайте динамични масиви. В случая ще Ви е необходима цяла матрица с M на брой редове и с по 7 колони - за трите страни, трите височини и радиуса на описаната окръжност. Трябва да решите в каква последователност ще пазите данните, защото това ще е важно за следващите условия по заданието - намиране на триъгълника с най-голяма описана окръжност.

 

3) Намирането на този триъгълник може да се извърши с един цикъл от 0 до M, като проверяваме и запазваме индекса на този триъгълник k, който има най-голям радиус на описаната окръжност и след сравняване с всички триъгълници, извеждаме данните за триъгълника с намерения от по-горния алгоритъм индекс. Изчисляването на средно аритметичната стойност на страните е тривиална задача, а оформянето е изцяло по Ваше усмотрение :).  

Ако имате затруднения, можете да погледнете тук

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

 

Поздрави и успях!

Редактирано от soundtracker (преглед на промените)
  • Харесва ми 2

Сподели този отговор


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

Както колегата @arcane спомена, най-вероятно ще трябва да боравите със свързан списък (от отговора Ви, си мисля, че дори динамичен масив не е опция - поправете ме, ако греша ). Това означава, че ще трябва да си дефинираме една структура/клас например Node, която да е градивния елемент за списъка. А стека директно ще представлява една инстанция на такъв списък, върху който ще дефинираме pop, push и т.н. методите. Модифицирането на алгоритъма за пряка селекция върху стека го беше дал колегата @flare в по-предните постове и мисля, че е достатъчно добър - все пак пряката селекция в основния случай си е O(n^2) време, а колегата е дал модификация, която се справя и за толкова в най-лошия случай. Тук може би е добра идея да спомена и друго - има значение каква наредба целим - низходяща или възходяща, за да можем да спестим допълнително O(n) време за едно ненужно обръщане на стека. Започнете, ако желаете с реализацията, а после в движение ще оправим изникналите проблеми и казуси :).

 

 

Привет,

 

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

 

Сега върху насоките:

За целите на насоките, приемаме, че имаме известни:

R - радиус на описана окръжност; alpha, beta - известните ъгли.

 

1) Използвайте формулата за радиус на описана около триъгълник окръжност:

R = a/sin(alpha) => a = R*sin(alpha)R = b/sin(beta) => b = R*sin(beta)R = c/sin(gamma) = c/sin(180-(alpha+beta)) = c/sin(alpha+beta) => c = R*sin(alpha+beta)

където a, b и c са търсените страни и gamma е третия ъгъл в триъгълника. Референция: тук

S = a*ha/2 = b*hb/2 = c*hc/2 = a*b*sin(gamma)/2

Където ha, hb и hc са височините към съответните страни. Референция: тук

2) Ползвайте динамични масиви. В случая ще Ви е необходима цяла матрица с M на брой редове и с по 7 колони - за трите страни, трите височини и радиуса на описаната окръжност. Трябва да решите в каква последователност ще пазите данните, защото това ще е важно за следващите условия по заданието - намиране на триъгълника с най-голяма описана окръжност.

 

3) Намирането на този триъгълник може да се извърши с един цикъл от 0 до M, като проверяваме и запазваме индекса на този триъгълник k, който има най-голям радиус на описаната окръжност и след сравняване с всички триъгълници, извеждаме данните за триъгълника с намерения от по-горния алгоритъм индекс. Изчисляването на средно аритметичната стойност на страните е тривиална задача, а оформянето е изцяло по Ваше усмотрение :).  

Ако имате затруднения, можете да погледнете тук

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

 

Поздрави и успях!

ето какво сътворих...давами някви гречки

#include <stdio.h>

#include <math.h>

int main ()

{

int M,r[25],i,max_radius,nomer;

float a[25],b[25],c[25];

double sa,p,s,ha[25],hb[25],hc[25];

double alpha[25],beta[25];

printf("Vavedi broi triagalnici=");

scanf("%d",&M);

while (M<0||M>25)

{

printf("greshka! broi na triagalnicite trbva da e po malak ot 25nM=");

scanf("%d",&M);

}

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

{

printf("vavedi alpha[%d]=",i+1);

scanf("%f",&alpha);

}

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

{

printf("vavedi beta[%d]=",i+1);

scanf("%f",&beta);

}

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

{

printf("vavedi radius[%d]=",i+1);

scanf("%d",&r);

}

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

{

a=2*r*sin(alpha);

b=2*r*sin(beta);

c=2*r*sin(180-(alpha+beta));

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));

ha=(s*2)/a;

hb=(s*2)/b;

hc=(s*2)/c;

}

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

{

printf("%.2f",a,b,c,r,ha,hb,hc,alpha,beta);

}

max_radius = r[0];

nomer = 0;

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

if(r> max_radius)

{

max_radius = r;

nomer = i;

}

printf(" MAX = %.2f n", max_radius);

printf(" Na nomer = %d n", nomer+1);

return 0;

}

 грешките:

*' : illegal, right operand has type 'int [25]'

sin' : cannot convert parameter 1 from 'double [25]

трябва да изведа и средно аритметично на триъгълника с най-голям радиус тва как тряя стане :D

Сподели този отговор


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

ето какво сътворих...давами някви гречки

#include <stdio.h>

#include <math.h>

int main ()

{

int M,r[25],i,max_radius,nomer;

float a[25],b[25],c[25];

double sa,p,s,ha[25],hb[25],hc[25];

double alpha[25],beta[25];

printf("Vavedi broi triagalnici=");

scanf("%d",&M);

while (M<0||M>25)

{

printf("greshka! broi na triagalnicite trbva da e po malak ot 25nM=");

scanf("%d",&M);

}

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

{

printf("vavedi alpha[%d]=",i+1);

scanf("%f",&alpha);       // Защо четете float променлива, при положение, че масива Ви е от double елементи ?!

                                             //Използвайте "%lf" за изчитане на double - в противен случай губите прецизност.

}

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

{

printf("vavedi beta[%d]=",i+1);

scanf("%f",&beta);   //Като горното

}

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

{

printf("vavedi radius[%d]=",i+1);

scanf("%d",&r);

}

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

{

//Функцията sin(double) работи в радиани. Използвайте формулата за преобразуване на радиани в градуси, ако искате да работите с градуси

//Съдейки по въвеждането и идеята, alpha, beta и gamma са ви в градуси.

a=2*r*sin(alpha);                          // Тук защо подавате масиви ? Трябва да е alpha и съответно r

b=2*r*sin(beta);                           // Отново като горното

c=2*r*sin(180-(alpha+beta));     // И пак ... 

p=(a+b+c)/2;                          // Има ли смисъл да ползвате полупериметър ?! Лицето на триъгълника на това ниво може да се изчисли и 

s=sqrt(p*(p-a)*(p-b)*(p-c));   // само с две страни и ъгъл между тях ... Радвам се, че знаете Хероновата формула, но в случая е безсмислено.

ha=(s*2)/a;

hb=(s*2)/b;

hc=(s*2)/c;

}

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

{

//Този цикъл нужен ли ни е ? Ако е само за debug-ване - добре, но иначе е абсолютно излишен

printf("%.2f",a,b,c,r,ha,hb,hc,alpha,beta);  

}

max_radius = r[0];

nomer = 0;

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

if(r> max_radius)

{

max_radius = r;

nomer = i;

}

printf(" MAX = %.2f n", max_radius);

printf(" Na nomer = %d n", nomer+1);

return 0;

}

 грешките:

*' : illegal, right operand has type 'int [25]'

//Това е заради използването на r, вместо r при изчисляване на страните

sin' : cannot convert parameter 1 from 'double [25]

//Това е заради използването на alpha (както и на beta) вместо alpha и beta отново на същото място

трябва да изведа и средно аритметично на триъгълника с най-голям радиус тва как тряя стане :D

Здравейте,

 

приложил съм коментарите си inline в кода Ви. Надявам се, че няма проблеми в това. Колкото до въпроса ви, ето както е записано в условието:

 

Намерете кой триъгълник има най-голям радиус на описаната окръжност.

Изведете всички негови данни и пресметнете средно аритметичната стойност на неговите страни.

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

 

Подозирам, че поради факта, че sin работи с радиани, сте получил "странни" лица за триъгълниците и затова сте подходил с Хероновата формула. В случая тази гимнастика е излишна от гледна точка на код, защото на текущото ниво, можете да ползвате формули с вече намерени данни за триъгълника (2 страни и ъгъла, заключен между тях).

 

Като съвет Ви препоръчвам да форматирате кода си, слагайте тук-таме шпации между променливи, блокове и описания на цикли - иначе кода става трудно четим. Освен това, можете да ползвате таговете [сode][/сode], който са на разположение във форума, за да запазите форматирането на кода си. Приложете промените и споделете какво се е получило...

 

Поздрави !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
Здравейте.
Имам проблем с решаването на тази задача и ще съм много благодарен, ако ми помогнете.
Задачата е да се напише програмен код по тази блокова схема. Може на С или на С++.
Q(X)=100-(x-5)^2 е функцията, а  х е 2<=х<=8.
А и В са границите на функцията, съответно 2 и 8.
Навсякъде, където е написано малко б, всъщност е голямо В, просто правописна грешка. А Xt е ХЕ, правописна грешка.
deltamin=0,7; delta0 e 1,5 и се получава от b-a/4 демек 8-2/4. Така се намалява тази делта в задачата. И идеята е, че когато стане много по-малко от deltamin(0,7), просто се замества с 0,7 и се обявява резултат. Накрая трябва да се направи проверка.
 
Ако някой може да ми помогне, ще бъда много благодарен.
 

Сподели този отговор


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

 

Здравейте.
Имам проблем с решаването на тази задача и ще съм много благодарен, ако ми помогнете.
Задачата е да се напише програмен код по тази блокова схема. Може на С или на С++.
Q(X)=100-(x-5)^2 е функцията, а  х е 2<=х<=8.
А и В са границите на функцията, съответно 2 и 8.
Навсякъде, където е написано малко б, всъщност е голямо В, просто правописна грешка. А Xt е ХЕ, правописна грешка.
deltamin=0,7; delta0 e 1,5 и се получава от b-a/4 демек 8-2/4. Така се намалява тази делта в задачата. И идеята е, че когато стане много по-малко от deltamin(0,7), просто се замества с 0,7 и се обявява резултат. Накрая трябва да се направи проверка.
 
Ако някой може да ми помогне, ще бъда много благодарен.

 

Здравейте, 

 

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

Ако нямате такъв, то можете поне началото да разпишете - за да можем да продължим заедно със задачата. 

Целта в случая не е ние да показваме интелект или знания, като разпишем пълното решение на проблема, а Вие да разберете и схванете алгоритъма и логиката зад кода. Според приложената блок-схема, мисля, че можете да започнете с някакъв Ваш вариант и ние ще помогнем оттам насетне :).

 

Поздрави !

  • Харесва ми 1

Сподели този отговор


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

Здравейте!
Много ще съм ви благодарен ако някой ми помогне за домашното по С++, което трябва да предам до утре най-късно до 08:30 и много много съм го закъсал. Много ми е трудно да го направя сам и съм сигурен, че няма да успея. Ако има мераклии и не ви занимавам с глупости, моля да ми помогнете. 

Ето какво трябва да направя.

Осите на правоъгълна координатна система в равнината я разделят на 4 квадранта, номерирани от 1 до 4. Координатното начало принадлежи на всички квадранти, другите точки от осите – на по два, всички останали точки - на единствен квадрант. Нека координатите да са само целочислени.
1. Съставете програма на С++, която подканя потребителя да въведе стойности за две цели променливи – координати на точка и след това съобщава на кои квадранти принадлежи точката.
2. Съставете същата програма, като ползвате тройния оператор и оператора switch. 
3. Съставете вариант на същата програма, който да обработва предварително зададен брой точки.
4. Съставете вариант на същата програма, който да обработва предварително зададен брой точки и съобщава координатите на точката, намираща се най-близо до координатното начало

Благодаря предварително! 

Tова е което съм направил.... (грешно 100%)

#include <iostream>

#include <cmath>
Using namespace std;
Double a,b,c;
Int main ()
{
Cout<<"molq vavedete pyrwi koardinat.";
Cin>>a;
Cout<<"molq vavedete vtori kordinat";
Cin>>b;
If (a>0 && b>0){
Cout<<" tochkata prinadleji na 1 kvadrant"; }
Else { if (a>0 && b<0){
Cout<<"tochkata prinadleji na 4 kvadrant";}
Else { if (a<0 && b>0){
Cout<<" tockata prinadleji na 2 kvadrant"; }
Else { if (a<0 && b<0){
Cout<<"tochkata prinadleji na 3 kvadrant";}
else { 
Cout<<"greshka";}
}
Редактирано от Александър Сергиев (преглед на промените)

Сподели този отговор


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

Здравейте,

 

Ако позволите, бих искал да копирам кода Ви за златните си архиви - От всичко написано имате точно пет думи, които сте уцелил - "else", "main", "include", "iostream" и "cmath". Защо всичко останало започва с главна буква :ohmy:  ?! Така написан, кода изглежда повече на преразказ, отколкото на нещо, което се очаква да работи. Съответно компилатора се трогна и логично извади в конзолата доволно лирическо отклонение от няколкостотин реда стак-трейс. Сега по същество:

 

1) Тотално забърсваме поемата по-горе - грешна е, не се компилира, а и са пропуснати няколко гранични случая ( a=0, b=0, a & b = 0). 

2) Ще въведем малко по-"говорещи" променливи - х, у и т.н., за да можем да знаем в даден момент с какво всъщност работим.

3) Условието

не е изпълнено от Вас - трябва да работим с int променливи - ще махнем това Double (По ирония, Double е валиден тип за обекти в Java - бел. авт.) и слагаме int.

 

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

/**Осите на правоъгълна координатна система в равнината я разделят на 4 квадранта, номерирани от 1 до 4. Координатното начало принадлежи на всички квадранти, другите точки от осите – на по два, всички останали точки - на единствен квадрант. Нека координатите да са само целочислени.1. Съставете програма на С++, която подканя потребителя да въведе стойности за две цели променливи – координати на точка и след това съобщава на кои квадранти принадлежи точката.2. Съставете същата програма, като ползвате тройния оператор и оператора switch. 3. Съставете вариант на същата програма, който да обработва предварително зададен брой точки.4. Съставете вариант на същата програма, който да обработва предварително зададен брой точки и съобщава координатите на точката, намираща се най-близо до координатното начало*/#include <iostream>#include <cmath>using namespace std;#define MAX 3void calculateQuadrant(int,int);int x,y;int main (){	cout<<"Enter X coordinate:n";	cin>>x;	cout<<"Enter Y coordinate:n";	cin>>y;	cout << "Task 1 : Using the ugly if/else approach:nn";	if (x == 0 || y == 0) {		if (x == 0 && y == 0) {			cout << "Entered point lies in all quadrantsn";		} else if (x == 0) {			if (y < 0) {				cout << "Entered point lies in 3rd and 4th quadrantsn";			} else {				cout << "Entered point lies in 1st and 2nd quadrantsn";			}		} else if (y == 0) {			if (x < 0) {				cout << "Entered point lies in 2nd and 3rd quadrantsn";			} else {				cout << "Entered point lies in 1st and 4th quadrantsn";			}		}	} else if (x>0 && y>0){		cout<<"Entered point lies in 1st quadrantn"; 	} else if (x>0 && y<0){		cout<<"Entered point lies in 4th quadrantn";	} else if (x<0 && y>0){		cout<<"Entered point lies in 2nd quadrantn"; 	} else if (x<0 && y<0){		cout<<"Entered point lies in 3rd quadrantn";	} else { 		cout<<"Errorn";	}	cout << "nTask 2 : Using the ternary ?: operator and switch:n";	int mult = x*y >= 0 ? (x*y == 0 ? 0 : 1) : -1;	int sum = x + y >= 0 ? (x + y == 0 ? 0 : 1) : -1;	switch(mult) {		case 0:			switch (sum) {				case 0 : cout << "Entered point lies in all quadrantsn";break;				case -1: cout << ((x < 0) ? "Entered point lies in 2nd and 3rd quadrantsn" : "Entered point lies in 3rd and 4th quadrantsn");break;				case 1: cout << ((x > 0) ? "Entered point lies in 1st and 4th quadrantsn" : "Entered point lies in 1st and 2nd quadrantsn"); break;			}			break;		case -1: 			cout << ((x < y) ? "Entered point lies in 2nd quadrantn":"Entered point lies in 4th quadrantn");break;			break;		case 1: 			switch(sum) {				case -1: cout << "Entered point lies in 3rd quadrantn";break;				case 1: cout << "Entered point lies in 1st quadrantn"; break;			}			break;		default: cout << "Errorn"; break;	}	cout << "nTask 3 : Using user entered points in array - size is defined by the MAX constantnn";        //This array will hold the points, entered by user - first column will hold the X coordinates, and the second column will hold the Y coordinates.	int points[2][MAX];	for (int i = 0; i < MAX; i++) {		cout<<"Enter X coordinate for point " << i+1 << ":n";		cin>>points[0][i];		cout<<"Enter Y coordinate for point " << i+1 << ":n";		cin>>points[1][i];	}	for (int i = 0; i < MAX; i++) {		cout << "Point (" << points[0][i] << "," << points[1][i] << ") lies in ";		calculateQuadrant(points[0][i], points[1][i]);	}	cout << "nTask 4 : Find the closest point to the center of the coordinate systemnn";	int closestPointIdx = 0;	double closestDistance = sqrt((points[0][0]*points[0][0])*1.0 + (points[1][0]*points[1][0])*1.0);	double currentDist = 0;	for (int i = 0; i < MAX; i++) {		currentDist = sqrt((points[0][i]*points[0][i])*1.0 + (points[1][i]*points[1][i])*1.0);		if (currentDist < closestDistance) {			closestDistance = currentDist;			closestPointIdx = i;		}	}	cout << "Closest point to the center of the coordinate system is: (" << points[0][closestPointIdx] << "," << points[1][closestPointIdx] << ") with distance: " << closestDistance << endl;}//Method is used for Task 3void calculateQuadrant(int x, int y) {	int mult = x*y >= 0 ? (x*y == 0 ? 0 : 1) : -1;	int sum = x + y >= 0 ? (x + y == 0 ? 0 : 1) : -1;	switch(mult){		case 0:			switch (sum) {				case 0 : cout << "all quadrantsn";break;				case -1: cout << ((x < 0) ? "2nd and 3rd quadrantsn" : "3rd and 4th quadrantsn");break;				case 1: cout << ((x > 0) ? "1st and 4th quadrantsn" : "1st and 2nd quadrantsn"); break;			}			break;		case -1: 			cout << ((x < y) ? "2nd quadrantn":"4th quadrantn");break;			break;		case 1: 			switch(sum) {				case -1: cout << "3rd quadrantn";break;				case 1: cout << "1st quadrantn"; break;			}			break;		default: cout << "Errorn"; break;	}}

Поздрави !

Просто не знам как да ти благодаря :X Домашното мина (супеееееер). Още в 07:30 съм станал да видя дали някой е отговорил и като видях отговора веднага го пратих на професора :))))))))))))))))) Благодаря ти МНОГО !!! :))))

Сподели този отговор


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

Просто не знам как да ти благодаря :X Домашното мина (супеееееер). Още в 07:30 съм станал да видя дали някой е отговорил и като видях отговора веднага го пратих на професора :))))))))))))))))) Благодаря ти МНОГО !!! :))))

Т.е. да смятам, че директно сте copy/paste-нали отговора ми в мейла към професора си ? А поне отделихте ли време да разберете как работи, защо така работи ? Ако не, то много жалко, наистина - целта ми беше да помогна със знания, за да можете да се справите и разберете материята. Както и да е - ако така или иначе няма да се занимавате с програмиране занапред е все едно всъщност ...

 

Поздрави !

  • Харесва ми 2

Сподели този отговор


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

Интересно ако професора му и той хвърля едно око тука каква ли оценка ще му пише за така "написана" програма?

Сподели този отговор


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

Здравейте, 

 

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

Ако нямате такъв, то можете поне началото да разпишете - за да можем да продължим заедно със задачата. 

Целта в случая не е ние да показваме интелект или знания, като разпишем пълното решение на проблема, а Вие да разберете и схванете алгоритъма и логиката зад кода. Според приложената блок-схема, мисля, че можете да започнете с някакъв Ваш вариант и ние ще помогнем оттам насетне :).

 

Поздрави !

 

Здравейте!

 

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

 

Поздрави!

Сподели този отговор


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

Т.е. да смятам, че директно сте copy/paste-нали отговора ми в мейла към професора си ? А поне отделихте ли време да разберете как работи, защо така работи ? Ако не, то много жалко, наистина - целта ми беше да помогна със знания, за да можете да се справите и разберете материята. Както и да е - ако така или иначе няма да се занимавате с програмиране занапред е все едно всъщност ...

 

Поздрави !

След като го пратих на професора, веднага седнах да разбера какво сте направили и до голяма степен го разбрах и си допълних знанията. Благодаря!

Сподели този отговор


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

Интересно ако професора му и той хвърля едно око тука каква ли оценка ще му пише за така "написана" програма?

Това вече не е наш проблем, колега - ние помогнахме с решението. Как точно ще се ползва и към кого ще се праща/дава не ни интересува. Не търся авторски права върху публикувания си код, така, че ако съфорумниците решат, могат да го използват и в платени приложения или да си изкарват оценките. Имам само една молба към всички, на които помагаме: Моля Ви, оценете помощта ни, като поне седнете и разберете какво и защо сме написали. Вярно, че не ни коства дни/месеци, за да помогнем, но поне разбирайте това, което ползвате - иначе просто смисъл от въпроса Ви няма. Съхранете нещо от идеята в себе си. 

 

 

Здравейте!

 

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

 

Поздрави!

Окей, но поне започнете с някакъв код - дефиниции, скелет на main() метода, include клаузи, които смятате, че трябва да ползвате ... Т.е. както се казва - стартирайте Вие процеса и ние да продължим. За пример вижте @Елвис Бабуров как започва с въпроса си - колкото и грешен да е кода, който беше постнал, поне имаше начална позиция, откъдето да се тръгне. Не се плашете - във форума колегите са достатъчно начетени и възпитани - няма нито да Ви се присмеем, нито да Ви унижим. Всеки знае откъде е тръгнал и че всички в един момент сме били зелени.

 

P.S. Към @capnemo: Искрено се извинявам за offtopic-а, който си позволих да направя. Ще гледам останалите постове в темата да са според въпросите и мненията на запитващите върху конкретни казуси.

 

Поздрави !

  • Харесва ми 2

Сподели този отговор


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

Това вече не е наш проблем, колега - ние помогнахме с решението. Как точно ще се ползва и към кого ще се праща/дава не ни интересува. Не търся авторски права върху публикувания си код, така, че ако съфорумниците решат, могат да го използват и в платени приложения или да си изкарват оценките. Имам само една молба към всички, на които помагаме: Моля Ви, оценете помощта ни, като поне седнете и разберете какво и защо сме написали. Вярно, че не ни коства дни/месеци, за да помогнем, но поне разбирайте това, което ползвате - иначе просто смисъл от въпроса Ви няма. Съхранете нещо от идеята в себе си. 

 

 

Окей, но поне започнете с някакъв код - дефиниции, скелет на main() метода, include клаузи, които смятате, че трябва да ползвате ... Т.е. както се казва - стартирайте Вие процеса и ние да продължим. За пример вижте @Елвис Бабуров как започва с въпроса си - колкото и грешен да е кода, който беше постнал, поне имаше начална позиция, откъдето да се тръгне. Не се плашете - във форума колегите са достатъчно начетени и възпитани - няма нито да Ви се присмеем, нито да Ви унижим. Всеки знае откъде е тръгнал и че всички в един момент сме били зелени.

 

P.S. Към @capnemo: Искрено се извинявам за offtopic-а, който си позволих да направя. Ще гледам останалите постове в темата да са според въпросите и мненията на запитващите върху конкретни казуси.

 

Поздрави !

Поста е точно по темата. Както всички, които се опитваме да помогне (и аз да се вмъкна сред тях :) ) многократно сме споменавали мързела не се толерира. И очакваме питащия поне да се пробва да направи нещо, не да чака всичко наготово :)

  • Харесва ми 3

Сподели този отговор


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

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

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