Czy taką funkcjonalność daje tablica?

0

Hej,

jako, że potrzeba jest matką wynalazku a czasu zawsze mało, postanowiłem zrobić krótki kurs ogarnięcia c++ poprzez robienie projektów. Potrzebuję zrobić coś takiego.

Jest liczba "n" rzeczy, które definiujemy. I w zależności od liczby jaką wpiszemy, pojawiać ma się nam "n" zmiennych do wypełnienia. tj. pojawia się zapytanie np. "ilu jest klientów" i w zależności od tego jaką cyfrę podobamy, pojawi się nam tyle kolejnych zmiennych, które będziemy wypełniać z palca.
Jak ugryźć taką funkcjonalność?

2

Słyszałeś o STL? Tam jest coś takiego, jak std::vector, ale przecież, to Musisz mieć w ksiązce.

1

Można ugryźć stosując, na przykład dynamiczną tablicę std::vector<typ zmiennej>.

0

Do czego mają być użyte te liczby?
Bo nie zawsze musisz pchać wszystko do tablicy, np:

int count,curr,sum=0;
for(cin>>count;(count--)&&(cin>>curr);sum+=curr) {}
cout<<"suma wynosi: "<<sum<<endl;
1

Nie ma czegos takiego jak "wyswietlenie n zmiennych do wypelnienia".

Mozesz "n razy zapytac o wartosc" (konsola) lub "wyswietlic n pol do wypelnienia" (web).

0

Myślę, że należą się od razu wyjaśnienia. Generalnie chciałbym się zająć programowaniem w c++, jako, że akurat potrzebuję zrobić projekt na studia (mimo, że warto dodać podstaw nie było) to jest to idealny czas na naukę, poprzez robienie projektu. Nie jestem w stanie jednak uczyć się miliona zbędnych rzeczy poza projektem, ponieważ mam po prostu deadline i muszę się go trzymać, a praca nie pozwala mi na całe dnie spędzane na klikaniu i bawieniu się przy komputerze.

Potrzebuję zrobić funkcję, która w zdefiniowanym przedziale znajduje miejsca zerowe. Chcę to zrobić metodą Newtona a to wymaga między innymi policzenia pochodnej (które gdzieś tam staram się oprogramować) oraz zdefiniowania funkcji (co jest nawet istotniejsze). Tylko teraz mogę albo przyjąć na sztywno i wpisać sobie z palca. Co w teorii może być do zaakceptowania, ale mi osobiście zależy na możliwości zrobienia okienka, w którym mogę zapisać funkcję. Wydaje mi się, że w odróżnieniu od matlaba tutaj musimy zdefiniować każdą ze składowych osobno i potem podpiąć ją pod wzór, pytanie jednak jak to zrobić?

0

Zacznij od paraboli.

0

Jeżeli nie musisz tworzyć tutaj własnego algorytmu, to skorzystaj z biblioteki boost

0
#include<iostream>
#include<cstdlib>
using namespace std;

int horner(int wsp[],int st, int x)
{
	if(st==0)
		return wsp[0];

	return x*horner(wsp,st-1,x)+wsp[st];
}

int main()
{
	int *wspolczynniki;
	int stopien;

	cout<<"Podaj stopien wielomianu: ";
	cin>>stopien;

	wspolczynniki = new int [stopien+1];

	//wczytanie współczynników
	for(int i=0;i<=stopien;i++)
	{
		cout<<"Podaj wspolczynnik stojacy przy potedze "<<stopien-i<<": ";
		cin>>wspolczynniki[i];
	}

	float argument;

	for (argument = -100; argument <= 100 ; argument+ = 0.1 )
{
    cin>>argument;

	cout<<"W( "<<argument<<" ) = "<<horner(wspolczynniki,stopien,argument)<<endl;
}
	delete [] wspolczynniki;
	system("pause");
	return 0;
}

Generalnie zrobiłem takie coś. Brakuje mi jakby 2 rzeczy, które nie do końca wiem jak zrealizować. Chciałbym, aby zliczało mi w tej pętli wszystko od -100 do 100 z tym krokiem, oraz w sytuacji gdy W(n)~0, to aby ta wartość została zapisana. Myślałem o jakiejś pętli w pętli, która będzie działać dopóki wynik będzie większy od założonego błędu. Jednak nie bardzo wiem czy mój sposób myślenia będzie poprawny?

0

@smoku35: Zrobiłeś pętlę od -100 do 100, z krokiem 0.1, ale w tej pętli wczytujesz od użytkownika dane do tej samej zmiennej! Przetestuj sobie: w pierwszym obiegu pętli podaj 101, pętla się już więcej razy nie wykona. Jeżeli potrzebujesz sprawdzić czy funkcja horner zwraca 0 to musisz skorzystać z instrukcji warunkowej if.

if ( horner(arg1, arg2, arg3) == 0 )
{
   // to wykona się tylko, gdy horner zwróci 0.
}
0

Tutaj masz algorytm z którego możesz skorzystać.

#include <iostream>
#include <functional>

using namespace std;

vector<double> getroots( function<double(double)> f , double a , double b , double step , double epsilon )
{
    double root_average {0.0};
    int root_average_number {0};
    vector<double> roots;

    for( double x=a ; x<b ; x+=step )
    {
        if( abs(f(x))<epsilon )
        {
            root_average += x;
            ++root_average_number;
        }
        else if( root_average_number>0 )
        {
           roots.push_back(root_average/root_average_number);
           root_average_number = 0;
           root_average = 0.0;
        }
    }

    return roots;
}

int main()
{
    for( const auto& root : getroots( []( double x ) { return (x-1)*(x-7)*(x+1)*(x-3)*(x+0.5); } , -5 , 10 , 0.01 ,0.01 ) )
    {
        cout << root << "\n";
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1