"Która i jaka liczba występuje najczęściej w tablicy?" 25721 30

O temacie

Autor diegomez

Zaczęty 22.01.2013 roku

Wyświetleń 25721

Odpowiedzi 30

diegomez

diegomez

Labirynt
posty452
Propsy63
  • Labirynt
Mam problem odnośnie takiego pewnego zadania.
Mianowicie... komputer ma wylosować dowolną ilość liczb w tablicy, następnie sprawdzić, która liczba występuje najczęściej i wyświetlić tą liczbę i powiedzieć ile razy została ona powtórzona.

Np.
Mamy tablicę 6 znaków z przedziału od 0 - 3
( 3 2 0 1 3 3 )
Komputer ma sprawdzić, która występuje najczęściej.
( 3 )
I powiedzieć ile razy ona wystąpiła
( 3 )

No i nie wiem jak się za to zabrać. Ma ktoś pomysł ? Nie chodzi mi o gotowy skrypt tylko o wytłumaczenie sposobu na to.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Zrób sobie drugą tablicę tab2 o takim samym rozmiarze co tab i dla każdego elementu w tab sprawdzaj jaką ma wartość i zwiększaj odpowiedni element w tab2 o 1. Jeśli wartości w tablicy mogą być ujemne, to utwórz klasę para, która przechowuje indeks i wartość albo użyj vector < pair<int,int> >.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Adanos. Ładnie wyskoczyłeś z tym tworzeniem klasy. To może być jakieś proste zadanie na jakiś przedmiot na którym zapewne nie doszli do obiektowości jeszcze :) .

Swoją drogą sposobów jest pewnie z tuzin. Niektóre prostsze, inne trochę bardziej skomplikowane i mniej zasobożerne.

Jak już się bawimy w obiektowość, to ja bym po prostu użył jednego obiektu na cały program - Map - i pewnie z 2 lub trzech funkcji, choć i to niekoniecznie, bo pewnie dałoby się to zrobić durnym forem i tyle.
 
Popisuje się ciągle menda jedna...

diegomez

diegomez

Labirynt
posty452
Propsy63
  • Labirynt
...i dla każdego elementu w tab sprawdzaj jaką ma wartość i zwiększaj odpowiedni element w tab2 o 1.
Wytłumaczysz mi to lepiej? Nie bardzo wiem czemu to ma służyć?
(Ujemnych nie ma)
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Niech tab = {3 2 0 1 3 3}. Jeśli znasz przedział liczb 0 - n , to robisz tab2[n]. Jeśli nie tab2 ma taki sam rozmiar jak tab.

Wszystkie elementy w tab2 są równe 0. tab2[0] oznacza, ile elementów 0 występuje w tab, tab2[1] oznacza, ile elementów 1 występuje w tab itd.

W pętli for sprawdzasz po kolei elementy w tab. Jeśli tab ma wartość 3, to tab2[3] zwiększ o 1.

Na końcu znajdujesz indeks oraz maksimum w tab2. Indeks w tej tablicy oznacza, jaka liczba występuje najczęściej, a maksimum ile razy występuje.

Cytuj
Adanos. Ładnie wyskoczyłeś z tym tworzeniem klasy. To może być jakieś proste zadanie na jakiś przedmiot na którym zapewne nie doszli do obiektowości jeszcze :) .
Podałem co najmniej dwa sposoby. Napisał w nazwie tematu, że chodzi mu o C++, więc trudno nie pisać obiektowo, skoro już strumienie są obiektami.

LeOn91

LeOn91

Użytkownicy
posty60
Propsy7
  • Użytkownicy
Jeśli mamy liczby z zakresu 0-3 to nie widze powodu,żeby tworzyć nie wiadomo jak skomplikowany kod.

Deklaracja 4 zmiennych,
pętla FOR która sprawdza kolejno każdy element tablicy,
jeśli aktualny element =0,zwiększaj zmienną j0,w przeciwnym wypadku:
jeśli aktualny element =1,zwiększaj zmienną j1,w przeciwnym wypadku:
jeśli aktualny element =2,zwiększaj zmienną j2,w przeciwnym wypadku:
zwiększaj zmienną j3.
Sprawdzenie która zmienna jest najwięszka/sortowanie i wyświetlenie największej, lub jeśli sortowaliśmy to wyświetlenie pierwszej/ostatniej.

EDIT:UP, nie doczytałem, bo w sumie podałeś to samo tylko, że zamiast zmiennych zapisujesz wyniki w tablicy, no ale może mój "pseudokod" jakoś pomoże autorowi.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Aż chamsko widać, że to na jakieś zajęcia... No bo taki problem dla tak małych zestawów liczb przy poważnych projektach chyba za bardzo się nie pojawia :)
 
Popisuje się ciągle menda jedna...

Żadna Głupia Spółgłoska

Żadna Głupia Spółgłoska

Użytkownicy
Mniejszość Żydowska na HMS Stuleja
posty2557
Propsy3534
ProfesjaGracz
  • Użytkownicy
  • Mniejszość Żydowska na HMS Stuleja
 
Często odkrywa się, jak naprawdę piękną jest rzeczywiście piękna kobieta dopiero po długim z nią obcowaniu. Reguła ta stosuje się również do Niagary, majestatycznych gór i meczetów, szczególnie do meczetów.
Mark Twain

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
W Excelu bym to zrobił :lol2:
Śmiej się śmiej, ale do excela można normalnie kodzić w visual basicu. Teoretycznie to można grę zrobić w excelu.
 
Popisuje się ciągle menda jedna...

Żadna Głupia Spółgłoska

Żadna Głupia Spółgłoska

Użytkownicy
Mniejszość Żydowska na HMS Stuleja
posty2557
Propsy3534
ProfesjaGracz
  • Użytkownicy
  • Mniejszość Żydowska na HMS Stuleja
Z chęcią się tego nauczę, bo w sumie połowa mojej dysertacji to Excel, a druga połowa to perl i klient ssh. Wiem że w Excelu makra robi się na bazie kodu, ale nigdy się w to nie bawiłem. Nieraz problemem dla mnie jest to, że muszę używać kilku różnych funkcji (i sporo się nakombinować), żeby jakoś krok po kroku przefiltrować dane. Potrafi mi się zwiesić komp z czterema rdzeniami i 8 GB RAMu. Jeden proces w Excelu liczony kilka minut, tak że nie pozostaje mi nic innego jak grać w Sudoku na telefonie :D
 
Często odkrywa się, jak naprawdę piękną jest rzeczywiście piękna kobieta dopiero po długim z nią obcowaniu. Reguła ta stosuje się również do Niagary, majestatycznych gór i meczetów, szczególnie do meczetów.
Mark Twain

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Z chęcią się tego nauczę, bo w sumie połowa mojej dysertacji to Excel, a druga połowa to perl i klient ssh. Wiem że w Excelu makra robi się na bazie kodu, ale nigdy się w to nie bawiłem. Nieraz problemem dla mnie jest to, że muszę używać kilku różnych funkcji (i sporo się nakombinować), żeby jakoś krok po kroku przefiltrować dane. Potrafi mi się zwiesić komp z czterema rdzeniami i 8 GB RAMu. Jeden proces w Excelu liczony kilka minut, tak że nie pozostaje mi nic innego jak grać w Sudoku na telefonie :D

To na jakich ty wielkich zbiorach danych operujesz, że taki komp nie daje rady?
 
Popisuje się ciągle menda jedna...

diegomez

diegomez

Labirynt
posty452
Propsy63
  • Labirynt
Jeśli mamy liczby z zakresu 0-3 to nie widze powodu,żeby tworzyć nie wiadomo jak skomplikowany kod.

Np.
Mamy tablicę 6 znaków z przedziału od 0 - 3
( 3 2 0 1 3 3 )
Komputer ma sprawdzić, która występuje najczęściej.
( 3 )
I powiedzieć ile razy ona wystąpiła
( 3 )


Dla przykładu podałem zakres 0-3. Obecnie mam zakres 0-50, wystarczy że dopiszę do 51 jedno 0 i mam zakres 0-509.
Gdyby ta tablica była w takim zakresie jak dałem dla przykładu to nie miałbym problemu z tym zadaniem.
 

LeOn91

LeOn91

Użytkownicy
posty60
Propsy7
  • Użytkownicy
Z racji tego,że trwa sesja,a ja robie wszystko,żeby tylko sie nie uczyć.Postanowiłem napisać coś co Ci pomoże. Nie jestem specem od programowania,co chyba widać,ale udało mi sie napisać program króry powinien Ci pomóc. Efektem tego programu jest tablica, która wypisuje pokolei ile razy dana liczba została umieszczona w tablicy wejściowej. Lekka modyfikacja , sortowanie ,chwila zabawy i będziesz miał to co potrzebujesz. #include <stdio.h>
#include <conio.h>
#include <iostream>

using namespace std;
int main ()
{
int tab[10];
int tabrob[10];
int a;
for (int i=0;i<10;i++)
{

cout << ("podaj wartosc ktora wpisac do komorki tablicy");
cin >> tab[i];

}
cout << "liczby w tablicy to: ";
for (i=0;i<10;i++)
{

cout << tab[i] ;
cout << " " ;
}
cout << "\n";
for (i=0;i<10;i++)
tabrob[i]=0;
for (i=0;i<10;i++)
{
a=0;
a=tab[i];
tabrob[a]+=1;
}
for (i=0;i<10;i++)
{

cout << tabrob[i];
cout << " ";
}
}

EDIT:
Cytuj
Obecnie mam zakres 0-50, wystarczy że dopiszę do "51" jedno "0" i mam zakres 0-509.
Gdyby ta tablica była w takim zakresie jak dałem dla przykładu to nie miałbym problemu z tym zadaniem.
To chyba jakaś matematyka wyższa...?:P
 

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
upryedzam ze programatorem nie jestem
jak rozumiem to on ma liczby od 0-50 a  tab[10],tabrob[10] maja  index  0-9
a=tab[i];
       tabrob[a]+=1;
v takim razie jak będzie
tab= 30;
to
a = 30;i
tabrob[30]
nie istnieje ...
 


LeOn91

LeOn91

Użytkownicy
posty60
Propsy7
  • Użytkownicy
Jasne, ale skoro autor nie wie na jak dużych liczbach będzie operował to napisałem przykładowy kod, który można w łatwy sposób zmienić. A ponadto moim celem było nakierowanie go jedynie na poprawne rozwiązanie, nie mam zamiaru odwalać całej roboty za kogoś,w końcu prosił o pomoc.

Nie bardzo też rozumiem pierwszy post, komputer ma wylosować ilość liczb w tablicy i wygenerować zawartość tej tablicy losowo? Bo jeśli ma wylosować rozmiar tablicy to trzeba najpierw wylosować np n które niech wyniesie 40, a potem zadeklarować tablice tab[n],nie wiem jednak czy to przejdzie,bo rozmiar tablicy powinien być znany przed kompilowaniem(chyba,że mowa o tablicach dynamicznych). No i w sumie jeśli najpierw wylosujemy ,a potem zadeklarujemy tab[n] to znamy rozmiar tablicy,ale czy kompilator to kupi to trzebaby sprawdzić.

Druga sprawa to wygenerowanie zawartości tablicy,ale to już zwykłym FOR'em zrobimy.

Jak mówiłem,nie jestem programistą,może wypowie sie ktoś kto sie zna  :)
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
a ja tu już wymyślałem jak skodzić, żeby to działało dla dowolnej liczby dowolnych cyfr :P
 
Popisuje się ciągle menda jedna...

LeOn91

LeOn91

Użytkownicy
posty60
Propsy7
  • Użytkownicy
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
no uniwersalny algorytm do rozwiązywania tego typu problemu bez ograniczeń w postaci przedziału cyfr bądź ich ilości.
 
Popisuje się ciągle menda jedna...

LeOn91

LeOn91

Użytkownicy
posty60
Propsy7
  • Użytkownicy
A... ok.
No to myśle,że tak jak napisałem będzie najłatwiej.
1.Wylosować n
2.Zadeklarować tab[n]
3.Wypełnić tab[n] wartościami za pomocą FOR'a
4.Zmienić troche mój kod powyższy.
5.Znaleźć największą wartość w tablicy
6.Zwrócić index komórki  największej wartości i samą wartość,otrzymamy wtedy liczbe(index tablicy) oraz ilość wystąpień.

Inna sprawa,że jeśli losujemy dowolną liczbe to może Ci wylosować 50 a może kilka tysiecy.

Z resztą nie ma sensu sie rozwodzić już nad tym,bo chyba sam autor tematu olał sprawe.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
skąd wiesz jakiej wielkości jest n i jak dużą tablicę zadeklarować?  :lol:  . W cepie chyba nie ma tablic o dynamicznej wielkości ;)
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry