• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czym zastąpić przekazywanie zmiennej przez referencje

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,098 wizyt
pytanie zadane 28 stycznia 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

Cześć. Uczę sie C++ z ksiazki stephena Pratta i mam taki problem. Jest takie oto zadanie: 

Napisz program proszący użytkownika o podanie do 10 wyników golfowych, które będą zapisane w
tablicy. Należy umożliwić zakończenie wprowadzania danych przed podaniem wszystkich tych
wyników. Program ma pokazać wyniki w jednym wierszu i podać wynik średni. Obsługa
wprowadzania danych, ich wyświetlania i obliczania średniej ma być zrealizowana w trzech
osobnych funkcjach przetwarzających tablice. 

Program działa jesli rozmiar tablice zmienna przekaże przez referencje ale to zadanie pochodzi z rozdizłau gdzie nie było o tym mowy takie moje pytanie jak zrobić to zadanie bez zmiennej referencyjnej. Bardzo dziekuje za pomoc. o to moj kod:

#include <iostream>

using namespace std;
int n = 10;


void wprowadzenie(double tab[], int &n) {
    double wynik;
    int i;
    for(i=0; i<n; i++) {
        cout << "Podaj wynik golfowy (0 konczy program): ";
        cin>>wynik;
        tab[i] = wynik;
        if(wynik == 0) {
            n=i;
            break;
        }
    }

}

double srednia (double tab[], int n) {
    int i=0;
    double srednia=0;
    for(int i=0; i<n; i++) {
        srednia+=tab[i];
    }
    srednia = srednia / n;
    return srednia;
}

void wyswietlanie(double tab[], double n) {

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

        cout << tab[i] << " ";
    }
    cout << endl;
    cout << "Srednia: "<<srednia(tab,n)<<endl;
}

int main()
{
    double *tab;
    tab = new double [n];
    wprowadzenie(tab, n);
    srednia(tab,n);
    wyswietlanie(tab,n);

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 28 stycznia 2019 przez criss Mędrzec (172,590 p.)
wybrane 29 stycznia 2019 przez Michał_Warmuz
 
Najlepsza
    double *tab;
    tab = new double [n];

Nie ma sensu dla dynamicznej alokacji, skoro n zawsze w tym miejscu będzie równe 10 i jednocześnie 10 doubli to wystarczająco mało, żeby móc nie musieć alokować dynamicznie (wystarczy pamięć stosu).

Co do pytania.. tej referencji w ogóle nie potrzebujesz, bo n jest globalne. Zakładając, że jednak nie jest... zamiast pisać do n (przekazanej przez ref.) ilość wpisanych wyników, zwracaj z funkcji tą wartość.

int wprowadzenie(double tab[], int n) {
    double wynik;
    int i;
    for(i=0; i<n; i++) {
        cout << "Podaj wynik golfowy (0 konczy program): ";
        cin>>wynik;
        tab[i] = wynik;
        if(wynik == 0) {
            return i+1; // +1 bo np. gdy wpisujesz pierwszy wynik, to i==0
            break;
        }
    }
 
}

int main()
{
//...
n = wprowadzenie(tab, n);
//...
}

PS: dlaczego w wyswietlanie() parametr `n` jest typu double?

komentarz 28 stycznia 2019 przez niezalogowany

Można wyrzucić z kodu break.

0 głosów
odpowiedź 31 stycznia 2019 przez dziubi21 Początkujący (310 p.)
#include <iostream>
int n = 10;

void enter_data(int [], int &);
double average(int[], int);
void show_data(int [], int);

int main(int argc, char **argv)
{
	int result[n];
	enter_data(result, n);
	show_data(result, n);
	return 0;
}

void enter_data(int results[], int &n)
{
	std::cout<<"Poda j wyniki (jesli chcesz skonczyc wpisz q)\n";		
		
		for(int i=0; i<n; i++)	{
		std::cout<<i+1<<" wynik: ";
		std::cin>>results[i];
			if(!results[i])
			n = i;					
		}	
}

double average(int results[], int n)
{
	double aver, sum=0;
		int i=0;
		for(i = 0; i<n; i++)
		{
			sum+=results[i];
		} aver = sum/i;
		return aver;
}

void show_data(int results[], int n)
{	
	std::cout<<"Poadne wyniki:\n";
		for(int i=0; i<n; i++)
		{
			std::cout<<i+1<<" wynik: "<<results[i]<<std::endl;
		}std::cout<<std::endl;
		std::cout<<"Srednia wynikow: "<<average(results, n)<<std::endl;		
}

A co powiecie na taki kod do tego zadania?

Podobne pytania

0 głosów
2 odpowiedzi 779 wizyt
pytanie zadane 29 grudnia 2018 w Java przez studenciak Nowicjusz (230 p.)
0 głosów
1 odpowiedź 396 wizyt

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...