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

Różnice między programowaniem proceduralnym i strukturalnym.

Object Storage Arubacloud
+3 głosów
4,288 wizyt
pytanie zadane 30 czerwca 2018 w C i C++ przez Huberti Gaduła (4,500 p.)
Witam, jakie są różnice między programowaniem proceduralnym i strukturalnym. Kiedy o programie powiemy, że napisany jest proceduralnie, a kiedy strukturalnie? Może ktoś załączyć jakiś kod źródłowy rozwiązujący ten sam problem tymi dwoma paradygmatami programowania?

2 odpowiedzi

+2 głosów
odpowiedź 30 czerwca 2018 przez RafalS VIP (122,820 p.)
wybrane 1 lipca 2018 przez Huberti
 
Najlepsza

Wszystkie programy dzisiaj są pisane strukturalnie dlatego tego nie widać. W programowaniu strukturalnym chodzi o używanie struktur, które kontrolują flow programu w stylu for, switch, while, if, else zamiast skakania sobie przy pomocy goto.

	int i = 0;
	int sum = 0;
	poczatek:
	sum += i;
	i++;
	if(i<10) //tu mi sie wkradło strukturalne, ale nie wiem jak zrobic ifa nie-strukturalnie :P
		goto poczatek;
	return 0;

gdybyśmy nie mieli pętli for to tak byśmy je pisali i jest to podejście nie-strukturalne. Podejście niestrukturalne było stosowane wieki temu kiedy więcej pisało się w assemblerze. Wtedy każdy kod bazował właśnie na liniowych operacjach i skokach. Nie było zagnieżdzeń, kod był płaski. Teraz wprowadzam podejście strukturalne:

	int sum = 0;
	for (int i = 0; i < 10; i++) {
		sum += 0;
	}

Mamy strukture, która kontroluje flow programu. Nie musimy sami pisać skoków.

Podejście proceduralne polega na podzieleniu programu na procedury czyli funkcje:

void policzSume(int * sum, int max_i) {
	for (int i = 0; i < max_i; i++) {
		*sum += 0;
	}
}
void wypiszSumeNaEkran(int sum) {
	std::cout << "suma wynosi: " << sum << std::endl;
}
int main()
{
	int sum = 0;
	policzSume(&sum, 10);
	wypiszSumeNaEkran(sum);
	return 0;
}

 

komentarz 30 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
A obiektowe polega na używaniu obiektów, czy na ich tworzeniu?
komentarz 30 czerwca 2018 przez RafalS VIP (122,820 p.)
Zdecydowanie na tworzeniu. Projektujesz system dzielac go na oddziałujące miedzy soba obiekty. Jak bd przed laptopem to napisze kod ilustrujacy roznice.

Generalnie największa roznica miedzy wolnymi funkcjami (proceduralnym) a metodami (obiektowym) jest taka ze obiektowe łączy stan (zmienne) z zachowaniem (funkcje). Stan obiektu powinien byc niedostepny na zewnatrz. Klasa definiuje swoj publiczy interfejs czyli sposoby w ktore mozesz z tej klasy korzystac.
komentarz 30 czerwca 2018 przez Huberti Gaduła (4,500 p.)

Bardzo dziękuję za przejrzyste wyjaśnienie. Mam jeszcze jedno pytanie. Czy program proceduralny zawsze jest również programem strukturalnym?

Czyli czy poniższy program możemy nazwać proceduralnym i strukturalnym, czy tylko proceduralnym?

void show(int source) 
{
    std::cout << source << std::endl;
}

int main()
{
    show(5);
    return 0;
}
2
komentarz 30 czerwca 2018 przez RafalS VIP (122,820 p.)

Każdy program proceduralny jest też programem strukturalnym (ze względu na użycie wywołań funkcji, które są tymi "strukturami" sterującymi przebiegiem programu).

komentarz 30 czerwca 2018 przez RafalS VIP (122,820 p.)

Jeszcze co do proceduralnego vs obiektowego.

Proceduralnie:

//generalnie ciala funkcji są nieistotne tutaj
int policzDlugoscNapisu(const char* napis) {
	return strlen(napis);
}
void obrocNapis(char* napis) {
	char* koniecNapisu = strchr(napis, 0);
	std::reverse(napis, koniecNapisu);
}

char * polaczNapisy(const char* napis1, const char* napis2) {
	int dlugosc = strlen(napis1) + strlen(napis2);
	char * napis =(char*) malloc(dlugosc);
	strcpy(napis, napis1);
	strcat(napis, napis2);
	return napis;
}
int main()
{
	char napis[100];
	strcpy(napis, "ale jaja panie ferdku");
	cout << policzDlugoscNapisu(napis) << endl;
	obrocNapis(napis);
	char* polaczone = polaczNapisy(napis, "no elo");
	return 0;
}

Obiektowo:

class Napis {
public:
	Napis(const char* zawartosc) {
		strcpy(napis, zawartosc);
		dlugosc = strlen(zawartosc);
	}
	void obroc() {
		char* koniecNapisu = strchr(napis, 0);
		std::reverse(napis, koniecNapisu);
	}
	void dodaj(const char* dodawanyNapis) {
		strcat(napis, dodawanyNapis);
	}
	const char* zwrocJakoTabliceCharow() {
		return napis;
	}
private:
	char napis[100];
	int dlugosc = 0;
};
int main()
{
	Napis napis("juz chyba troche lepiej");
	napis.dodaj(", no nie?");
	napis.obroc();
}

I generalnie na tym polega różnica. Proceduralne separuje zachowanie od stanu. Czyli funkcje od danych (zmiennych) na których pracują, przez co albo dane są globalne albo przekazywane do funkcji. Obiektowe łączy dane z funkcjami jakie można na nich wykonywać. Czyli łączy dane z zachowaniem. Mamy zamienną typu tablica charów reprezentującą napis więc implementujemy zachowania napisu, jego interfejs publiczny, co można z nim zrobić i w podejściu obiektowym ta tablica charów jest połączona z zachowaniem. Ma to w cholere zalet, poczytajcie gdzies, nie chce mi sie tlumaczyć.

Podobne pytania

+3 głosów
2 odpowiedzi 2,575 wizyt
pytanie zadane 20 czerwca 2021 w C i C++ przez Martita Bywalec (2,500 p.)
0 głosów
1 odpowiedź 279 wizyt

92,620 zapytań

141,474 odpowiedzi

319,816 komentarzy

62,005 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!

...