fentg.com

ФОРУМЪТ на ФЕНОВЕТЕ на НТГ
Дата и час: Нед Апр 11, 2021 8:10 am

Часовете са според зоната UTC + 2 часа [ DST ]


Правила на форума


Натиснете за да видите правилата



Напиши нова тема Отговори на тема  [ 128 мнения ]  Отиди на страница Предишна  1 ... 8, 9, 10, 11, 12, 13  Следваща
Автор Съобщение
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Съб Фев 07, 2009 8:36 pm 
Offline

Регистриран на: Сря Ное 19, 2008 5:48 pm
Мнения: 513
1. Дадена е точка и n на брой точки, да се намери най-близката и най-далечната от n-те точки до първата.

2. Дадени са n на брой точки да се намери между кои от точките разстоянието е най-малко и м-у кои най-голямо.

Ето и задачата, която решихме днес.
Дадени са координатите на 2 точки, които образуват права и на още 2, които образуват друга права. Да се намерят координатите на пресечната точка на 2-те прави.
Код:
#include<conio.h>
#include<stdio.h>

void main (void)
{float x1,y1,x2,y2,x3,y3,x4,y4,a1,b1,x,y,a2,b2;
int isv1,isv2;

    printf("Enter x1: ");
    scanf("%f",&x1);
    printf("Enter y1: ");
    scanf("%f",&y1);

    printf("Enter x2: ");
    scanf("%f",&x2);
    printf("Enter y2: ");
    scanf("%f",&y2);

    printf("Enter x3: ");
    scanf("%f",&x3);
    printf("Enter y3: ");
    scanf("%f",&y3);

    printf("Enter x4: ");
    scanf("%f",&x4);
    printf("Enter y4: ");
    scanf("%f",&y4);

     isv1=(x1==x2);
     isv2=(x3==x4);

if(!isv1&&!isv2)
  {
    a2=(y4-y3)/(x4-x3);
    b2=(x4*y3-x3*y4)/(x4-x3);
    a1=(y2-y1)/(x2-x1);
    b1=(x2*y1-x1*y2)/(x2-x1);


    if(a1==a2&&b1==b2)
      printf("pravite savpadat");
     
     else if(a1==a2)
      printf("pravite sa usporedni");
     
        else
     {
     x=(b2-b1)/(a1-a2);
     y=(a1*b2-a2*b1)/(a1-a2);
           printf("X: %.2f Y: %.2f",x,y);
      }
  }


 
else   {     if(isv1&&isv2)
           {     

                if(a1==a2)
                   
         printf(" i 2-te sa vertikalni");
          if(x1==x2&&x2==x3&&x3==x4)
           printf("i savpadat");
       }
     else
       if(isv1)
          {
       a2=(y4-y3)/(x4-x3);
       b2=(x4*y3-x3*y4)/(x4-x3);
       x=x1;
       y=a2*x+b2;
          printf("X: %.2f Y: %.2f",x,y);
                  }
      else
       {
         a1=(y2-y1)/(x2-x1);
         b1=(x2*y1-x1*y2)/(x2-x1);
         x=x3;
         y=a1*x+b1;
                    printf("X: %.2f Y: %.2f",x,y);
        }
      }



getch();
}

_________________
Toва което не може да се опише с думи, се описва с музика.


Последна промяна mitko на Нед Фев 08, 2009 2:07 am, променена общо 1 път

Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Нед Фев 08, 2009 2:45 am 
Offline

Регистриран на: Сря Ное 19, 2008 5:48 pm
Мнения: 513
Ето 1-вата задача: 1. Дадена е точка и n на брой точки, да се намери най-близката и най-далечната от n-те точки до първата.

Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>

  float razstoqnie (float x1, float y1, float x2, float y2)
  {   
    float a=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    return a;
    }

void  main(void)

{
  float a[1000],b[500],x,y,min,max;
  int j=0,i,n,h;


   printf("Enter x: ");
   scanf("%f",&x);
   printf("Enter y: ");
   scanf("%f",&y);
   printf("Enter n: ");
   scanf("%d",&n);


         for(i=0;i<2*n;i++)
     {
           if(i%2==0)
            {
               j++;
               printf("Enter x na n[%d]",j);
             }
           else
              printf("Enter y na n[%d]",j);

        scanf("%f",&a[i]);

      }



   for(i=0,j=1;i<2*n;i=i+2,j++)
    b[j]=razstoqnie (a[i], a[i+1], x, y);

    max=b[1];
    min=b[1];
    j=1;
    h=1;

   for(i=2;i<=n;i++)
    {
       if(b[i]>max)
        {
           max=b[i];
           j=i;
          }
       if(b[i]<min)
        {
      min=b[i];
           h=i;
         }
      }   
          printf("Nai blizkata to4ka e t %d s koordinati: x: %.2f y: %.2f i razstoqnieto e %.2f",h,a[h*2-2],a[h*2-1],min);
          printf("\nNai dale4nata to4ka e t %d s koordinati x: %.2f y: %.2f i razstoqnieto e %.2f",j,a[j*2-2],a[j*2-1],max);
getch();
}             

_________________
Toва което не може да се опише с думи, се описва с музика.


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Нед Фев 08, 2009 10:27 am 
Offline
Администратор
Аватар

Регистриран на: Нед Ное 02, 2008 5:30 pm
Мнения: 3550
Още забележки по задачата за пресечната точка на правите:

Първо: още в началото бих направил отделни проверки за вертикалност и съответното пресмятане на a и b само за невертикалните прави (поотделно)! Защото ти правиш проверката само ако и двете са невертикални - и тогава ги смяташ a и b и на двете прави. После ако само едната не е вертикална повтаряш кода за смятане на нейните a и b. Така и с другата и по този начин кода за смятане на a-тата и b-тата го има 2 пъти в програмата. Ако го има сметнат в началото (с отделни проверки за вертикалност) ще минеш само с еднократното му пресмятане. Това, като го предлагах да е така не можах да го обоснова, защото не се сетих тогава, но сега вече разбрах причината.

И още нещо - при двете вертикални си намесил проверката (a1==a2) Защо? И в този случай имаш ли изчислени стойностите за a1 и a2 за да им правиш проверка? И изобщо налага ли се такава?

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

Обобщавам: ако проверката за невертикалност е отделна за всяка права и изчисляваш само нейните a и b - и то в началото, после направо ще си ги имаш за ползване - където се ползват (по на 2 места за права - или общо 4 пъти...)

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

_________________
Изображение


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Нед Фев 08, 2009 12:26 pm 
Offline

Регистриран на: Сря Ное 19, 2008 5:48 pm
Мнения: 513
После ще я погледна да я дооптимизирам, а за 2-рата програма, не е толкова голяма колкото изглежда, входа е голям иначе самите изчисления са 1 цикъл 2 иф-а и 1 функция:

Поемането на х-овете и у-греците съм го направил в 1 масив, като x1=а[0] y1=a[1] x2=a[2] y2=a[3] и така нататък.
разстоянията ги слагам в друг масив,като пропускам b[0] защото накрая за принтенето се налага да умножавам и като умножа по 0 няма да ми връщавярно координатите на точката вярно..



Код:
  float razstoqnie (float x1, float y1, float x2, float y2) // Функция за изчисление на разстоянието м-у 2 точки.
  {   
    float a=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    return a;
    }





for(i=0,j=1;i<2*n;i=i+2,j++)
    b[j]=razstoqnie (a[i], a[i+1], x, y); // Пълня масива с разстоянията като съответно a[i] е x и a[i+1] е у.

    max=b[1]; // Задавам на min и max началните стойности.
    min=b[1];  //
    j=1;                     // Тези променливи ще ми послужат за да се "запомни" кое число подред е с най-малкото и
    h=1;                    // кое с най-голямото разстояние до началната точка.

   for(i=2;i<=n;i++)
    {
       if(b[i]>max) // Всяко b се проверява дали е по-голямо от досегашното най-голямо
                     // и ако е така max придобива неговата стойност а j запомня кое по ред е числото.
        {
           max=b[i];
           j=i;
          }
       if(b[i]<min) // Всяко b се проверява дали е по-малко от досегашното най-малко
                     // и ако е така min придобива неговата стойност а h запомня кое по ред е числото.
        {
      min=b[i];
           h=i;
         }
      }   


_________________
Toва което не може да се опише с думи, се описва с музика.


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Пон Фев 09, 2009 7:37 pm 
Offline
Администратор
Аватар

Регистриран на: Нед Ное 02, 2008 5:30 pm
Мнения: 3550
Днес предложихме друг модел на данните, при който се сещам, че всичко може да мине в един-единствен цикъл барабар с поемането на данните... Митаче, пробвай му се, за да свикнеш и с измисляне на такива модели данни, при които алгоритмите са по-прости. Правилният модел данни води до простота и стабилност на алгоритъма...

_________________
Изображение


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Съб Фев 14, 2009 9:25 pm 
Offline
Администратор
Аватар

Регистриран на: Нед Ное 02, 2008 5:30 pm
Мнения: 3550
Та докато чакаме да "излезе" решението ни се появи следното терзание:

Това е Паскалски код:
Код:
var year, month, day, lastday : integer;

begin

  year:=2000; month:=2;

  case month of
   1,3,5,7,8,10,12 : lastday:=31;
   4,6,9,11 : lastday:=30;
   2 : if year mod 4 = 0 then lastday:=29
       else lastday:=28;
  end;

  writeln(lastday);

end.

Това е C кодът:
Код:
#include<conio.h>
#include<stdio.h>
int main()
{int year=2000, month=2, day, lastday;
switch(month)
{
  case  1 :
  case  3 :
  case  5 :
  case  7 :
  case  8 :
  case 10 :
  case 12 : lastday=31; break;

  case  4 :
  case  6 :
  case  9 :
  case 11 : lastday=30; break;

  case  2 : if(year%4)lastday=28;
            else lastday=29;
}
printf("%d",lastday);

return 0;
}
Вълнува ме фактът, че в Паскал case операторът,
аналог на switch - case конструкцията в C допуска
по-краткото записване на алтернативите, като се
изброяват със запетаи. Има ли такава възможност и в C?

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

/това е част от кода, от задача за намиране на следваща дата
по зададена такава... очакваме цялостни решения.../

_________________
Изображение


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Съб Фев 14, 2009 10:38 pm 
Offline
Аватар

Регистриран на: Пет Дек 05, 2008 9:03 pm
Мнения: 3
Няма такава опция. И аз се чудих, но питах доцент Крушков на времето, и той ми каза.


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Съб Фев 14, 2009 10:59 pm 
Offline
Администратор
Аватар

Регистриран на: Нед Ное 02, 2008 5:30 pm
Мнения: 3550
Еййй, Гоги, бях забравил, че си регистриран потребител на нашият форум!

Много се радвам!

Да ти се похваля, че в посока "геометрична информатика" или по-скоро "информатична геометрия"
позадобряхме. Задачите с точки и прави им хванахме леко "цаката", макар и да не довършихме
много от тях, но вече си открихме основните "чалъми"... На олимпиада вероятността да се падне подобна задача е около 1/6... За утре, за който дойде съм измислил една занаятчийско-програмистка задача, която съм й измислил
идеално приложение във web-разработките с php примерно. Но ще й адаптирам условието, за да напипаме основната идея...

Ако си "айлякчия" може да понаминеш. Който иска и може - около 11ч. в училище...

_________________
Изображение


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Пет Фев 20, 2009 11:47 pm 
Offline
Администратор
Аватар

Регистриран на: Нед Ное 02, 2008 5:30 pm
Мнения: 3550
Кога се срещаме?

Някой ако постави тук календар на срещите, ще сме му благодарни!

Защото не знам например утре имаме ли среща?

Ако ме няма - звънете и ще прехвръкна/долетя според къде съм...

_________________
Изображение


Върнете се в началото
 Профил  
 
 Заглавие: Re: МЛАДИ ПРОГРАМИСТИ...
МнениеПубликувано на: Нед Фев 22, 2009 3:49 pm 
Offline

Регистриран на: Сря Ное 19, 2008 5:48 pm
Мнения: 513
Ами днеска трябваше да имаме, но аз не дойдох, щото ако съм сам пак нямаше смисъл,защото не ви знам номера, а и говорих с Никола и той каза, че няма да идва, пък Люсито не я засякох в скайп.

_________________
Toва което не може да се опише с думи, се описва с музика.


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 128 мнения ]  Отиди на страница Предишна  1 ... 8, 9, 10, 11, 12, 13  Следваща

Часовете са според зоната UTC + 2 часа [ DST ]


Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Превод: Ioan Filipov