Автор Тема: 2 простички задачки  (Прочетена 2853 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

efgeni

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 4
2 простички задачки
« -: 28 Март 2012, 14:29:04 »
Здравейте, дадоха ми 2 задачки до края на седмицата. От 1 месец уча С++ и още не съм на ти с нещата и просто логически не знам как да ги подредя.

1-вата е да напиша програма, която въвежда цяло четирицифрено число след, което да се провери дали произведението от цифрите на числото е кратно на 3.

2-рата е отново програма, която горе долу направих, но ми казаха, че трябва с цикълa for да я направя. Трябва да въведа естествено число n и реално число a, трябва да се изчисли и изведе a на степен n-тa " an ".

1-вата знам, че трябва да стане с "if" ,а 2-рата с "for".

Библиотеките, които мога да използвам и знам са: <iostream.h> <conio.h> <math.h>.

Много ще съм ви благодарен ако можете да ми помогнете!

efgeni

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 4
Re: 2 простички задачки
« Отговор #1 -: 28 Март 2012, 14:49:10 »
По 2-рата задача ето това което се опитвах:

[CODE]
#include <iostream.h>
#include <conio.h>
int main ();
{
int n;
float a;
cout<<"a="<<a<<endl;
cin>>a;
cout<<"n="<<n<<endl;
cin>>n;
pow (a,n); (От тук надолу не съм много сигурен какво става.)
cout<<(a,n);

getch ();
return 0;
}
[/code]

Drakonov

  • Гост
Re: 2 простички задачки
« Отговор #2 -: 28 Март 2012, 15:21:19 »
Цитат
1-вата е да напиша програма, която въвежда цяло четирицифрено число след, което да се провери дали произведението от цифрите на числото е кратно на 3.

1. Проверяваш дали числото е между 1000 и 9999:  if((num>=1000)&&(num<=9999))
2. Ако е , в 4 отделни променливи записваш хилядите, стотиците десетиците и единиците:
3. Проверяваш дали произведението им се дели на 3:   if((а*b*c*d)%3)


Цитат
2-рата е отново програма, която горе долу направих, но ми казаха, че трябва с цикълa for да я направя. Трябва да въведа естествено число n и реално число a, трябва да се изчисли и изведе a на степен n-тa " an ".


a^n = n пъти а по а

for(int i =0; i< n; i++){
a *=a;
}

efgeni

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 4
Re: 2 простички задачки
« Отговор #3 -: 28 Март 2012, 15:31:39 »
Горе-долу схванах. Ще опитам малко по-късно. Благодаря ти много! Ще пиша ако има проблеми. :)

Справих се с 2-рата ето кода.

#include <conio.h>
#include <iostream.h>

int main ()
{
int n,i;
float a,power;
cout<<"a=";
cin>>a;
cout<<"n=";
cin>>n;

power=1;
for (i=0;i<n;i++)
{
    power=power*a;
}
cout<<power;

getch ();
return 0;

}
« Последна редакция: 28 Март 2012, 15:40:57 от efgeni »

Drakonov

  • Гост
Re: 2 простички задачки
« Отговор #4 -: 28 Март 2012, 16:09:36 »
Става, но прави проверки на входа! Например ако за n напиша отрицателно число твоята програма ще изведе 1, независимо какво съм въвел за а, а това не трябва да се случва, така че трябва да провериш дали а е в някакъв допустим интервал, в твоя случай а>=1, и ако не е да изведеш съобщение за грешка или отново да поискаш потребителя да въведе число

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: 2 простички задачки
« Отговор #5 -: 31 Март 2012, 18:07:35 »
Първата задача едно бързо решение.

Код: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7.     int fourNumber = 0;
  8.     do
  9.     {
  10.         system("cls");
  11.         cout << "Vavedete chislo s 4 znaka : ";
  12.         cin >> fourNumber;
  13.     }
  14.     while((fourNumber<1000)||(fourNumber>9999));
  15.     int total = 1;
  16.     bool delise = false;
  17.     for(int i = 0; i < 4; i++)
  18.     {
  19.         if(fourNumber % 10 == 0)
  20.         {
  21.             break;
  22.         }
  23.         else
  24.         {
  25.             total *=fourNumber % 10;
  26.             fourNumber /= 10;
  27.         }
  28.         if(i == 3 && total % 3 == 0)
  29.         {
  30.             delise = true;
  31.         }
  32.     }
  33.     if(delise)
  34.     {
  35.         cout << "Deli se na 3 bez ostatak";
  36.     }
  37.     else
  38.     {
  39.         cout << "NE se deli na 3 bez ostatak";
  40.     }
  41.     return 0;
  42. }
  43.  
« Последна редакция: 31 Март 2012, 19:17:20 от Zealar »

Drakonov

  • Гост
Re: 2 простички задачки
« Отговор #6 -: 31 Март 2012, 18:55:48 »
@Zealar Може ли да обясниш логиката на кода систъпка по стъпка, че нещо не го схващам  :)

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: 2 простички задачки
« Отговор #7 -: 31 Март 2012, 19:16:58 »
Разбира се впрочем имам малка грешка в предният пример която ей сегичка ще оправя. (забравих че е умножение не събиране)

Код: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7.     // Създавам променлива в която ще стой 4-ри цифреното число
  8.     int fourNumber = 0;
  9.     // Използвам do/while защото кода трябва да бъде изпълнен поне 1 път
  10.     // Също така използвам system("cls"); да чисти конзолата всеки път (по готино е
  11.     // и не пречинява излишен спам
  12.     // това се върти докато въведеното число е по-малко от 1000 и по голямо от 9999
  13.     do
  14.     {
  15.         system("cls");
  16.         cout << "Vavedete chislo s 4 znaka : ";
  17.         cin >> fourNumber;
  18.     }
  19.     while((fourNumber<1000)||(fourNumber>9999));
  20.     // променливата тотал ще държи произведението на цифрите
  21.     int total = 1;
  22.     // Тази променлива е да следя дали fourNumber отговаря на изискванията
  23.     bool delise = false;
  24.     // Тъй като са 4 цифри завъртам цикъла 4 пъти
  25.     for(int i = 0; i < 4; i++)
  26.     {
  27.         // Ако стигне до цифра която е 0 то значи че не се дели на 3
  28.         // Защото ако имаме число 3408 то 3*4*0*8 = 0 както знаем всяко
  29.         // число умножено по 0 = 0 така че няма смисъл да гледаме по нататък
  30.         if(fourNumber % 10 == 0)
  31.         {
  32.             break;
  33.         }
  34.         // В противен случай към крайното се добавя с умножение поредото число
  35.         // а вторият ред просто маха последната цифра
  36.         else
  37.         {
  38.             total *=fourNumber % 10;
  39.             fourNumber /= 10;
  40.         }
  41.         // Когато дойде последното завъртане от цикъла и тотала се дели на 3 без остатък
  42.         // значи това число е кратно на 3
  43.         if(i == 3 && total % 3 == 0)
  44.         {
  45.             delise = true;
  46.         }
  47.  
  48.     }
  49.     // Според флага принтираме съобщение
  50.     if(delise)
  51.     {
  52.         cout << "Deli se na 3 bez ostatak";
  53.     }
  54.     else
  55.     {
  56.         cout << "NE se deli na 3 bez ostatak";
  57.     }
  58.     return 0;
  59. }
  60.  

Drakonov

  • Гост
Re: 2 простички задачки
« Отговор #8 -: 31 Март 2012, 20:45:27 »
Цитат
Разбира се впрочем имам малка грешка в предният пример която ей сегичка ще оправя. (забравих че е умножение не събиране)
Аз затова питам  :D, но според мен ако числото съдържа цифрата 0 пак би трябвало да се дели (въпрос на гледна точка :))

ПП: твоя алгоритъм може да се промени малко:
Код: C++
  1. //Ako dadena cifra ot chisloto se deli na 3,  to i proizvedenieto im 6te se deli na 3
  2. if(!(total % 3))
  3.         {
  4.             delise = true;
  5.             break;
  6.         }
  7.  
« Последна редакция: 31 Март 2012, 20:50:44 от Kalessin »

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: 2 простички задачки
« Отговор #9 -: 01 Април 2012, 00:39:28 »
До колкото съм чувал деленето на нула в програмирането се счита за грешка но както каза въпрос на гледна точка.
Относно оптимизацията има доста неща който могат да се направят но както казах по-горе това е просто 1 бърз пример не перфектният.

Иначе тази проверка сложена извън цикъла ще е по-добре от моментното решение ако алгоритъма не извади късмет :D

Drakonov

  • Гост
Re: 2 простички задачки
« Отговор #10 -: 01 Април 2012, 08:32:40 »
Не бе, ти не делиш на 0, ти делиш 0 на 3 което си е математически правилно

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: 2 простички задачки
« Отговор #11 -: 01 Април 2012, 10:05:26 »
Мхм така е.
Код: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7.     int fourNumber = 0;
  8.     do
  9.     {
  10.         system("cls");
  11.         cout << "Vavedete chislo s 4 znaka : ";
  12.         cin >> fourNumber;
  13.     }
  14.     while((fourNumber<1000)||(fourNumber>9999));
  15.     int total = 1;
  16.     bool delise = false;
  17.     for(int i = 0; i < 4; i++)
  18.     {
  19.         if(!(total % 3) || total == 0)
  20.         {
  21.             delise = true;
  22.             break;
  23.         }
  24.         else
  25.         {
  26.             total *=fourNumber % 10;
  27.             fourNumber /= 10;
  28.         }
  29.     }
  30.     (delise)?cout<<"Deli se na 3 bez ostatak":cout<<"NE se deli na 3 bez ostatak";
  31.     return 0;
  32. }
  33.  

NightWarrior

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 2
  • Публикации: 23
Re: 2 простички задачки
« Отговор #12 -: 16 Ноември 2012, 20:30:07 »
До колкото знам на състезанията по C++ такива  "Vavedete chislo s 4 znaka:" могат да ви докарат 0 точки, за това избягвайте да ги използвате. Лично мое мнение.

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: 2 простички задачки
« Отговор #13 -: 10 Декември 2012, 01:00:47 »
До колкото знам на състезанията по C++ такива  "Vavedete chislo s 4 znaka:" могат да ви докарат 0 точки, за това избягвайте да ги използвате. Лично мое мнение.
Я виж дали ти е отворена вратата към терасата.