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

Tworzenie tablic z użyciem pętli

Object Storage Arubacloud
+1 głos
3,042 wizyt
pytanie zadane 6 listopada 2015 w C i C++ przez Mr. Satan Początkujący (390 p.)
Cześć!

Całkiem niedawno zacząłem się uczyć programowaćw C++, aktualnie przystanąłem po odcinku 5, aby ogarnąć materiał, który dotąd obejrzałem ;) Ale do rzeczy:

Problem jest mianowicie taki, że chciałbym przy użyciu tablicy i pętli wpisać sobie numerki (to nie problem, ale zaraz się pojawi), lecz te numery nie mogą być takie, jak poprzednie. Czyli wpisując w tablicy powiedzmy o nazwie tablica_liczby[1] nie mogę wpisać 5, bo wpisałem już ją do numer [0]. Tak samo z późniejszymi. I problem jest, jak to wykonać? Jak sprawić, by liczby nie mogły być takie same? Oczywistym jest, że potrzebna jest tutaj instrukcja warunkowa, ale nie wiem jak ją poprawnie zapisać. Ponadto jeszcze jedna, istotna rzecz: Jesli już uda mi się zrobić, by liczby z tablic nie mogły być takie same, jak zrobić, by za pomocą instrukcji warunkowej wracać do pętli? Coś tam napisałem:

if (tablica[i]==tablica[i-1])
    {
        cout << "Liczby nie moga sie powtarzac!";
    }

I wtedy pętla jest robiona na nowo, a komórka z liczbą przepada.

P.S To u góry jest złe, widzę to, bo po wpisaniu na początku liczby "1" wyskakuje komunikat z instrukcji warunkowej :P

5 odpowiedzi

+2 głosów
odpowiedź 6 listopada 2015 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 8 listopada 2015 przez Mr. Satan
 
Najlepsza
#include <iostream>

int main()
{
	int tablica[10];
	for(int i = 0; i < 10; i++)
	{
		std::cin >> tablica[i];
		if(std::cin.fail() || !std::cin.good())
		{
			std::cout << "Wpisales niepoprawna wartosc. Sprobuj ponownie" << std::endl;
			i--;
			std::cin.clear();
			std::cin.sync();
			continue;
		}
		for(int j = 0; j < 10; j++)
		{
			if(j != i)
			{
				if(tablica[j] == tablica[i])
				{
					std::cout << "Wpisales wartosc, ktora sie juz powtorzyla. Sprobuj ponownie" << std::endl;
					i--;
					break;
				}
			}
		}
	}
	return 0;
}

Wiem, że mnie zminusujecie za gotowca, ale niektórzy po prostu lubią się z nich uczyć, a najlepszym sposobem nauki programowania jest analizowanie (ze zrozumieniem) cudzego kodu. Więc życzę autorowi pytania powodzenia w tym!

komentarz 6 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Czyli teraz czeka mnie dość sporo analizy ;) Człowiek ciągle musi uczyć się czegoś nowego, a to z pewnością nie jeden raz wykorzystam. Dziękuję pięknie, choć poczekam jeszcze na odpowiedzi innych, chyba, że to jedyny sposób wykonywania takiej operacji, jaką chcę wykonać :)
komentarz 6 listopada 2015 przez Patrycjerz Mędrzec (192,320 p.)

Sorki, był jeden błąd (nie czyściłem bufora oraz błędnych flag strumienia wejścia).

A co do innych sposób, to teoretycznie może być ich nieskończenie wiele - jedne lepsze, drugie gorsze. Wg mnie mój sposób jest dość prosty i wydajny (w tego typu programach trudno zrobić coś mało wydajnego smiley), ale jeśli chcesz poczekać na coś lepszego...

komentarz 6 listopada 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
A czym jest "continue;"? Po co on?
komentarz 6 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Hmm... Do czego służy std: ? Tak się zastanawiam, bagatela, nawet teraz szukam do czego to służy, ale to chyba znaczy, że zapewne w jakimś następnym odcinku jest o tym mowa.
komentarz 6 listopada 2015 przez Patrycjerz Mędrzec (192,320 p.)

Condzi, ja ty się uczysz języka? Najpierw trzeba przerobić podstawy, czyli m.in. wszystkie słowa kluczowe, aby zacząć cokolwiek robić, a ty jednak tego nie zrobiłeś. Choć wytłumaczenie tego problemu znalazłbyś bezproblemowo w Sieci, to jednak ci wytłumaczę, co w trawie piszczy wink Więc polecenie continue powoduje przeskoczenie wykonywania programu od tego polecenia do początku pętli, czyli umożliwia ono pominięcie wszystkich poleceń, które by się wykonały w danym obiegu pętli bez tego polecenia.

komentarz 6 listopada 2015 przez Patrycjerz Mędrzec (192,320 p.)

Std jest przestrzenią nazw (nie zaprzątaj sobie głowy tą definicją na początek), którą można, ale nie trzeba, pisać przy elementach, które się w niej zawierają. U pana Mirka pewnie piszecie linijkę using namespace std, co nie? Więc po napisaniu tego nie musisz już pisać tego przedrostka std, tylko samo odwołanie do elementu.

Ale taki zapis powoduje nieczytelność kodu i profesjonaliści zazwyczaj piszą wszystkie przedrostki. Ja wyrobiłem w sobie taki nawyk i jest mi z nim bardzo dobrze smiley 

komentarz 6 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Jak dotąd nie doszedłem do przestrzeni nazw, choć zaraz biorę się za przerabianie następnego odcinka, bo bez zrozumienia podstaw nie idzie zrobić (z łatwością, oczywiście) zabiegów takich, jak chce :D Generalnie powoli, ale do przodu ^^
+1 głos
odpowiedź 6 listopada 2015 przez Michał628496 Pasjonat (17,340 p.)
edycja 7 listopada 2015 przez Michał628496

Może takie coś:



bool sprawdz(int *tab,int rozmiar,int wartosc,int indeks) //Czy ta wartość jest taka jek poprzednia?
{ 
    if(indeks>0)
{
    if(tab[indeks-1]==wartosc) return true;
    else return false;
}
}

 

+1 głos
odpowiedź 6 listopada 2015 przez niezalogowany
Czyli tak naprawdę mamy analogiczną sytuację do losowania liczb bez powtórzeń, możesz to albo zrobić w sposób naiwny (przechodzisz przez całą tablicę i sprawdzasz czy taka liczba się pojawiła, rozwiązanie zaproponowane przez @Michał628496) lub nieco sprytniejszy, jednak bardziej opłacalny przy większej ilości danych: przez wykorzystanie np drzewa binarnego, bo obawiam się że sortowanie za każdym razem będzie zbyt kosztowne.

Tylko, że wtedy wyjdziesz ze zwykłych tablic i zapisu t[i], na rzecz wskaźników. Skoro mówisz, że dopiero zaczynasz to naiwna metoda będzie dla ciebie dużo lepiej zrozumiała i na pewno cie nie zniechęci.
0 głosów
odpowiedź 6 listopada 2015 przez Boshi VIP (100,240 p.)
Chodzi ci o wypełnienie tablicy bez powtórzeć liczbami?
 Czy o wypelnienie tablicy od 1-n ?
komentarz 6 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Bez powtórzeń ;)

Po prostu chciałbym napisać coś, gdzie przykładowo w tablicy numer [4] nie będzie można wpisać liczb, które były użyte w poprzednich tablicach.
0 głosów
odpowiedź 6 listopada 2015 przez jeremus Maniak (59,720 p.)
coś takiego ?

n=0; ile=10;

while ( n<ile )

{

  cin >> liczba ;

  j=0; while ( j<n && tablica[j] != liczba ) j++;

  if ( j == n ) { tablica[n]=liczba; n++; }

}
komentarz 6 listopada 2015 przez Mr. Satan Początkujący (390 p.)
Raczej nie, chyba w tym wypadku działało by to tylko dla jednej tablicy, a tam na górze ktoś dobrze napisał instrukcje, gdzie nawet jeśli w ostatniej tablicy wartość będzie miała jak jakaś poprzednia, zostanie wyświetlony odpowiedni komunikat i ponowna próba :)

 

BTW: Kiedy j=0 i n=0 w warunku nr 1 j<n nie da zasem wartości fałszywej? :X

Podobne pytania

0 głosów
1 odpowiedź 1,138 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez CichoCiemny Początkujący (480 p.)
0 głosów
2 odpowiedzi 119 wizyt
pytanie zadane 30 czerwca 2017 w Python przez DODO Bywalec (2,950 p.)
0 głosów
2 odpowiedzi 1,877 wizyt
pytanie zadane 3 sierpnia 2018 w C i C++ przez Kr1$u Początkujący (310 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...