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

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

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

deso91

Програма на C

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


Здравейте,

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

Ето я и задачата:

 

Измерванията на разстоянията от точка до точка в дадена схема се въвеждат от клавиатурата и се съхраняват в едномерен масив Т(М). Дължините на проводниците, с които разполагате, се въвеждат и записват в друг  едномерен масив P(M). Стойностите за броят M и N се въвеждат предварително и са M<N.

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

Да се пресметне какъв е броят на проводниците, които не могат да се използват.

Намерете колко и кои проводници са с дължина в границите, нужни за свързване в схемата- запишете техните стойности в нов масив PP, а в друг масив IND съхранете съответните им индекси от първоначалния масив P.

Отпечатайте всички получени резултати по подходящ начин.

 

Може ли някой да помогне?

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

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


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

Здравейте,

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

Ето я и задачата:

 

Измерванията на разстоянията от точка до точка в дадена схема се въвеждат от клавиатурата и се съхраняват в едномерен масив Т(М). Дължините на проводниците, с които разполагате, се въвеждат и записват в друг  едномерен масив P(M). Стойностите за броят M и N се въвеждат предварително и са M<N.

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

Да се пресметне какъв е броят на проводниците, които не могат да се използват.

Намерете колко и кои проводници са с дължина в границите, нужни за свързване в схемата- запишете техните стойности в нов масив PP, а в друг масив IND съхранете съответните им индекси от първоначалния масив P.

Отпечатайте всички получени резултати по подходящ начин.

 

Може ли някой да помогне?

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

Да, може, да помогнем след като се напрегнете и напишете нещо сам, ние ще коригираме и даваме идеи

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


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

Да, може, да помогнем след като се напрегнете и напишете нещо сам, ние ще коригираме и даваме идеи

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

Темата, за която говоря е тук. Не знам до колко можем да счетем запитванията като аналогични, но поне като идея и двете се реализират аналогично. В цитираната тема е поместен и "псевдокод", който както беше и коментирано, с малко поправки ще вземе и да тръгне даже :D. Ако вече след това колегата deso91 изпитва затруднения и проблеми, нека заповяда с конкретни въпроси по кода си. 

 

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

 

P.S. Дали е възможно двамата потребители deso91 и luxeon_ да имат някаква връзка извън форума? Просто ми е интересно за толкова кратко време да се пуснат 2 запитвания за твърде подобни неща  :rolleyes:.

 

Поздрави !

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


Линк към този отговор
Сподели в други сайтове
P.S. Дали е възможно двамата потребители deso91 и luxeon_ да имат някаква връзка извън форума? Просто ми е интересно за толкова кратко време да се пуснат 2 запитвания за твърде подобни неща  :rolleyes:Поздрави !

Може да учат при един и същ преподавател :)

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


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

Може да учат при един и същ преподавател :)

Иначе казано да са един и същ човек :)


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


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

Ето опита ми, който е грешен:

 

#include <stdio.h> void  main( ) {   int T[ 50 ],   P[ 50 ],   PP[ 50 ],   IND[ 50 ],   i,   l,   k,   M,   N,   br,   s;   do   {   printf( "Vavedi stoinost M=" );   scanf( "%d", &M );   } while( M <= 0 );   do   {   printf( "Vavedi stoinost N=" );   scanf( "%d", &N );   } while( N < M );   printf( " Vavedi %d razstoqniq za T:n", M );   for( i = 0; i < M; i++ )   {   printf( " T[%d] = ", i + 1 );   scanf( "%d", &T[ i ] );   while( T[ i ] <= 0 )   {   printf( "Ne moze da se vyvezdat otricatelni chislan" );   printf( " T[%d] = ", i + 1 );   scanf( "%d", &T[ i ] );   }   }   printf( " Vavedi %d provodnika za P:n", N );   for( i = 0; i < N; i++ )   {   printf( " P[%d] = ", i + 1 );   scanf( "%d", &P[ i ] );   while( P[ i ] <= 0 )   {   printf( "Ne move da se vyvezdat otricatelni chislan" );   printf( " P[%d] = ", i + 1 );   scanf( "%d", &P[ i ] );   }   }   k = 0;   l = 0;   for( i = k; i < M; i++ )   {   for( s = l; s < N; s++ )   {   if( T[ i ] <= P[ s ] )   {   PP[ k ]  = P[ s ];   IND[ k ] = s;   k   = k + 1;   l   = l + 1;   }   else   l = 0;   }   }   br = ( M + 1 ) - k;   printf( "Broia na provodnicite koito ne moze da se izpolzvat e = %dn", br );   printf( "Provodnicite koito mogat da se izpolzvat sa %d na broin", k );   printf( "Te sa s nomera i dylzina:nnnn" );   for( i = 0; i < k; i++ )   {   printf( "Provodnik No %d s dulzina = %dn", IND[ i ] + 1, PP[ i ] );   } }

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


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

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

Ето опита ми, който е грешен:#include     <stdio.h>void  main( ){    //В условието на задачата не видях дължините да са зададени като Integer променливи - не са ли по-скоро double или float ?!    int T[ 50 ], P[ 50 ],PP[ 50 ],IND[ 50 ],        i, l, k, M, N, br, s;    do    {        printf( "Vavedi stoinost M=" );        scanf( "%d", &M );    } while( M <= 0 );    do    {        printf( "Vavedi stoinost N=" );        scanf( "%d", &N );    } while( N < M );    printf( " Vavedi %d razstoqniq za T:n", M );    for( i = 0; i < M; i++ )    {        printf( " T[%d] = ", i + 1 );        scanf( "%d", &T[ i ] );        while( T[ i ] <= 0 )        {            printf( "Ne moze da se vyvezdat otricatelni chislan" );            printf( " T[%d] = ", i + 1 );            scanf( "%d", &T[ i ] );        }    }    printf( " Vavedi %d provodnika za P:n", N );    for( i = 0; i < N; i++ )    {        printf( " P[%d] = ", i + 1 );        scanf( "%d", &P[ i ] );        while( P[ i ] <= 0 )        {            printf( "Ne move da se vyvezdat otricatelni chislan" );            printf( " P[%d] = ", i + 1 );            scanf( "%d", &P[ i ] );        }    }    //Защо не намираме търсените стойности от това условие:    //Намерете дължините на най-късото и най-дългото разстояние в схемата.    //Преди да започнем да гледаме дали даден проводник може или не може да бъде     //използван за целите, трябва да дефинираме границите в които трябва да е стойността        //му, за да може да бъде използван - т.е. MIN(T(M)) <= P(I)//ПОПРАВЕНО 19.10.2013г.    k = 0;    l = 0;    for( i = k; i < M; i++ ) //На този външен цикъл, не му е мястото тук    //Той трябва да бъде отделен и да се погрижи да се намерят именно максималното и    //минималното разстояние в записите за T(M).    {        for( s = l; s < N; s++ )        {            //В зависимост от това дали ще трябва да опроводим схемата изцяло, дали просто ще гледаме дали даден проводник става за което            //и да е разстояние, и дали проводник би могъл/не би могък да се скъсява, то логиката тук ще е различна.            //Може би ще има сортиране на проводници и разстояния + няколко цикълчета за проверки. //ПОПРАВЕНО 19.10.2013            if( T[ i ] <= P[ s ] )            {                PP[ k ]  = P[ s ];                IND[ k ] = s;                k        = k + 1;                l        = l + 1;            }            else            {                l = 0;            }        }    }    //След като горните биват коригирани, това също трябва да се огледа и коригира.    br = ( M + 1 ) - k;    printf( "Broia na provodnicite koito ne moze da se izpolzvat e = %dn", br );    printf( "Provodnicite koito mogat da se izpolzvat sa %d na broin", k );    printf( "Te sa s nomera i dylzina:nnnn" );    for( i = 0; i < k; i++ )    {        printf( "Provodnik No %d s dulzina = %dn", IND[ i ] + 1, PP[ i ] );    }}

Поздрави !

 

P.S. Надявам се, сега разбирате защо колегите във форума Ви помолиха за код - защото проблемите, дори и за еднакви задачи може да коренно различни и на съвсем различни места. А е къде-къде по-добре и по-полезно за Вас да работим с Ваш код, който добре разбирате как сте написал, вместо някой друг да го разпише така, както той възприема нещата :)

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


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

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

+1

    //Защо не намираме търсените стойности от това условие:    //Намерете дължините на най-късото и най-дългото разстояние в схемата.    //Преди да започнем да гледаме дали даден проводник може или не може да бъде     //използван за целите, трябва да дефинираме границите в които трябва да е стойността        //му, за да може да бъде използван - т.е. MIN(T(M)) <= P(I) <= MAX(T(M))    k = 0;    l = 0;    for( i = k; i < M; i++ ) //На този външен цикъл, не му е мястото тук    //Той трябва да бъде отделен и да се погрижи да се намерят именно максималното и    //минималното разстояние в записите за T(M).

Хмм. Аз пак да вляза в ролята на мърморкото. :weather4:  Освен ако не разбирам правилно условието - не е много ясно. Ако ще трябва да работим с мин и макс, то има две важни подробности, които трябва да отбележим: първо, че трябва да търсим не абсолютни(т.е. за целия масив) ами (примерно ако почнем от проводниците) най-голямото разстояние, по-малко от текущо обработвания проводник. И второ, непременно по някакъв начин да отбележим че това разстояние вече сме го "покрили" т.е. намерили сме си проводник за него, да не сложим някой от следващите пак на него. Сложно. Аз бих сортирал масивите предварително. Това ще ми гарантира, че като тръгна да обхождам, няма да се наложи да се връщам назад и ще стане с 1 цикъл - след сортиранията.

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


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

Как да запиша и да намеря най-малкото и най-дългото разстояние в схемата и къде да го сложа. Не мога да се сетя как да го опиша. Ако можете да ми го обясните или ако може приме. Благодаря предварително!!

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


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

Хмм. Аз пак да вляза в ролята на мърморкото. :weather4:  Освен ако не разбирам правилно условието - не е много ясно. Ако ще трябва да работим с мин и макс, то има две важни подробности, които трябва да отбележим: първо, че трябва да търсим не абсолютни(т.е. за целия масив) ами (примерно ако почнем от проводниците) най-голямото разстояние, по-малко от текущо обработвания проводник. И второ, непременно по някакъв начин да отбележим че това разстояние вече сме го "покрили" т.е. намерили сме си проводник за него, да не сложим някой от следващите пак на него. Сложно. Аз бих сортирал масивите предварително. Това ще ми гарантира, че като тръгна да обхождам, няма да се наложи да се връщам назад и ще стане с 1 цикъл - след сортиранията.

Мммм добра забележка. Реално се оказва, че дори и Max не е нужен - ненужен проводник би бил само такъв, който ще е по-малък от най-малкото разстояние между точките. т.е. Min(T(x)).   Колкото до това:

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

може би трябва да се попитат и изяснят няколко въпроса: I) Имаме ли изискване да се намери множеството проводници, които биха/ще свързали/свържат схемата ? Защото тогава задачата става една идея по - сложна и подхода ми е тотално грешен. II) Считаме ли, че по-дълъг проводник може да бъде срязан, за да съвпадне точно с някакво разстояние ? - Ако да, то търсим всички P(i) >= Min(T(M)), тъй като такива проводници ще покрият поне едно разстояние между две точки. Проводниците P(i) < Min(T(M)) са неизползваеми и броя им е всъщност решението на първата подточка а именно:

Да се пресметне какъв е броят на проводниците, които не могат да се използват.

- Ако не, то трябва да търсим дали всеки даден проводник ще покрие поне една пътека точно, т.е. съществува ли такова P(i), за което имаме такова T(M), за което T(M) = P(i). Интересен е въпроса по отношение на повтарящи се разстояние/дължини на проводници. Това ще се реши относително лесно, защото ще имаме масива с индекси, когото ще попитаме дали този проводник вече не е ползван. А и използвайки сортировка, нещата бързо ще се наредят.    Ще коригирам по-горе коментарите си, базирайки се презумпцията, че искаме да намерим всички проводници, които биха свършили работа за свързване на връзките във схемата при това: 1) Няма да търсим колко от разстоянията биха били покрити 2) Няма да проверяваме дали покриваме всички пътища 3) Няма да проверяваме дали едно и също място не се покрива от няколко проводника.   Решенията и extend-ването на трите ограничения, които дадох по-горе се решават със сортирането на масивите и избора на даден проводник, >= от текущо разглежданото разстояние. Ако това се иска в условието, разбира се.   За най-малко и най-голямо разстояние можете да подходите така:

min, max = T(1); //Първия елемент от масива T(M)for every distance Dist in T(M)begin   if Dist < min   then min = Dist   if Dist > max   then max = Distend

Това в код ще рече нещо такова:

int min = T[0];int max = T[0];for (int i = 1; i < M; i++) {	if (T[i] < min)		min = T[i];	if (T[i] > max)		max = T[i];}

Този код можете да го сложите преди да започнете същинската логика на програмата Ви (т.е. преди за започнете да търсите за това кои проводници не могат да се използват) но и след като вече сте попълнили масива T(M). Може самата процедура да се направи и по време на попълване на масива T(M), което ще спести цял цикъл, но дори и да е отделно ще го преживеем.

 

Поздрави !

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


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

Колеги, така ли трябва да е:
#include <stdio.h>
void main ()
{
int T[50], max = T[50], min = T[50], P[50], PP[50], IND[50], i, l, k, M, N, br, s;

do
{ printf("Vavedi stoinost M=");
scanf("%d",&M);
}
while (M<=0);
do
{
printf("Vavedi stoinost N=");
scanf("%d",&N);
}
while (N<M);
printf(" Vavedi %d razstoqniq za T:n",M );
for(i=0; i<M; i++)
{ printf(" T[%d] = ",i+1);
scanf("%d",&T);
while (T<=0)
{
printf("Ne moze da se vyvezdat otricatelni chislan");
printf(" T[%d] = ",i+1);
scanf("%d",&T);
}
}

printf(" Vavedi %d provodnika za P:n",N );
for(i=0; i<N; i++)
{ printf(" P[%d] = ",i+1);
scanf("%d",&P);
while (P <=0)
{
printf("Ne move da se vyvezdat otricatelni chislan");
printf(" P[%d] = ",i+1);
scanf("%d",&P);
}
for (int i = 1; i < M; i++)
{
if (T < min)
min = T;
if (T > max)
max = T;
}
}
k=0; l=0;
for (i=k; i<M; i++)
{
for (s=l; s<N; s++)
{
if (T<=P)
{
PP[k]=P;
IND[k]=s;
k=k+1;
l=l+1;
}
else

l=0;
}
}




br=(M+1)-k;
printf("Broia na provodnicite koito ne moze da se izpolzvat e = %dn", br);
printf("Provodnicite koito mogat da se izpolzvat sa %d na broin",k);
printf("Te sa s nomera i dylzina:nnnn");
for (i=0; i<k; i++)
{

printf("Provodnik No %d s dulzina = %dn", IND+1, PP);
}
Трябвали да се добавя и друго или да се прави нещо.
Благодаря предварително!! :)


 

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


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

...

Както бях обещал на запитващия, поствам примерно решение на задачата с това, което знам засега. За да е поне малко интересен отговора, на кода ще му сложа един много специален лиценз, на който се натъкнах тия дни. Тъй като лицензите трябва да се цитират буквално, няма как да го променя  :rolleyes:.

START LICENSE

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

Version 2, December 2004

Copyright © 2004 Sam Hocevar <sam@hocevar.net>

Everyone is permitted to copy and distribute verbatim or modified

copies of this license document, and changing it is allowed as long

as the name is changed.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. You just DO WHAT THE FUCK YOU WANT TO.

END LICENSE

License: http://www.wtfpl.net/txt/copying/

Copyright © 2013 SOUNDTRACKER

#include <stdio.h>#define MAX_INT (((unsigned int)-1) >> 1)#define MAX_ARR 5//The method is only used, if we need to check if the scheme can be wired !void sortUsingDirectSelectionDesc(int* collection, int collectionSize) {	int tempVal;	for (int i = 0; i < collectionSize - 1; i++) {		for (int k = i + 1; k < collectionSize; k++) {			if (collection[i] < collection[k]) {				tempVal = collection[i];				collection[i] = collection[k];				collection[k] = tempVal;			}		}	}}//The method is only used, if we need to check if the scheme can be wired !bool isUsed (int value, int* setToCheck, int setSize) {	for (int i = 0; i < setSize; i++) {		if (value == setToCheck[i]) {			return true;		}		return false;	}}void solve() {	int T[ MAX_ARR ], P[ MAX_ARR ], PP[ MAX_ARR ], IND[ MAX_ARR ];	int M, N, countUnusable = 0, usableCondIdx = 0;	unsigned int minDist, maxDist;	do {		printf( "Enter distances count (M) = " );		scanf( "%d", &M );	} while( M <= 0 );	do {		printf( "Enter count of conductors (N) = " );		scanf( "%d", &N );	} while( N < M );	printf( " Enter %d distances for the set of distances (T) :n", M );	maxDist = 0;	minDist = MAX_INT;	for(int i = 0; i < M; i++ ) {		printf( " T[%d] = ", i + 1 );		scanf( "%d", &T[ i ] );		while( T[ i ] <= 0 ) {			printf( "Cannot enter negative distances! Please, enter again: n" );			printf( " T[%d] = ", i + 1 );			scanf( "%d", &T[ i ] );		}		if (maxDist < T[i]) {			maxDist = T[i];		}		if (minDist > T[i]) {			minDist = T[i];		}	}	printf( " Enter %d conductors for the set of conductors (P) :n", N );	for(int i = 0; i < N; i++ ) {		printf( " P[%d] = ", i + 1 );		scanf( "%d", &P[ i ] );		while( P[ i ] <= 0 ) {			printf( "Cannot enter negative distances! Please, enter again: n" );			printf( " P[%d] = ", i + 1 );			scanf( "%d", &P[ i ] );		}		if (P[i] < minDist) {			countUnusable++;		} else {			PP[usableCondIdx] = P[i];			IND[usableCondIdx++] = i;		}	}	printf( "Minimal distance is %d and maximum distance is %dn", minDist, maxDist);	printf( "Count of unusable conductors: %dn", countUnusable);	printf( "List of usable conductors:n");	for (int i = 0; i < usableCondIdx; i++) {		printf( "Conductor with index %d (possition %d ) and length = %dn", IND[i], IND[i] + 1, PP[i]);	}		//Start bonus algorithm:	//Check if the scheme can be fully wired	if (M > usableCondIdx) {		printf( "The count of usable conductors is less than the distances we have to cover !n");		printf( "The scheme cannot be fully wired !n");	} else {		sortUsingDirectSelectionDesc(PP, usableCondIdx);		sortUsingDirectSelectionDesc (T, M);		int used [MAX_ARR];		int usedSetCount = 0;		for (int i = 0; i < M; i++) {			int foundProperCondIdx = -1;			for (int k = 0; k < usableCondIdx; k++) {				if ((T[i] <= PP[k]) && (!isUsed(k, used, usedSetCount))) {					foundProperCondIdx = k;					break;				}			}			if (foundProperCondIdx >= 0) {				used[usedSetCount++] = foundProperCondIdx;				printf( "Covered distance %d with lenght %d by conductor with lenght %d !n",i+1, T[i],PP[foundProperCondIdx] );			}		}		if (usedSetCount == M) {			printf( "All distances are wired ! Hurray !n");		} else {			printf( "%d distance(s) were not wired !n", M - usedSetCount);		}	}	//End bonus algorithm:}void  main( ){	solve();} 

Поздрави !

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


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

×

Информация

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