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

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

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

efgeniii

2 простички задачки

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


Здравейте, дадоха ми 2 задачки до края на седмицата. От 1 месец уча С++ и още не съм на ти с нещата и просто логически не знам как да ги подредя.

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

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

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

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

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

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


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

Ще ти помогнем, но първо опитай сам. Задачите ти не са трудни, а ако не започнеш да опитваш никога няма да се научиш. Казваш, че си направил нещо по втората задача. Прати го тук и ще ти покажем как ще стане с for.

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


Линк към този отговор
Сподели в други сайтове
#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;
}

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


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

Ами нали знаеш какво е "a на степен n" - това е (а*а*...*а) n пъти.

Циклълът for в C++ изпълнява тялото си докато условието му е вярно. Тоест правиш нещо такова:

// Горе при другите променливи.
int i;	    // Това е променливата с която ще броим
float power;//  Това е променливата в която ще пазим резултата от умноженията

// Заместваш pow с:
power = 1; // Отначало а трябва да е 1 за да може с каквото и да я умножим да стане същото число.
for (i = 0; i < n; i++) // Повтаряме тялото отдолу n пъти ( i става последователно от 0 до n-1)
{
	power = power * a; // или power *= a, както ти харесва повече
}
// когато цикълът приключи с повторенията в power ще имаме a повдигнато на степен n.
// Само остава да го отпечаташ.
cout << power;

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


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

Това направих и когато го компилирам ми излиза

а=3.21412е-0390

като напиша нещо например 20

излиза n=2

след това пиша примерно 10

и излиза -2147483648.

Нещо не е като хората.

#include <conio.h>
#include <iostream.h>
int main ()
{
int n,power;
float a,i;
cout<<"a="<<a<<endl;
cin>>a;
cout<<"n="<<n<<endl;
cin>>n;
power=1;
for (i=0; i<n; i++)
{
    power=power*a;
}
cout<<power;
getch ();
return 0;
}

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


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

power ти е int, а i ти е float... ;)

Редакция: аааа а защо печаташ a и n преди да си им задал стойности??? Това трябва да е така:

cout<<"a="<<endl;
cin>>a;
cout<<"n="<<endl;
cin>>n;

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


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

Добре обърнах ги така:

#include <conio.h>
#include <iostream.h>
int main ()
{
int n,i;
float a,power;
cout<<"a="<<a<<endl;
cin>>a;
cout<<"n="<<n<<endl;
cin>>n;
power=1;
for (i=0;i<n;i++)
{
    power=power*a;
}
cout<<power;
getch ();
return 0;
}

Отново не става.

Излиза ми:

а=3.21412е-039

пиша 20

излиза ми n=2

пиша 30

излиза ми 1.#INF

и толкова.

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


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

Прочети редакцията на последния ми пост. Ти какви числа въвеждаш?

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


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

Ето и моят вариант на програмата само че с рекурсия:

#include <iostream>
using namespace std;
int power(int b, int p);

int main()
{
	int n,pow;
	cout << "Enter a number and the power: " <<endl;
	cin >> n;
	cin >> pow;
	cout << power(n,pow) << endl;
	return 0;
}
int power(int b, int p)
{
	if(p==0)
	{
		return 1;
	}
	else return b * power(b,p-1);
}
Надявам се да съм помогнал.

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


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

Ух че съм глупав. Стана благодаря много!

Някаква помощ по 1-вата задача?

Мисля, че трябва да се провери дали числото е от 1000 до 9999 и после дали се дели на 3. Но не мога да се справя нещо.

Ето и моят вариант на програмата само че с рекурсия:

#include <iostream>
using namespace std;
int power(int b, int p);

int main()
{
	int n,pow;
	cout << "Enter a number and the power: " <<endl;
	cin >> n;
	cin >> pow;
	cout << power(n,pow) << endl;
	return 0;
}
int power(int b, int p)
{
	if(p==0)
	{
		return 1;
	}
	else return b * power(b,p-1);
}
Надявам се да съм помогнал.

Благодаря и на теб, но предпочитам другия вариант тъй като някой неща от твоя не са ми ясни и не мога да ги обясня. Моя си начин ми изглежда по-лесен. :)

Ако имате идеи по 1-ва моля помагайте. :)

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


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

Ух че съм глупав. Стана благодаря много!

Моля.

Някаква помощ по 1-вата задача?

Мисля, че трябва да се провери дали числото е от 1000 до 9999 и после дали се дели на 3. Но не мога да се справя нещо.

Ами това е добро начало. Напиши нещо и ще видим как да ти помогнем :)

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


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

Ето какво измислих:

#include <iostream.h>
#include <conio.h>
int main()
{
    int num,a,b,c,d;
    cout<<"Number:";
    cin>>num;
    if((num>=1000)&&(num<=9999));
    else  cout<<"Worng number";
   
  
}

След това мисля да направя 4 променливи, които са отговарят на единици, десетици, стотици и хилядни, но не знам как ще стане.

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


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

След това мисля да направя 4 променливи, които са отговарят на единици, десетици, стотици и хилядни, но не знам как ще стане.

подсказка:
  • когато операцията делене в C++ е с два целочислени операнда, връща резултат цяло число закръглен надолу. Операцията % връща остатък от деленето. Комбинацията от тези две операции е идеален метод за извличане на произволна цифра от число. (имайки предвид, че остатък от делене на 10 е последната цифра на числото, а целочислено делене на 10 връща числото без последната му цифра)
  • в случая числото ти е зададено да е с 4 цифри и може да го направиш с 4 променливи. Обаче е лошо да се учиш така. ами ако е с 40 цифри, 40 променливи ли ще ползваш? Направи си цикъл (както със степенуването) - извличаш последната цифра, умножаваш я по резултата, и я премахваш от числото и така докато свърши.

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


Линк към този отговор
Сподели в други сайтове
:questions: Абе да взема да питам нещо и аз : ква е тази библиотека в ++ #include <conio.h>

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


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

:questions: Абе да взема да питам нещо и аз :

ква е тази библиотека в ++

#include <conio.h>

това не е библиотека, а заглавен файл. И по спомени го има само в Windows

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


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

Това е стар нестандартен хедърен файл, така че не е за препоръчване да се използва.

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


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

frozener, какво става като извикаш power() с отрицателно p?

Също нямаш защита от препълване!

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


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

frozener, какво става като извикаш power() с отрицателно p?

Също нямаш защита от препълване!

Някакви предложения ?

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


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

Някакви предложения ?

  • не ползваш рекурсия, освен ако а) много ще ти опрости кода и б) можеш да гарантираш дълбочината ѝ. В случая и двете условия не са изпълнени. Нито е по-просто, нито знаеш на каква степен ще се вдига. Изобщо във C и C++, не е гарантирана оптимизацията на "tail recursion" и по правило рекурсията се избягва винаги, когато може.
  • като пишеш код, който реализира цикъл, да се увериш, че винаги ще стигнеш до изпълнение на условието за край. (това на теб ти е навик да не го правиш и показва, че не си обмисяш кода)
П.П. освен това първият ти параметър е int, а според условието трябва да е реално число.

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


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

Ами сега ?

int power(int b, int p)
{
    if(p<=0)
    {
	    return 1;
    }
    else return b * power(b,p-1);
}

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


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

frozener, ако при p < 0 връщаш 1-ца, това е математически невярно! :) По условие се казва:

...

Трябва да въведа естествено число n и реално число a, трябва да се изчисли и изведе a на степен n-тa " an ".

т.е. ако си направиш a да ти е реално, ще си спестиш много от акробатиките. Ето една примерна реализация:
double power(double a, long int n) {
	if (0 == n) return 1.0;
	if (0 > n) return 1.0 / ( a * power(a, (-n)-1) );
	return a * power(a, n-1);
}
Също трудно се получава препълване, тъй като double реже от незначителните знаци, намалява точността, но дава някакъв числен резултат! ;)

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


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

frozener, ако при p < 0 връщаш 1-ца, това е математически невярно! :) По условие се казва:т.е. ако си направиш a да ти е реално, ще си спестиш много от акробатиките. Ето една примерна реализация:

double power(double a, long int n) { if (0 == n) return 1.0; if (0 > n) return 1.0 / ( a * power(a, (-n)-1) ); return a * power(a, n-1); }
Също трудно се получава препълване, тъй като double реже от незначителните знаци, намалява точността, но дава някакъв числен резултат! ;)
И все пак не е добре да ползвате рекурсия. Особено за такава елементарна цел.

Просто си представям, какво става като направиш power (1.0,10000)....

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


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

Ама напълно съм съгласен! Просто коментирах имплементацията на frozener! Иначе една примерна итеративна реализация (на Notepad) би била:

double power(double a, long int n) {
	if (0 == n || 1.0 == a) return 1.0;
	if (0.0 == a) return 0.0;

	bool isNegative;
	if (n < 0) {
		isNegative = true;
		n = -n;
	} else isNegative = false;
	
	double result = a;
	while (--n)
		result *= a;

	if (isNegative) return 1.0/result;
	return result;
}

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


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

frozener, ако при p < 0 връщаш 1-ца, това е математически невярно! :) По условие се казва:т.е. ако си направиш a да ти е реално, ще си спестиш много от акробатиките. Ето една примерна реализация:

double power(double a, long int n) {
	if (0 == n) return 1.0;
	if (0 > n) return 1.0 / ( a * power(a, (-n)-1) );
	return a * power(a, n-1);
}
Също трудно се получава препълване, тъй като double реже от незначителните знаци, намалява точността, но дава някакъв числен резултат! ;)

А ако потребителя въведе отрицателна стойност ?

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


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

А ако потребителя въведе отрицателна стойност ?

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

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


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

×

Информация

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