Wstęp

Wstęp

Zostałeś już narażony na niewielką część tego, jakie kontrola przepływu jest w naszej poprzedniej części, a mianowicie sekcja o operatorach relacyjnych. Gdy zaczniesz pisać bardziej złożone programy, poczujesz potrzebę kontrolowania zamówienie w którym program wykonuje różne części.
Kontrola przepływu jest obecna w większości języków programowania w takiej czy innej formie, a to, co zamierzasz tutaj przeczytać, jest niezbędne do pisania programów C.

Jeśli/else/inaczej jeśli

Ta część kontroli przepływu jest prawdopodobnie najbardziej intuicyjna i prostsza, chociaż można łatwo spaść na ciemną stronę i zacząć pisać niezrozumiały kod z IFS. Pomysł jest prosty: if (warunek_is_true) do_something; else do_something_else; . Chodzi więc o logikę, logikę binarną, w której wyrażenie może mieć dwie wartości: prawda lub fałsz. Jeśli użyłeś C lub Java, jesteś używany z bobolem danych. Zmienna bool może być tylko prawdziwa lub tylko fałszywa w danym momencie. Ale C, chociaż nie ma danych BOOL, ułatwia radzenie sobie z logiką binarną, jak zobaczysz.

Powiedzmy, że chcesz powiedzieć użytkownikowi swojego programu, jeśli jest stary, czy nie, w zależności od jego wieku. Nie do końca przydatne i ewentualnie obrażające, ale dla zilustrowania naszego punktu, to zrobi. Tak więc główną ideą jest: jeśli wprowadzony wiek jest powyżej progu, mówimy użytkownikowi, że jest stary. Jeśli nie, mówimy mu/jej, on/ona jest wciąż młody i kwitnie. Kod takiego programu wyglądałby tak:

#include #Define Limit 50 int main () int wiek; printf („Witaj, wprowadź swój wiek!\ n ”); scanf („%d ”i wiek);  Jeśli(wiek < LIMIT)  printf("Your age is %d.\n", age); printf("Quite young, I say.\n");  w przeciwnym razie Jeśli(wiek == limit) printf („Mówisz, że twój wiek to %d.\ n ", wiek); printf (" prawie tam.\N");  w przeciwnym razie printf („Więc twój wiek to %d, huh?\ n ", wiek); printf („ geezer.\N");  powrót 0; 

Ten program wyraźnie nie ma praktycznego zastosowania, ale są w nim elementy, które pomogą nam przekazać nasz punkt i zilustrować nowe elementy. Na przykład zobaczycie zdefiniowanie stały nazwany limit (zaleca się kapitalizację stałych) o wartości 50, czyli progu, o którym mówiliśmy powyżej. Następnie zauważysz, że C nie używa „wtedy” po wyrażeniu IF, takim jak robi to powłoka Bourne, na przykład. Wreszcie napisaliśmy ten program w ten sposób, ponieważ możemy zilustrować kolejną ważną koncepcję: bloki. Blok to seria instrukcji, które należą razem, zjednoczone przez aparat ortodontyczny. Należy pamiętać, że jeśli użyjesz indziej, jeśli możesz pominąć finał, w zależności od sytuacji.

Tak więc nasz pierwszy blok mówi: „Jeśli wiek jest mniejszy niż 50, wydrukuj„ Twój wiek to $ wiek ” I Wydrukuj „Całkiem młody, mówię”. Kiedy zaczniesz czytać kod innych osób, zauważysz, że bloki są często używane w C i zalecamy użycie ich, gdy ich potrzebujesz, a czasem nawet jeśli nie, aby Twój kod był bardziej dostępny dla zwykłych śmiertelników. Co oznaczało „nawet gdy nie”? Cóż, C pozwala ci gniazdować i rzeczy mogą bardzo łatwo iść na południe i tworzyć błędy, które będą trudne do prześledzenia, lub twój kod może stać się bałaganem do odczytania przez innych, a nawet ciebie, więc jeśli planujesz naprawdę użyć zagnieżdżonych ifs i Nie możemy bez nich żyć, zalecamy nadużycie używania aparatów ortodontycznych do jasności. Istnieje wiele sytuacji, w których logiczny i operator może cię zapisać i sprawić, że kod staje się bardziej czytelny. Rozważ następujący przykład:

liczba int = 3; Jeśli ((liczba> 2) && (liczba < 4))  printf ("number is three"); /* Można to napisać w ten sposób:*/ liczba int = 3; Jeśli (liczba> 2)  Jeśli (numer < 4)  printf ("number is three");  

Znowu jest to prosty przykład, ale myślę, że masz rację. Użyj dowolnej metody i pamiętaj, że „&&” nie zawsze jest substytutem zagnieżdżonych IFS, ale jeśli potrzebujesz zbyt skomplikowanych, jeśli struktury prawdopodobnie musisz przemyśleć logikę programu.

podczas i dla

Dzięki tej sekcji naszego artykułu wprowadzamy kolejną podstawową koncepcję programowania C: pętle. Pętla pozwala powtórzyć określoną instrukcję lub blok w zależności od warunku, to znaczy, wykonać coś, dopóki jakiś warunek zmieni wartość prawdy z True na fałsz. Jak widać, ta koncepcja jest powiązana z instrukcjami warunkowymi i można je w razie potrzeby użyć.

chwila

Teoretyczna koncepcja while jest „while (Expression_IS_True) Execute_Something;” . Z każdą iteracją wyrażenie w ponownej ocenie, a jeśli jest to nadal prawdą, instrukcje (instrukcje) są/są wykonywane ponownie, dopóki wyrażenie, na które testujemy, stanie się fałszywe. Stąd możemy wywnioskować, że jeśli chcemy napisać nieskończoną pętlę za pomocą podczas gdy możemy pisać

chwila(1) do_stuff (); do_more_stuff (); 

Jak powiedzieliśmy, C nie ma słowa kluczowego Bool, ale możesz zrobić coś, aby to pokonać: możesz skompilować swoje programy, aby przylegać do edycji C99 Standard (-Std = C99 jako flaga GCC), co pozwoli na to, że pozwala Uzyskujesz dostęp do danych _bool, możesz użyć stdbool.h, który definiuje 1 jako prawdziwy i 0 jako false lub możesz zdefiniować prawdziwe i fałsz z instrukcjami preprocesor. Jak myślisz, jaka metoda działałaby lepiej i dlaczego? Jak przepisałbyś powyższy fragment kodu, biorąc pod uwagę to, co zostało powiedziane powyżej?

W każdym razie, kontynuujmy kompletny, działający przykład. Powiedzmy, że chcemy wyprowadzić trochę wiadomości na ekranie 5 razy. Porozmawiamy o tym samym przykładzie, który jest używany dla, ale na razie zobaczmy, jak to zrobić z czasem.

#Include int main () int i; i = 5; chwila(I != 0) printf ("Hello!\ n "); i--; powrót 0;  

Tak więc podczas wykonywania instrukcji między jego aparatem ortodontyczny != 0 'ocenia się jako fałszywy, to znaczy, gdy ja równa się zero, to zatrzymuje się. Aby ta pętla działała, musimy zmniejszyć I przy każdym przejściu, aż osiągnie zero.

Ćwiczenia

Teraz, biorąc pod uwagę następującą konstrukcję kontroli przepływu po prawej stronie, zmodyfikuj powyższy kod, aby się dostosować. Czy uważasz, że te projekty są przydatne?

[WSKAZÓWKA]: Przeczytaj do końca artykułu, możesz tam znaleźć kilka przydatnych wskazówek.

Do

Pętla napisana dla jest bardziej kompaktowa i zorganizowana, ale robi to samo, co pętla: oceń wyrażenie i wykonaj coś, jeśli wyrażenie jest prawdziwe. Oznacza to, że istnieją sytuacje, w których instrukcje mogą w ogóle nie wykonywać, jeśli warunek jest fałszywy od samego początku. Z kaprysem zobaczysz, dlaczego jest to ważne. Używanie VS, podczas gdy jest kwestią sytuacji, nawyków i osobistych preferencji, więc tak naprawdę nie ma nic, a drugi nie może.

A dla pętli ma trzy części: inicjalizacja, pętla, przyrost/zmniejszenie. Ważne jest, aby wiedzieć, że każda część trzech można pominąć, ale półkolony, jak zobaczysz, muszą pozostać. Tak więc nieskończona pętla z wyglądem wyglądałaby tak:

Do(;;)  Zrób coś(); Zrób coś innego(); 

Teraz, pod warunkiem, że już zadeklarowałem jako liczbę całkowitą, ale nie zdefiniowałem, jak napisałbyś kod, który wyświetla się „Cześć!”Pięć razy za pomocą pętli? Jest to dość łatwe, gdy patrzysz na to uważnie, więc staraj się unikać Google lub innych źródeł inspiracji. Poczucie, że będziesz miał to rozwiązanie, jest obok nic.

Sprawa przełącznik

Jeśli chcesz skorzystać z interaktywnego programu i zdajesz sobie sprawę, że w pewnym momencie będziesz musiał poradzić sobie z wieloma opcjami, wybranymi z listy stałych, to Switch jest tym, czego potrzebujesz. Ta sytuacja jest często napotykana podczas pisania interaktywnych aplikacji, w których użyjesz takich dialogów: „Jeśli chcesz to zrobić, naciśnij to; Jeśli tego potrzebujesz, naciśnij to ”i tak dalej. Na przykład pokażemy program, który pokazuje wartość liczb całkowitą, którą wprowadzasz w sześciokątnym lub ósemkę, w zależności od twojego wyboru.

#Include int main () char opcja; liczba int; printf ("Wprowadź numer, który chcesz przekonwertować.\N"); /*Proszę powstrzymać się od używania gets () ze względu na jego  * Niepewne „funkcje” */ Scanf („%i” i liczba); printf („Jakiej konwersji potrzebujesz?\ n ”); printf („ prasa „o” dla ósemka i „x” dla szesnastkowego.\N"); chwila((opcja = getchar ()) != Eof && (opcja = getchar ()) != '\ n')  przełącznik(opcja)  sprawa „O”: printf (”liczba w ośmiorożcu wynosi 0%o.\ n ”, liczba); przerwa; sprawa „x”: printf (”liczba w hexie to 0x%x.\ n ”, liczba); przerwa; domyślny: printf („Opcja nieprawidłowa.\N"); przerwa;  powrót 0; 

Teraz przeanalizujmy program i zobaczmy, co i jak to robi. Jedną rzeczą, która tutaj wprowadzona jest funkcja getchar (), zgodnie z definicją w stdio.H . Jest tu używany do uzyskania pojedynczy znak z wejścia użytkownika, a następnie napisz znak na zmienną. Moglibyśmy użyć opcji = getCar () raz, przed czasem, ale napisaliśmy taki kod, aby podkreślić, w jaki sposób możesz go użyć. Zostawimy to, aby dowiedzieć się, dlaczego sprawdzamy EOF i nową postać, i zachęcamy do sprawdzenia, co się stanie, jeśli pominiesz te kontrole. Składnia instrukcji przełącznika jest dość prosta i oczywista, więc będziemy dość krótcy.

Używamy przerwy; W każdym przypadku, ponieważ w przeciwnym razie pętla będzie kontynuowana do następnego znacznika (tagi są napisane przed dwukropkiem). Domyślnie: Tag nie jest obowiązkowy, ale warto zrobić coś na wypadek, gdyby inny znacznik pasuje do istniejących danych, a także jest uważana za dobrą praktykę programowania. Jako kolejne ćwiczenie zalecamy próbę przepisania naszego kodu poniżej za pomocą scanf () zamiast getchar () i zobaczyć, jak to idzie. Czy to zadziała?

zrób/while

Powiedzieliśmy wcześniej, że podczas oceny pierwszej i wykonania później, istnieje szansa, że ​​instrukcje mogą nigdy nie zostać wykonane. Będą sytuacje, w których będziesz chciał dokładnie odwrócić, a to gdzie/podczas gdy wchodzi na scenę. Logiczny przepływ jest odwrócony, w porównaniu do while, jak w do (coś), w którym (warunek_is_true). Tak więc ocena jest dokonana Po Wykonanie, które gwarantuje co najmniej jedną rundę, zanim kompilator zdaje sobie sprawę, że warunek jest fałszywy (lub nie).

Zobaczmy, jak wyglądałaby nieskończona pętla z do/while:

Do printf ("Hello!\N"); chwila(1);

Możesz po prostu spróbować sprawdzić, jak płynie przepływ, po prostu zastępując 1 w powyższym kodzie i zobaczyć, co się stanie: program wydrukuje „Hello!„Pewnego razu, zanim zda sobie sprawę, że wyrażenie, w którym ocenia się jako fałszywe. Do/While konstrukcji są zwykle mniej używane, że ich odpowiedniki, ale zobaczysz, że są sytuacje, w których ułatwiają twoje życie. Czy możesz podać przykład?

przerwać, kontynuuj i goto

Już wcześniej „spotkaliśmy się” i można to po prostu opisać jako metodę wydostania się z pętli na inny sposób niż domyślny. Możesz użyć go z pętlami lub konstrukcjami przełączników, w przeciwieństwie do kontynuacji, co tak naprawdę nie ma sensu w przełączniku. Zostawimy ci to, aby napisać kod, w którym przerwę i kontynuowanie są używane i przydatne, a my będziemy kontynuować jednego z „wrogów” programisty C: goto. Zacząłem programować z Basic i nadal dreszczam, kiedy pamiętam tam użycie goto, i chociaż C też go ma, jego zastosowanie nie jest w żadnym wypadku zalecane, być może z wyjątkiem niektórych programów związanych z systemem. Nie jest to zalecane, ponieważ dzięki GOTO możesz łatwo przekształcić swoją pracę w kod spaghetti, to znaczy kod, który jest bardzo trudny do odczytania i debugowania, ponieważ czytelnik jest zmuszony „skakać” do różnych sekcji kodu, aby ją zrozumieć. Ale ze względu na kompletność, oto jak to działa. Zadeklarujesz etykietę, a następnie przypisujesz jej instrukcje, a następnie możesz użyć jej w różnych częściach kodu. Zwykle zamiast tego możesz uciec z funkcją niestandardową, więc użyj goto tylko wtedy, gdy wszystko inne zawiedzie.

Jeśli(error_unknown) iść do błąd; /*[…]*/ Błąd: printf („Błąd ogólny!.\N");

Teraz, gdy masz nietraktowany/nieznany błąd, możesz użyć etykiety błędu GOTO, aby wydrukować tę bardzo pomocną wiadomość. Znowu unikaj goto jak plaga. To łatwiejsze, niż możesz się do tego przyzwyczaić i stworzyć zły nawyk pisania kodu spaghetti. Nie możemy tego wystarczająco podkreślić.

Wniosek

Pod warunkiem, że przeczytałeś tę część uważnie i próbowałeś rozwiązać postawione przez nas wyzwania, zrobiłeś teraz kolejny krok w krainie programowania C. Spróbuj przeczytać i napisać jak najwięcej kodu i nie bój się zapytać, czy coś pójdzie nie tak.

Oto, czego możesz się spodziewać następnego:

  • I. C Opracowanie w Linux - Wprowadzenie
  • Ii. Porównanie C i innych języków programowania
  • Iii. Typy, operatorzy, zmienne
  • Iv. Kontrola przepływu
  • V. Funkcje
  • Vi. Wskaźniki i tablice
  • VII. Struktury
  • VIII. Podstawowe I/O
  • IX. Styl kodowania i zalecenia
  • X. Budowanie programu
  • Xi. Opakowanie dla Debiana i Fedory
  • XII. Uzyskanie pakietu w oficjalnych repozytoriach Debiana

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Skrypty Bash: operatorzy
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Mastering Bash Script Loops
  • Ubuntu 20.04 Przewodnik
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Hung Linux System? Jak uciec do wiersza poleceń i…