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

[Youtube][Kurs C++] Odcinek 11: Znajdowanie największej liczby - mój własny kod

VPS Starter Arubacloud
0 głosów
631 wizyt
pytanie zadane 8 lutego 2016 w Nasze projekty przez Marcin_N_97 Stary wyjadacz (10,290 p.)
edycja 8 lutego 2016 przez Marcin_N_97

Witam!

Jestem nowy na forum, więc jeżeli umieściłem temat w złym dziale, dubluje tematy lub coś to z góry przepraszam.

Trzy dni temu zacząłem swoją przygodę z C++ - oczywiście z kursem Pana Mirosława. Aktualnie jestem na 11 odcinku. Staram się pisać programy, które są w kilku słowach opisywane,a potem wykonane przez Pana Mirosława. Spróbowałem napisać jak najbardziej czytelny, spójny, profesjonalny, z podziałem na wszystkie funkcje itp. program. Po testach wydaje mi się, że wszystko działa bez zarzutów. Teraz mam prośbę do Was - starszych stażem programistów, abyście sprawdzili czy wszystko na pewno jest ładnie napisane i czy mój program nie robi w dziwnych przypadkach jakiś numerów. Od razu mówię, że nie robiłem obsługi błędów typu, osoba nie wpisze liczby.

Problem, który ma rozwiązywać kod to wynajdowanie liczby największej oraz najmniejszej z nieznanej(wprowadzanej przez użytkownika) ilości cyfr.
Oto kod:

 

#include <iostream>

using namespace std;

void wczytaj(float *wyrazy, int ile);
float max(float *wyrazy, int ile);
float min(float *wyrazy, int ile);

int ilosc=0;

int main()
{
	cout << "Z ilu cyfr chcesz wyszukać najwieksza/najmniejsza liczbe?" << endl;
	cin >> ilosc;
	float *tablica;
	tablica=new float [ilosc];
	
	wczytaj(tablica, ilosc);
	
	int wybor;
	cout << "Jezeli chcesz poznac wartosc najwieksza wybierz 1, a jezeli wartosc najmniejsza 2." << endl;
	cin >> wybor;
	switch(wybor)
	{
		case 1:  cout << endl << max(tablica, ilosc); break;
		case 2:  cout << endl << min(tablica, ilosc);  break;
	}
	
	delete [] tablica;
	
	getchar(); getchar();
}

void wczytaj(float *wyrazy, int ile)
{
	for(int i=0; i<ile; i++)
	{
		cout << "Podaj " << i+1 << " liczbe." << endl;
		cin >> *wyrazy;
		wyrazy++;
	}	
}


float max(float *wyrazy, int ile)
{
	
	int x, y;
	x=*wyrazy;					//przypisujemy x = 1 szufladke
	y=*(wyrazy+1);				//przypisujemy y = 2 szufladke

	
	for(int i=0; i<ile+1; i++)
	{
		if(x<y)					//sprawdzamy czy x szufladka jest mniejsza od y szufladki
		{
			x=y;				//jezeli jest to przypisujemy x = y szufladke
			y=*(wyrazy++);		//a y przypisujemy nastepna szufladke
		}
		else
		{
			y=*(wyrazy++);		//jezeli nie jest to y przypisujemy nastepna szufladke
		}
	}
	
	return x;
}


float min(float *wyrazy, int ile)
{
	
	int x, y;
	x=*wyrazy;
	y=*(wyrazy+1);

	
	for(int i=0; i<ile+1; i++)
	{
		if(x>y)
		{
			x=y;
			y=*(wyrazy++);
		}
		else
		{
			y=*(wyrazy++);
		}
	}
	
	return x;
}

 

 

2 odpowiedzi

+1 głos
odpowiedź 8 lutego 2016 przez niezalogowany
wybrane 22 lutego 2016 przez Marcin_N_97
 
Najlepsza

czy wszystko na pewno jest ładnie napisane i czy mój program nie robi w dziwnych przypadkach jakiś numerów. Od razu mówię, że nie robiłem obsługi błędów typu, osoba nie wpisze liczby.

Sam sobie zaprzeczyłeś, ale jeżeli zakładamy, że mamy tylko liczby, to:

  1. brak obsługi przypadku podania ilości <= 0;
  2. nie ma obsługi przypadku w razie wpisania innej wartości niż 1 lub 2 przy wyborze (mogę wpisać dowolną liczbą i user nie będzie w żaden spoób poinformowany, że zrobił coś źle;
  3. brak wykrycia błędu wyjścia poza zakres inta (czy to od dołu, czy to od góry).

 

Styl kodu jest ogólnie ok, ale:

  1. polskie nazewnictwo, powiedzmy że może przejść na wczesnym etpaie nauki, więc ok
  2. switch, a konkrtretnie case'y w Twoim wykonaniu są nieczytelne, istnieje niepisana zasada w programowaniu (C/C++): 1 instrukcja na 1 linię
  3. endl daje się zazwyczaj na końcu wypisanej linii, łatwiej jest później zapanować nad tym co się wypisuje
case 1: 
cout << max(tablica, ilosc) << endl; 
break;

 

Btw, raczej trzymajmy się zasady, że w "Nasze projekty" wrzucamy bardziej zaawansowane rzeczy, a nie programy z początków nauki programowania lub prac domowych inaczej zaraz by nam się na forum zaroiło od tematów typu "Hello World"

komentarz 9 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Okey. Dzięki bardzo ;)

Styl pisania case'ow wziąłem z jednego z odcinków kursu (w jednej linii).

W takim razie gdybym chciał zamieszczać swoje prace to raczej na offtopie ?
komentarz 9 lutego 2016 przez niezalogowany
Inaczej, jeżeli zrobisz coś co nie jest pracą domową i jakoś wykracza poza to co jest w kursach to wrzucaj w "Nasze Projekty", ale w przypadku bardziej szablonowych (typowych) zadań, z którymi nie masz problemu to raczej się wstrzymaj.

W tym przypadku wyszukiwałeś największego i najmniejszego elementu w sposób nawiny (liniowo, elementy min i max znalazłeś przeszukując całą tablicę za każdym razem od nowa), co innego gdybyś powiedzmy znalazł elementy min i max przy jednym obiegu pętli.
komentarz 9 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
przywrócone 9 lutego 2016 przez Marcin_N_97
Przy jednym obiegu? Nie wiem jak rozwiązać ten problem w taki sposób, jedyne moje pomysły to:

1) Znaleźć największy (najcięższy) element w tablicy a następnie sprawdzić czy jest on dodatni czy ujemny. I tym samym tokiem dla minimalnej wartości. Oczywiście uwzględnić jak będą tylko minusowe itp.

2) Przepisać wczytane znaki na znaki z tablicy ASCII i sprawdzić, ilość znaków w jednej "szufladce", następnie wyznaczyć czy minus/plus z przodu oraz jak długi ciąg znaków oraz który jest największy.

Aczkolwiek pierwszy pomysł wydaje mi się dużo lepszy od drugiego. Nie mam pojęcia czy powinno to działać, musiałbym się zająć tym pisząc kod, na razie chce przerobić całe C++ oraz obiektówke i dopiero wtedy zacząć dużo więcej praktyki na kodach. Chyba, że może polecasz inaczej? ;)
komentarz 9 lutego 2016 przez niezalogowany
To był przykład kodu, któym faktycznie warto jest się chwalić. Zadanie nie jest już tak trywialne, ale pozwala zaoszczędzić nieco czasu.

Zbyt mocno kombinujesz, da się ta załatwić paroma niespecjalnie skomplikowanymi if'ami. Nie mówię, że musisz to zrobić, chyba że chcesz pokombinować
komentarz 9 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Popróbuję sobie w wolnej chwili. Na razie uczę się programowania, bo w kolejnym semestrze studiów zaczynamy od razu z obiektowym c++ :/ nie robię w końcu tego dla zaliczenia tylko z czystej chęci zdobycia doświadczenia i wiedzy. Możliwe, że za któryś tydzień odświeżę ten temat z nowym kodem.
komentarz 23 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Odświeżam temat ;)

Ifami i funkcją rekurencyjną to nie jest to proste i ładne rozwiązanie?

 

Dzisiaj wieczorkiem możliwe, że dodam kod, który stworzę na lepsze rozwiązanie tego problemu ;)
0 głosów
odpowiedź 23 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)

Hah. Po napisaniu tamtego komentarza wpadłem na najłatwiejsze rozwiązanie. Zrobiłem tylko dla liczby największej, dla najmniejsze trzeba tylko odwrócić znak <. A tutaj wklejam kod:

 

#include <iostream>

using namespace std;

void wczytaj(float *wyrazy, int ile);
float max(float *wyrazy, int ile);
float min(float *wyrazy, int ile);

int ilosc=0;

int main()
{
	cout << "Z ilu cyfr chcesz wyszukać najwieksza liczbe?" << endl;
	cin >> ilosc;
	float *tablica;
	tablica=new float [ilosc];
	
	wczytaj(tablica, ilosc);
	
	delete [] tablica;
	
	getchar(); getchar();
}

void wczytaj(float *wyrazy, int ile)
{
	int x;
	
	for(int i=0; i<ile; i++)
	{
		cout << "Podaj " << i+1 << " liczbe." << endl;
		cin >> *(wyrazy+i);
		if( i==0)
		{
			x = *wyrazy;
		}
		if( *(wyrazy+i) > *(wyrazy+i-1))
		{
			x = *(wyrazy+i);
		}
	}
	cout << x << endl;	
}

 

Dziękuję Ci Szymonie za popchnięcie mnie do refaktoryzacji kodu ;)

Podobne pytania

0 głosów
4 odpowiedzi 764 wizyt
0 głosów
2 odpowiedzi 593 wizyt
+1 głos
3 odpowiedzi 592 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!

...