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

Ominięcie całej funkcji

Object Storage Arubacloud
0 głosów
189 wizyt
pytanie zadane 9 listopada 2015 w C i C++ przez Plessio Obywatel (1,090 p.)

Witam, dostałem takie o to zadanie:

Srednia: napisać funckję float srednia(float *tab, int count), która pobiera tablicę zmiennych typu float o wymiarze count. Następnie wyznaczana jest wartość średniej z podanych liczb oraz zwracana do menu

I udało mi się napisać takie coś:

float srednia(float *tab, int count)
{
	float suma;
	cout << "Podaj wielkosc tablicy: ";
	cin >> count;
	for (int i = 0; i < count; i++)
	{
		tab[i] = rand() % 100;
			suma += tab[i];
	}
	cout <<  suma / count << endl;

	return 0;
}

lecz, program omija całą funkcję:

 

I nie wiem w czym problem, proszę o wskazówki jestem początkujący.

2 odpowiedzi

0 głosów
odpowiedź 9 listopada 2015 przez Muminek Dyskutant (8,650 p.)
wybrane 9 listopada 2015 przez Plessio
 
Najlepsza

Błędnie wywołujesz funkcje.

W funkcji w argumentach masz podane dwie zmienne float *tab i int count. Tablice w argumentach funkcji deklaruję się w ten sposób void funkcja (int tablica[]) a przy wywołaniu funkcji podajesz tylko nazwe tablicy. Nazwa tablicy jest wskaźnikiem do pierwszego jej elementu. 

Gdy wywołujesz funkcje to nie w taki sposób: float srednia(float *tab, int count) -> to jest deklaracja funkcji, tylko to powinno wyglądać tak:


{
float srednia (float tab[], int count); // deklaracja funkcji

// TREŚĆ KODU...

int count = 15; // rozmiar tablicy
float tab [count]; // deklaracja tablicy

// WYWOŁANIE FUNKCJI
srednia (tab, count); // wywołujesz funkcje z konkretnymi zmiennym lub wartościami

}

Oczywiście jest sposób na dynamiczną deklaracje tablicy (poprzez wprowadzoną zmienną ustalasz jej wielkość): link

komentarz 9 listopada 2015 przez Plessio Obywatel (1,090 p.)

Przerobiłem na takie coś:

float obliczanieSredniej(float *tab, int count)
{

	for (int i = 0; i < count; i++)
	{
		tab[i] = rand() % 100;
		suma += tab[i];
	}
	cout << suma / count << endl;

	return 0;
}


float srednia()
{
	int count;
	cout << "Podaj wielkosc tablicy: ";
	cin >> count;

	obliczanieSredniej(tab, count); //przy tabie jest error: argument of type float is incompatible with parameter of type float

	return 0;
}

Wywoływane takim czymś:

case '5':
		{srednia(); }
		break;

I nadal nie działa, bo wyskakuje błąd przy tabie.

komentarz 9 listopada 2015 przez Muminek Dyskutant (8,650 p.)

Linie: 

1 - przekazując tablice deklarujesz ją w inny sposób. Bo i tak jest przekazywany wskaźnik do jej pierwszego elementu. Nie potrzeba dodawania float *tab tylko float tab[]

9 - 10 Twoja funkcja jest typu float a nie void więc najlepiej byłoby gdyby zwracała coś konretnego.  Zastąp te liniki tym: return suma / count;  wtedy wartością zwracaną typu float będzie wynik działania tej funkcji. Później będziesz mógł na tym wyniku pracować.

21 - funkcja średnia nie wie o istnieniu jakieś zmiennej tab. W jej bloku czyli zakresie ważnościo taka zmienna po prostu nie występuję.  Źle to robisz. Funkcja średnia jest bez sensu. Co chciałeś nią uzyskać? 

komentarz 9 listopada 2015 przez Plessio Obywatel (1,090 p.)

Po wprowadzeniu poprawek, nadal mam problem z wywołaniem funkcji, gdzie przy tabie nadal jest ten sam błąd, a count'a musiałem znowu zadeklarować:

float obliczanieSredniej(float tab[], int count)
{
	cout << "Podaj wielkosc tablicy: ";
	cin >> count;
	for (int i = 0; i < count; i++)
	{
		tab[i] = rand() % 100;
		suma += tab[i];
	}
	return suma / count;
}

case '5':
		{
			int count;
			obliczanieSredniej(tab, count); }
		break;

Jestem początkującym i po prostu przekombinowałem z tą funkcją średnia, bo chciałem jakoś obejść problem.

komentarz 9 listopada 2015 przez Muminek Dyskutant (8,650 p.)

To może w ten sposób:

float obliczanieSredniej(float tab[], int count)
{
// Te linijki wywalamy bo wielkość tablicy podajesz jako argument funkcji.
    for (int i = 0; i < count; i++)
    {
        tab[i] = rand() % 100;
        suma += tab[i];
    }
    return suma / count;
}
 
case '5':
        
// tutaj musi być wartość liczbowa, bo
//przekazujesz konkretną wielkość którą ma tablica
            int count = 15; 

// deklarujesz tablice o wielkosci count.
// Pamiętaj, ze zmienne mają określony zakreś ważności. 
// To znaczy, że program je widzi w określonym bloku {} 
// jeżeli chcesz by był widziany wszędzie musisz go zdeklarować
//poza blokiem lokalnym
            float tablica [count];  

// nazwy zmiennych wywoływanych nie muszą
//być takie same jak zmienne podane w deklaracji funkcji
// deklarujesz zmienną do której jest przypisane wynik (return) z działania funkcji
float srednia_wynik = obliczanieSredniej(tablica, count);  

// wypisujesz wartosc zmiennej
cout << srednia_wynik;           
        break;
komentarz 9 listopada 2015 przez Plessio Obywatel (1,090 p.)

Wyskakuje mi nadal, że count musi mieć stałą wartość:

float tablica[count];

 

komentarz 9 listopada 2015 przez Muminek Dyskutant (8,650 p.)

Moje niedopatrzenie.  

Zwróciło mi się jeszcze oczy.. czemu masz char main() zamiast int main()? 

Zmien nazwę count na inną.

A przed int w lini 18 dopisz const. ( a jak nie będzie działać to w definicji funkcji dopisz do argumentu int tak samo const - ale teog nie jestem pewien)

Powinno działać

Zapoznaj się koniecznie z jakimiś kursami C++

komentarz 9 listopada 2015 przez Plessio Obywatel (1,090 p.)
Dziękuję bardzo za cierpliwość :)
komentarz 9 listopada 2015 przez adrian17 Ekspert (345,160 p.)
(formalność: jako argument funkcji nie ma jakiejkolwiek różnicy, czy napiszesz float *tab czy float tab[], to praktycznie dokładnie to samo)
0 głosów
odpowiedź 9 listopada 2015 przez gromula Stary wyjadacz (10,070 p.)
Pokaż cały kod z case'em
komentarz 9 listopada 2015 przez Plessio Obywatel (1,090 p.)
char main()
{
	while (1) {

		cout << "MENU:\n";
		cout << "Wybierz opcje:\n";
		cout << "\t1 - Odejmowanie\n";
		cout << "\t2 - Printer\n";
		cout << "\t3 - Min\n";
		cout << "\t4 - Statystyka\n";
		cout << "\t5 - Srednia\n";
		cout << "\t6 - Finder\n";
		cout << "\tx - Wyjscie\n";
		cout << "Twoj wybor: ";
		cin >> w;

		switch (w)
		{
		case '1':
		{odejmowanie(); }
		break;

		case '2':
		{ZadajPytanie(); }
		break;

		case '3':
		{min(); }
		break;

		case '4':
		{Statystyka(); }
		break;

		case '5':
		{float srednia(float *tab, int count); }
		break;

		case '6':
		{
		}
		break;

		case 'x':
			return 0;
			break;

		}

	}

}

 

Podobne pytania

0 głosów
3 odpowiedzi 1,058 wizyt
pytanie zadane 14 kwietnia 2016 w C i C++ przez TheFeniks Gaduła (4,690 p.)
0 głosów
2 odpowiedzi 880 wizyt
0 głosów
2 odpowiedzi 833 wizyt
pytanie zadane 3 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,615 zapytań

141,465 odpowiedzi

319,776 komentarzy

61,997 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...