• 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

VPS Starter Arubacloud
0 głosów
778 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 550 wizyt
pytanie zadane 29 grudnia 2018 w Java przez studenciak Nowicjusz (230 p.)
0 głosów
1 odpowiedź 313 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...