C++ Pomoc w dokończeniu kodu

0

Cześć mam napisany kod i w sumie to nie wiem dalej jak to mam przeskoczyć czy jest ktoś wstanie dokończyć ten program aby działał poprawnie.
Z góry wielkie dzięki za jaką kolwiek pomoc.

 #include <iostream>
#include <math.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;



int main(int argc, char** argv) 
{
	int a=0;
	float suma=0, b=0;					// zmienne 
	
	/********************************************************************************/
	cout << "Wprowadz liczbe elementow (Max 10) --> ";		
	cin >> a;
	float tablica[a];											// wielkosc tablicy
	if (a<=10)
	{	
	/***************************************************************************************/
	cout << "\n\nWprowadz teraz kolejne liczby do tablicy";	
	for (int i=0;i<a;i++)
	{
	cout << "\nElement " << i+1 << " --> ";							// wprowadzanie elementow
	cin >> b;
	tablica[i]=b;
	}
/***************************************************************************************************/	

	**Jak dokonczyc tu ten kod aby OBLICZYŁ iloczyn, iloraz i różnice, wczytanych elementow i nastepnie wypisal wartosc. I to wszystko chcialbym miec w osobnych programach tzn, osobno iloczyn itd..**//foo//
	
}
	
return 0;
}
4
cin >> a; 
float tablica[a]; 

straszny błąd! Zamiast tego użyj

std::vector

lub dynamiczna pamięć

1

Nie wiem z czym problem, podpowiem, że sumuje się tak:

 
for(i=0;i<a;i++)
{ 
   suma += tablica[i];
}

@Trebuh
Nie męcz go, bo jak nie umie obliczyć sumy liczb w tablicy to tym bardziej nie będzie się bawił w vectory, albo tablice dynamiczne :P

1

Ten program nie ma prawa "działać poprawnie", bo nie jest to ani program w języku C, ani w C++ (potencjalnie C++17, ale to nie jest pewne). Nie powinien się on kompilować i tak dokładnie jest: http://coliru.stacked-crooked.com/a/7a923571fab44fa4

Jak ma wyglądać iloraz wprowadzonych elementów? (Pierwszy/drugi)/trzeci)/...?

Popracuj nad formatowaniem kodu, fatalnie się Twój czyta. Czy tak nie jest czytelniej?

#include <algorithm>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <thread>
#include <utility>
#include <math.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

#define DBG(x) { cout << left << setw(40) << #x << (x) << endl; }

int main(int argc, char** argv)
{
    int a = 0;
    double suma = 0, iloczyn = 0; // zmienne

    /********************************************************************************/
    cout << "Wprowadz liczbe elementow (Max 10) --> ";
    cin >> a;
    vector<double> tablica(a); // wielkosc tablicy
    if (a <= 10) {
        /***************************************************************************************/
        cout << "\n\nWprowadz teraz kolejne liczby do tablicy";
        for (int i = 0; i < a; i++) {
            cout << "\nElement " << i + 1 << " --> "; // wprowadzanie elementow
            double b;
            cin >> b;
            tablica[i] = b;
        }
        /***************************************************************************************************/

        //**Jak dokonczyc tu ten kod aby OBLICZYŁ iloczyn, iloraz i różnice, wczytanych elementow i nastepnie wypisal wartosc.I to wszystko chcialbym miec w osobnych programach tzn, osobno iloczyn itd..** //foo//
    }

    suma = accumulate(begin(tablica), end(tablica), 0.);
    DBG(suma);
    iloczyn = accumulate(begin(tablica), end(tablica), 1., multiplies<void>());
    DBG(iloczyn);

    return 0;
}

http://melpon.org/wandbox/permlink/LClSaSMOxz2kxkMm

0

nie no mój kod się u mnie kompiluje tylko źle przedtem go wykomentowałem. Zaś ten twój kq jest troszkę skomplikowany nie rozumie go i nie działa wyskakują u mnie błędy.
i wciąż się denerwuje bo nie wiem jak mam to zrobić^^

  #include <iostream>
#include <math.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
 
 
int main(int argc, char** argv) 
{
    int a=0;
    float suma=0, b=0;                    // zmienne 
 
    /********************************************************************************/
    cout << "Wprowadz liczbe elementow (Max 10) --> ";        
    cin >> a;
    float tablica[a];                                            // wielkosc tablicy
    if (a<=10)
    {    
    /***************************************************************************************/
    cout << "\n\nWprowadz teraz kolejne liczby do tablicy";    
    for (int i=0;i<a;i++)
    {
    cout << "\nElement " << i+1 << " --> ";                            // wprowadzanie elementow
    cin >> b;
    tablica[i]=b;
    }
/***************************************************************************************************/    
 
     
}
 
return 0;
}
0

geez... nie męczcie go, proszę.

Przecież ja pamiętam lekcje informatyki z mojego liceum. Nie zdziwiłbym się, gdyby się okazało, że robi dokładnie to, co miał na lekcjach. Nie mówcie mu o vectorach, skoro ma problemy z tym, czego wymagają od niego w szkołach!

@sidofler, wiesz, jak się deklaruje podprogramy / funkcje / procedury / jakkolwiek to się u was nazywa? Jeśli tak, to czy wiesz, jak przekazać im tablicę jako argument? Pytam po prostu po to, żeby wiedzieć, na czym stoimy :)

2

Jako że rozwiązanie @kq jest ciut zbyt zaawansowane na tym etapie to możesz popatrzeć na to:

#include <iostream>
#include <vector>

using namespace std;

float iloczyn(const vector<float>& tablica)
{
    float iloczyn = 1;
    for (unsigned i = 0; i < tablica.size(); ++i)
        iloczyn *= tablica[i];
    
    return iloczyn;
}

int main() 
{
    int rozmiar, element;
    
    cout << "Wprowadz liczbe elementow (Max 10) --> ";        
    cin >> rozmiar;
    vector<float> tablica(rozmiar);                                
    if (rozmiar <= 10)
    {    
        cout << "\n\nWprowadz teraz kolejne liczby do tablicy";    
        for (int i = 0; i < rozmiar; ++i)
        {
            cout << "\nElement " << i + 1 << " --> ";            
            cin >> element;
            tablica[i] = element;
        }

        cout << "Iloczyn: " << iloczyn(tablica) << endl;
    }
 
    return 0;
}

Napisałem iloczyn, resztę możesz sam dopisać, są analogiczne.
Zwróć uwagę na wcięcia w kodzie i używanie spacji do rozdzielenia elementów. for (int i = 0; i < rozmiar; ++i) łatwiej się czyta niż taką kupkę for(int i=0;i<rozmiar;++i).

0

@Shakaz
No i dlatego właśnie rzucanie takimi kodami jakimi rzucił @kq nie ma najmniejszego sensu, to jest gotowiec którego Sidofler nie ma szans zrozumieć! Szczególnie, jeśli uczą go w szkole tak, jak go uczą.

@sidofler
Coś mi się zaczyna wydawać, że masz przed sobą 2 możliwości:

  1. Zaliczyć przedmiot w szkole, lub
  2. Faktycznie się czegoś nauczyć z programowania

Jeśli to drugie, to szczerze Ci radzę, zacznij uczyć się na własną rękę, inaczej nic z tego. Może poszukaj w księgarni jakiejś mądrej książki traktującej o C++?
Np. czy "Symfonia C++" nadaje się dla początkujących?

0

@twonek
No to teraz wytłumacz mu:

  • Co to jest vector i jak go używać - jak rozumieć konstrukcje vector<float> tablica(rozmiar); oraz tablica.size();
  • Co to jest przekazywanie przez referencję i co to w ogóle jest referencja
  • Co to znaczy const

Skoro nie wiadomo, czy on w ogóle rozumie jak definiować funkcje!

Na marginesie - żeby wam uprzytomnić, co się dzieje - u mnie w szkole panował surowy zakaz używania jakichkolwiek konstrucji, które nie były explicite dozwolone przez nauczycielkę. Np. nie wolno było używać *=, o vectorach nawet się nie zająknęła. Weźcie to wszystko pod uwagę, jak piszecie do niego.

0

@twonek
Rozumiem Twoje racje, ale czy zdajesz sobie sprawę, że Twojego kodu by moja nauczycielka w szkole mi nie zaliczyła? Ja mówię poważnie, wiem że Twój kod jest bardziej poprawny, ale mimo to kazałaby mi go przepisać. Dlaczego? Bo kod zawiera niedozwolone konstrukcje, których nie było na lekcji.

Dobra, sorry za spam, to już mój ostatni post tego typu.

1

@kmph: Po pierwsze, OP napisał:

Z góry wielkie dzięki za jaką kolwiek pomoc.

Po drugie: nie było ani słowa o ograniczeniach związanych z programem nauczania.

Po trzecie: nauka i promowanie złych praktyk jest złe i nie mam zamiaru tego wspierać. Nauczycielka może nie mieć racji. Np. mi kiedyś geograficzka wstawiła jedynkę, bo ją poprawiłem, gdy powiedziała, że Wenus nie ma atmosfery. Mam nadzieję, że nie sugerujesz, że gdybym przyszedł z tym problemem na forum geograficzne to odpowiedzią powinno być "a, chyba, że nauczycielka tak powiedziała, w takim razie trzymaj się tego co powiedziała".

0

wszystko na spokojnie sobie przeczytam o const i tej całej reszcie ale jeszcze mam pytanko co do tego zadanka bo ono w sumie składa się z 3 części.
1 to wczytanie liczb podających 2 to wczytanie kolejnych liczb a 3 to zaś jest iloczyn.
I teraz tak z czego mógłbym się przygotować chodzi mi o takie samo zadanie na takim samym mniej więcej poziomie tylko może być np. inny 3 punkt
(przychodzi mi do głowy średnia arytmetyczna czy jest coś jeszcze takiego?)
Wielkie dzieki za pomoc naprawde :)

1
sidofler napisał(a):

(przychodzi mi do głowy średnia arytmetyczna czy jest coś jeszcze takiego?)

No to definiujesz funkcję float srednia (const vector<float>& liczby) i wyliczysz co trzeba. A w głównym programie wywołujesz tak jak iloczyn

cout << "Srednia arytmetyczna: " << srednia(tablica) << endl;
1

@sidofler
Dobra, krótkie kompedium. Wiem, że to jest długie, ale proszę przebrnij przez to, ta wiedza będzie Ci niezbędna w szkole.

Weźmy pod uwagę taki niedowartościowany programik:

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
	int fajnosc = 0;
	
	cout << "Jestem bardzo fajny!\n";
	cout << "Potrafie dodac dwa do dwoch - prosze bardzo:\n";
	cout << "2 + 2 = " << 2+2 << "\n\n";
	
	cout << "Czy uwazasz, ze jestem fajny? Wpisz, na ile tak sadzisz (0-10):\n";
	cin >> fajnosc;
	if(fajnosc < 0 || fajnosc > 10)
		cout << "Mialo byc od 0 do 10, jestes glupi!\n\n";
	else if(fajnosc <= 5)
		cout << "Jestes niemily!\n\n";
	else
		cout << "Tak... Masz racje!\n\n";
	
	cout << "Dobra, teraz musimy sie pozegnac, papa!\n";
	
	return 0;
}

Wszystko, a jest tego trochę, napisane jednym ciągiem. Nieczytelne.
Można pogrupować kawałki kodu dla czytelności, definiując funkcje:

#include <iostream>
using namespace std;

void pochwalSie()
{
	cout << "Jestem bardzo fajny!\n";
	cout << "Potrafie dodac dwa do dwoch - prosze bardzo:\n";
	cout << "2 + 2 = " << 2+2 << "\n\n";
	
	return;
}

void coOMnieSadzisz()
{
	int fajnosc = 0;
	
	cout << "Czy uwazasz, ze jestem fajny? Wpisz, na ile tak sadzisz (0-10):\n";
	cin >> fajnosc;
	if(fajnosc < 0 || fajnosc > 10)
		cout << "Mialo byc od 0 do 10, jestes glupi!\n\n";
	else if(fajnosc <= 5)
		cout << "Jestes niemily!\n\n";
	else
		cout << "Tak... Masz racje!\n\n";
		
	return;
}

void pozegnajSie()
{
	cout << "Dobra, teraz musimy sie pozegnac, papa!\n";
	
	return;
}

int main(int argc, char** argv)
{
	pochwalSie();
	coOMnieSadzisz();
	pozegnajSie();
	
	return 0;
}

Zdefiniowaliśmy tutaj 3 funkcje: pochwalSie(), coOMnieSadzisz(), pozegnajSie(). Funkcje (w zapisie) tym różnią się od zmiennych, że posiadają nawiasy na końcu.

Możesz wywołać swoją funkcję (wykonać kawałek kodu, który został w niej zdefiniowany), wpisując jej nazwę (tylko pamiętaj o nawiasach, tak jak w tym przykładzie).

Zauważ jednak, że w tym momencie deklarację zmienniej int fajnosc musieliśmy przenieść do funkcji coOMnieSadzisz() - dzieje się tak dlatego, że funkcja widzi wyłącznie własne zmienne, zmiennej zadeklarowanej w innej funkcji (np. main(), to też jest funkcja!) już nie. Dlatego takie: http://ideone.com/jktNGc rozwiązanie nie przejdzie.

Druga rzecz jest taka, że funkcja musi być zdefiniowana zanim zostaje wywołana (czyli wykonana). Dlatego też takie: http://ideone.com/4LIJuM rozwiązanie nie przejdzie.

Drugie zastosowanie funkcji jest takie, żebyś nie musiał powtarzać własnego kodu.

Weźmy pod uwagę np. taki przykładowy kalkulator:

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
	int czasPracy = 0;
	double placaZaDzien = 0;
	
	cout << "Wpisz, w ile dni prace wykona Jan Kowalski:\n";
	cin >> czasPracy;
	cout << "Wpisz, ile Jan Kowalski wezmie za dziec pracy:\n";
	cin >> placaZaDzien;
	cout << "Jan Kowalski wezmie " << czasPracy * placaZaDzien;
	cout << " za wykonana robote.\n\n";
	
	cout << "Wpisz, w ile dni prace wykona Zbigniew Nowak:\n";
	cin >> czasPracy;
	cout << "Wpisz, ile Zbigniew Nowak wezmie za dziec pracy:\n";
	cin >> placaZaDzien;
	cout << "Zbigniew Nowak wezmie " << czasPracy * placaZaDzien;
	cout << " za wykonana robote.\n\n";
	
	return 0;
}

Widać, że to rozwiązanie jest baardzo brzydkie, musisz powtarzać 2 razy ten sam kawałek kodu. Beznadzieja.

Z pomocą przychodzą funkcje:

#include <iostream>
#include <string>
using namespace std;

double obliczKoszt(string nazwisko)
{
	int czasPracy = 0;
	double placaZaDzien = 0;
	
	cout << "Wpisz, w ile dni prace wykona " << nazwisko << "\n";
	cin >> czasPracy;
	cout << "Wpisz, ile " << nazwisko << " wezmie za dziec pracy:\n";
	cin >> placaZaDzien;
	
	return czasPracy * placaZaDzien;
}

int main(int argc, char** argv)
{
	double kosztKowalskiego = obliczKoszt("Jan Kowalski");
	double kosztNowaka = obliczKoszt("Zbigniew Nowak");
	
	cout << "\nJan Kowalski wezmie " << kosztKowalskiego << " za robote, ";
	cout << "natomiast Zbigniew Nowak zazyczy sobie " << kosztNowaka << ".\n";
	
	if(kosztKowalskiego < kosztNowaka)
		cout << "Tanszy bedzie p. Kowalski.\n";
	else
		cout << "Tanszy bedzie p. Nowak.\n";
	
	return 0;
}

Mamy tutaj 2 sprawy.

Po pierwsze: parametry. Funkcje mogą mieć parametry, czyli zmienne zadeklarowane w nawiasach. Tutaj mieliśmy jedną taką zmienną - string nazwisko. Zmienne te muszą być przekazane funkcji za każdym razem, kiedy się ją wywołuje. (teoretycznie funkcja main() też ma swoje parametry, int argc, char** argv - są to dane, jakie można (choć nie trzeba) przekazać programowi, gdy się go uruchamia - żadnych danych jednak nie przekazujemy, więc w programie nigdzie tych zmiennych nie bierzemy pod uwagę).

Po drugie: zwracana wartość. Funkcja może zwracać wartość. Jeśli tak, trzeba zadeklarować typ zwracanej wartości, kiedy definiujemy funkcję - w tym przypadku jest to double. Wartość, jaką zwraca funkcja, jest określona po słowie kluczowym return - np. return czasPracy * placaZaDzien oznacza, że funkcja zwróci iloczyn wartości zmiennych czasPracy i placaZaDzien. Jeśli funkcja ma nie zwracać wartości, wtedy musi być zadeklarowana jako void - tak jak funkcje w przykładzie powyżej; wtedy też po słowie kluczowym return nic nie następuje. (funkcja main() powinna być typu int i zwracać 0, z przyczyn technicznych.)

Zauważ, że za każdym razem, kiedy wpisujesz nazwę funkcji w swoim programie, wtedy ona się wykona. Np. takie: http://ideone.com/ipehsd rozwiązanie jest niepoprawne, bo wtedy program aż 2 razy zapyta o koszt i czas pracy każdego z Panów, i to w nieodpowiednich momentach - uruchom to sobie w Dev-C++ i zobacz, jak bardzo nie działający jest ten program.

Funkcja może otrzymywać wiele parametrów, musisz je wtedy oddzielić przecinkiem, np. tak:

#include <iostream>
using namespace std;

int pole(int a, int b)
{
	return a * b;
}

int main(int argc, char** argv)
{
	cout << "Pole kwadratu o bokach 15 na 20 jest rowne " << pole(15, 20);
	return 0;
}

Ostatnia sprawa. Przekazywanie tablic. Tablice przekazujesz do funkcji tak:

#include <iostream>
using namespace std;

int sumuj(int tablica[], int rozmiar)
{
	int suma = 0;
	for(int i=0; i<rozmiar; i++)
		suma += tablica[i];
	return suma;
}

int main(int argc, char** argv)
{
	int tablica[10];
	cout << "Wpisz 10 liczb oddzielonych spacja:\n";
	for(int i=0; i<10; i++)
		cin >> tablica[i];
	cout << sumuj(tablica, 10);
	
	return 0;
}

Zwróć uwagę, w których miejscach występują [], a w których nie. Zauważ też, że funkcja sumuj() potrzebuje mieć podany rozmiar tablicy.

Istnieją różnice między przekazywaniem funkcji tablic, a zmiennych nietablicowych. Porównaj:

#include <iostream>
using namespace std;

void zwieksz(int a)
{
	a++;
	cout << "a wewnatrz funkcji zwieksz(), po operacji a++, jest rowne: " << a << "\n";
	return;
}

int main(int argc, char** argv)
{
	int a = 10;
	cout << "a na zewnatrz funkcji zwieksz(), przed jej wywolaniem, jest rowne: " << a << "\n";
	zwieksz(a);
	cout << "a na zewnatrz funkcji zwieksz(), po jej wywolaniu, jest rowne: " << a << "\n";
	return 0;
}
#include <iostream>
using namespace std;

void zwieksz(int a[])
{
	a[0]++;
	cout << "a[0] wewnatrz funkcji zwieksz(), po operacji a++, jest rowne: " << a[0] << "\n";
	return;
}

int main(int argc, char** argv)
{
	int a[10];
	for(int i=0; i<10; i++)
		a[i]=10;
		
	cout << "a[0] na zewnatrz funkcji zwieksz(), przed jej wywolaniem, jest rowne: " << a[0] << "\n";
	zwieksz(a);
	cout << "a[0] na zewnatrz funkcji zwieksz(), po jej wywolaniu, jest rowne: " << a[0] << "\n";

	return 0;
}

Sprawdź sam, na czym polega różnica w obu kodach. Wrzuć to do Dev-C++ i odpal, zobacz, co się stanie.

Okej, to powinno Ci wystarczyć do rozwiązania tego zadania. Jest to w takim stylu, w jakim Cię uczą. Oczywiście kod @twonek 'a jest o niebo bardziej elegancki, być może jutro napiszę kolejny post takiej długości jak ten i wytłumaczę, dlaczego.

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