[C++] Tablice

kis_s
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 1 kwie 2012, o 19:37
Płeć: Mężczyzna
Lokalizacja: warszawa

[C++] Tablice

Post autor: kis_s »

Witam,
Otóż mam do napisania pewien program. Jestem początkujący w tym programowaniu i prosiłbym o pomoc. Doszedłem do punktu 3 i nie mogę przez to przebrnąć czy ktoś mógłbym mi w tym pomóc ?
Oto zadanie:
Zmierzono wzrost grupie studentów złożonej z n osób np. 300. Okazało się, że wzrost wszystkich
studentów mieści się między 150 cm a 209 cm. Zadeklarować tablicę wzrost, elementy tej tablicy
wylosować z przedziału <150, 199>.
Podzielić studentów na 6 grup.
1. Napisać funkcję która obliczaja ile osób znajduje się w grupie 1 zawierającej studentów o
wzroście od 150 do 159, w grupie 2 zawierającej studentów o wzroście od 160-169 cm, itd.
aż do grupy 6 zawierającej studentów o wzroście 200-209 cm.
2. Napisać funkcję która oblicza procent jaki te liczby stanowią w stosunku do badanej
populacji.
3. Napisać funkcję, która oblicz średni wzrost studenta.
4. Napisać funkcję, która oblicza medianę. Mediana jest to środkowa wartość w posortowanej
tablicy wzrost, w przypadku parzystej liczby elementów tablicy jest to średnia dwóch
środkowych wartości
5. Podać która grupa jest najliczniejsza, jeśli są dwie lub więcej równolicznych grup podać
wszystkie.
6. Narysować histogram w złożony z ‘*’. Histogram pokazuje liczebności poszczególnych
grup.

A tutaj mój kod :

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>

using namespace std;
# define dlugosc 10
void losuj ( int tab[], int n){
 for (int i=0; i<n;i++) {
     tab[i]=rand()%60+150;
                          }
     }
void wypisz (int tab[], int n){
     for (int i=0;i<n;i++){
         cout << tab[i] << " " ;
         }
    }
void pogrupuj (int tab[],int tab1[],int n){
       for (int i=0;i<n;i++){   
           tab1[(tab[i]-150)/10]++;
           }       
}
void procent (int tab[],int n){
     for (int i=1;i<=6;i++){
         cout<< "grupa " <<i<< " stanowi: " <<tab[i]*100/n << "% ogolu" <<endl; 
        }
}

void sr (int tab[],int n ){
	for (int i=0;i<n;i++){
	cout << (tab[i]+tab[i+1])/n;	
	}

}


     
int main(int argc, char *argv[])
{
    int grupy[6]={0}, wynik;
        int wzrost[dlugosc];
        
    losuj (wzrost, dlugosc);
      
    wypisz (wzrost,dlugosc);
    
    cout << endl;
    
    
    pogrupuj(wzrost,grupy,dlugosc);
    cout << endl;
    
   for (int i=1;i<=6;i++){
       cout << "ilosc osob w grupie " << i <<"= "<< grupy[i] ;
    
    cout << endl;
}cout << endl;

    procent(grupy,dlugosc);
    cout << endl;
    
sr (wzrost,dlugosc);
 cout << endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
zhtk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 2 kwie 2012, o 10:53
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 2 razy

[C++] Tablice

Post autor: zhtk »

Jak się domyślam problem tkwi w funkcji sr. Oto poprawiony kod:

Kod: Zaznacz cały

void sr (int tab[],int n ){
     long long int suma=0;
     for (int i=0;i<n;i++) suma+=tab[i];
     cout<<suma/n<<endl;
}
kis_s
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 1 kwie 2012, o 19:37
Płeć: Mężczyzna
Lokalizacja: warszawa

[C++] Tablice

Post autor: kis_s »

dzięki wielkie mam kolejne pytanie co do 4 pkt. Na początek należy posortować tablice a po tym wyznaczyć medianę tak też zrobiłem :

Kod: Zaznacz cały

void sortowanie (int tab[dlugosc],int n,int x){
	n=dlugosc;
	for (int i=0;i<n-1;i++){
		for (int j=0;j<n-i-1;j++){
		
			if (tab[j]>tab[j+1]){
			x=tab[j];
			tab[j]=tab[j+1];
			tab[j+1]=x;
		}	
		}
	}

     for (int i=0;i<n;i++){
         cout << tab[i] << " ";
		}
}
tylko teraz nie wiem jak odwołać się do posortowanej tablicy.
A taki miałem pomysł na obliczenie miediany:

Kod: Zaznacz cały

	if (dlugosc%2==0)    // dlugosc - wielkosc tablicy
		cout << wzrost[dlugosc/2]<< " " << wzrost[dlugosc/2+1]<<endl ;   // wzrost - nazwa tablicy
	if (dlugosc%2!=0)
	cout << wzrost[dlugosc+1/2]<< endl;
dexter90
Użytkownik
Użytkownik
Posty: 391
Rejestracja: 11 lis 2011, o 09:48
Płeć: Mężczyzna
Pomógł: 32 razy

[C++] Tablice

Post autor: dexter90 »

Jak odwołać? Heh po nazwie, posortowałeś już, więc w czym dalej problem.
kis_s
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 1 kwie 2012, o 19:37
Płeć: Mężczyzna
Lokalizacja: warszawa

[C++] Tablice

Post autor: kis_s »

no jak napisałem tak jak teraz to jak kompiluje to mi pokazuje medianę nie posrotowanej tablicy
dexter90
Użytkownik
Użytkownik
Posty: 391
Rejestracja: 11 lis 2011, o 09:48
Płeć: Mężczyzna
Pomógł: 32 razy

[C++] Tablice

Post autor: dexter90 »

Posortowania tablica niech będzie "w drugiej tablicy".

Pozdrawiam
kis_s
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 1 kwie 2012, o 19:37
Płeć: Mężczyzna
Lokalizacja: warszawa

[C++] Tablice

Post autor: kis_s »

nie bardzo wiem jak to zrobić...
zhtk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 2 kwie 2012, o 10:53
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 2 razy

[C++] Tablice

Post autor: zhtk »

Tutaj problematyczne jest chyba to, że tablicę przekazujesz jako argument funkcji. Opisana przez Ciebie procedura działa tak:
1. Skopiuj tablicę przekazywaną jako argument funkcji sortowanie na stos.
2. Posortuj tablicę
3. Wypisz posortowany ciąg
4. Usuń posortowaną tablicę ze stosu
5. Zakończ wykonywanie procedury

Medianę wypisujesz w innej funkcji, więc nie ma ona dostępu do posortowanej tablicy (która została usunięta). Twój kod można naprawić na 2 sposoby:
1. Przekazujesz tablicę do posortowania przez zmienną globalną:

Kod: Zaznacz cały

int tablica[]={1,5,3,4,2};
void sortuj(){
       //Posortuj zmienną tablica
}
2. Jako argument funkcji przekazujesz referencję do tablicy (taki wskaźnik). Poprawiona funkcja wyglądałaby mniej-więcej tak:

Kod: Zaznacz cały

void sortowanie (int &tab[dlugosc],int n,int x){
        //Kod funkcji
}
Zwróć uwagę na ampersand przy nazwie zmiennej. Informuje on kompilator, że nie ma on tworzyć kopii tablicy na stosie tylko że ta zmienna ma wskazywać na tablicę która jest przekazywana jako argument.

Brzmi to zawile, ale jest całkiem proste. Pozdrawiam.
kis_s
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 1 kwie 2012, o 19:37
Płeć: Mężczyzna
Lokalizacja: warszawa

[C++] Tablice

Post autor: kis_s »

Dzięki wielkie za pomoc. Temat można zamknąć.
Pozdrawiam. No i z okazji zbliżających świąt to życzę Wszystkim wszystkiego co najlepsze! ;D
ODPOWIEDZ